如何在 Shopware 中向帐户控制器添加操作
How to add an Action to Account Controller in Shopware
如何在 Shopware 中向现有控制器添加自定义操作?
示例(url 结构):
/account/bonus
/account/custom
/account/...
通常为此目的创建一个新的控制器更容易也更干净,但在某些情况下这是必要的。
剧透:更换控制器
没有比更换整个控制器并扩展其功能更清洁的方法了,因此它几乎与 Shopware 的挂钩一样干净。
向导
向您的插件添加新订阅者
class AccountSubscriber implements SubscriberInterface
{
/**
* @return array
*/
public static function getSubscribedEvents()
{
return array(
'Enlight_Controller_Dispatcher_ControllerPath_Frontend_Account' => 'getAccountController'
);
}
/**
* @return string
*/
public function getAccountController()
{
return $this->getPath() . '/Controllers/Frontend/AccountExtended.php';
}
/**
* @return string
*/
public function getPath()
{
$plugin = Shopware()->Container()->get('kernel')->getPlugins()['AcmeYourPlugin'];
return $plugin->getPath();
}
}
缺点
不幸的是,某些控制器具有影响逻辑的私有方法。就像帐户控制器一样。所以并不总是可以简单地扩展控制器。
最后,尝试添加一个新的控制器和一个新的路由。
它更简单、更干净。
有比替换整个控制器更简洁的方法。
由于缺乏更新兼容性,也不建议更换整个控制器。
在最坏的情况下,类似的东西可能会杀死整个网站。
不久前,我在 shopware forum (german) 中创建了一个主题讨论完全相同的问题。我想 扩展 结帐控制器中现有的 finishAction() 。
public function onPostDispatchCheckout(\Enlight_Controller_ActionEventArgs $args)
{
/** @var \Enlight_Controller_Action $controller */
$controller = $args->getSubject();
/** @var \Enlight_Controller_Request_Request $request */
$request = $controller->Request();
if ($request->getActionName() !== 'finish') {
return;
}
// do your stuff here
}
因此,即使您遇到的不是完全相同的问题,程序也完全相同。
首先你订阅控制器(在我的例子中是 PostDispatchCheckout 控制器)然后你在你的 Bootstrap.php
中编辑控制器
为了确保它只是改变了您 必须 使用 if 构造的特定操作,因此您的代码只会在希望的操作上触发 [在我的例子中是 finishAction ()].
希望对您有所帮助。令我感到奇怪的是,为什么您必须向已经存在的控制器添加 new 操作。我想不出有什么比创建一个全新的自定义控制器更可行的了。
亲切的问候,
最大
您不应更换 "account" 控制器。
您可以使用以下内容为现有控制器定义自己的操作:
public static function getSubscribedEvents()
{
return [
'Enlight_Controller_Action_Frontend_Account_MyBonus' => 'onAccountMyBonus',
];
}
然后
public function onAccountMyBonus(\Enlight_Event_EventArgs $args)
{
$args->setProcessed(true);
.....
your code here
}
如何在 Shopware 中向现有控制器添加自定义操作?
示例(url 结构):
/account/bonus
/account/custom
/account/...
通常为此目的创建一个新的控制器更容易也更干净,但在某些情况下这是必要的。
剧透:更换控制器
没有比更换整个控制器并扩展其功能更清洁的方法了,因此它几乎与 Shopware 的挂钩一样干净。
向导
向您的插件添加新订阅者
class AccountSubscriber implements SubscriberInterface
{
/**
* @return array
*/
public static function getSubscribedEvents()
{
return array(
'Enlight_Controller_Dispatcher_ControllerPath_Frontend_Account' => 'getAccountController'
);
}
/**
* @return string
*/
public function getAccountController()
{
return $this->getPath() . '/Controllers/Frontend/AccountExtended.php';
}
/**
* @return string
*/
public function getPath()
{
$plugin = Shopware()->Container()->get('kernel')->getPlugins()['AcmeYourPlugin'];
return $plugin->getPath();
}
}
缺点
不幸的是,某些控制器具有影响逻辑的私有方法。就像帐户控制器一样。所以并不总是可以简单地扩展控制器。
最后,尝试添加一个新的控制器和一个新的路由。 它更简单、更干净。
有比替换整个控制器更简洁的方法。 由于缺乏更新兼容性,也不建议更换整个控制器。 在最坏的情况下,类似的东西可能会杀死整个网站。 不久前,我在 shopware forum (german) 中创建了一个主题讨论完全相同的问题。我想 扩展 结帐控制器中现有的 finishAction() 。
public function onPostDispatchCheckout(\Enlight_Controller_ActionEventArgs $args)
{
/** @var \Enlight_Controller_Action $controller */
$controller = $args->getSubject();
/** @var \Enlight_Controller_Request_Request $request */
$request = $controller->Request();
if ($request->getActionName() !== 'finish') {
return;
}
// do your stuff here
}
因此,即使您遇到的不是完全相同的问题,程序也完全相同。
首先你订阅控制器(在我的例子中是 PostDispatchCheckout 控制器)然后你在你的 Bootstrap.php
中编辑控制器为了确保它只是改变了您 必须 使用 if 构造的特定操作,因此您的代码只会在希望的操作上触发 [在我的例子中是 finishAction ()].
希望对您有所帮助。令我感到奇怪的是,为什么您必须向已经存在的控制器添加 new 操作。我想不出有什么比创建一个全新的自定义控制器更可行的了。
亲切的问候,
最大
您不应更换 "account" 控制器。 您可以使用以下内容为现有控制器定义自己的操作:
public static function getSubscribedEvents()
{
return [
'Enlight_Controller_Action_Frontend_Account_MyBonus' => 'onAccountMyBonus',
];
}
然后
public function onAccountMyBonus(\Enlight_Event_EventArgs $args)
{
$args->setProcessed(true);
.....
your code here
}