Beispiel #1
0
 /**
 * 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);
 }
Beispiel #2
0
 /**
  * 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();
 }
Beispiel #3
0
 /**
  * 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);
 }