/** * 2016-08-17 * Цель плагина — форматирование внешнего вида платёжного адреса в том случае, * когда отключенен запрос этого адреса у покупателей, и данные, вероятно, пусты. * * Раньше я пробовал реализовать эту функциональность обработкой события «customer_address_format»: * https://github.com/mage2pro/core/blob/1.6.16/Customer/Observer/AddressFormat.php?ts=4#L37-L92 * Однако такой подход оказался невозможен, * потому что метод @see \Magento\Sales\Model\Order\Address\Renderer::format() выглядит так: * $formatType = $this->addressConfig->getFormatByCode($type); if (!$formatType || !$formatType->getRenderer()) { return null; } $this->eventManager->dispatch('customer_address_format', [ 'type' => $formatType, 'address' => $address ]); return $formatType->getRenderer()->renderArray($address->getData()); * * Во-первых, надо обратить внимание, что $formatType — это одиночка. * 1) Сначала я наивно пытался её модифицировать, но тогда, раз это одиночка, * то мои изменения применялись ко всем последующим адресам, * в том числе к непустым адресам и адресам доставки. * 2) Второй попыткой было в обработчике события подменять одиночку $formatType на свой объект. * Но ведь метод @see \Magento\Sales\Model\Order\Address\Renderer::format() игнорирует * результат обработчика события, и продолжает использовать одиночку, * так что в таком подходе толку нет. * * Поэтому пришлось делать этот плагин. * * @see \Magento\Sales\Model\Order\Address\Renderer::format() * @param Sb $sb * @param \Closure $proceed * @param Address $a * @param string $type * @return string */ public function aroundFormat(Sb $sb, \Closure $proceed, Address $a, $type) { /** @var string $result */ // 2016-08-17 // Убеждаемся, что firstname и lastname равны null, // чтобы не ломать отображение адресов, для которых информация присутствует // (например, эти адреса могли быть собраны до отключения опции askForBillingAddress). if (df_address_is_billing($a) && !$a->getFirstname() && !$a->getLastname()) { /** @var OP|null $payment */ $payment = $a->getOrder()->getPayment(); if ($payment && dfp_is_my($payment)) { /** * 2016-08-17 * Раньше тут было ещё условие !$method->s()->askForBillingAddress(), * но на самом деле оно ошибочно, * потому что если администратор сначала отключил опцию askForBillingAddress, * собраз заказы, а потом снова включил эту опцию, * то адреса заказов, собранных во время отключения опции, * должны обрабатываться корректно. */ /** * 2016-08-17 * Дальнейший код идёт по аналалогии с кодом * @see \Magento\Sales\Model\Order\Address\Renderer::format() */ /** * 2016-07-27 * По аналогии с @see \Magento\Sales\Model\Order\Address\Renderer::format() * https://github.com/magento/magento2/blob/2.0.0/app/code/Magento/Sales/Model/Order/Address/Renderer.php#L51 * @var DataObject $typeO */ $typeO = $this->addressConfig()->getFormatByCode($type); /** * 2016-07-27 * Если в будущем мы захотим написать что-либо более объёмное, * то можно поставить ещё 'escape_html' => false */ $typeO->addData(['default_format' => __(!df_is_backend() ? 'Not used.' : 'The customer was not asked for it.')]); /** @var RendererInterface|DefaultRenderer|null $renderer */ /** @noinspection PhpUndefinedCallbackInspection */ $renderer = call_user_func([$typeO, 'getRenderer']); if (!$renderer) { $result = null; } else { df_dispatch('customer_address_format', ['type' => $typeO, 'address' => $a]); $result = $renderer->renderArray($a->getData()); } } } return isset($result) ? $result : $proceed($a, $type); }
/** * 2016-07-27 * Цель плагина — добавление возможности отключения необходимости платёжного адреса. * Это будет использоваться моими платёжными модулями. * Помимо этого плагина для данной функциональности нужны ещё 2: * @see \Df\Customer\Plugin\Model\ResourceModel\AddressRepository * @see \Df\Sales\Plugin\Model\Order\Address\Validator * * @see \Magento\Customer\Model\Address\AbstractAddress::validate() * @param Sb $sb * @param \Closure $proceed * @return bool|string[] */ public function aroundValidate(Sb $sb, \Closure $proceed) { return S::disabled() && df_address_is_billing($sb) ? true : $proceed(); }
/** * 2016-07-27 * Цель плагина — добавление возможности отключения необходимости платёжного адреса. * Это будет использоваться моими платёжными модулями. * Помимо этого плагина для данной функциональности нужны ещё 2: * @see \Df\Customer\Plugin\Model\Address\AbstractAddress * @see \Df\Customer\Plugin\Model\ResourceModel\AddressRepository * * @see \Magento\Sales\Model\Order\Address\Validator::validate() * @param Sb $sb * @param \Closure $proceed * @param Address $address * @return string[] */ public function aroundValidate(Sb $sb, \Closure $proceed, Address $address) { return S::disabled() && df_address_is_billing($address) ? [] : $proceed($address); }