如何在Shopware

时间:2017-09-21 09:21:11

标签: events shopware

如何将自定义操作添加到Shopware中的现有控制器?

示例(网址结构):

/account/bonus
/account/custom
/account/...

通常,为此目的创建一个新的控制器更容易,更清洁,但在某些情况下,这是必要的。

3 个答案:

答案 0 :(得分:1)

有一种比更换整个控制器更简洁的方法。 由于缺乏更新兼容性,也不建议更换整个控制器。 在最糟糕的情况下,这样的事情可能会杀死整个网站。 前段时间我在shopware forum (德语)中创建了一个讨论完全相同问题的线程。我想在结帐控制器中扩展现有的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-construction,所以你的代码只是在希望的动作上触发[在我的例子中是finishAction()]。 / p>

我希望这会有所帮助。令我感到奇怪的是,为什么你必须向已经存在的控制器添加 new 动作。我认为没有哪种情况比创建一个完整的新自定义控制器更实用。

亲切的问候,

最高

答案 1 :(得分:0)

剧透:更换控制器

没有比替换整个控制器和扩展它的功能更清洁的方式,所以它几乎与Shopware的钩子一样 clean

<强>指南

在插件中添加新的订阅者

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

    }
}

<强>缺点

不幸的是,某些控制器具有影响逻辑的私有方法。像账户控制器一样。因此,并不总是可以简单地扩展控制器。

最后,尝试添加一个带有新路径的新控制器。 它更容易,更清洁。

答案 2 :(得分:0)

您不应该更换&#34;帐户&#34;控制器。 您可以使用以下命令为现有控制器定义自己的操作:

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
}