在确认订单页面的 shopware 送货地址中自定义验证

custom validate in shopware shipping address in confirm order page

如何在确认订单页面的 shopware 送货地址中添加我的自定义验证。如果成功,该过程将确认订单。请解释如何做到这一点。

您不能在创建地址时向地址添加额外的字段吗?

public static function getSubscribedEvents()
{
    return array(
        'Shopware_Form_Builder' => ['onFormBuild', 1000]
    );
}

public function onFormBuild(\Enlight_Event_EventArgs $event)
{
    if (
        (   $event->getReference() !== \Shopware\Bundle\AccountBundle\Form\Account\PersonalFormType::class &&
            $event->getReference() !== \Shopware\Bundle\AccountBundle\Form\Account\AddressFormType::class  )
    ) {
        return;
    }

    /** @var \Symfony\Component\Form\Form $builder */
    $builder = $event->getBuilder();

    $builder->get('additional')
        ->add('yourFieldName', \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
            'constraints' => [
                new NotBlank()
            ]
        ]);
}

如果没有,那么您应该订阅结帐邮寄并查看您想要的内容:

public static function getSubscribedEvents()
{
    return array(
        'Enlight_Controller_Action_PreDispatch_Frontend_Checkout' => 'onFrontendPreDispatchCheckout',
    );
}

/**
 * @param \Enlight_Controller_ActionEventArgs $args
 */
public function onFrontendPreDispatchCheckout(\Enlight_Controller_ActionEventArgs $args)
{
    /**@var $subject \Shopware_Controllers_Frontend_Checkout */
    $subject = $args->getSubject();
    $request = $subject->Request();
    $response = $subject->Response();
    $action = $request->getActionName();
    $view = $subject->View();

    if (!$request->isDispatched() || $response->isException() || 
    // only in case action is payment or confirm we should chcek it
    ($action != 'payment' && $action != 'confirm') ||
    !$view->hasTemplate()
    ) {
        return;
    }

    $validation = $this->thereWeCheckIt();
    if (
        $validation['message']
    ) {
                $subject->forward('index', 'account', 'frontend', array(
                    'errorVariable' => $validation['message'],
                ));
    }
}

然后您还需要postDispatch account controller并向客户显示errorVariable