在商店的客户部分,我想呈现用户帐户菜单(我们在到达/my-account
网址时默认可以看到)作为其他控制器的侧栏,例如与相关联的控制器/ my-adresses“,”/ identity“ pages ..
我以为我必须创建另一个控制器,其目的是收集菜单信息并仅呈现菜单<ul>
列表。然后我可以覆盖控制器,例如 MyAccountController , IdentityController ,以包含这个前一个Ctrl,然后将其内容呈现为这两个其他控制器视图的视图的一部分。
那么如何从另一个加载特定的控制器以呈现页面之间的共享视图?这是正确/干净的方式吗?
我听说过$this->getController()
,但我没有找到任何我希望实现的片段或实现。我是Prestashop的新手,但即使代码看起来很清楚,我也不明白这一点。
谢谢!
答案 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中是这样。不过,对我而言,这种方法远比重复的视图代码更清晰。
如果您有更好(更清洁)的方法来实施这样的机制,请告诉我!
有什么想法吗?