Я вчера ответил на тот же вопрос. Почему действие вашего контроллера такое сложное? Я думаю, вам не нужно ничего больше, чем
function index() {
$this->set('posts', $this->Portfolio->find('all'));
// Make sure the model Portfolio is accessible from here, i.e. place this
// action in PortfoliosController or load it using
// ClassRegistry::init('Portfolio')->find...
}
Затем в вашем представлении index.ctp:
<?php echo $this->element('foobar', array('posts' => $posts)); ?>
Если вы хотите иметь возможность запрашивать это на каждой странице вашего сайта (боковой панели или чего-то еще), вы можете использовать requestAction
или поместить $this->set...
в свой AppController. Если вы используете requestAction
в своем элементе, вам не нужно передавать array('posts' => ...)
в вашем $this->element
вызове.
Хорошо, ясно, что вам нужно гораздо больше направлений. Позвольте мне объяснить это шаг за шагом. Сначала нам нужно создать beforeFilter
на вашем AppController
, чтобы переменная $posts
была доступна из любого места в вашем приложении.
/app/app_controller.php
<?php
class AppController extends Controller {
function beforeFilter() {
parent::beforeFilter();
$this->set('posts', ClassRegistry::init('Portfolio')->find('all'));
}
}
Далее мы создаем простой элемент в app/views/elements/foobar.ctp
:
<?php debug($items); ?>
Наконец, мы вызываем элемент откуда-то в представлении:
<?php echo $this->element('foobar', array('items' => $posts)); ?>
Мы присваиваем переменной $ posts (которую мы определили в вашем AppController) ключ items
, потому что наш элемент ожидает переменную $items
.