2015-12-16 11 views
0

在店鋪的客戶部分,我想在其他控制器(如與「/ my-adresses」相關聯的控制器上的側欄)上呈現用戶帳戶菜單(我們可以在默認情況下看到/my-account URL) 「/ identity」 pages ..控制器共享部分:如何在Prestashop> = 1.5的另一個控制器的視圖中包含控制器的輸出?

我想我將不得不創建另一個控制器,其目的是收集菜單信息並僅顯示菜單<ul>列表。然後,我可以覆蓋控制器,例如MyAccountController,IdentityController以包含此前Ctrl,然後將其內容呈現爲這兩個其他控制器視圖的視圖的一部分。

那麼如何從另一個加載特定的控制器,以呈現頁面之間的共享視圖?這是正確的/乾淨的方式來做到這一點?

我聽說$this->getController(),但我沒有找到任何我想達到的片段或實現。我是Prestashop的新手,但即使代碼看起來很清晰,我也沒有在這裏明白。

謝謝!

回答

0

變得有點深入瞭解後,我結束了移動菜單(在MyAccountControllerCore別名my-account模板的最初部分)進入一個全新的控制器「MyAccountMenuController」,在/override/controllers/front/

<?php 
// In /override/controllers/front/MyAccountMenuController.php 
// The "exposer" controller 
public function display() 
{ 
    // Do what ever you want to pass specific variables 

    if (! $this->template) { 
     throw new Exception(get_class($this) . '::display() : missing template.'); 
    } 
    $this->context->smarty->display($this->template); 
    return true; 
} 

我現在能夠通過將每個控制器是客戶帳戶部分的部分initContent()方法中下面的代碼片段導入此菜​​單(這意味着他們每個人必須重寫,有關更多信息上位控制器,見documentation):

<?php 
// In /override/controllers/front/MyAccountController.php 
// The "consumer" controller 
public function initContent() { 
    // ... 
    // Importing the customer area's menu 
    $menuController = $this->getController('MyAccountMenuController'); 
    ob_start(); 
    $menuController->run(); 
    $this->context->smarty->assign('myAccountMenu', ob_get_clean()); 
} 

我不認爲getController方法(位於ControllerCore類)的最初目的是爲了包括另一控制器輸出,至少在1.5的Prestashop。不過,對我來說,這種方法比重複的視圖代碼更清潔。

如果您有更好的(更清潔)的方法來實現這樣的機制,請讓我知道!

有什麼想法?

相關問題