| Server IP : 213.186.33.4 / Your IP : 216.73.216.193 Web Server : Apache System : Linux webm006.cluster103.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 User : awebpaca ( 35430) PHP Version : 8.5.0 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/a/w/e/awebpaca/boutiques/app/code/core/Mage/Eav/Model/Entity/Collection/ |
Upload 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) 2010 Magento Inc. (http://www.magentocommerce.com)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
/**
* Entity/Attribute/Model - collection abstract
*
* @category Mage
* @package Mage_Eav
* @author Magento Core Team <core@magentocommerce.com>
*/
class Mage_Eav_Model_Entity_Collection_Abstract extends Varien_Data_Collection_Db
{
/**
* Array of items with item id key
*
* @var array
*/
protected $_itemsById = array();
/**
* Entity static fields
*
* @var array
*/
protected $_staticFields = array();
/**
* Entity object to define collection's attributes
*
* @var Mage_Eav_Model_Entity_Abstract
*/
protected $_entity;
/**
* Entity types to be fetched for objects in collection
*
* @var array
*/
protected $_selectEntityTypes = array();
/**
* Attributes to be fetched for objects in collection
*
* @var array
*/
protected $_selectAttributes=array();
/**
* Attributes to be filtered order sorted by
*
* @var array
*/
protected $_filterAttributes=array();
/**
* Joined entities
*
* @var array
*/
protected $_joinEntities = array();
/**
* Joined attributes
*
* @var array
*/
protected $_joinAttributes = array();
/**
* Joined fields data
*
* @var array
*/
protected $_joinFields = array();
/**
* Collection constructor
*
* @param Mage_Core_Model_Mysql4_Abstract $resource
*/
public function __construct($resource=null)
{
parent::__construct();
$this->_construct();
$this->setConnection($this->getEntity()->getReadConnection());
$this->_prepareStaticFields();
$this->_initSelect();
}
/**
* Initialize collection
*/
protected function _construct()
{
}
public function getTable($table)
{
return $this->getResource()->getTable($table);
}
/**
* Prepare static entity fields
*
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
protected function _prepareStaticFields()
{
foreach ($this->getEntity()->getDefaultAttributes() as $field) {
$this->_staticFields[$field] = $field;
}
return $this;
}
protected function _initSelect()
{
$this->getSelect()->from(array('e'=>$this->getEntity()->getEntityTable()));
if ($this->getEntity()->getTypeId()) {
$this->addAttributeToFilter('entity_type_id', $this->getEntity()->getTypeId());
}
return $this;
}
/**
* Standard resource collection initalization
*
* @param string $model
* @return Mage_Core_Model_Mysql4_Collection_Abstract
*/
protected function _init($model, $entityModel=null)
{
$this->setItemObjectClass(Mage::getConfig()->getModelClassName($model));
if (is_null($entityModel)) {
$entityModel = $model;
}
$entity = Mage::getResourceSingleton($entityModel);
$this->setEntity($entity);
return $this;
}
/**
* Set entity to use for attributes
*
* @param Mage_Eav_Model_Entity_Abstract $entity
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function setEntity($entity)
{
if ($entity instanceof Mage_Eav_Model_Entity_Abstract) {
$this->_entity = $entity;
} elseif (is_string($entity) || $entity instanceof Mage_Core_Model_Config_Element) {
$this->_entity = Mage::getModel('eav/entity')->setType($entity);
} else {
Mage::throwException(Mage::helper('eav')->__('Invalid entity supplied: %s.', print_r($entity,1)));
}
return $this;
}
/**
* Get collection's entity object
*
* @return Mage_Eav_Model_Entity_Abstract
*/
public function getEntity()
{
if (empty($this->_entity)) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Entity is not initialized.'));
}
return $this->_entity;
}
/**
* Get resource instance
*
* @return Mage_Core_Model_Mysql4_Abstract
*/
public function getResource()
{
return $this->getEntity();
}
/**
* Set template object for the collection
*
* @param Varien_Object $object
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function setObject($object=null)
{
if (is_object($object)) {
$this->setItemObjectClass(get_class($object));
}
else {
$this->setItemObjectClass($object);
}
return $this;
}
/**
* Add an object to the collection
*
* @param Varien_Object $object
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function addItem(Varien_Object $object)
{
if (get_class($object)!== $this->_itemObjectClass) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Attempt to add an invalid object.'));
}
return parent::addItem($object);
}
/**
* Retrieve entity attribute
*
* @param string $attributeCode
* @return Mage_Eav_Model_Entity_Attribute_Abstract
*/
public function getAttribute($attributeCode)
{
if (isset($this->_joinAttributes[$attributeCode])) {
return $this->_joinAttributes[$attributeCode]['attribute'];
} else {
return $this->getEntity()->getAttribute($attributeCode);
}
}
/**
* Add attribute filter to collection
*
* If $attribute is an array will add OR condition with following format:
* array(
* array('attribute'=>'firstname', 'like'=>'test%'),
* array('attribute'=>'lastname', 'like'=>'test%'),
* )
*
* @see self::_getConditionSql for $condition
* @param Mage_Eav_Model_Entity_Attribute_Interface|integer|string|array $attribute
* @param null|string|array $condition
* @param string $operator
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function addAttributeToFilter($attribute, $condition=null, $joinType='inner')
{
if($attribute===null) {
$this->getSelect();
return $this;
}
if (is_numeric($attribute)) {
$attribute = $this->getEntity()->getAttribute($attribute)->getAttributeCode();
}
elseif ($attribute instanceof Mage_Eav_Model_Entity_Attribute_Interface) {
$attribute = $attribute->getAttributeCode();
}
if (is_array($attribute)) {
$sqlArr = array();
foreach ($attribute as $condition) {
$sqlArr[] = $this->_getAttributeConditionSql($condition['attribute'], $condition, $joinType);
}
$conditionSql = '('.join(') OR (', $sqlArr).')';
} elseif (is_string($attribute)) {
if (is_null($condition)) {
$condition = '';
}
$conditionSql = $this->_getAttributeConditionSql($attribute, $condition, $joinType);
}
if (!empty($conditionSql)) {
$this->getSelect()->where($conditionSql);
} else {
Mage::throwException('Invalid attribute identifier for filter ('.get_class($attribute).')');
}
return $this;
}
/**
* Wrapper for compatibility with Varien_Data_Collection_Db
*
* @param mixed $attribute
* @param mixed $condition
*/
public function addFieldToFilter($attribute, $condition=null)
{
return $this->addAttributeToFilter($attribute, $condition);
}
/**
* Add attribute to sort order
*
* @param string $attribute
* @param string $dir
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function addAttributeToSort($attribute, $dir='asc')
{
if (isset($this->_joinFields[$attribute])) {
$this->getSelect()->order($this->_getAttributeFieldName($attribute).' '.$dir);
return $this;
}
if (isset($this->_staticFields[$attribute])) {
$this->getSelect()->order("e.{$attribute} {$dir}");
}
if (isset($this->_joinAttributes[$attribute])) {
$attrInstance = $this->_joinAttributes[$attribute]['attribute'];
$entityField = $this->_getAttributeTableAlias($attribute).'.'.$attrInstance->getAttributeCode();
} else {
$attrInstance = $this->getEntity()->getAttribute($attribute);
$entityField = 'e.'.$attribute;
}
if ($attrInstance) {
if ($attrInstance->getBackend()->isStatic()) {
$this->getSelect()->order($entityField.' '.$dir);
} else {
$this->_addAttributeJoin($attribute, 'left');
if (isset($this->_joinAttributes[$attribute])) {
$this->getSelect()->order($attribute.' '.$dir);
} else {
$this->getSelect()->order($this->_getAttributeTableAlias($attribute).'.value '.$dir);
}
}
}
return $this;
}
/**
* Add attribute to entities in collection
*
* If $attribute=='*' select all attributes
*
* @param array|string|integer|Mage_Core_Model_Config_Element $attribute
* @param false|string $joinType flag for joining attribute
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function addAttributeToSelect($attribute, $joinType=false)
{
if (is_array($attribute)) {
Mage::getSingleton('eav/config')->loadCollectionAttributes($this->getEntity()->getType(), $attribute);
foreach ($attribute as $a) {
$this->addAttributeToSelect($a, $joinType);
}
return $this;
}
if ($joinType!==false && !$this->getEntity()->getAttribute($attribute)->isStatic()) {
$this->_addAttributeJoin($attribute, $joinType);
} elseif ('*'===$attribute) {
$attributes = $this->getEntity()
->loadAllAttributes()
->getAttributesByCode();
foreach ($attributes as $attrCode=>$attr) {
$this->_selectAttributes[$attrCode] = $attr->getId();
}
} else {
if (isset($this->_joinAttributes[$attribute])) {
$attrInstance = $this->_joinAttributes[$attribute]['attribute'];
} else {
//$attrInstance = $this->getEntity()->getAttribute($attribute);
$attrInstance = Mage::getSingleton('eav/config')->getCollectionAttribute($this->getEntity()->getType(), $attribute);
}
if (empty($attrInstance)) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid attribute requested: %s', (string)$attribute));
}
$this->_selectAttributes[$attrInstance->getAttributeCode()] = $attrInstance->getId();
}
return $this;
}
public function addEntityTypeToSelect($entityType, $prefix)
{
$this->_selectEntityTypes[$entityType] = array(
'prefix'=>$prefix,
);
return $this;
}
/**
* Add field to static
*
* @param string $field
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function addStaticField($field)
{
if (!isset($this->_staticFields[$field])) {
$this->_staticFields[$field] = $field;
}
return $this;
}
/**
* Add attribute expression (SUM, COUNT, etc)
*
* Example: ('sub_total', 'SUM({{attribute}})', 'revenue')
* Example: ('sub_total', 'SUM({{revenue}})', 'revenue')
*
* For some functions like SUM use groupByAttribute.
*
* @param string $alias
* @param string $expression
* @param string $attribute
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function addExpressionAttributeToSelect($alias, $expression, $attribute)
{
// validate alias
if (isset($this->_joinFields[$alias])) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Joint field or attribute expression with this alias is already declared.'));
}
if(!is_array($attribute)) {
$attribute = array($attribute);
}
$fullExpression = $expression;
// Replacing multiple attributes
foreach($attribute as $attributeItem) {
if (isset($this->_staticFields[$attributeItem])) {
$attrField = sprintf('e.%s', $attributeItem);
}
else {
$attributeInstance = $this->getAttribute($attributeItem);
if ($attributeInstance->getBackend()->isStatic()) {
$attrField = 'e.' . $attributeItem;
} else {
$this->_addAttributeJoin($attributeItem, 'left');
$attrField = $this->_getAttributeFieldName($attributeItem);
}
}
$fullExpression = str_replace('{{attribute}}', $attrField, $fullExpression);
$fullExpression = str_replace('{{' . $attributeItem . '}}', $attrField, $fullExpression);
}
$this->getSelect()->columns(array($alias=>$fullExpression));
$this->_joinFields[$alias] = array(
'table' => false,
'field' => $fullExpression
);
return $this;
}
/**
* Groups results by specified attribute
*
* @param string|array $attribute
*/
public function groupByAttribute($attribute)
{
if(is_array($attribute)) {
foreach ($attribute as $attributeItem) {
$this->groupByAttribute($attributeItem);
}
} else {
if (isset($this->_joinFields[$attribute])) {
$this->getSelect()->group($this->_getAttributeFieldName($attribute));
return $this;
}
if (isset($this->_staticFields[$attribute])) {
$this->getSelect()->group(sprintf('e.%s', $attribute));
return $this;
}
if (isset($this->_joinAttributes[$attribute])) {
$attrInstance = $this->_joinAttributes[$attribute]['attribute'];
$entityField = $this->_getAttributeTableAlias($attribute).'.'.$attrInstance->getAttributeCode();
} else {
$attrInstance = $this->getEntity()->getAttribute($attribute);
$entityField = 'e.'.$attribute;
}
if ($attrInstance->getBackend()->isStatic()) {
$this->getSelect()->group($entityField);
} else {
$this->_addAttributeJoin($attribute);
$this->getSelect()->group($this->_getAttributeTableAlias($attribute).'.value');
}
}
return $this;
}
/**
* Add attribute from joined entity to select
*
* Examples:
* ('billing_firstname', 'customer_address/firstname', 'default_billing')
* ('billing_lastname', 'customer_address/lastname', 'default_billing')
* ('shipping_lastname', 'customer_address/lastname', 'default_billing')
* ('shipping_postalcode', 'customer_address/postalcode', 'default_shipping')
* ('shipping_city', $cityAttribute, 'default_shipping')
*
* Developer is encouraged to use existing instances of attributes and entities
* After first use of string entity name it will be cached in the collection
*
* @todo connect between joined attributes of same entity
* @param string $alias alias for the joined attribute
* @param string|Mage_Eav_Model_Entity_Attribute_Abstract $attribute
* @param string $bind attribute of the main entity to link with joined $filter
* @param string $filter primary key for the joined entity (entity_id default)
* @param string $joinType inner|left
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function joinAttribute($alias, $attribute, $bind, $filter=null, $joinType='inner', $storeId=null)
{
// validate alias
if (isset($this->_joinAttributes[$alias])) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid alias, already exists in joint attributes.'));
}
// validate bind attribute
if (is_string($bind)) {
$bindAttribute = $this->getAttribute($bind);
}
if (!$bindAttribute || (!$bindAttribute->isStatic() && !$bindAttribute->getId())) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid foreign key.'));
}
// try to explode combined entity/attribute if supplied
if (is_string($attribute)) {
$attrArr = explode('/', $attribute);
if (isset($attrArr[1])) {
$entity = $attrArr[0];
$attribute = $attrArr[1];
}
}
// validate entity
if (empty($entity) && $attribute instanceof Mage_Eav_Model_Entity_Attribute_Abstract) {
$entity = $attribute->getEntity();
} elseif (is_string($entity)) {
// retrieve cached entity if possible
if (isset($this->_joinEntities[$entity])) {
$entity = $this->_joinEntities[$entity];
} else {
$entity = Mage::getModel('eav/entity')->setType($attrArr[0]);
}
}
if (!$entity || !$entity->getTypeId()) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid entity type.'));
}
// cache entity
if (!isset($this->_joinEntities[$entity->getType()])) {
$this->_joinEntities[$entity->getType()] = $entity;
}
// validate attribute
if (is_string($attribute)) {
$attribute = $entity->getAttribute($attribute);
}
if (!$attribute) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid attribute type.'));
}
if (empty($filter)) {
$filter = $entity->getEntityIdField();
}
// add joined attribute
$this->_joinAttributes[$alias] = array(
'bind' => $bind,
'bindAttribute' => $bindAttribute,
'attribute' => $attribute,
'filter' => $filter,
'store_id' => $storeId,
);
$this->_addAttributeJoin($alias, $joinType);
return $this;
}
/**
* Join regular table field and use an attribute as fk
*
* Examples:
* ('country_name', 'directory/country_name', 'name', 'country_id=shipping_country', "{{table}}.language_code='en'", 'left')
*
* @param string $alias 'country_name'
* @param string $table 'directory/country_name'
* @param string $field 'name'
* @param string $bind 'PK(country_id)=FK(shipping_country_id)'
* @param string|array $cond "{{table}}.language_code='en'" OR array('language_code'=>'en')
* @param string $joinType 'left'
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function joinField($alias, $table, $field, $bind, $cond=null, $joinType='inner')
{
// validate alias
if (isset($this->_joinFields[$alias])) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Joined field with this alias is already declared.'));
}
// validate table
if (strpos($table, '/')!==false) {
$table = Mage::getSingleton('core/resource')->getTableName($table);
}
$tableAlias = $this->_getAttributeTableAlias($alias);
// validate bind
list($pk, $fk) = explode('=', $bind);
$bindCond = $tableAlias.'.'.$pk.'='.$this->_getAttributeFieldName($fk);
// process join type
switch ($joinType) {
case 'left':
$joinMethod = 'joinLeft';
break;
default:
$joinMethod = 'join';
}
$condArr = array($bindCond);
// add where condition if needed
if (!is_null($cond)) {
if (is_array($cond)) {
foreach ($cond as $k=>$v) {
$condArr[] = $this->_getConditionSql($tableAlias.'.'.$k, $v);
}
} else {
$condArr[] = str_replace('{{table}}', $tableAlias, $cond);
}
}
$cond = '('.join(') AND (', $condArr).')';
// join table
$this->getSelect()->$joinMethod(array($tableAlias=>$table), $cond, ($field ? array($alias=>$field) : array()));
// save joined attribute
$this->_joinFields[$alias] = array(
'table'=>$tableAlias,
'field'=>$field,
);
return $this;
}
/**
* Join a table
*
* @param string|array $table
* @param string $bind
* @param string|array $fields
* @param null|array $cond
* @param string $joinType
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function joinTable($table, $bind, $fields=null, $cond=null, $joinType='inner')
{
$tableAlias = null;
if (is_array($table)) {
list($tableAlias, $tableName) = each($table);
}
else {
$tableName = $table;
}
// validate table
if (strpos($tableName, '/') !== false) {
$tableName = Mage::getSingleton('core/resource')->getTableName($tableName);
}
if (empty($tableAlias)) {
$tableAlias = $tableName;
}
// validate fields and aliases
if (!$fields) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid joint fields.'));
}
foreach ($fields as $alias=>$field) {
if (isset($this->_joinFields[$alias])) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('A joint field with this alias (%s) is already declared.', $alias));
}
$this->_joinFields[$alias] = array(
'table' => $tableAlias,
'field' => $field,
);
}
// validate bind
list($pk, $fk) = explode('=', $bind);
$bindCond = $tableAlias . '.' . $pk . '=' . $this->_getAttributeFieldName($fk);
// process join type
switch ($joinType) {
case 'left':
$joinMethod = 'joinLeft';
break;
default:
$joinMethod = 'join';
}
$condArr = array($bindCond);
// add where condition if needed
if (!is_null($cond)) {
if (is_array($cond)) {
foreach ($cond as $k=>$v) {
$condArr[] = $this->_getConditionSql($tableAlias.'.'.$k, $v);
}
} else {
$condArr[] = str_replace('{{table}}', $tableAlias, $cond);
}
}
$cond = '('.join(') AND (', $condArr).')';
// join table
$this->getSelect()->$joinMethod(array($tableAlias => $tableName), $cond, $fields);
return $this;
}
/**
* Remove an attribute from selection list
*
* @param string $attribute
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function removeAttributeToSelect($attribute=null)
{
if (is_null($attribute)) {
$this->_selectAttributes = array();
} else {
unset($this->_selectAttributes[$attribute]);
}
return $this;
}
/**
* Set collection page start and records to show
*
* @param integer $pageNum
* @param integer $pageSize
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function setPage($pageNum, $pageSize)
{
$this->setCurPage($pageNum)
->setPageSize($pageSize);
return $this;
}
/**
* Load collection data into object items
*
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function load($printQuery = false, $logQuery = false)
{
if ($this->isLoaded()) {
return $this;
}
Varien_Profiler::start('__EAV_COLLECTION_BEFORE_LOAD__');
Mage::dispatchEvent('eav_collection_abstract_load_before', array('collection' => $this));
$this->_beforeLoad();
Varien_Profiler::stop('__EAV_COLLECTION_BEFORE_LOAD__');
Varien_Profiler::start('__EAV_COLLECTION_LOAD_ENT__');
$this->_loadEntities($printQuery, $logQuery);
Varien_Profiler::stop('__EAV_COLLECTION_LOAD_ENT__');
Varien_Profiler::start('__EAV_COLLECTION_LOAD_ATTR__');
$this->_loadAttributes($printQuery, $logQuery);
Varien_Profiler::stop('__EAV_COLLECTION_LOAD_ATTR__');
Varien_Profiler::start('__EAV_COLLECTION_ORIG_DATA__');
foreach ($this->_items as $item) {
$item->setOrigData();
}
Varien_Profiler::stop('__EAV_COLLECTION_ORIG_DATA__');
$this->_setIsLoaded();
Varien_Profiler::start('__EAV_COLLECTION_AFTER_LOAD__');
$this->_afterLoad();
Varien_Profiler::stop('__EAV_COLLECTION_AFTER_LOAD__');
return $this;
}
/**
* Clone and reset collection
*
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
protected function _getAllIdsSelect($limit=null, $offset=null)
{
$idsSelect = clone $this->getSelect();
$idsSelect->reset(Zend_Db_Select::ORDER);
$idsSelect->reset(Zend_Db_Select::LIMIT_COUNT);
$idsSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
$idsSelect->reset(Zend_Db_Select::COLUMNS);
$idsSelect->columns('e.'.$this->getEntity()->getIdFieldName());
$idsSelect->limit($limit, $offset);
return $idsSelect;
}
/**
* Retrive all ids for collection
*
* @return array
*/
public function getAllIds($limit=null, $offset=null)
{
return $this->getConnection()->fetchCol($this->_getAllIdsSelect($limit, $offset), $this->_bindParams);
}
/**
* Retrive all ids sql
*
* @return array
*/
public function getAllIdsSql()
{
$idsSelect = clone $this->getSelect();
$idsSelect->reset(Zend_Db_Select::ORDER);
$idsSelect->reset(Zend_Db_Select::LIMIT_COUNT);
$idsSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
$idsSelect->reset(Zend_Db_Select::COLUMNS);
$idsSelect->reset(Zend_Db_Select::GROUP);
$idsSelect->columns('e.'.$this->getEntity()->getIdFieldName());
return $idsSelect;
}
/**
* Save all the entities in the collection
*
* @todo make batch save directly from collection
*/
public function save()
{
foreach ($this->getItems() as $item) {
$item->save();
}
return $this;
}
/**
* Delete all the entities in the collection
*
* @todo make batch delete directly from collection
*/
public function delete()
{
foreach ($this->getItems() as $k=>$item) {
$this->getEntity()->delete($item);
unset($this->_items[$k]);
}
return $this;
}
/**
* Import 2D array into collection as objects
*
* If the imported items already exist, update the data for existing objects
*
* @param array $arr
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function importFromArray($arr)
{
$entityIdField = $this->getEntity()->getEntityIdField();
foreach ($arr as $row) {
$entityId = $row[$entityIdField];
if (!isset($this->_items[$entityId])) {
$this->_items[$entityId] = $this->getNewEmptyItem();
$this->_items[$entityId]->setData($row);
} else {
$this->_items[$entityId]->addData($row);
}
}
return $this;
}
/**
* Get collection data as a 2D array
*
* @return array
*/
public function exportToArray()
{
$result = array();
$entityIdField = $this->getEntity()->getEntityIdField();
foreach ($this->getItems() as $item) {
$result[$item->getData($entityIdField)] = $item->getData();
}
return $result;
}
public function getRowIdFieldName()
{
if (is_null($this->_idFieldName)) {
$this->_setIdFieldName($this->getEntity()->getIdFieldName());
}
return $this->getIdFieldName();
}
public function setRowIdFieldName($fieldName)
{
return $this->_setIdFieldName($fieldName);
}
/**
* Load entities records into items
*
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function _loadEntities($printQuery = false, $logQuery = false)
{
$entity = $this->getEntity();
// $entityIdField = $entity->getEntityIdField();
if ($this->_pageSize) {
$this->getSelect()->limitPage($this->getCurPage(), $this->_pageSize);
}
$this->printLogQuery($printQuery, $logQuery);
try {
$rows = $this->_fetchAll($this->getSelect());
} catch (Exception $e) {
Mage::printException($e, $this->getSelect());
$this->printLogQuery(true, true, $this->getSelect());
throw $e;
}
foreach ($rows as $v) {
$object = $this->getNewEmptyItem()
->setData($v);
$this->addItem($object);
if (isset($this->_itemsById[$object->getId()])) {
$this->_itemsById[$object->getId()][] = $object;
}
else {
$this->_itemsById[$object->getId()] = array($object);
}
}
return $this;
}
/**
* Load attributes into loaded entities
*
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function _loadAttributes($printQuery = false, $logQuery = false)
{
if (empty($this->_items) || empty($this->_itemsById) || empty($this->_selectAttributes)) {
return $this;
}
$entity = $this->getEntity();
$entityIdField = $entity->getEntityIdField();
$tableAttributes = array();
foreach ($this->_selectAttributes as $attributeCode => $attributeId) {
if (!$attributeId) {
continue;
}
$attribute = Mage::getSingleton('eav/config')->getCollectionAttribute($entity->getType(), $attributeCode);
if ($attribute && !$attribute->isStatic()) {
$tableAttributes[$attribute->getBackendTable()][] = $attributeId;
}
}
$selects = array();
foreach ($tableAttributes as $table=>$attributes) {
$selects[] = $this->_getLoadAttributesSelect($table, $attributes);
}
if (!empty($selects)) {
try {
$select = implode(' UNION ', $selects);
$values = $this->_fetchAll($select);
} catch (Exception $e) {
Mage::printException($e, $select);
$this->printLogQuery(true, true, $select);
throw $e;
}
foreach ($values as $value) {
$this->_setItemAttributeValue($value);
}
}
return $this;
}
/**
* Retrieve attributes load select
*
* @param string $table
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
protected function _getLoadAttributesSelect($table, $attributeIds=array())
{
if (empty($attributeIds)) {
$attributeIds = $this->_selectAttributes;
}
$entityIdField = $this->getEntity()->getEntityIdField();
$select = $this->getConnection()->select()
->from($table, array($entityIdField, 'attribute_id', 'value'))
->where('entity_type_id=?', $this->getEntity()->getTypeId())
->where("$entityIdField in (?)", array_keys($this->_itemsById))
->where('attribute_id in (?)', $attributeIds);
return $select;
}
/**
* Initialize entity ubject property value
*
* $valueInfo is _getLoadAttributesSelect fetch result row
*
* @param array $valueInfo
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
protected function _setItemAttributeValue($valueInfo)
{
$entityIdField = $this->getEntity()->getEntityIdField();
$entityId = $valueInfo[$entityIdField];
if (!isset($this->_itemsById[$entityId])) {
Mage::throwException('Mage_Eav',
Mage::helper('eav')->__('Data integrity: No header row found for attribute.')
);
}
$attributeCode = array_search($valueInfo['attribute_id'], $this->_selectAttributes);
if (!$attributeCode) {
$attribute = Mage::getSingleton('eav/config')->getCollectionAttribute(
$this->getEntity()->getType(),
$valueInfo['attribute_id']
);
$attributeCode = $attribute->getAttributeCode();
}
foreach ($this->_itemsById[$entityId] as $object) {
$object->setData($attributeCode, $valueInfo['value']);
}
return $this;
}
/**
* Get alias for attribute value table
*
* @param string $attributeCode
* @return string
*/
protected function _getAttributeTableAlias($attributeCode)
{
return '_table_'.$attributeCode;
}
protected function _getAttributeFieldName($attributeCode)
{
if (isset($this->_joinAttributes[$attributeCode]['condition_alias'])) {
return $this->_joinAttributes[$attributeCode]['condition_alias'];
}
if (isset($this->_staticFields[$attributeCode])) {
return sprintf('e.%s', $attributeCode);
}
if (isset($this->_joinFields[$attributeCode])) {
$attr = $this->_joinFields[$attributeCode];
return $attr['table'] ? $attr['table'] .'.'.$attr['field'] : $attr['field'];
}
$attribute = $this->getAttribute($attributeCode);
if (!$attribute) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid attribute name: %s.', $attributeCode));
}
if ($attribute->isStatic()) {
if (isset($this->_joinAttributes[$attributeCode])) {
$fieldName = $this->_getAttributeTableAlias($attributeCode).'.'.$attributeCode;
} else {
$fieldName = 'e.'.$attributeCode;
}
} else {
$fieldName = $this->_getAttributeTableAlias($attributeCode).'.value';
}
return $fieldName;
}
/**
* Add attribute value table to the join if it wasn't added previously
*
* @param string $attributeCode
* @param string $joinType inner|left
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
protected function _addAttributeJoin($attributeCode, $joinType='inner')
{
if (!empty($this->_filterAttributes[$attributeCode])) {
return $this;
}
$attrTable = $this->_getAttributeTableAlias($attributeCode);
if (isset($this->_joinAttributes[$attributeCode])) {
$attribute = $this->_joinAttributes[$attributeCode]['attribute'];
$entity = $attribute->getEntity();
$entityIdField = $entity->getEntityIdField();
$fkName = $this->_joinAttributes[$attributeCode]['bind'];
$fkAttribute = $this->_joinAttributes[$attributeCode]['bindAttribute'];
$fkTable = $this->_getAttributeTableAlias($fkName);
if ($fkAttribute->getBackend()->isStatic()) {
if (isset($this->_joinAttributes[$fkName])) {
$fk = $fkTable.".".$fkAttribute->getAttributeCode();
} else {
$fk = "e.".$fkAttribute->getAttributeCode();
}
} else {
$this->_addAttributeJoin($fkAttribute->getAttributeCode(), $joinType);
$fk = "$fkTable.value";
}
$pk = $attrTable.'.'.$this->_joinAttributes[$attributeCode]['filter'];
} else {
$entity = $this->getEntity();
$entityIdField = $entity->getEntityIdField();
$attribute = $entity->getAttribute($attributeCode);
$fk = "e.$entityIdField";
$pk = "$attrTable.$entityIdField";
}
if (!$attribute) {
throw Mage::exception('Mage_Eav', Mage::helper('eav')->__('Invalid attribute name: %s.', $attributeCode));
}
if ($attribute->getBackend()->isStatic()) {
$attrFieldName = "$attrTable.".$attribute->getAttributeCode();
} else {
$attrFieldName = "$attrTable.value";
}
$condArr = array("$pk = $fk");
if (!$attribute->getBackend()->isStatic()) {
$condArr[] = $this->getConnection()->quoteInto("$attrTable.attribute_id=?", $attribute->getId());
}
/**
* process join type
*/
$joinMethod = ($joinType == 'left') ? 'joinLeft' : 'join';
$this->_joinAttributeToSelect($joinMethod, $attribute, $attrTable, $condArr, $attributeCode, $attrFieldName);
$this->removeAttributeToSelect($attributeCode);
$this->_filterAttributes[$attributeCode] = $attribute->getId();
/**
* Fix double join for using same as filter
*/
$this->_joinFields[$attributeCode] = array(
'table' => '',
'field' => $attrFieldName,
);
return $this;
}
/**
* Adding join statement to collection select instance
*
* @param string $method
* @param object $attribute
* @param string $tableAlias
* @param array $condition
* @param string $fieldCode
* @param string $fieldAlias
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
protected function _joinAttributeToSelect($method, $attribute, $tableAlias, $condition, $fieldCode, $fieldAlias)
{
$this->getSelect()->$method(
array($tableAlias => $attribute->getBackend()->getTable()),
'('.join(') AND (', $condition).')',
array($fieldCode=>$fieldAlias)
);
return $this;
}
/**
* Get condition sql for the attribute
*
* @see self::_getConditionSql
* @param string $attribute
* @param mixed $condition
* @param string $joinType
* @return string
*/
protected function _getAttributeConditionSql($attribute, $condition, $joinType='inner')
{
if (isset($this->_joinFields[$attribute])) {
return $this->_getConditionSql($this->_getAttributeFieldName($attribute), $condition);
}
if (isset($this->_staticFields[$attribute])) {
return $this->_getConditionSql(sprintf('e.%s', $attribute), $condition);
}
// process linked attribute
if (isset($this->_joinAttributes[$attribute])) {
$entity = $this->getAttribute($attribute)->getEntity();
$entityTable = $entity->getEntityTable();
} else {
$entity = $this->getEntity();
$entityTable = 'e';
}
if ($entity->isAttributeStatic($attribute)) {
$conditionSql = $this->_getConditionSql('e.'.$attribute, $condition);
} else {
$this->_addAttributeJoin($attribute, $joinType);
if (isset($this->_joinAttributes[$attribute]['condition_alias'])) {
$field = $this->_joinAttributes[$attribute]['condition_alias'];
}
else {
$field = $this->_getAttributeTableAlias($attribute).'.value';
}
$conditionSql = $this->_getConditionSql($field, $condition);
}
return $conditionSql;
}
/**
* Set sorting order
*
* $attribute can also be an array of attributes
*
* @param string|array $attribute
* @param string $dir
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
public function setOrder($attribute, $dir='desc')
{
if (is_array($attribute)) {
foreach ($attribute as $attr) {
$this->addAttributeToSort($attr, $dir);
}
} else {
$this->addAttributeToSort($attribute, $dir);
}
return $this;
}
public function toArray($arrAttributes = array())
{
$arr = array();
foreach ($this->_items as $k=>$item) {
$arr[$k] = $item->toArray($arrAttributes);
}
return $arr;
}
protected function _beforeLoad()
{
return $this;
}
protected function _afterLoad()
{
return $this;
}
/**
* Reset collection
*
* @return Mage_Eav_Model_Entity_Collection_Abstract
*/
protected function _reset()
{
parent::_reset();
$this->_selectEntityTypes = array();
$this->_selectAttributes = array();
$this->_filterAttributes = array();
$this->_joinEntities = array();
$this->_joinAttributes = array();
$this->_joinFields = array();
return $this;
}
/**
* Returns already loaded element ids
*
* return array
*/
public function getLoadedIds()
{
return array_keys($this->_items);
}
}