Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Attribute.php
Go to the documentation of this file.
1 <?php
8 
13 
22 class Attribute extends \Magento\Eav\Model\Entity\Attribute\AbstractAttribute implements
23  \Magento\Framework\DataObject\IdentityInterface
24 {
32 
37 
41  const CACHE_TAG = 'EAV_ATTRIBUTE';
42 
48  protected $_eventPrefix = 'eav_entity_attribute';
49 
57  protected $_eventObject = 'attribute';
58 
63 
67  protected $_localeDate;
68 
73 
77  protected $_localeResolver;
78 
82  protected $dateTimeFormatter;
83 
107  public function __construct(
108  \Magento\Framework\Model\Context $context,
109  \Magento\Framework\Registry $registry,
110  \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
112  \Magento\Eav\Model\Config $eavConfig,
113  \Magento\Eav\Model\Entity\TypeFactory $eavTypeFactory,
114  \Magento\Store\Model\StoreManagerInterface $storeManager,
115  \Magento\Eav\Model\ResourceModel\Helper $resourceHelper,
116  \Magento\Framework\Validator\UniversalFactory $universalFactory,
117  \Magento\Eav\Api\Data\AttributeOptionInterfaceFactory $optionDataFactory,
118  \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor,
119  \Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
120  \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
121  \Magento\Catalog\Model\Product\ReservedAttributeList $reservedAttributeList,
122  \Magento\Framework\Locale\ResolverInterface $localeResolver,
124  \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
125  \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
126  array $data = []
127  ) {
128  parent::__construct(
129  $context,
130  $registry,
131  $extensionFactory,
133  $eavConfig,
134  $eavTypeFactory,
136  $resourceHelper,
137  $universalFactory,
141  $resource,
142  $resourceCollection,
143  $data
144  );
145  $this->_localeDate = $localeDate;
146  $this->_localeResolver = $localeResolver;
147  $this->reservedAttributeList = $reservedAttributeList;
148  $this->dateTimeFormatter = $dateTimeFormatter;
149  }
150 
156  protected function _getDefaultBackendModel()
157  {
158  switch ($this->getAttributeCode()) {
159  case 'created_at':
160  return \Magento\Eav\Model\Entity\Attribute\Backend\Time\Created::class;
161 
162  case 'updated_at':
163  return \Magento\Eav\Model\Entity\Attribute\Backend\Time\Updated::class;
164 
165  case 'store_id':
166  return \Magento\Eav\Model\Entity\Attribute\Backend\Store::class;
167 
168  case 'increment_id':
169  return \Magento\Eav\Model\Entity\Attribute\Backend\Increment::class;
170 
171  default:
172  break;
173  }
174 
175  return parent::_getDefaultBackendModel();
176  }
177 
183  protected function _getDefaultSourceModel()
184  {
185  if ($this->getAttributeCode() == 'store_id') {
186  return \Magento\Eav\Model\Entity\Attribute\Source\Store::class;
187  }
188  return parent::_getDefaultSourceModel();
189  }
190 
197  public function deleteEntity()
198  {
199  return $this->_getResource()->deleteEntity($this);
200  }
201 
207  public function loadEntityAttributeIdBySet()
208  {
209  // load attributes collection filtered by attribute_id and attribute_set_id
210 
211  $filteredAttributes = $this->getResourceCollection()->setAttributeSetFilter(
212  $this->getAttributeSetId()
213  )->addFieldToFilter(
214  'entity_attribute.attribute_id',
215  $this->getId()
216  )->load();
217  if (count($filteredAttributes) > 0) {
218  // getFirstItem() can be used as we can have one or zero records in the collection
219  $this->setEntityAttributeId($filteredAttributes->getFirstItem()->getEntityAttributeId());
220  }
221  return $this;
222  }
223 
232  public function beforeSave()
233  {
234  // prevent overriding product data
235  if (isset($this->_data['attribute_code']) && $this->reservedAttributeList->isReservedAttribute($this)) {
236  throw new LocalizedException(
237  __(
238  'The attribute code \'%1\' is reserved by system. Please try another attribute code',
239  $this->_data['attribute_code']
240  )
241  );
242  }
243 
247  if (isset(
248  $this->_data['attribute_code']
249  ) && !\Zend_Validate::is(
250  $this->_data['attribute_code'],
251  'StringLength',
252  ['max' => self::ATTRIBUTE_CODE_MAX_LENGTH]
253  )
254  ) {
255  throw new LocalizedException(
256  __(
257  'The attribute code needs to be %1 characters or fewer. Re-enter the code and try again.',
258  self::ATTRIBUTE_CODE_MAX_LENGTH
259  )
260  );
261  }
262 
263  $defaultValue = $this->getDefaultValue();
264  $hasDefaultValue = (string)$defaultValue != '';
265 
266  if ($this->getBackendType() == 'decimal' && $hasDefaultValue) {
267  $numberFormatter = new \NumberFormatter($this->_localeResolver->getLocale(), \NumberFormatter::DECIMAL);
268  $defaultValue = $numberFormatter->parse($defaultValue);
269  if ($defaultValue === false) {
270  throw new LocalizedException(
271  __('The default decimal value is invalid. Verify the value and try again.')
272  );
273  }
274  $this->setDefaultValue($defaultValue);
275  }
276 
277  if ($this->getBackendType() == 'datetime') {
278  if (!$this->getBackendModel()) {
279  $this->setBackendModel(\Magento\Eav\Model\Entity\Attribute\Backend\Datetime::class);
280  }
281 
282  if (!$this->getFrontendModel()) {
283  $this->setFrontendModel(\Magento\Eav\Model\Entity\Attribute\Frontend\Datetime::class);
284  }
285 
286  // save default date value as timestamp
287  if ($hasDefaultValue) {
288  try {
289  $locale = $this->_localeResolver->getLocale();
290  $defaultValue = $this->_localeDate->date($defaultValue, $locale, false, false);
291  $this->setDefaultValue($defaultValue->format(DateTime::DATETIME_PHP_FORMAT));
292  } catch (\Exception $e) {
293  throw new LocalizedException(__('The default date is invalid. Verify the date and try again.'));
294  }
295  }
296  }
297 
298  if ($this->getBackendType() == 'gallery') {
299  if (!$this->getBackendModel()) {
300  $this->setBackendModel(\Magento\Eav\Model\Entity\Attribute\Backend\DefaultBackend::class);
301  }
302  }
303 
304  return parent::beforeSave();
305  }
306 
312  public function afterSave()
313  {
314  $this->_getResource()->saveInSetIncluding($this);
315  return parent::afterSave();
316  }
317 
322  public function afterDelete()
323  {
324  return parent::afterDelete();
325  }
326 
334  public function getBackendTypeByInput($type)
335  {
336  $field = null;
337  switch ($type) {
338  case 'text':
339  case 'gallery':
340  case 'media_image':
341  case 'multiselect':
342  $field = 'varchar';
343  break;
344 
345  case 'image':
346  case 'textarea':
347  $field = 'text';
348  break;
349 
350  case 'date':
351  $field = 'datetime';
352  break;
353 
354  case 'select':
355  case 'boolean':
356  $field = 'int';
357  break;
358 
359  case 'price':
360  case 'weight':
361  $field = 'decimal';
362  break;
363 
364  default:
365  break;
366  }
367 
368  return $field;
369  }
370 
378  public function getDefaultValueByInput($type)
379  {
380  $field = '';
381  switch ($type) {
382  case 'select':
383  case 'gallery':
384  case 'media_image':
385  break;
386  case 'multiselect':
387  $field = null;
388  break;
389 
390  case 'text':
391  case 'price':
392  case 'image':
393  case 'weight':
394  $field = 'default_value_text';
395  break;
396 
397  case 'textarea':
398  case 'texteditor':
399  $field = 'default_value_textarea';
400  break;
401 
402  case 'date':
403  $field = 'default_value_date';
404  break;
405 
406  case 'boolean':
407  $field = 'default_value_yesno';
408  break;
409 
410  default:
411  break;
412  }
413 
414  return $field;
415  }
416 
425  {
426  return $this->getResource()->getAttributeCodesByFrontendType($type);
427  }
428 
434  public function getStoreLabels()
435  {
436  if (!$this->getData('store_labels')) {
437  $storeLabel = $this->getResource()->getStoreLabelsByAttributeId($this->getId());
438  $this->setData('store_labels', $storeLabel);
439  }
440  return $this->getData('store_labels');
441  }
442 
449  public function getStoreLabel($storeId = null)
450  {
451  if ($this->hasData('store_label')) {
452  return $this->getData('store_label');
453  }
454  $store = $this->_storeManager->getStore($storeId);
455  $labels = $this->getStoreLabels();
456  if (isset($labels[$store->getId()])) {
457  return $labels[$store->getId()];
458  } else {
459  return $this->getFrontendLabel();
460  }
461  }
462 
469  public function getSortWeight($setId)
470  {
471  $groupSortWeight = isset($this->_data['attribute_set_info'][$setId]['group_sort'])
472  ? (float) $this->_data['attribute_set_info'][$setId]['group_sort'] * 1000
473  : 0.0;
474  $sortWeight = isset($this->_data['attribute_set_info'][$setId]['sort'])
475  ? (float) $this->_data['attribute_set_info'][$setId]['sort'] * 0.0001
476  : 0.0;
477  return $groupSortWeight + $sortWeight;
478  }
479 
486  public function getIdentities()
487  {
488  return [self::CACHE_TAG . '_' . $this->getId()];
489  }
490 
495  public function __sleep()
496  {
497  $this->unsetData('attribute_set_info');
498  return array_diff(
499  parent::__sleep(),
500  ['_localeDate', '_localeResolver', 'reservedAttributeList', 'dateTimeFormatter']
501  );
502  }
503 
508  public function __wakeup()
509  {
512  $this->_localeDate = $objectManager->get(\Magento\Framework\Stdlib\DateTime\TimezoneInterface::class);
513  $this->_localeResolver = $objectManager->get(\Magento\Framework\Locale\ResolverInterface::class);
514  $this->reservedAttributeList = $objectManager->get(\Magento\Catalog\Model\Product\ReservedAttributeList::class);
515  $this->dateTimeFormatter = $objectManager->get(DateTimeFormatterInterface::class);
516  }
517 }
$objectManager
Definition: bootstrap.php:17
$storeManager
__()
Definition: __.php:13
$resource
Definition: bulk.php:12
$type
Definition: item.phtml:13
__construct(\Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory, AttributeValueFactory $customAttributeFactory, \Magento\Eav\Model\Config $eavConfig, \Magento\Eav\Model\Entity\TypeFactory $eavTypeFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Eav\Model\ResourceModel\Helper $resourceHelper, \Magento\Framework\Validator\UniversalFactory $universalFactory, \Magento\Eav\Api\Data\AttributeOptionInterfaceFactory $optionDataFactory, \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor, \Magento\Framework\Api\DataObjectHelper $dataObjectHelper, \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, \Magento\Catalog\Model\Product\ReservedAttributeList $reservedAttributeList, \Magento\Framework\Locale\ResolverInterface $localeResolver, DateTimeFormatterInterface $dateTimeFormatter, \Magento\Framework\Model\ResourceModel\AbstractResource $resource=null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection=null, array $data=[])
Definition: Attribute.php:107
static is($value, $classBaseName, array $args=array(), $namespaces=array())
Definition: Validate.php:195