/** * 2016-08-22 * @return C|null */ protected function c() { return dfc($this, function () { /** @var int|null $id $id */ $id = $this->o()->getCustomerId(); return !$id ? null : df_customer_get($id); }); }
/** * 2016-07-27 * Цель плагина — добавление возможности отключения необходимости платёжного адреса. * Это будет использоваться моими платёжными модулями. * Помимо этого плагина для данной функциональности нужны ещё 2: * @see \Df\Customer\Plugin\Model\Address\AbstractAddress * @see \Df\Sales\Plugin\Model\Order\Address\Validator * * @see \Magento\Customer\Model\ResourceModel\AddressRepository::save() * @param Sb $sb * @param \Closure $proceed * @param AI|CDA $address * @return AI * @throws InputException */ public function aroundSave(Sb $sb, \Closure $proceed, AI $address) { /** @var AI $result */ /** * 2016-07-27 * Адрес приобретает тип, только когда используется при оформлении заказа. * Пока же адрес просто принадлежит покупателю * @see \Magento\Customer\Model\Data\Address * @see \Magento\Customer\Api\Data\AddressInterface * а не используется в контексте оформления заказа, то такой адрес ещё типа не имеет, * и в будущем, в зависимости от контекста, * может использоваться и как адрес доставки, и как платёжный адрес. * * По этой причине мы не вызываем здесь @see df_address_is_billing() * В то же время, мы попадаем сюда при оформлении заказа, * поэтому мы не можем проводить валидацию адреса, * если необходимость платёжного адреса отключена администратором. * Поэтому ветка S::disabled() нужна. */ if (!S::disabled()) { $result = $proceed($address); } else { /** @var Customer $customer */ $customer = df_customer_get($address->getCustomerId()); /** @var Address $addressM */ $addressM = null; if ($address->getId()) { $addressM = df_address_registry()->retrieve($address->getId()); } if ($addressM) { $addressM->updateData($address); } else { $addressM = df_om()->create(Address::class); $addressM->updateData($address); $addressM->setCustomer($customer); } // 2016-07-27 // Вот здесь в ядре валидация, а мы её пропускаем. $addressM->save(); // Clean up the customer registry since the Address save has side effect on customer: // \Magento\Customer\Model\ResourceModel\Address::_afterSave df_customer_registry()->remove($address->getCustomerId()); df_address_registry()->push($addressM); $customer->getAddressesCollection()->clear(); $result = $addressM->getDataModel(); } return $result; }
/** * 2016-08-22 * Имеется ещё метод @see \Magento\Customer\Model\Session::getCustomer() * однако смущает, что он напрямую загружает объект из БД, а не пользуется репозиторием. * @return C|null */ function df_current_customer() { return df_customer_session()->isLoggedIn() ? df_customer_get(df_customer_session()->getCustomerId()) : null; }