Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot fill inputfield with string from database

Update (on top because the post is so long)

Alright. New developments. When I add

resources.db.params.charset = "utf8"
resources.db.params.driver_options.1002 = "SET NAMES utf8;"

to my bootstrap, the title is returned as oriëntatie (It's in the database as oriëntatie). But when I want to add oriëntatie to my DB, it gets stripped all the way down to ori.

Original post

I have built a CMS. Like any other CMS you can add/update pages.

Now when I add a page with the a title containing, for example, the character ë it gets placed in the database as such in my title field. (I use StringTrim and StripTags filters on my form.)

Now, when I want to update the page, and pre-fill the title input field I want to show the ë character again. Instead my input field remains empty.

I tried to encode and decode the value (htmletities, html_entity_decode) all possible ways, but I can only get the htmlentity value displaying in the form field.

My guts are telling me that this isn't the right way, but still I want people to add proper titles without spelling mistakes...

Advice, tips anything would be greatly appreciated!

Edit: Added some code, not sure which parts

This is what happens with the code below:

Adding the word oriëntatie through the input field puts oriëntatie in the database. While trying to load the value oriëntatie in the input field again on the update page, the input field stays empty. I now for sure that all the data is retrieved.

Below is a screenshot of the database row filled.

enter image description here

Application.ini

resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.profiler = true

Bootstrap

// Build the view and layouts
protected function _initBuildBase()
{
    $this->bootstrap('view');
    $this->bootstrap('layout');     
    $layout = $this->getResource('layout');
    $this->view = $layout->getView();

    $this->view->doctype("HTML4_STRICT");
    $this->view->setEncoding('UTF-8');
    $this->view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
    $this->view->headMeta()->appendHttpEquiv('Content-Language', 'nl-NL');
    $this->view->headMeta()->appendHttpEquiv('Cache-control', 'public');
    $this->view->headMeta()->appendName('author', 'De Graaf & Partners Communications');
}

Header of the update.phtml page

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

    <head>

        <link href="/server_management/domains/cms_version_2/../../_application/public/images/admin/favicon.ico" rel="icon" type="image/x-icon" /><meta http-equiv="Content-Type" content="text/html;charset=utf-8" >

<meta http-equiv="Content-Language" content="nl-NL" >

<meta http-equiv="Cache-control" content="public" >

<meta name="author" content="De Graaf &amp; Partners Communications" >

<meta name="robots" content="noindex, nofollow" ><link href="/server_management/domains/cms_version_2/../../_application/public/css/admin/style.css" media="screen" rel="stylesheet" type="text/css" >

<!--[if IE]> <link href="/server_management/domains/cms_version_2/../../_application/public/css/admin/ie/style.css" media="screen, projection" rel="stylesheet" type="text/css" ><![endif]-->

<!--[if IE]> <link href="/server_management/domains/cms_version_2/../../_application/public/css/blueprint/ie.css" media="screen, projection" rel="stylesheet" type="text/css" ><![endif]-->

<link href="/server_management/domains/cms_version_2/../../_application/public/css/admin/print.css" media="print" rel="stylesheet" type="text/css" ><script type="text/javascript" src="/server_management/domains/cms_version_2/../../_application/public/jquery/jquery.lib.js"></script>

<script type="text/javascript" src="/server_management/domains/cms_version_2/../../_application/public/jquery/jquery.loader.js"></script>

<script type="text/javascript" src="/server_management/domains/cms_version_2/../../_application/public/jquery/jquery.init.js"></script>

<script type="text/javascript" src="/server_management/domains/cms_version_2/../../_application/public/jquery/tinymce/jquery.tinymce.js"></script><title>Pages - Admin - DGPCMS</title> </head>

    <body>

Database

enter image description here

Database Table

enter image description here

PagesService (Insert and Update)

public function InsertPages($url, $parent_page, $title, $text, $keywords, $description, $user, $dashboardmessage)
    {
        $data = array(
            'url' => $url,
            'parent_page' => $parent_page,
            'secure' => 'n',
            'title' => $title,
            'text' => $text,
            'keywords' => $keywords,
            'description' => $description,
            'user_created' => $user,
            'user_modified' => $user,
            'date_created' => time(),
            'date_modified' => time()
        );
        return $this->pages->insert($data);
        $this->DashboardService->InsertDashboard('insert', 'pages', $dashboardmessage, $user);
    }

    public function UpdatePages($id, $url, $parent_page, $title, $text, $keywords, $description, $user, $dashboardmessage)
    {
        $data = array(
            'url' => $url,
            'parent_page' => $parent_page,
            'secure' => 'n',
            'title' => $title,
            'text' => $text,
            'keywords' => $keywords,
            'description' => $description,
            'user_modified' => $user,
            'date_modified' => time()
        );
        $this->pages->update($data, $this->CreateWhereClause($id));
        $this->DashboardService->InsertDashboard('update', 'pages', $dashboardmessage, $user);
    }

PagesController (preDispatch, form settings)

$this->view->form = new Forms_Pages();
$this->view->form->setElementFilters(array('StringTrim', 'StripTags'));
$this->view->standardform = new Forms_StandardButtons();
$this->view->standardform->setElementFilters(array('StringTrim', 'StripTags'));

PagesController (Insert and Update)

public function insertAction()
{
    $this->view->pagesDropdown($this->PagesService->GetAllRootPages(), 'url');
    $pass = false;
    $textArray = array();
    foreach($this->PagesService->GetAllPages() as $result)
    {
        $textArray[] = $result->text;
    }
    if($this->getRequest()->isPost())
    {
        if($this->view->form->isValid($this->getRequest()->getPost()))
        {
            if($this->checkexists->isValid($this->view->urlCleaner($this->view->form->getValue('title'))))
            {
                if(preg_match('/(\\[\\[news:overview\\]\\])/is', $this->view->form->getUnfilteredValue('text')))
                {
                    if(preg_grep('/(\\[\\[news:overview\\]\\])/is', $textArray))
                    {
                        $this->_helper->flashMessenger(array('message' => $this->view->translate('The tag [[news:overview]] was already placed on another page. Please remove it before placing it on another page'), 'status' => 'notice'));
                    }
                    else
                    {
                        $pass = true;
                        $this->cache->save($this->view->urlCleaner($this->view->form->getValue('title')), 'module_newsBasepage');
                    }
                }
                else
                {
                    $pass = true;
                }
                if($pass)
                {
                    $this->lastId = $this->PagesService->InsertPages(
                        $this->view->urlCleaner($this->view->form->getValue('title')),
                        $this->view->form->getValue('parent_page'),
                        $this->view->form->getValue('title'),
                        stripslashes($this->view->form->getUnfilteredValue('text')),    
                        $this->view->form->getValue('keywords'),    
                        $this->view->form->getValue('description'),
                        $this->view->user->username,
                        '<strong>'.$this->view->form->getValue('title').'</strong>'
                    );
                    $this->_helper->flashMessenger(array('message' => $this->view->translate('The '.$this->view->subject.' was succesfully saved'), 'status' => 'success'));
                    if($this->getRequest()->getPost('save_finish') != 'Save')
                    {
                        $this->_redirect('/admin/pages/update/'.$this->lastId);
                    }
                    else
                    {
                        $this->_helper->redirectToIndex();
                    }
                }
            }
            else
            {
                $this->_helper->flashMessenger(array('message' => $this->view->translate('This '.$this->view->subject.' already exists'), 'status' => 'notice'));
            }
        }
        else
        {
            $this->_helper->flashMessenger(array('message' => $this->view->translate('Some errors occured'), 'status' => 'error'));
        }
    }
}

public function updateAction()
{
    $this->view->result = $this->PagesService->GetSinglePage($this->_getParam('id'));
    $this->view->form->populate($this->view->result[0]);
    //$this->view->form->populate(array('title' => html_entity_decode($this->view->result[0]['title'])));
    $this->view->pagesDropdown($this->PagesService->GetAllRootPages(), 'url', $this->view->result[0]['title']);
    $pass = false;
    $textArray = array();
    if($this->getRequest()->isPost())
    {
        if($this->view->form->isValid($this->getRequest()->getPost()))
        {
            foreach($this->PagesService->GetAllPages() as $result)
            {
                if($result->id != $this->view->result[0]['id'])
                {
                    $textArray[] = $result->text;
                }
            }
            if($this->view->form->getValue('title') != $this->view->result[0]['title'])
            {
                if($this->checkexists->isValid($this->view->urlCleaner($this->view->form->getValue('title'))))
                {
                    $pass = true;
                }
                else
                {
                    $this->_helper->flashMessenger(array('message' => $this->view->translate('This '.$this->view->subject.' already exists'), 'status' => 'notice'));
                }
            }
            if(preg_match('/(\\[\\[news:overview\\]\\])/is', $this->view->form->getUnfilteredValue('text')))
            {
                if(preg_grep('/(\\[\\[news:overview\\]\\])/is', $textArray))
                {
                    $this->_helper->flashMessenger(array('message' => $this->view->translate('The tag [[news:overview]] was already placed on another page. Please remove it before placing it on another page'), 'status' => 'notice'));
                }
                else
                {
                    $pass = true;
                    $this->cache->save($this->view->urlCleaner($this->view->form->getValue('title')), 'module_newsBasepage');
                }
            }
            else
            {
                $pass = true;
            }
            if($pass == true)
            {
                $this->lastId = $this->PagesService->UpdatePages(
                    $this->_getParam('id'),
                    $this->view->urlCleaner($this->view->form->getValue('title')),
                    $this->view->form->getValue('parent_page'),
                    $this->view->form->getValue('title'),
                    stripslashes($this->view->form->getUnfilteredValue('text')),    
                    $this->view->form->getValue('keywords'),    
                    $this->view->form->getValue('description'),
                    $this->view->user->username,
                    '<strong>'.$this->view->form->getValue('title').'</strong>'
                );
                $this->_helper->flashMessenger(array('message' => $this->view->translate('The '.$this->view->subject.' was succesfully saved'), 'status' => 'success'));
                if(!$this->getRequest()->getPost('save_finish') != 'Save')
                {
                    $this->_helper->redirectToIndex();
                }
                else
                {
                    $this->_redirect('/admin/pages/update/'.$this->_getParam('id'));
                }
            }
        }
        else
        {
            $this->_helper->flashMessenger(array('message' => $this->view->translate('Some errors occured'), 'status' => 'error'));
        }
    }
}

This is the result of Zend_Debug::dump($this->view->result);

array(1) {
  [0] => array(13) {
    ["id"] => string(3) "188"
    ["order"] => string(1) "0"
    ["url"] => string(10) "orientatie"
    ["parent_page"] => string(3) "n/a"
    ["secure"] => string(1) "n"
    ["title"] => string(10) "oriëntatie"
    ["text"] => string(13) "<p>Test 3</p>"
    ["keywords"] => string(6) "Test 1"
    ["description"] => string(6) "Test 2"
    ["user_created"] => string(5) "Admin"
    ["user_modified"] => string(5) "Admin"
    ["date_created"] => string(10) "1326280122"
    ["date_modified"] => string(10) "1326280122"

And this is the html output

<div class="padding_row">
<label for="title" class="required">Title</label>
<input type="text" name="title" id="title" value="" class="form_validator"> <div class="form_validator_box"> <a href="#" title="This page already exists" class="form_validator_result_bad"></a> </div>
</div>
like image 862
Rick de Graaf Avatar asked Jan 10 '12 13:01

Rick de Graaf


2 Answers

The dump shows the correct string. So this cannot be a database issue.

But I noticed, that you do

$this->view->form->isValid($this->getRequest()->getPost())

AFTER populate() in your update action. The isValid method includes populating the form already. So here you might overwrite your string with an empty string from POST. You should move your populate() to

if($this->getRequest()->isPost()) {
    //...
}
else{
    // here
}

or remove it and replace isValid(...) with

$this->view->form->isValid($this->view->result[0]) 

If the error is still somewhere else insert

Zend_Debug::dump($this->view->form->getValue('title'));

after every major operation to determine where your string changes to blank.

like image 24
ACNB Avatar answered Nov 01 '22 21:11

ACNB


The only time I've seen this happen is when the client (browser) isn't aware of the correct character encoding.

I see you've added the appropriate HTTP-Equiv meta into the HeadMeta helper but are you actually displaying it in your view or layout?

You should have something like this in the <head> section of your layout (or view if not using a layout)

<head>
    <?php echo $this->headMeta() ?>

I'm a little curious about your Bootstrap class. Could you show the rest of the code around the two lines you've listed? Why is the view apparently a property of Bootstrap and how is it assigned?

like image 199
Phil Avatar answered Nov 01 '22 22:11

Phil