在CakePHP中将变量从元素传递到视图

在CakePHP中将变量从元素传递到视图,cakephp,Cakephp,我有一个庞大的数组,用于多个视图,因此我将其存储在元素文件中,并在需要时获取它: element/select.ctp: $districts = array( __('Region A') => array( __('district 1') => __('district 1'), __('district 2') => __('district 1'), __('district 3') => __('dist

我有一个庞大的数组,用于多个视图,因此我将其存储在元素文件中,并在需要时获取它:

element/select.ctp

$districts = array(
    __('Region A') => array(
        __('district 1') => __('district 1'),
        __('district 2') => __('district 1'),
        __('district 3') => __('district 1')
    ),
    __('Region B') => array(
        __('district 4') => __('district 4'),
        __('district 5') => __('district 5'),
        __('district 6') => __('district 6')
    )
);
echo $this->element('select');
echo $this->Form->Create('Profile');
echo $this->Form->input('district', array(
    'options' => $districts
);
我将其包含在
profiles/add.ctp
中:

$districts = array(
    __('Region A') => array(
        __('district 1') => __('district 1'),
        __('district 2') => __('district 1'),
        __('district 3') => __('district 1')
    ),
    __('Region B') => array(
        __('district 4') => __('district 4'),
        __('district 5') => __('district 5'),
        __('district 6') => __('district 6')
    )
);
echo $this->element('select');
echo $this->Form->Create('Profile');
echo $this->Form->input('district', array(
    'options' => $districts
);

但是变量没有被传递。我想知道如何从元素传递它?

元素不是这样做的正确方法。元素用于在多个视图中多次呈现或显示类似的代码段。可以将变量从视图传递到元素,但不能反过来传递

我建议您将阵列放入AppController,如下所示:

<?php

    namespace App\Controller;

    use Cake\Controller\Controller;
    use Cake\Event\Event;

    class AppController extends Controller
    {
        public function beforeFilter(Event $event) {
            $this->set('districts', array(
                __('Region A') => array(
                    __('district 1') => __('district 1'),
                    __('district 2') => __('district 1'),
                    __('district 3') => __('district 1')
                ),
                __('Region B') => array(
                    __('district 4') => __('district 4'),
                    __('district 5') => __('district 5'),
                    __('district 6') => __('district 6')
                )
            ));
        }
    }

?>
然后将阵列传递给控制器中所需的每个视图:

<?php

    namespace App\Controller;

    class SomeController extends AppController
    {
        public function index() {
            $this->set('districts', $this->districts);
        }
    }

?>


您是否可以尝试返回
$distrincts
我在视图中打印它,它返回一个错误,说明它是一个未定义的变量不要在视图模板中设置变量。使用您的控制器进行此操作。请看下面Lars Ebert的回答。谢谢。如果我在AppController和(比如)ProfileController之间创建一个类的中间层来存储数组,会导致更少或更多的工作负载吗?因为只有某些控制器需要变量。我认为在AppController和ProfileController之间创建类没有问题,只要中间控制器仍然继承AppController。还要确保betweenControllers beforeFilter方法使用
parent::beforeFilter($event)调用AppController beforeFilter方法位于beforeFilter方法的开头。