控制器共享部件:如何在Prestashop中的另一个控制器视图中包含控制器的输出> = 1.5?

时间:2015-12-16 12:17:29

标签: prestashop prestashop-1.6 prestashop-1.5

在商店的客户部分,我想呈现用户帐户菜单(我们在到达/my-account网址时默认可以看到)作为其他控制器的侧栏,例如与相关联的控制器/ my-adresses“”/ identity“ pages ..

我以为我必须创建另一个控制器,其目的是收集菜单信息并仅呈现菜单<ul>列表。然后我可以覆盖控制器,例如 MyAccountController IdentityController ,以包含这个前一个Ctrl,然后将其内容呈现为这两个其他控制器视图的视图的一部分。

那么如何从另一个加载特定的控制器以呈现页面之间的共享视图?这是正确/干净的方式吗?

我听说过$this->getController(),但我没有找到任何我希望实现的片段或实现。我是Prestashop的新手,但即使代码看起来很清楚,我也不明白这一点。

谢谢!

1 个答案:

答案 0 :(得分:0)

在深入了解源代码后,我最终将菜单(最初是MyAccountControllerCore别名my-account模板的一部分)移动到一个全新的Controller“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类中)的最初目的不是要包含另一个控制器输出,至少在Prestashop 1.5中是这样。不过,对我而言,这种方法远比重复的视图代码更清晰。

如果您有更好(更清洁)的方法来实施这样的机制,请告诉我!

有什么想法吗?