123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- /**
- * Entity/Attribute/Model - attribute frontend abstract
- *
- * @author Magento Core Team <core@magentocommerce.com>
- */
- namespace Magento\Eav\Model\Entity\Attribute\Frontend;
- use Magento\Framework\App\CacheInterface;
- use Magento\Framework\Serialize\Serializer\Json as Serializer;
- use Magento\Store\Model\StoreManagerInterface;
- use Magento\Framework\App\ObjectManager;
- use Magento\Eav\Model\Cache\Type as CacheType;
- use Magento\Eav\Model\Entity\Attribute;
- use Magento\Eav\Model\Entity\Attribute\Source\BooleanFactory;
- /**
- * EAV entity attribute form renderer.
- *
- * @api
- * @since 100.0.2
- */
- abstract class AbstractFrontend implements \Magento\Eav\Model\Entity\Attribute\Frontend\FrontendInterface
- {
- /**
- * Default cache tags values
- * will be used if no values in the constructor provided
- * @var array
- */
- private static $defaultCacheTags = [CacheType::CACHE_TAG, Attribute::CACHE_TAG];
- /**
- * @var CacheInterface
- */
- private $cache;
- /**
- * @var StoreManagerInterface
- */
- private $storeManager;
- /**
- * @var Serializer
- */
- private $serializer;
- /**
- * @var array
- */
- private $cacheTags;
- /**
- * Reference to the attribute instance
- *
- * @var \Magento\Eav\Model\Entity\Attribute\AbstractAttribute
- */
- protected $_attribute;
- /**
- * @var BooleanFactory
- */
- protected $_attrBooleanFactory;
- /**
- * @param BooleanFactory $attrBooleanFactory
- * @param CacheInterface $cache
- * @param null $storeResolver @deprecated
- * @param array $cacheTags
- * @param StoreManagerInterface $storeManager
- * @param Serializer $serializer
- * @codeCoverageIgnore
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function __construct(
- BooleanFactory $attrBooleanFactory,
- CacheInterface $cache = null,
- $storeResolver = null,
- array $cacheTags = null,
- StoreManagerInterface $storeManager = null,
- Serializer $serializer = null
- ) {
- $this->_attrBooleanFactory = $attrBooleanFactory;
- $this->cache = $cache ?: ObjectManager::getInstance()->get(CacheInterface::class);
- $this->cacheTags = $cacheTags ?: self::$defaultCacheTags;
- $this->storeManager = $storeManager ?: ObjectManager::getInstance()->get(StoreManagerInterface::class);
- $this->serializer = $serializer ?: ObjectManager::getInstance()->get(Serializer::class);
- }
- /**
- * Set attribute instance
- *
- * @param \Magento\Eav\Model\Entity\Attribute\AbstractAttribute $attribute
- * @return $this
- * @codeCoverageIgnore
- */
- public function setAttribute($attribute)
- {
- $this->_attribute = $attribute;
- return $this;
- }
- /**
- * Get attribute instance
- *
- * @return \Magento\Eav\Model\Entity\Attribute\AbstractAttribute
- * @codeCoverageIgnore
- */
- public function getAttribute()
- {
- return $this->_attribute;
- }
- /**
- * Get attribute type for user interface form
- *
- * @return string
- * @codeCoverageIgnore
- */
- public function getInputType()
- {
- return $this->getAttribute()->getFrontendInput();
- }
- /**
- * Retrieve label
- *
- * @return string
- */
- public function getLabel()
- {
- $label = $this->getAttribute()->getFrontendLabel();
- if ($label === null || $label == '') {
- $label = $this->getAttribute()->getAttributeCode();
- }
- return $label;
- }
- /**
- * Retrieve localized label
- *
- * @return \Magento\Framework\Phrase
- */
- public function getLocalizedLabel()
- {
- return __($this->getLabel());
- }
- /**
- * Retrieve attribute value
- *
- * @param \Magento\Framework\DataObject $object
- * @return mixed
- */
- public function getValue(\Magento\Framework\DataObject $object)
- {
- $value = $object->getData($this->getAttribute()->getAttributeCode());
- if (in_array($this->getConfigField('input'), ['select', 'boolean'])) {
- $valueOption = $this->getOption($value);
- if (!$valueOption) {
- $opt = $this->_attrBooleanFactory->create();
- $options = $opt->getAllOptions();
- if ($options) {
- foreach ($options as $option) {
- if ($option['value'] === $value) {
- $valueOption = $option['label'];
- }
- }
- }
- }
- $value = $valueOption;
- } elseif ($this->getConfigField('input') == 'multiselect') {
- $value = $this->getOption($value);
- if (is_array($value)) {
- $value = implode(', ', $value);
- }
- }
- return $value;
- }
- /**
- * Checks if attribute is visible on frontend
- *
- * @return bool
- * @codeCoverageIgnore
- */
- public function isVisible()
- {
- return $this->getConfigField('frontend_visible');
- }
- /**
- * Retrieve frontend class
- *
- * @return string
- */
- public function getClass()
- {
- $out = [];
- $out[] = $this->getAttribute()->getFrontendClass();
- if ($this->getAttribute()->getIsRequired()) {
- $out[] = 'required-entry';
- }
- $inputRuleClass = $this->_getInputValidateClass();
- if ($inputRuleClass) {
- $out[] = $inputRuleClass;
- }
- $textLengthValidateClasses = $this->getTextLengthValidateClasses();
- if (!empty($textLengthValidateClasses)) {
- $out = array_merge($out, $textLengthValidateClasses);
- }
- $out = !empty($out) ? implode(' ', array_unique(array_filter($out))) : '';
- return $out;
- }
- /**
- * Return validate class by attribute input validation rule
- *
- * @return string|false
- */
- protected function _getInputValidateClass()
- {
- $class = false;
- $validateRules = $this->getAttribute()->getValidateRules();
- if (!empty($validateRules['input_validation'])) {
- switch ($validateRules['input_validation']) {
- case 'alphanumeric':
- $class = 'validate-alphanum';
- break;
- case 'alphanum-with-spaces':
- $class = 'validate-alphanum-with-spaces';
- break;
- case 'numeric':
- $class = 'validate-digits';
- break;
- case 'alpha':
- $class = 'validate-alpha';
- break;
- case 'email':
- $class = 'validate-email';
- break;
- case 'url':
- $class = 'validate-url';
- break;
- case 'length':
- $class = 'validate-length';
- break;
- default:
- $class = false;
- break;
- }
- }
- return $class;
- }
- /**
- * Retrieve validation classes by min_text_length and max_text_length rules
- *
- * @return array
- */
- private function getTextLengthValidateClasses()
- {
- $classes = [];
- if ($this->_getInputValidateClass()) {
- $validateRules = $this->getAttribute()->getValidateRules();
- if (!empty($validateRules['min_text_length'])) {
- $classes[] = 'minimum-length-' . $validateRules['min_text_length'];
- }
- if (!empty($validateRules['max_text_length'])) {
- $classes[] = 'maximum-length-' . $validateRules['max_text_length'];
- }
- if (!empty($classes)) {
- $classes[] = 'validate-length';
- }
- }
- return $classes;
- }
- /**
- * Retrieve config field
- *
- * @param string $fieldName
- * @return mixed
- * @codeCoverageIgnore
- */
- public function getConfigField($fieldName)
- {
- return $this->getAttribute()->getData('frontend_' . $fieldName);
- }
- /**
- * Get select options in case it's select box and options source is defined
- *
- * @return array
- */
- public function getSelectOptions()
- {
- $cacheKey = 'attribute-navigation-option-' .
- $this->getAttribute()->getAttributeCode() . '-' .
- $this->storeManager->getStore()->getId();
- $optionString = $this->cache->load($cacheKey);
- if (false === $optionString) {
- $options = $this->getAttribute()->getSource()->getAllOptions();
- $this->cache->save(
- $this->serializer->serialize($options),
- $cacheKey,
- $this->cacheTags
- );
- } else {
- $options = $this->serializer->unserialize($optionString);
- }
- return $options;
- }
- /**
- * Retrieve option by option id
- *
- * @param int $optionId
- * @return mixed|bool
- */
- public function getOption($optionId)
- {
- $source = $this->getAttribute()->getSource();
- if ($source) {
- return $source->getOptionText($optionId);
- }
- return false;
- }
- /**
- * Retrieve Input Renderer Class
- *
- * @return string|null
- * @codeCoverageIgnore
- */
- public function getInputRendererClass()
- {
- return $this->getAttribute()->getData('frontend_input_renderer');
- }
- }
|