/** * @used-by df_preg_match() * @used-by df_preg_match_int() * Возвращает: * 1) string, если текст соответствует регулярному выражению * 2) string[], если текст соответствует регулярному выражению, * и регулярное выражение содержит несколько пар круглых скобок. * 3) null, если текст не соответствует регулярному выражению * 4) false, если при соответствии произошёл внутренний сбой функции @see preg_match() * @throws \Exception * @return string|string[]|null|bool */ public function match() { if (!isset($this->{__METHOD__})) { /** @var string|null|bool $result */ /** @var int|bool $matchResult */ /** @var string[] $matches */ // Собачка нужна, чтобы подавить warning. $matchResult = @preg_match($this->getPattern(), $this->getSubject(), $matches); if (false !== $matchResult) { if (1 === $matchResult) { /** * Раньше тут стояло: * $result = dfa($matchResult, 1); * что не совсем правильно, * потому что если регулярное выражение не содержит круглые скобки, * то результирующий массив будет содержать всего один элемент. * ПРИМЕР * регулярное выражение: #[А-Яа-яЁё]#mu * исходный текст: Категория Яндекс.Маркета * результат: Array([0] => К) * * 2015-03-23 * Добавил поддержку нескольких пар круглых скобок. */ $result = count($matches) < 3 ? df_last($matches) : df_tail($matches); } else { if (!$this->needThrowOnNotMatch()) { $result = null; } else { $this->throwNotMatch(); } } } else { if ($this->needThrowOnError()) { $this->throwInternalError(); } else { $result = false; } } $this->{__METHOD__} = df_n_set($result); } return df_n_get($this->{__METHOD__}); }
/** * 2015-09-27 * Цель метода — получение информации о формировании в данный момент заголовка страницы. * @uses \Magento\Framework\View\Page\Title::get() * @param Sb $sb * @param \Closure $proceed * @return string */ public function aroundGet(Sb $sb, \Closure $proceed) { df_state()->renderingTitle(true); try { $result = $proceed(); /** * Делаем браузерные заголовки административной части * более короткими и понятными: оставляем лишь первую и последнюю части заголовка. */ if (df_is_backend()) { /** @var string[] $resultA */ $resultA = explode(Sb::TITLE_GLUE, $result); $result = 3 > count($resultA) ? $result : implode(Sb::TITLE_GLUE, [df_first($resultA), df_last($resultA)]); } } finally { df_state()->renderingTitle(false); } return $result; }
/** * 2016-08-10 * «groups[all_pay][groups][installment_sales][fields][plans][template][months]» => «months» * @param string $nameFull * @return string */ function df_fe_name_short($nameFull) { return df_last(df_clean(df_explode_multiple(['[', ']'], $nameFull))); }
/** @return bool */ public static function disabled() { return df_last(self::$_stack); }
/** * @param string $key * @param \\Zend_Validate_Interface|\Df\Zf\Validate\Type|string|mixed[] $validator * @param bool|null $isRequired [optional] * @throws \Df\Core\Exception * @return $this */ protected function _prop($key, $validator, $isRequired = null) { /** * Полезная проверка! * Как-то раз ошибочно описал поле без значения: private static $P__TYPE; * И при вызове $this->_prop(self::$P__TYPE, DF_V_STRING_NE) * получил диагностическое сообщение: «значение «» недопустимо для свойства «».» */ df_param_string_not_empty($key, 0); /** * Обратите внимание, что если метод @see _prop() был вызван с двумя параметрами, * то и count($arguments) вернёт 2, * хотя в методе @see _prop() всегда доступен и 3-х параметр: $isRequired. * Другими словами, @see func_get_args() не возвращает параметры по умолчанию, * если они не были реально указаны при вызове текущего метода. */ /** * Хотя документация к PHP говорит, * что @uses func_num_args() быть параметром других функций лишь с версии 5.3 PHP, * однако на самом деле @uses func_num_args() быть параметром других функций * в любых версиях PHP 5 и даже PHP 4. * http://3v4l.org/HKFP7 * http://php.net/manual/function.func-num-args.php */ if (2 < func_num_args()) { /** @var mixed[] $arguments */ $arguments = func_get_args(); $isRequired = df_last($arguments); /** @var bool $hasRequiredFlag */ $hasRequiredFlag = is_bool($isRequired) || is_null($isRequired); if ($hasRequiredFlag) { $validator = array_slice($arguments, 1, -1); } else { $isRequired = null; $validator = df_tail($arguments); } } /** @var \Zend_Validate_Interface[] $additionalValidators */ $additionalValidators = []; /** @var \Zend_Filter_Interface[] $additionalFilters */ $additionalFilters = []; if (!is_array($validator)) { $validator = Validator::resolveForProperty($this, $validator, $key, $skipOnNull = false === $isRequired); df_assert($validator instanceof \Zend_Validate_Interface); } else { /** @var array(\Zend_Validate_Interface|Df_Zf_Validate_Type|string) $additionalValidatorsRaw */ $additionalValidatorsRaw = df_tail($validator); $validator = Validator::resolveForProperty($this, df_first($validator), $key, $skipOnNull = false === $isRequired); df_assert($validator instanceof \Zend_Validate_Interface); foreach ($additionalValidatorsRaw as $additionalValidatorRaw) { /** @var \Zend_Validate_Interface|\Zend_Filter_Interface|string $additionalValidatorsRaw */ /** @var \Zend_Validate_Interface|\Zend_Filter_Interface $additionalValidator */ $additionalValidator = Validator::resolveForProperty($this, $additionalValidatorRaw, $key); if ($additionalValidator instanceof \Zend_Validate_Interface) { $additionalValidators[] = $additionalValidator; } if ($additionalValidator instanceof \Zend_Filter_Interface) { $additionalFilters[] = $additionalValidator; } } } $this->_validators[$key][] = $validator; if ($validator instanceof \Zend_Filter_Interface) { /** @var \Zend_Filter_Interface $filter */ $filter = $validator; $this->_addFilter($key, $filter); } foreach ($additionalFilters as $additionalFilter) { /** @var \Zend_Filter_Interface $additionalFilter */ $this->_addFilter($key, $additionalFilter); } /** * Раньше мы проводили валидацию лишь при извлечении значения свойства, * в методе @see getData(). * Однако затем мы сделали улучшение: * перенести валидацию на более раннюю стадию — инициализацию свойства @see setData(), * и инициализацию валидатора/фильтра @see _prop(). * Это улучшило диагностику случаев установки объекту некорректных значений свойств, * потому что теперь мы возбуждаем исключительную ситуацию * сразу при попытке установки некорректного значения. * А раньше, когда мы проводили валидацию лишь при извлечении значения свойства, * то при диагностике было не вполне понятно, * когда конкретно объекту было присвоено некорректное значение свойства. */ /** @var bool $hasValueVorTheKey */ $hasValueVorTheKey = array_key_exists($key, $this->_data); if ($hasValueVorTheKey) { Validator::checkProperty($this, $key, $this->_data[$key], $validator); } foreach ($additionalValidators as $additionalValidator) { /** @var \Zend_Validate_Interface $additionalValidator */ $this->_validators[$key][] = $additionalValidator; if ($hasValueVorTheKey) { Validator::checkProperty($this, $key, $this->_data[$key], $additionalValidator); } } return $this; }
/** * 2016-08-24 * Несмотря на то, что опция @see \Df\Payment\Settings::askForBillingAddress() * стала общей для всех моих платёжных модулей, * платёжный адрес у заказа всегда присутствует, * просто при askForBillingAddress = false платёжный адрес является вырожденным: * он содержит только email покупателя. * * Только что проверил, как метод работает для анонимных покупателей. * Оказывается, если аноничный покупатель при оформлении заказа указал адреса, * то эти адреса в данном методе уже будут доступны как посредством * @see \Magento\Sales\Model\Order::getAddresses() * так и, соответственно, посредством @uses \Magento\Sales\Model\Order::getBillingAddress() * и @uses \Magento\Sales\Model\Order::getShippingAddress() * Так происходит в связи с особенностью реализации метода * @see \Magento\Sales\Model\Order::getAddresses() * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Sales/Model/Order.php#L1957-L1969 if ($this->getData('addresses') == null) { $this->setData('addresses', $this->getAddressesCollection()->getItems()); } return $this->getData('addresses'); * Как видно, метод необязательно получает адреса из базы данных: * для анонимных покупателей (или ранее покупавших, но указавшим в этот раз новый адрес), * адреса берутся из поля «addresses». * А содержимое этого поля устанавливается методом @see \Magento\Sales\Model\Order::addAddress() * https://github.com/magento/magento2/blob/2.1.0/app/code/Magento/Sales/Model/Order.php#L1238-L1250 * * @param bool $bs * @return OA */ private function addressMixed($bs) { return dfc($this, function ($bs) { /** @var OA[] $aa */ $aa = df_clean([$this->addressB(), $this->addressS()]); $aa = $bs ? $aa : array_reverse($aa); /** @var OA $result */ $result = df_create(OA::class, df_clean(df_first($aa)->getData()) + df_last($aa)->getData()); /** * 2016-08-24 * Сам класс @see \Magento\Sales\Model\Order\Address никак order не использует. * Однако пользователи класса могут ожидать работоспособность метода * @see \Magento\Sales\Model\Order\Address::getOrder() * В частности, этого ожидает метод @see \Dfe\TwoCheckout\Address::build() */ $result->setOrder($this->o()); return $result; }, func_get_args()); }
/** * 2015-08-13 * @return BlockInterface */ public function templateFile() { return df_last($this->_templateFileStack); }
/** * 2015-12-13 * @used-by df_fe_uid() * Метод @uses \Magento\Framework\Data\Form\Element\AbstractElement::_getUiId() * возвращает атрибут и его значение уже в виже слитной строки, поэтому парсим её. * https://github.com/magento/magento2/blob/c58d2d/lib/internal/Magento/Framework/Data/Form/Element/AbstractElement.php#L331-L338 * @param AE $element * @param string $suffix [optional] * @return string */ public static function uidSt(AE $element, $suffix = null) { return df_trim(df_last(explode('=', $element->_getUiId($suffix))), '"'); }
/** * 2015-12-29 * 2016-10-20 * Нельзя делать параметр $c опциональным, потому что иначе получим сбой: * «get_class() called without object from outside a class» * https://3v4l.org/k6Hd5 * @param string|object $c * @return string */ function df_class_last($c) { return df_last(df_explode_class($c)); }