/app/code/core/Mage/Eav/Model/Entity/Attribute.php
PHP | 345 lines | 192 code | 40 blank | 113 comment | 26 complexity | 6767004ad4d075e23e07f22e0f8d5b12 MD5 | raw file
- <?php
- /**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category Mage
- * @package Mage_Eav
- * @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
- */
-
-
- /**
- * EAV Entity attribute model
- *
- * @category Mage
- * @package Mage_Eav
- * @author Magento Core Team <core@magentocommerce.com>
- */
- class Mage_Eav_Model_Entity_Attribute extends Mage_Eav_Model_Entity_Attribute_Abstract
- {
- /**
- * Prefix of model events names
- *
- * @var string
- */
- protected $_eventPrefix = 'eav_entity_attribute';
-
- CONST ATTRIBUTE_CODE_MAX_LENGTH = 30;
-
- /**
- * Parameter name in event
- *
- * In observe method you can use $observer->getEvent()->getAttribute() in this case
- *
- * @var string
- */
- protected $_eventObject = 'attribute';
-
- const CACHE_TAG = 'EAV_ATTRIBUTE';
- protected $_cacheTag = 'EAV_ATTRIBUTE';
-
- /**
- * Retreive default attribute backend model by attribute code
- *
- * @return string
- */
- protected function _getDefaultBackendModel()
- {
- switch ($this->getAttributeCode()) {
- case 'created_at':
- return 'eav/entity_attribute_backend_time_created';
-
- case 'updated_at':
- return 'eav/entity_attribute_backend_time_updated';
-
- case 'store_id':
- return 'eav/entity_attribute_backend_store';
-
- case 'increment_id':
- return 'eav/entity_attribute_backend_increment';
- }
-
- return parent::_getDefaultBackendModel();
- }
-
- /**
- * Retreive default attribute frontend model
- *
- * @return string
- */
- protected function _getDefaultFrontendModel()
- {
- return parent::_getDefaultFrontendModel();
- }
-
- /**
- * Retreive default attribute source model
- *
- * @return string
- */
- protected function _getDefaultSourceModel()
- {
- if ($this->getAttributeCode() == 'store_id') {
- return 'eav/entity_attribute_source_store';
- }
- return parent::_getDefaultSourceModel();
- }
-
- /**
- * Delete entity
- *
- * @return Mage_Eav_Model_Resource_Entity_Attribute
- */
- public function deleteEntity()
- {
- return $this->_getResource()->deleteEntity($this);
- }
-
- /**
- * Load entity_attribute_id into $this by $this->attribute_set_id
- *
- * @return Mage_Core_Model_Abstract
- */
- public function loadEntityAttributeIdBySet()
- {
- // load attributes collection filtered by attribute_id and attribute_set_id
- $filteredAttributes = $this->getResourceCollection()
- ->setAttributeSetFilter($this->getAttributeSetId())
- ->addFieldToFilter('entity_attribute.attribute_id', $this->getId())
- ->load();
- if (count($filteredAttributes) > 0) {
- // getFirstItem() can be used as we can have one or zero records in the collection
- $this->setEntityAttributeId($filteredAttributes->getFirstItem()->getEntityAttributeId());
- }
- return $this;
- }
-
- /**
- * Prepare data for save
- *
- * @return Mage_Eav_Model_Entity_Attribute
- */
- protected function _beforeSave()
- {
- // prevent overriding product data
- if (isset($this->_data['attribute_code'])
- && Mage::getModel('catalog/product')->isReservedAttribute($this))
- {
- throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('The attribute code \'%s\' is reserved by system. Please try another attribute code', $this->_data['attribute_code']));
- }
-
- /**
- * Check for maximum attribute_code length
- */
- if (isset($this->_data['attribute_code']) &&
- !Zend_Validate::is(
- $this->_data['attribute_code'],
- 'StringLength',
- array('max' => self::ATTRIBUTE_CODE_MAX_LENGTH)
- )
- ) {
- throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Maximum length of attribute code must be less then %s symbols', self::ATTRIBUTE_CODE_MAX_LENGTH));
- }
-
- $defaultValue = $this->getDefaultValue();
- $hasDefaultValue = ((string)$defaultValue != '');
-
- if ($this->getBackendType() == 'decimal' && $hasDefaultValue) {
- $locale = Mage::app()->getLocale()->getLocaleCode();
- if (!Zend_Locale_Format::isNumber($defaultValue, array('locale' => $locale))) {
- throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid default decimal value'));
- }
-
- try {
- $filter = new Zend_Filter_LocalizedToNormalized(
- array('locale' => Mage::app()->getLocale()->getLocaleCode())
- );
- $this->setDefaultValue($filter->filter($defaultValue));
- } catch (Exception $e) {
- throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid default decimal value'));
- }
- }
-
- if ($this->getBackendType() == 'datetime') {
- if (!$this->getBackendModel()) {
- $this->setBackendModel('eav/entity_attribute_backend_datetime');
- }
-
- if (!$this->getFrontendModel()) {
- $this->setFrontendModel('eav/entity_attribute_frontend_datetime');
- }
-
- // save default date value as timestamp
- if ($hasDefaultValue) {
- $format = Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT);
- try {
- $defaultValue = Mage::app()->getLocale()->date($defaultValue, $format, null, false)->toValue();
- $this->setDefaultValue($defaultValue);
- } catch (Exception $e) {
- throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid default date'));
- }
- }
- }
-
- if ($this->getBackendType() == 'gallery') {
- if (!$this->getBackendModel()) {
- $this->setBackendModel('eav/entity_attribute_backend_media');
- }
- }
-
- return parent::_beforeSave();
- }
-
- /**
- * Save additional data
- *
- * @return Mage_Eav_Model_Entity_Attribute
- */
- protected function _afterSave()
- {
- $this->_getResource()->saveInSetIncluding($this);
- return parent::_afterSave();
- }
-
- /**
- * Detect backend storage type using frontend input type
- *
- * @return string backend_type field value
- * @param string $type frontend_input field value
- */
- public function getBackendTypeByInput($type)
- {
- $field = null;
- switch ($type) {
- case 'text':
- case 'gallery':
- case 'media_image':
- case 'multiselect':
- $field = 'varchar';
- break;
-
- case 'image':
- case 'textarea':
- $field = 'text';
- break;
-
- case 'date':
- $field = 'datetime';
- break;
-
- case 'select':
- case 'boolean':
- $field = 'int';
- break;
-
- case 'price':
- $field = 'decimal';
- break;
- }
-
- return $field;
- }
-
- /**
- * Detect default value using frontend input type
- *
- * @return string default_value field value
- * @param string $type frontend_input field name
- */
- public function getDefaultValueByInput($type)
- {
- $field = '';
- switch ($type) {
- case 'select':
- case 'gallery':
- case 'media_image':
- break;
- case 'multiselect':
- $field = null;
- break;
-
- case 'text':
- case 'price':
- case 'image':
- $field = 'default_value_text';
- break;
-
- case 'textarea':
- $field = 'default_value_textarea';
- break;
-
- case 'date':
- $field = 'default_value_date';
- break;
-
- case 'boolean':
- $field = 'default_value_yesno';
- break;
- }
-
- return $field;
- }
-
- /**
- * Retreive attribute codes by frontend type
- *
- * @param string $type
- * @return array
- */
- public function getAttributeCodesByFrontendType($type)
- {
- return $this->getResource()->getAttributeCodesByFrontendType($type);
- }
-
- /**
- * Return array of labels of stores
- *
- * @return array
- */
- public function getStoreLabels()
- {
- if (!$this->getData('store_labels')) {
- $storeLabel = $this->getResource()->getStoreLabelsByAttributeId($this->getId());
- $this->setData('store_labels', $storeLabel);
- }
- return $this->getData('store_labels');
- }
-
- /**
- * Return store label of attribute
- *
- * @return string
- */
- public function getStoreLabel($storeId = null)
- {
- if ($this->hasData('store_label')) {
- return $this->getData('store_label');
- }
- $store = Mage::app()->getStore($storeId);
- $label = false;
- if (!$store->isAdmin()) {
- $labels = $this->getStoreLabels();
- if (isset($labels[$store->getId()])) {
- return $labels[$store->getId()];
- }
- }
- return $this->getFrontendLabel();
- }
- }