Как передать запись базы данных из контроллера для просмотра в CakePHP - PullRequest
0 голосов
/ 20 февраля 2012

Я начал проект в CakePHP. У меня нет такого опыта, большая часть моего опыта с Symfony2.

Прямо сейчас я создал файл представления, контроллер и модель для использования с этим проектом и его базой данных. В одном контроллере я хочу передать одну запись из базы данных в представление для использования на домашней странице. Однако я не могу передать запись, так как получаю эту ошибку:

Примечание (8): неопределенная переменная: content [APP \ View \ Contents \ home.ctp, строка 42]

Вот мой код контроллера:

function home() {
    $content = $this->Content->query("SELECT title, content FROM content WHERE id = 1;");
    $this->set('pagecontent',$content); 
}

А вот код, который я использую для отображения данных в файле представления:

<?php $content['content']; ?>

Что я пропустил?


EDIT: Я изменил <?php $content['content']; ?> на <?php echo $pagecontent['Content']['content']; ?> в соответствии с изменениями, изложенными в ответе Росса. Однако теперь есть эта ошибка:

Примечание (8): неопределенный индекс: содержимое [APP \ View \ Contents \ home.ctp, строка 43]

Я использовал <?php echo debug($this->viewVars); ?>, и это вывод из этого:

 app\View\Contents\home.ctp (line 42) Array (
     [pagecontent] => Array
         (
             [0] => Array
                 (
                     [content] => Array
                         (
                             [title] => <h1>This is a title</h1>
                             [content] => <p>this is some test text</p>
                         )

                 )

         )

 )

1 Ответ

1 голос
/ 20 февраля 2012

$this->set('pagecontent',$content); - здесь вы устанавливаете переменные представления.

Вы пытаетесь получить доступ к переменной с именем $content, хотя на самом деле она хранится как $pagecontent.

Также, основываясь на соглашениях Cake, ключ content на самом деле должен быть Content, поэтому ваш вывод, вероятно, должен быть:

<h1><?php echo $pagecontent['Content']['title']; ?></h1>
<div class="page-content">
    <?php echo $pagecontent['Content']['content']; ?>
</div>

Вы всегда можете сделать debug($this->viewVars);, чтобы точно узнать, к чему у вас есть доступ.


Просмотр выходных помогает; ошибка связана с тем, как торт возвращает данные.

Вероятно, это связано с тем, что вы используете query() вместо find() или read(). (также объясняет, почему ваша клавиша content является строчной - query() использует имя таблицы , а не название модели.

Попробуйте:

$content = $this->Content->find('first', 
                              array('fields' => array('title', 'content'),
                                    'conditions' => array('Content.id' => 1)
                                   )
                               );

$this->set('pagecontent', $content); 


// view
echo $pagecontent['Content']['title'];
echo $pagecontent['Content']['content'];

теперь должно работать.

Альтернатива - просто получить доступ к данным через индекс массива:

echo $pagecontent[0]['content']['title']

который не такой "торт", как.

для расширения = query() возвращает данные в структуре, отличной от использования find или read. Есть и другие способы сделать это тоже.

$this->Content->id = 1;
$this->set('pagecontent', $this->Content->read(array('title', 'content')));

также должно быть действительным.

...