CakePHP передает данные элементу - PullRequest
12 голосов
/ 02 апреля 2011

У меня в контроллере следующий код:

function index()
{
    $posts = $this->set('posts', $this->Portfolio->find('all'));

    if (isset($this->params['requested']))
    {
        return $posts;
    }
    else
    {
        $this->set('posts', $this->Portfolio->find('all'));
    }
}

и я хочу, чтобы это было: а) показать список элементов портфеля для индекса, например, /portfolio/ и b) показать список элементов портфолио внутри элемента, чтобы пользователь мог получить доступ к элементам портфолио из моей боковой панели на сайте.

Вот мой элемент для боковой панели:

<?php $posts = $this->requestAction('portfolio/index'); ?>
<ul>
    <?php foreach ($posts as $post): ?>
    <li><?php echo $this->Html->link($post['Portfolio']['title'], array('action' => 'view', $post['Portfolio']['id']));?></li>
    <?php endforeach; ?>
</ul>

и затем я называю это так в моем макете:

<?php $this->element('portfolio-nav', array('posts' => $posts) ); ?>

Однако выдает следующую ошибку:

Notice (8): Undefined variable: posts [APP/controllers/portfolio_controller.php, line 16]

И не показывает список элементов на боковой панели.

Я почти уверен, что то, что я написал в своем контроллере, является мусором, так что если кто-нибудь может помочь мне заставить его работать, это было бы здорово.

Спасибо

Ответы [ 10 ]

27 голосов
/ 02 апреля 2011

Я вчера ответил на тот же вопрос. Почему действие вашего контроллера такое сложное? Я думаю, вам не нужно ничего больше, чем

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.

7 голосов
/ 02 апреля 2011

Второй аргумент в методе элемента передает данные.Что вам нужно:

$this->element('portfolio-nav', array('posts' => $posts) );

Пожалуйста, прочитайте документы .

4 голосов
/ 07 ноября 2016

Элемент с параметром

$this->element('elementname', array('var_name'=>$var));
2 голосов
/ 03 апреля 2011

Одна вещь, о которой я не думаю, была замечена, ваше сообщение об ошибке:

Notice (8): Undefined variable: posts [APP/controllers/portfolio_controller.php, line 16]

находится в контроллере. То, что вы опубликовали, выглядит хорошо (хотя и немного многословно), поэтому я хотел бы спросить, где находится строка 16 в PortfolioController и почему не определено $ posts?

Возврат значения из контроллера для использования в элементе в целом работает, поэтому проблем нет.

1 голос
/ 19 ноября 2013

Вы можете сделать это и так.

class AppController extends Controller {

    public $var;    

    public function beforeFilter()
    {
         $this->var = ClassRegistry::init('Portfolio')->find('all');
    }
 }
class YourController extends AppController {

    public function index() {

        debug($this->var);
    }
}
1 голос
/ 03 апреля 2011

Попробуйте и дайте мне знать, работает ли он или нет ..

Я внес некоторые изменения в вашу функцию Controller :: index ():

function index () {
    // this is the problem
    // $posts = $this->set('posts', $this->Portfolio->find('all'));

    $posts = $this->Portfolio->find ( 'all' );

    if (isset($this->params['requested']))
    {
        return $posts;
    }
    else
    {
        // you already have the posts
        //$this->set('posts', $this->Portfolio->find('all'));

        $this->set ( 'posts', $posts );
    }
}

никаких изменений в вашем элементеportfolio-nav ..

измените вызов в вашем макете, чтобы он стал:

<?php $this->element ( 'portfolio-nav' ); ?>

Надеюсь, это было полезно для вас ... удачи в развитии ...

1 голос
/ 02 апреля 2011

вы устанавливаете переменную $ posts в элементе и пытаетесь передать ее из макета в элемент o.o

ваш код идет в следующем порядке

render layout
include element passing variable
set var with requestAction

Еогеасп

вы должны делать

render layout
include element (dont pass anything)
set var with requesAction (you get the data here so why are you trying to pass it in)
0 голосов
/ 08 февраля 2015
//Controller users
public function getUsers(){

     $users=  $this->User->find("all");

     return $users;
    }


//Element name users

$this->requestAction(array('controller'=>'users','action'=>'getUsers'))

//vista name view
 print_r( $this->element('users')); ?>
0 голосов
/ 30 июля 2014

Просмотр документации Cakephp http://book.cakephp.org/2.0/en/views.html

echo $this->element('helpbox', array(
    "helptext" => "Oh, this text is very helpful."
));

Если вам нужна переменная в каждом представлении, вы должны установить ее в сеансе.

0 голосов
/ 03 апреля 2011

Вот как я решил это очень просто:

контроллер:

function birdsTwo() { 
    return $this->Bird->find('all', array('order' => 'Bird.name ASC', 'limit' => 2));   
}

расположение:

<?php echo $this->element('quick_5_birds'); ?>

элемент:

$birds = $this->requestAction('/birds/birdsTwo/');
    foreach($birds as $bird) {
          echo $this->Html->link(__($bird['Bird']['name'], true), 
array('controller' =>'bird','action' => 'view', $bird['Bird']['id'])) . "<br />";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...