69 private $attributesByScope = [];
232 parent::__construct();
236 $this->{
'_' . $key} =
$value;
271 return $this->_resource->getConnection();
294 return $this->_resource->getTableName(
$alias);
307 $this->_type = $this->_eavConfig->getEntityType(
$type);
319 if (empty($this->_type)) {
358 $this->_attributesByCode = [];
359 $this->_attributesByTable = [];
372 if (!isset($this->_attributesByCode[$attrCode])) {
376 $attr = $this->getAttribute($attrCode);
377 unset($this->_attributesByTable[
$attr->getBackend()->getTable()][$attrCode]);
378 unset($this->_attributesByCode[$attrCode]);
412 if ($attributeInstance) {
419 $attributeInstance->setAttributeCode(
438 if (empty($attributeInstance)
439 || !$attributeInstance instanceof AbstractAttribute
440 || !$attributeInstance->getId()
474 if ($object !==
null) {
475 $suffix = $this->getAttributesCacheSuffix($object);
493 private function getAttributesByScope(
$suffix)
495 return (isset($this->attributesByScope[
$suffix]) && !empty($this->attributesByScope[
$suffix]))
496 ? $this->attributesByScope[
$suffix]
506 private function getAttributesCacheSuffix(
DataObject $object)
509 $storeId = $object->getStoreId() ?: 0;
522 if ($flag !==
null) {
523 $this->_isPartialLoad = (bool)$flag;
537 if ($flag !==
null) {
538 $this->_isPartialSave = (bool) $flag;
563 if ($setId ===
null) {
577 $this->_sortingSetId = $setId;
591 $firstSort = $firstAttribute->getSortWeight((
int) $this->_sortingSetId);
592 $secondSort = $secondAttribute->getSortWeight((
int) $this->_sortingSetId);
594 return $firstSort <=> $secondSort;
627 public function walkAttributes($partMethod, array $args = [], $collectExceptionMessages =
null)
629 $methodArr = explode(
'/', $partMethod);
630 switch (
sizeof($methodArr)) {
637 $part = $methodArr[0];
645 $suffix = $this->getAttributesCacheSuffix($args[0]);
677 $results[$attrCode] = call_user_func_array([$instance,
$method], $args);
678 }
catch (\
Magento\Eav\Model\Entity\Attribute\Exception $e) {
679 if ($collectExceptionMessages) {
680 $results[$attrCode] = $e->getMessage();
684 }
catch (\Exception $e) {
685 if ($collectExceptionMessages) {
686 $results[$attrCode] = $e->getMessage();
689 $e = $this->_universalFactory->create(
690 \
Magento\Eav\Model\Entity\Attribute\Exception::class,
691 [
'phrase' =>
__($e->getMessage())]
693 $e->setAttributeCode($attrCode)->setPart($part);
713 if (!is_object($instance) || !method_exists($instance,
$method) || !is_callable([$instance,
$method])) {
747 if (!$this->_entityTable) {
752 $this->_entityTable = $this->_resource->getTableName(
$table);
766 if (!$this->linkIdField) {
769 $this->linkIdField = $indexList[$pkName][
'COLUMNS_LIST'][0];
770 if (!$this->linkIdField) {
785 if (!$this->_entityIdField) {
786 $this->_entityIdField = $this->
getEntityType()->getEntityIdField();
787 if (!$this->_entityIdField) {
812 if (!$this->_valueTablePrefix) {
815 $this->_valueTablePrefix =
$prefix;
835 if (empty($this->_entityTablePrefix)) {
843 $this->_entityTablePrefix =
$prefix;
858 $attrInstance = $this->getAttribute(
$attribute);
859 return $attrInstance && $attrInstance->getBackend()->isStatic();
872 $result = $this->walkAttributes(
'backend/validate', [$object], $object->getCollectExceptionMessages());
875 if ($error ===
false) {
877 }
elseif (is_string($error)) {
896 if ($object->getIncrementId()) {
900 $incrementId = $this->
getEntityType()->fetchNewIncrementId($object->getStoreId());
902 if ($incrementId !==
false) {
903 $object->setIncrementId($incrementId);
923 if ($attributeBackend->getType() ===
'static') {
925 $bind = [
'value' => trim(
$value)];
935 if ($attributeBackend->getType() ==
'datetime') {
936 $value = (new \DateTime(
$value))->format(
'Y-m-d H:i:s');
943 $entityIdField = $object->getResource()->getLinkField();
945 $attributeBackend->getTable(),
948 'attribute_id = :attribute_id' 955 $bind[
'entity_type_id'] = $this->
getTypeId();
956 $select->where(
'entity_type_id = :entity_type_id');
961 $objectId = $object->
getData($entityIdField);
963 if (isset(
$data[0])) {
964 return $data[0] == $objectId;
969 return !count(
$data);
979 return \Magento\Eav\Model\Entity::DEFAULT_SOURCE_MODEL;
992 \Magento\Framework\Profiler::start(
'EAV:load_entity');
996 $object->beforeLoad($entityId);
1000 if (is_array(
$row)) {
1006 $object->afterLoad();
1007 $object->setOrigData();
1008 $object->setHasDataChanges(
false);
1010 $object->isObjectNew(
true);
1013 \Magento\Framework\Profiler::stop(
'EAV:load_entity');
1038 if (!$object->getId()) {
1042 \Magento\Framework\Profiler::start(
'load_model_attributes');
1049 $selects[$eavType][] =
$select->columns(
'*');
1051 $selectGroups = $this->_resourceHelper->getLoadAttributesSelectGroups($selects);
1052 foreach ($selectGroups as $selects) {
1053 if (!empty($selects)) {
1054 if (is_array($selects)) {
1060 foreach (
$values as $valueRow) {
1066 \Magento\Framework\Profiler::stop(
'load_model_attributes');
1131 $attribute = $this->getAttribute($valueRow[
'attribute_id']);
1135 $attribute->getBackend()->setEntityValueId($object, $valueRow[
'value_id']);
1154 if ($object->isDeleted()) {
1155 return $this->
delete($object);
1157 if (!$object->hasDataChanges()) {
1162 $object->validateBeforeSave();
1163 $object->beforeSave();
1164 if ($object->isSaveAllowed()) {
1170 && !$object->getEntityTypeId()
1172 $object->setEntityTypeId($this->
getTypeId());
1175 $object->setParentId((
int)$object->getParentId());
1177 $this->objectRelationProcessor->validateDataIntegrity($this->
getEntityTable(), $object->getData());
1183 $object->afterSave();
1186 $object->setHasDataChanges(
false);
1189 $object->setHasDataChanges(
true);
1191 }
catch (\Exception $e) {
1193 $object->setHasDataChanges(
true);
1221 $origObject = $this->_universalFactory->create(
$className);
1222 $origObject->setData([]);
1223 $this->
load($origObject, $object->
getData($this->getEntityIdField()));
1236 private function _aggregateDeleteData(&$delete,
$attribute, $object)
1261 $newData = $newObject->getData();
1270 if (!empty($entityId)) {
1271 $origData = $newObject->getOrigData();
1275 if (empty($origData)) {
1279 if ($origData ===
null) {
1287 foreach ($origData as $k => $v) {
1288 if (!array_key_exists($k, $newData)) {
1289 unset($origData[$k]);
1297 $staticFields = array_keys($staticFields);
1300 foreach ($newData as $k => $v) {
1313 if (!
$attribute->isInSet($newObject->getAttributeSetId()) && !in_array($k, $staticFields)) {
1314 $this->_aggregateDeleteData($delete,
$attribute, $newObject);
1340 $this->_aggregateDeleteData($delete,
$attribute, $newObject);
1341 }
elseif (!is_numeric($v) && $v !== $origData[$k] || is_numeric($v) && $v != $origData[$k]) {
1342 $update[$attrId] = [
1343 'value_id' =>
$attribute->getBackend()->getEntityValueId($newObject),
1344 'value' => is_array($v) ? array_shift($v) : $v,
1348 $insert[$attrId] = is_array($v) ? array_shift($v) : $v;
1352 $result = compact(
'newObject',
'entityRow',
'insert',
'update',
'delete');
1367 return array_key_exists(
$attribute->getAttributeCode(), $origData);
1384 if (isset($this->_describeTable[$this->
getEntityTable()][$field])) {
1406 if ($fieldProp[
'DATA_TYPE'] ==
'decimal') {
1421 protected function _processSaveData($saveData)
1423 extract($saveData, EXTR_SKIP);
1436 $insertEntity =
true;
1439 $entityId = $newObject->getId();
1441 unset($entityRow[$entityIdField]);
1442 if (!empty($entityId) && is_numeric($entityId)) {
1443 $bind = [
'entity_id' => $entityId];
1447 $insertEntity =
false;
1456 $entityObject =
new DataObject($entityRow);
1458 if ($insertEntity) {
1459 if (!empty($entityId)) {
1460 $entityRow[$entityIdField] = $entityId;
1466 $newObject->setId($entityId);
1468 $where = sprintf(
'%s=%d',
$connection->quoteIdentifier($entityIdField), $entityId);
1475 if (!empty($insert)) {
1476 foreach ($insert as $attributeId =>
$value) {
1477 $attribute = $this->getAttribute($attributeId);
1485 if (!empty($update)) {
1486 foreach ($update as $attributeId => $v) {
1487 $attribute = $this->getAttribute($attributeId);
1495 if (!empty($delete)) {
1503 $newObject->isObjectNew(
false);
1549 if (!isset($this->_attributeValuesToSave[
$table])) {
1550 $this->_attributeValuesToSave[
$table] = [];
1553 $entityIdField =
$attribute->getBackend()->getEntityIdField();
1556 $entityIdField => $object->getId(),
1562 $data[
'entity_type_id'] = $object->getEntityTypeId();
1578 foreach ($this->_attributeValuesToSave as
$table =>
$data) {
1582 foreach ($this->_attributeValuesToDelete as
$table => $valueIds) {
1587 $this->_attributeValuesToSave = [];
1588 $this->_attributeValuesToDelete = [];
1608 $backendTable =
$attribute->getBackendTable();
1609 if (!isset(self::$_attributeBackendTables[$backendTable])) {
1610 self::$_attributeBackendTables[$backendTable] = $this->
getConnection()->describeTable($backendTable);
1612 $describe = self::$_attributeBackendTables[$backendTable];
1628 foreach (
$info as $itemData) {
1629 $valueIds[] = $itemData[
'value_id'];
1632 if (empty($valueIds)) {
1636 if (isset($this->_attributeValuesToDelete[
$table])) {
1637 $this->_attributeValuesToDelete[
$table] = array_merge($this->_attributeValuesToDelete[
$table], $valueIds);
1639 $this->_attributeValuesToDelete[
$table] = $valueIds;
1658 $table = $backend->getTable();
1672 $where = implode(
' AND ', $whereArr);
1680 if ($origValueId ===
false && $newValue !==
null) {
1682 }
elseif ($origValueId !==
false && $newValue !==
null) {
1684 }
elseif ($origValueId !==
false && $newValue ===
null) {
1689 }
catch (\Exception $e) {
1727 public function delete($object)
1731 if (is_numeric($object)) {
1732 $id = (int) $object;
1734 $object->beforeDelete();
1735 $id = (int) $object->
getData($this->getLinkField());
1747 $object->isDeleted(
true);
1748 $object->afterDelete();
1750 $this->transactionManager->commit();
1752 $object->afterDeleteCommit();
1754 }
catch (\Exception $e) {
1755 $this->transactionManager->rollBack();
1775 $this->objectRelationProcessor->delete(
1776 $this->transactionManager,
1803 \Magento\Framework\Profiler::start(
'after_load');
1804 $this->walkAttributes(
'backend/afterLoad', [$object]);
1805 \Magento\Framework\Profiler::stop(
'after_load');
1817 $this->walkAttributes(
'backend/beforeSave', [$object]);
1829 $this->walkAttributes(
'backend/afterSave', [$object]);
1841 $this->walkAttributes(
'backend/beforeDelete', [$object]);
1853 $this->walkAttributes(
'backend/afterDelete', [$object]);
1864 return \Magento\Eav\Model\Entity::DEFAULT_ATTRIBUTE_MODEL;
1874 return [
'entity_type_id',
'attribute_set_id',
'created_at',
'updated_at',
'parent_id',
'increment_id'];
1884 return array_unique(array_merge(
1912 if ($this->attributeLoader ===
null) {
1991 $this->getAttribute($attrCode);
addCommitCallback($callback)
getObjectRelationProcessor()
_isCallableAttributeInstance($instance, $method, $args)
_loadModelAttributes($object)
beforeSave(DataObject $object)
_prepareDataForTable(DataObject $object, $table)
getData($key='', $index=null)
elseif(isset( $params[ 'redirect_parent']))
afterDelete(DataObject $object)
saveAttribute(DataObject $object, $attributeCode)
_getDefaultAttributeModel()
afterLoad(DataObject $object)
addAttribute(AbstractAttribute $attribute, $object=null)
checkAttributeUniqueValue(AbstractAttribute $attribute, $object)
load($object, $entityId, $attributes=[])
_saveAttribute($object, $attribute, $value)
getAttributeRow($entity, $object, $attribute)
save(\Magento\Framework\Model\AbstractModel $object)
_insertAttribute($object, $attribute, $value)
_updateAttribute($object, $attribute, $valueId, $value)
_beforeDelete(DataObject $object)
unsetAttributes($attributes=null)
$_attributeValuesToDelete
evaluateDelete($object, $id, $connection)
_prepareStaticValue($key, $value)
getSortedAttributes($setId=null)
static $_attributeBackendTables
_prepareValueForSave($value, AbstractAttribute $attribute)
_isApplicableAttribute($object, $attribute)
loadAttributesMetadata($attributes)
loadAllAttributes($object=null)
beforeDelete(DataObject $object)
setNewIncrementId(DataObject $object)
_getStaticFieldProperties($field)
setConnection($connection)
isPartialLoad($flag=null)
isPartialSave($flag=null)
_prepareLoadSelect(array $selects)
_setAttributeValue($object, $valueRow)
const DEFAULT_ENTITY_ID_FIELD
_isAttributeValueEmpty(AbstractAttribute $attribute, $value)
__construct(Context $context, $data=[])
afterSave(DataObject $object)
attributesCompare($firstAttribute, $secondAttribute)
_collectSaveData($newObject)
_afterLoad(DataObject $object)
isAttributeStatic($attribute)
setData($key, $value=null)
_afterDelete(DataObject $object)
getDefaultAttributeSourceModel()
_processAttributeValues()
_beforeSave(DataObject $object)
_getLoadRowSelect($object, $rowId)
foreach( $_productCollection as $_product)() ?>" class $info
_deleteAttributes($object, $table, $info)
_getLoadAttributesSelect($object, $table)
loadAttributesForObject($attributes, $object=null)
_afterSave(DataObject $object)
_canUpdateAttribute(AbstractAttribute $attribute, $v, array &$origData)
const DEFAULT_ENTITY_TABLE