/** * 2016-03-27 * @param OrderInterface|Order $order * @param int $transactionId * @param $allowNull [optional] * @return Invoice|null */ function df_invoice_by_transaction(OrderInterface $order, $transactionId, $allowNull = false) { /** @var Invoice|null $result */ $result = df_ftn(DfPayment::getInvoiceForTransactionId($order, $transactionId)); df_assert($allowNull || $result); return $result; }
/** * @return Df_YandexMarket_Helper_Settings */ private function getSettings() { /** @var Df_YandexMarket_Helper_Settings $result */ $result = df_cfg()->yandexMarket(); df_assert($result instanceof Df_YandexMarket_Helper_Settings); return $result; }
/** * @return void */ public function indexAction() { /** @var Df_YandexMarket_Model_Action_Front $action */ $action = df_model(Df_YandexMarket_Model_Action_Front::getNameInMagentoFormat(), array(Df_YandexMarket_Model_Action_Front::PARAM__CONTROLLER => $this)); df_assert($action instanceof Df_YandexMarket_Model_Action_Front); $action->process(); }
/** * @return Df_YandexMarket_Helper_Settings_Shop */ public function shop() { /** @var Df_YandexMarket_Helper_Settings_Shop $result */ static $result; if (!isset($result)) { /** @var Df_YandexMarket_Helper_Settings_Shop $result */ $result = Mage::helper(Df_YandexMarket_Helper_Settings_Shop::getNameInMagentoFormat()); df_assert($result instanceof Df_YandexMarket_Helper_Settings_Shop); } return $result; }
/** * @override * @param Varien_Data_Form_Element_Abstract $element * @return string */ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) { /** @var Df_YandexMarket_Model_Field_Conditions $field */ $field = df_model(Df_YandexMarket_Model_Field_Conditions::getNameInMagentoFormat(), array(Df_YandexMarket_Model_Field_Conditions::PARAM__ELEMENT => $element, Df_YandexMarket_Model_Field_Conditions::PARAM__BLOCK => $this)); df_assert($field instanceof Df_YandexMarket_Model_Field_Conditions); /** @var string $result */ $result = $field->getHtml(); $result .= sprintf('<input type="hidden" value="0" name="%s"/>', $element->getData('name')); df_result_string($result); return $result; }
/** * @param string $locale * @return \Zend_Validate_Interface */ protected function getZendValidator($locale) { df_param_string_not_empty($locale, 0); if (!isset($this->{__METHOD__}[$locale])) { /** @var string $class */ $class = $this->getZendValidatorClass(); /** @var \Zend_Validate_Interface $result */ $result = new $class($locale); df_assert($result instanceof \Zend_Validate_Interface); $this->{__METHOD__}[$locale] = $result; } return $this->{__METHOD__}[$locale]; }
/** * @return Mage_Core_Model_Store */ public function getStoreProcessed() { if (!isset($this->_storeProcessed)) { /** @var Df_Core_Model_ActionHelper_StoreProcessed $helper */ $helper = df_model(Df_Core_Model_ActionHelper_StoreProcessed::getNameInMagentoFormat(), array(Df_Core_Model_ActionHelper_StoreProcessed::PARAM__MODULE_NAME => 'Яндекс.Маркет', Df_Core_Model_ActionHelper_StoreProcessed::PARAM__URL_EXAMPLE => 'http://example.ru/df-yandex-market/yml/?store-view=<системное имя витрины>/')); df_assert($helper instanceof Df_Core_Model_ActionHelper_StoreProcessed); /** @var Mage_Core_Model_Store $result */ $result = $helper->getStoreProcessed(); df_assert($result instanceof Mage_Core_Model_Store); $this->_storeProcessed = $result; } df_assert($this->_storeProcessed instanceof Mage_Core_Model_Store); return $this->_storeProcessed; }
/** * @return Mage_CatalogRule_Model_Rule */ public function getRule() { if (!isset($this->_rule)) { /** @var Mage_CatalogRule_Model_Rule $result */ $result = df_model('catalogrule/rule'); df_assert($result instanceof Mage_CatalogRule_Model_Rule); $result->load($this->getConditions()); df_assert_between($result->getId(), 1); df_assert($result instanceof Mage_CatalogRule_Model_Rule); $this->_rule = $result; } df_assert($this->_rule instanceof Mage_CatalogRule_Model_Rule); return $this->_rule; }
/** * @return Mage_Directory_Model_Currency */ public function getCurrency() { if (!isset($this->_currency)) { /** @var string $currencyCode */ $currencyCode = Mage::getStoreConfig('df_yandex_market/general/currency', df_helper()->yandexMarket()->getStoreProcessed()); df_result_string($currencyCode); /** @var Mage_Directory_Model_Currency $result */ $result = df_model(Df_Directory_Const::CURRENCY_CLASS_MF); df_assert($result instanceof Mage_Directory_Model_Currency); $result->load($currencyCode); $this->_currency = $result; } df_assert($this->_currency instanceof Mage_Directory_Model_Currency); return $this->_currency; }
/** * @return Mage_CatalogRule_Model_Rule */ private function getRule() { if (!isset($this->_rule)) { /** @var Mage_CatalogRule_Model_Rule $result */ $result = df_model('catalogrule/rule'); df_assert($result instanceof Mage_CatalogRule_Model_Rule); if (0 < $this->getRuleExistingId()) { $result->load($this->getRuleExistingId()); df_assert_between($result->getId(), 1); } $result->addData(array('name' => 'Яндекс.Маркет', 'description' => 'не редактировать')); $this->_rule = $result; } df_assert($this->_rule instanceof Mage_CatalogRule_Model_Rule); return $this->_rule; }
/** * 2015-02-26 * Складывает 2 числовых массива как векторы. * Второй аргумент может быть также числом: * тогда считается, что все координаты этого вектора равны данному числу. * @param int[]|float[] $a * @param int|float|int[]|float[] $b * @return int[]|float[] */ function df_vector_sum(array $a, $b) { /** @var int $length */ $length = count($a); if (!is_array($b)) { $b = dfa_fill(0, $length, $b); } else { df_assert($length === count($b)); $b = array_values($b); } $a = array_values($a); /** @var int[]|float[] $result */ $result = []; for ($i = 0; $i < $length; $i++) { $result[] = $a[$i] + $b[$i]; } return $result; }
/** * @used-by \Df\Qa\Method::raiseErrorParam() * @param int $paramOrdering zero-based * @return \ReflectionParameter */ public function methodParameter($paramOrdering) { df_param_integer($paramOrdering, 0); if (!isset($this->{__METHOD__}[$paramOrdering])) { // Метод должен существовать df_assert($this->method()); // Параметр должен существовать if ($paramOrdering >= count($this->method()->getParameters())) { df_error("Программист ошибочно пытается получить значение параметра с индексом {$paramOrdering}" . " метода «{$this->methodName()}», хотя этот метод принимает всего %d параметров.", count($this->method()->getParameters())); } df_assert_lt(count($this->method()->getParameters()), $paramOrdering); /** @var \ReflectionParameter $result */ $result = dfa($this->method()->getParameters(), $paramOrdering); df_assert($result instanceof \ReflectionParameter); $this->{__METHOD__}[$paramOrdering] = $result; } return $this->{__METHOD__}[$paramOrdering]; }
/** * 2016-03-26 * @param string|M $model * Идентификатор необязательно является целым числом, * потому что объект может загружаться по нестандартному ключу * (с указанием этого ключа параметром $field). * Так же, и первичный ключ может не быть целым числом (например, при загрузке валют). * @param string|int $id * @param bool $throwOnAbsence [optional] * @param string|null $field [optional] * @return M|null */ function df_load($model, $id, $throwOnAbsence = true, $field = null) { df_assert($id); if (!is_null($field)) { df_param_string($field, 3); } /** @var M|null $result */ $result = is_string($model) ? df_om()->create($model) : $model; df_assert($result instanceof M); $result->load($id, $field); if (!$result->getId()) { if (!$throwOnAbsence) { $result = null; } else { df_error('A model of class «%s» with ID «%s» is absent.', get_class($result), $id); } } return $result; }
/** * @param string $path * @param bool $isDir [optional] * @return void */ public function createAndMakeWritable($path, $isDir = false) { df_param_string_not_empty($path, 0); if (!isset($this->{__METHOD__}[$path])) { if (file_exists($path)) { df_assert(is_dir($path) === $isDir); $this->chmod($path); } else { /** @var string $dir */ $dir = $isDir ? $path : dirname($path); if (!file_exists($dir)) { $this->mkdir($dir); } else { $this->chmod($dir); } } $this->{__METHOD__}[$path] = true; } }
/** * @overide * @return Df_YandexMarket_Model_System_Config_Backend_Currency */ protected function _beforeSave() { parent::_beforeSave(); if (!in_array($this->getValue(), Df_YandexMarket_Model_System_Config_Source_Currency::getAllowedCurrencies())) { /** @var string $currencyName */ $currencyName = $this->getValue(); try { /** @var Zend_Currency $result */ $currency = Mage::app()->getLocale()->currency($this->getValue()); $currencyName = $currency->getName(); } catch (Exception $e) { } df_error(sprintf('Яндекс.Маркет не допускает указанную Вами валюту «%s» в качестве основной валюты магазина.', $currencyName)); } else { /** @var Df_Admin_Model_Config_BackendChecker_CurrencyIsSupported $checker */ $checker = df_model(Df_Admin_Model_Config_BackendChecker_CurrencyIsSupported::getNameInMagentoFormat(), array(Df_Admin_Model_Config_BackendChecker_CurrencyIsSupported::PARAM__CURRENCY_CODE => $this->getValue(), Df_Admin_Model_Config_BackendChecker_CurrencyIsSupported::PARAM__BACKEND => $this)); df_assert($checker instanceof Df_Admin_Model_Config_BackendChecker_CurrencyIsSupported); $checker->check(); } return $this; }
/** * 2015-12-08 * @override * @see \Df\GoogleFont\Fonts\Png::draw() * @used-by \Df\GoogleFont\Fonts\Png::image() * @param resource $image * @return void */ protected function draw($image) { /** @var int $x */ $x = 0; /** @var int $y */ $y = 0; $this->_datumPoints = []; /** @var int|bool|resource $r */ $r = imagefill($image, 0, 0, $this->colorAllocateAlpha($image, $this->bgColor())); df_assert($r); // http://stackoverflow.com/a/1397584/254475 imagealphablending($image, true); foreach ($this->previews() as $preview) { /** @var Preview $preview */ try { /** @var resource $previewImage */ $previewImage = imagecreatefromstring($preview->contents()); df_assert($previewImage); try { $r = imagecopy($image, $previewImage, $x, $y, 0, 0, $preview->width(), $preview->height()); df_assert($r); $this->_datumPoints[$preview->getId()] = [$x, $y]; } finally { imagedestroy($previewImage); } } catch (\Exception $e) { df_log($e->getMessage()); } $x += $this->previewWidth(); if ($x >= $this->width()) { $x = 0; $y += $this->previewHeight() + $this->marginY(); } } df_media_write($this->pathToDatumPoints(), df_json_encode($this->_datumPoints)); }
/** * 2016-08-03 * @override * @see \Df\Config\O::validate() * @used-by \Df\Config\Backend\Serialized::validate() * @return void * @throws DFE */ public function validate() { df_assert(!is_array($this['scale_horizontal'])); }
/** * @return Mage_CatalogRule_Model_Rule */ private function getRule() { if (!isset($this->_rule)) { /** @var Mage_CatalogRule_Model_Rule $result */ $result = df_model('catalogrule/rule'); df_assert($result instanceof Mage_CatalogRule_Model_Rule); if (0 < $this->getRuleId()) { $result->load($this->getRuleId()); } $result->getConditions()->setJsFormObject('rule_conditions_fieldset'); $this->_rule = $result; } df_assert($this->_rule instanceof Mage_CatalogRule_Model_Rule); return $this->_rule; }
/** * 2015-12-30 * @param string $itemClass * @param mixed[] $itemsA * @return $this */ public static function i($itemClass, array $itemsA) { df_assert(!isset($itemsA[self::FAKE])); return new self([self::$P__ITEM_CLASS => $itemClass, self::$P__ITEMS_A => $itemsA]); }
/** * 2015-12-08 * @used-by \Df\GoogleFont\Fonts\Png::create() * @return resource */ private function image() { /** @var resource|bool $result */ $result = imagecreatetruecolor($this->width(), $this->height()); df_assert(false !== $result); $r = imagesavealpha($result, true); df_assert($r); $this->draw($result); return $result; }
/** * @return Mage_Core_Model_Store */ private function getStore() { /** @var Mage_Core_Model_Store $result */ $result = df_helper()->yandexMarket()->getStoreProcessed(); df_assert($result instanceof Mage_Core_Model_Store); return $result; }
/** * 2015-11-30 * 2015-12-13 * Обратите внимание, что $label может быть как пустой строкой, так и null, * и система будет вести себя по-разному в этих случаях. * Если $label равно null, то подпись у элемента будет отсутствовать. * Если $label равно пустой строке, то у элемента будет пустая подпись: * пустые теги <label><span></span></label> * Пустая подпись позволяет нам задействовать в качестве подписи FontAwesome: * мы цепляем к пустому тегу label правила типа: > label:not(.addafter) { display: inline-block; font-family: FontAwesome; // http://fortawesome.github.io/Font-Awesome/icon/text-width/ &:before {content: "\f035";} } * * 2015-12-28 * Добавил возможность передачи в качестве $values простого одномерного массива, * например: $this->select('decimalSeparator', 'Decimal Separator', ['.', ',']); * * @used-by \Df\Framework\Form\Element\Fieldset::yesNo() * @param string $name * @param string|null|Phrase $label * @param array(array(string => string|int))|string[]|string|OptionSourceInterface $values * @param array(string => mixed)|string $data [optional] * @param string|null $type [optional] * @return \Magento\Framework\Data\Form\Element\Select|E */ protected function select($name, $label, $values, $data = [], $type = 'select') { if (!is_array($values)) { if (!$values instanceof OptionSourceInterface) { $values = df_o($values); } df_assert($values instanceof OptionSourceInterface); $values = $values->toOptionArray(); } if (!is_array($data)) { $data = ['note' => $data]; } return $this->field($name, $type, $label, $data + ['values' => df_a_to_options($values)]); }
/** * 2016-08-24 * 2016-09-04 * Метод getId присутствует не только у потомков @see \Magento\Framework\Model\AbstractModel, * но и у классов сторонних библиотек, например: * https://github.com/CKOTech/checkout-php-library/blob/v1.2.4/com/checkout/ApiServices/Charges/ResponseModels/Charge.php?ts=4#L170-L173 * По возможности, задействуем и сторонние реализации. * * К сожалению, нельзя здесь для проверки публичности метода использовать @see is_callable(), * потому что наличие @see \Magento\Framework\DataObject::__call() * приводит к тому, что @see is_callable всегда возвращает true. * Обратите внимание, что @uses method_exists(), в отличие от @see is_callable(), * не гарантирует публичную доступность метода: * т.е. метод может у класса быть, но вызывать его всё равно извне класса нельзя, * потому что он имеет доступность private или protected. * Пока эта проблема никак не решена. * * 2016-09-05 * Этот код прекрасно работает с объектами классов типа @see \Magento\Directory\Model\Currency * благодаря тому, что @uses \Magento\Framework\Model\AbstractModel::getId() * не просто тупо считывает значение поля id, а вызывает метод * @see \Magento\Framework\Model\AbstractModel::getIdFieldName() * который, в ссвою очередь, узнаёт имя идентифицирующего поля из своего ресурса: * @see \Magento\Framework\Model\AbstractModel::_init() * @see \Magento\Directory\Model\ResourceModel\Currency::_construct() * * @see dfo_hash() использует тот же алгоритм, но не вызывает @see df_id() ради ускорения. * * @param object|int|string $o * @param bool $allowNull [optional] * @return int|string|null */ function df_id($o, $allowNull = false) { /** @var int|string|null $result */ $result = !is_object($o) ? $o : ($o instanceof M || method_exists($o, 'getId') ? $o->getId() : null); df_assert($allowNull || $result); return $result; }
/** * @param string|null $key * @param mixed $value * @param string[]|bool $wrapInCData [optional] * @return X */ private function importString($key, $value, $wrapInCData = []) { /** @var bool $wrapInCDataAll */ $wrapInCDataAll = is_array($wrapInCData) ? false : !!$wrapInCData; $wrapInCData = df_nta($wrapInCData); /** * null означает, что метод importString * не должен создавать дочерний тэг $key, * а должен добавить текст * в качестве единственного содержимого текущего тэга */ if (!is_null($key)) { df_param_string($key, 0); } /** @var string $keyAsString */ $keyAsString = is_null($key) ? $this->getName() : $key; /** * @var bool $valueIsString */ $valueIsString = is_string($value); /** @var string $valueAsString */ $valueAsString = null; try { $valueAsString = $valueIsString ? $value : df_string($value); } catch (E $e) { df_error("Не могу сконвертировать значение ключа «%s» в строку.\n%s", $keyAsString, df_ets($e)); } /** @var bool $needWrapInCData */ $needWrapInCData = $wrapInCDataAll; if ($valueIsString && $valueAsString) { /** * Поддержка синтаксиса array( 'Представление' => df_cdata( $this->getAddress()->format( Mage_Customer_Model_Attribute_Data::OUTPUT_FORMAT_TEXT ) ) ) * Обратите внимание, что проверка на синтаксис[[]] должна предшествовать * проверке на принадлежность ключа $keyAsString в массиве $wrapInCData, * потому что при соответствии синтаксису[[]] нам надо удалить из значения символы[[]]. * Обратите внимание, что нам нужно выполнить проверку на синтаксис df_cdata ([[]]) * даже при $wrapInCDataAll = true, потому что маркеры [[ и ]] из данных надо удалять. */ /** * Перед вызовом медленной функции @see preg_match * выполняем более быструю и простую проверку @see df_contains */ if (df_contains($valueAsString, '[[') && df_contains($valueAsString, ']]')) { /** @var string $pattern */ $pattern = "#\\[\\[([\\s\\S]*)\\]\\]#mu"; /** @var string[] $matches */ $matches = []; if (1 === preg_match($pattern, $valueAsString, $matches)) { $valueAsString = $matches[1]; $needWrapInCData = true; } } $needWrapInCData = $needWrapInCData || in_array($keyAsString, $wrapInCData); } /** @var X $result */ $result = $needWrapInCData ? is_null($key) ? $this->setCData($valueAsString) : $this->addChildText($keyAsString, $valueAsString) : (is_null($key) ? $this->setValue($valueAsString) : $this->addChild($keyAsString, $valueAsString)); df_assert($result instanceof X); return $result; }
/** * @param mixed|null $value * @param bool $skipEmptyCheck [optional] * @return mixed[] */ function df_nta($value, $skipEmptyCheck = false) { if (!is_array($value)) { if (!$skipEmptyCheck) { df_assert(empty($value)); } $value = []; } return $value; }
/** * @used-by df_throw_last_error() * @return void * @throws Exception */ public static function throwLast() { df_assert(error_get_last()); df_error(self::i()->main()); }
/** * @param string $class * @param string|string[] $functions * @return string[] */ protected static function _m($class, $functions) { df_assert($functions); /** @var string[] $result */ $result = []; if (!is_array($functions)) { $functions = df_tail(func_get_args()); } foreach ($functions as $function) { /** @var string $function */ $result[] = df_cc_method($class, $function); } return $result; }
/** * 2016-02-08 * @override * @see \Magento\Payment\Model\MethodInterface::getFormBlockType() * https://github.com/magento/magento2/blob/6ce74b2/app/code/Magento/Payment/Model/MethodInterface.php#L25-L32 * @see \Magento\Payment\Model\Method\AbstractMethod::getFormBlockType() * https://github.com/magento/magento2/blob/6ce74b2/app/code/Magento/Payment/Model/Method/AbstractMethod.php#L510-L518 * * USAGE * How is a payment method's getFormBlockType() used? https://mage2.pro/t/691 * @used-by \Magento\Payment\Helper\Data::getMethodFormBlock() * https://github.com/magento/magento2/blob/6ce74b2/app/code/Magento/Payment/Helper/Data.php#L174 * * 2016-02-29 * Этот метод используется только в административном интерфейсе * (в сценарии создания и оплаты заказа администратором). * * @return void */ public function getFormBlockType() { df_assert(df_is_backend()); df_should_not_be_here(); }
/** * 2015-12-10 * http://php.net/manual/function.imagettfbbox.php * * Пример $box для шрифта «ABeeZee (regular)»: * [-1, 4, 159, 4, 159 -16, -1, -16] * Bottom Left: [-1, 4] * Bottom Right: [159, 4] * Top Right: [159, -16] * Top Left: [-1, -16] * * Прочитайте в Википедии статью про baseline (и смотрите там картинку): * https://en.wikipedia.org/wiki/Baseline_(typography) * * Точка отсчёта системы координат [0, 0] — это самая левая точка baseline. * Далее кординаты увеличиваются вниз и вправо. * В описанном выше примере нижняя координата Y имеет значение 4: * это значит, что самая нижняя точка текста расположена на 4 пикселя ниже baseline. * Верхяя координата Y имеет значение -16: * это значит, что самая верхняя точка текста расположена на 16 пикселей выше baseline. * * Почему левая координата X получилась отрицательной? * Видимо, из-за левой засечки первой буквы текста «A». * * @param int|null $index [optional] * @return int|int[] * @throws \Exception */ private function box($index = null) { if (!isset($this->{__METHOD__})) { try { /** @var int[] $box */ $this->{__METHOD__} = imagettfbbox($this->fontSize(), 0, $this->ttfPath(), $this->text()); df_assert(false !== $this->{__METHOD__}); } catch (\Exception $e) { throw new \Exception("Unable to load the TTF file for the font" . " «{$this->family()} ({$this->variant()->name()})»: «{$this->ttfPath()}»." . "\n" . $e->getMessage(), 0, $e); } } return is_null($index) ? $this->{__METHOD__} : $this->{__METHOD__}[$index]; }
/** * 2016-05-20 * Возвращает страну по её 2-буквенному коду по стандарту ISO 3166-1 alpha-2. * https://ru.wikipedia.org/wiki/ISO_3166-1 * @param string $iso2 * @param bool $throw [optional] * @return C|null */ function df_country($iso2, $throw = true) { return dfcf(function ($iso2, $throw = true) { /** @var C|null $result */ $result = !df_check_iso2($iso2) ? null : df_countries()->getItemById($iso2); if ($result) { df_assert($result instanceof C); } else { if ($throw) { df_error('Не могу найти страну по 2-буквенному коду «%s».', $iso2); } } return $result; }, func_get_args()); }