cakephp $ this-> data теряет МНОГО своего массива данных после отправки формы - PullRequest
0 голосов
/ 13 марта 2012

У меня есть страница manage_photos, в которой $ this-> data содержит много информации о ее подразделении. У меня есть форма, которая вносит соответствующие изменения в базу данных. Однако при отправке формы $ this-> data (как видно при использовании pr ($ this-> data)) теряет MOST своих данных массива после обновления страницы. Вот код формы на мой взгляд:

echo $this->Form->create('Unit', array(
    'action' => 'manage_photos',
    'type' => 'file',
    'inputDefaults' => array(
        'label' => false,
        'div' => false
        )
    )
);
echo $this->Form->hidden('id');
$count=0;
foreach($this->data['Image'] as $img) {
echo '<div class="grid_4 manage-pics">';
echo $this->Form->hidden('Image.'.$count.'.id');
$char_list='http';
$link=strpos($img['img'], $char_list);
if($link===false) {
    echo '<img src="/img/uploaded_img/user/';
    echo $this->data['User']['id'];
    echo "/";
    echo $img['img'];
    echo '" alt=" "  />';
    }
elseif($link!==false) {
    echo '<img src="';
    echo $img['img'];
    echo '" alt="" />';
}
echo '<h4>Picture:  '.$img['img'].'</h4>';
echo '<br />';
echo $this->Form->input('Image.'.$count.'.img_alt', array('label'=>'A description of this picture', 'div'=>true, 'size'=>45));

$count++;
echo '</div>';
}
echo $this->Form->end('Update Photos');?>
<?php echo $this->Session->flash(); ?>

и код моего контроллера:

function manage_photos($id) {
    $this->set('title', 'Edit your photos');
    $this->Unit->id = $id;    
    if (empty($this->data)) {        
        $this->data = $this->Unit->read();    
    } else { 
        if ($this->Unit->saveAll($this->data)) {            
            $this->Session->setFlash('Your photos have been updated.',  'success');            
        }   
    }
}

Я предполагаю, что возвращаются только те модели в массиве, которые были изменены при внесении изменений, но есть ли способ заставить торт вернуть исходные данные $ this->? Я теряю все мое изображение src, когда страница обновляется. Возможно, мне не следует обновлять страницу, или мне действительно нужно вставить какое-то перенаправление обратно на эту же страницу в контроллере?

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Сеть и протокол HTTP не сохраняют состояния. Это означает, что в веб-программировании по умолчанию данные не сохраняются между запросами. На самом деле в CakePHP по умолчанию включены сеансы, которые могут помочь обойти эту проблему во многих случаях, но здесь нам, вероятно, нужно что-то другое.

$this->data заполняется только из полей формы, которые есть на странице. Это означает, что в вашем контроллере вы имеете дело с несколькими случаями:

  1. Запрос GET: давайте загрузим данные из базы данных.

  2. Запрос POST: давайте сохраним данные,

a) Успешно: либо перенаправить на другую страницу, либо загрузить все данные заново.

b) Неудачно: давайте загрузим все данные из базы данных и объединим их с нашими отправленными (недействительными) данными для повторного отображения формы. Если мы не выполняем функцию слияния, пользователь должен перепечатать все изменения, что редко желательно.

Попробуйте что-то вроде этого:

function manage_photos($id) {
    $this->set('title', 'Edit your photos');
    $this->Unit->id = $id;
    if (empty($this->data)) {
        // 1. GET request
        $this->data = $this->Unit->read();
    } else {
        if ($this->Unit->saveAll($this->data)) {
            // 2a POST successful
            $this->Session->setFlash('Your photos have been updated.',  'success');
            $this->data = $this->Unit->read();
        } else {
            // 2b POST unsuccessful
            Set::merge($this->Unit->findById($id), $this->data);
        }
    }
}

Set::merge(), часть библиотеки CakePHP, выполнит работу по объединению отправленных и полных данных.

0 голосов
/ 13 марта 2012

Вы пытались использовать файлы cookie для хранения переменных записи в случае обновления страницы или возникновения ошибки?

...