2015-08-26 98 views
4

我有一個是在幾個視圖中使用的笨重的陣列,所以我將它存儲在一個元件文件並在需要時去取:傳遞變量,以查看在CakePHP中

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

而我把它列入profiles/add.ctp

echo $this->element('select'); 
echo $this->Form->Create('Profile'); 
echo $this->Form->input('district', array(
    'options' => $districts 
); 

但是變量沒有通過。我想知道如何從元素中傳遞它?

+0

您可以嘗試返回''distrincts'' – gmponos

+0

我print_r它在視圖中,它返回錯誤,指出其未定義的變量 –

+1

不要在視圖模板中設置變量。使用你是這個控制器。請參閱下面的Lars Ebert的答案。 – drmonkeyninja

回答

4

元素不是這樣做的正確方法。元素用於在多個視圖中多次呈現或顯示類似的片段。您可以將視圖中的變量傳遞給元素,但不能以其他方式傳遞。

我建議把陣列到您的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') 
       ) 
      )); 
     } 
    } 

?> 

這樣,每個視圖將有可變$districts充滿陣列。

如果你需要做的這對每個動作的基礎上,你可以在你的AppController做到這一點:

<?php 

    namespace App\Controller; 

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

    class AppController extends Controller 
    { 
     public function beforeFilter(Event $event) { 
      $this->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); 
     } 
    } 

?> 
+0

謝謝。如果我在AppController和ProfileController之間創建一箇中間層來存儲數組,那麼它會導致更少的工作量還是更多? –

+0

由於只有某些控制器需要這些變量。 –

+0

我發現在AppController和ProfileController之間創建類沒有問題,只要between-Controller仍然繼承AppController。還要確保betweenControllers beforeFilter方法使用'parent :: beforeFilter($ event);'在beforeFilter方法的開始處調用AppController的beforeFilter方法。 –