2017-03-23 43 views
1

我有以下事件偵聽器,但想從它設置一個viewVar,並有一些問題搞清楚如何。如果我不能或不應該,當我需要$products可用於視圖時,最好的方法是什麼?CakePHP - 從EventListener中設置viewVar

文件是./Products/Lib/Event/Products.php

<?php 
App::uses('CakeEventListener', 'Event'); 

class Products implements CakeEventListener { 
    public function implementedEvents() { 
     return array(
      'View.beforeRender' => 'get_products', 
     ); 
    } 

    public function get_products($event) { 
     $this->Product = ClassRegistry::init('Products.Product'); 

     $products = $this->Product->find('all', array(
      'fields' => array('Product.*', 'Content.title') 
     )); 

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

返回Fatal error: Uncaught Error: Call to undefined method Products::set()

+0

尚未在近十年中使用的蛋糕,但是,確實類產品有一個'set'功能?看起來不像它。 – ficuscr

+0

一般而言,您需要將視圖/應用程序傳入或能夠將其從註冊表中取出,以便能夠在其中訪問該視圖/應用程序。這些傢伙喜歡靜態...有一個'App :: get'?搜索和這些是我能找到的最有用的。 http://martinbean.co.uk/blog/2013/11/22/getting-to-grips-with-cakephps-events-system/和http://stackoverflow.com/questions/16923246/where-to-register聽衆 - 祝你好運! – ficuscr

+0

如何將這個邏輯移動到AppController?這可以使'$ products'在任何地方都可用。 – Mary

回答

1

您訂閱由View對象觸發的事件,該事件因此主題將是對象,並通過事件對象subject()方法,你可以在你的監聽方法訪問它,如:

$event->subject()->set('products', $products); 

又見

+0

非常感謝這和文檔鏈接!它正在工作,我明白我需要做更多的事情。 – fleeting