2011-04-02 105 views
11

我在我的控制器下面的代码:CakePHP的将数据传递到元素

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')); 
    } 
} 

什么,我想要它做的是:a)显示的投资组合项目列表的指数例如/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] 

并没有显示侧边栏中的项目列表。

我很确定我在控制器中写的是垃圾,所以如果任何人都可以帮助我使它工作,那就太棒了。

谢谢

回答

7

元素方法中的第二个参数传递数据。你需要的是:

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

请阅读docs

+0

还没虽然工作。 – Cameron 2011-04-02 12:41:34

+0

将定义$ posts的行放在元素之外。 – Dunhamzzz 2011-04-02 12:44:03

+0

投资组合指数工作正常。但是侧边栏列表并不是! – Cameron 2011-04-02 12:46:27

26

昨天我回答了同样的问题。为什么你的控制器操作如此复杂?我猜你什么都不需要超过

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,则您不必在$this->element调用中通过array('posts' => ...)


好的,很明显你需要更多的方向。让我一步一步解释这一点。首先,我们需要在AppController上创建一个beforeFilter,因此可以从应用程序的任何地方访问$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)); ?> 

我们正在分配$职位(我们已经在您的AppControlle中定义r)变量items键,因为我们的元素期望$items变量。

+0

这是我的观点,虽然我需要从每个页面请求这个,但它不起作用,它只是说$ posts变量是未定义的! – Cameron 2011-04-02 12:54:22

+0

然后阅读我的消息,你的答案就在那里。 – Bjorn 2011-04-02 12:55:27

+0

完成你所说的,但在投资组合元素是空的,当查看其他页面时,它会抛出一个错误,说明帖子是未定义的。 – Cameron 2011-04-02 12:58:15

1

你设置元素中的$岗位变种,并试图从布局传递到元素OO

代码顺序

render layout 
include element passing variable 
set var with requestAction 

的foreach

你是怎么回事应该是做

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

正如我在回答中所述:)。 – Bjorn 2011-04-02 13:05:50

+0

你的回答很长,重写你的代码,并把它放在app_controller中,我的是停止传递未初始化的变量,无论如何在元素中被初始化... – dogmatic69 2011-04-02 13:07:33

+0

“如果你在元素中使用requestAction,你不必通过在你的$ this->元素中调用array('posts'=> ...)。“ – Bjorn 2011-04-02 13:08:03

1

试试这个,让我知道它是否有效..

我做了一些更改控制器::指数()函数:

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'); ?> 

我希望这是对你有帮助.. 好运与您的开发..

2

一两件事,我不认为已经拿起,你的错误消息:

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

是在控制器中。你发布的内容看起来没问题(尽管代码略为冗长),所以我会问在PortfolioController中的第16行,为什么$ posts没有定义?

从控制器返回值以在元素中使用通常在那里没有问题。

0

这是我如何解决了这个很干脆:

控制器:

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 />"; 
} 
1

你也可以这样做。

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); 
    } 
} 
0
//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')); ?> 
2

元素与PARAM

$this->element('elementname', array('var_name'=>$var)); 
+0

你能举个例子吗? – 2016-11-07 10:41:22

+0

它的自我示例 – 2016-11-07 10:43:52

+0

haha​​ha .......好的 – 2016-11-07 10:45:07