频道栏目
首页 > 资讯 > 其他 > 正文

Magento通过可配置(configurable)商品Id获得子类Ids

17-11-14        来源:[db:作者]  
收藏   我要投稿

通过productId获取子类ID:

$childProductIds = Mage::getModel('catalog/product_type_configurable')
      ->getChildrenIds($product_id);

getChildrenIds():

Mage_Catalog_Model_Product_Type_Configurable.php

/**
     * Retrieve Required children ids
     * Return grouped array, ex array(
     *   group => array(ids)
     * )
     *
     * @param  int $parentId
     * @param  bool $required
     * @return array
     */
public function getChildrenIds($parentId, $required = true)
{
    return Mage::getResourceSingleton('catalog/product_type_configurable')
        ->getChildrenIds($parentId, $required);
}

getChildrenIds():

Mage_Catalog_Model_Resource_Product_type_Configurable.php

/**
     * Retrieve Required children ids
     * Return grouped array, ex array(
     *   group => array(ids)
     * )
     *
     * @param int $parentId
     * @param bool $required
     * @return array
     */
public function getChildrenIds($parentId, $required = true)
{
    $childrenIds = array();
    $select = $this->_getReadAdapter()->select()
        ->from(array('l' => $this->getMainTable()), array('product_id', 'parent_id'))
        ->join(
            array('e' => $this->getTable('catalog/product')),
            'e.entity_id = l.product_id AND e.required_options = 0',
            array()
        )
        ->where('parent_id = ?', $parentId);

    $childrenIds = array(0 => array());
    foreach ($this->_getReadAdapter()->fetchAll($select) as $row) {
        $childrenIds[0][$row['product_id']] = $row['product_id'];
    }

    return $childrenIds;
}

_getReadAdapter():

Mage_Core_Model_Resource_Db_Abstract.php
这里涉及到了数据库的事务,如果事务开始使用写连接,否则使用读连接:

/**
     * Retrieve connection for read data
     *
     * @return Varien_Db_Adapter_Interface
     */
protected function _getReadAdapter()
{
    $writeAdapter = $this->_getWriteAdapter();
    if ($writeAdapter && $writeAdapter->getTransactionLevel() > 0) {
        // if transaction is started we should use write connection for reading
        return $writeAdapter;
    }
    return $this->_getConnection('read');
}
/**
     * Retrieve connection for write data
     *
     * @return Varien_Db_Adapter_Interface
     */
protected function _getWriteAdapter()
{
    return $this->_getConnection('write');
}

_getConnection()
根据参数类型获得连接类型:

/**
     * Get connection by name or type
     *
     * @param string $connectionName
     * @return Zend_Db_Adapter_Abstract
     */
protected function _getConnection($connectionName)
{
    if (isset($this->_connections[$connectionName])) {
        return $this->_connections[$connectionName];
    }
    if (!empty($this->_resourcePrefix)) {
        $this->_connections[$connectionName] = $this->_resources->getConnection(
            $this->_resourcePrefix . '_' . $connectionName);
    } else {
        $this->_connections[$connectionName] = $this->_resources->getConnection($connectionName);
    }

    return $this->_connections[$connectionName];
}

_connections():

/**
     * Connections cache for this resource model
     *
     * @var array
     */
protected $_connections          = array();

getMainTable():
返回主表名,从module/table中获得

/**
     * Returns main table name - extracted from "module/table" style and
     * validated by db adapter
     *
     * @return string
     */
public function getMainTable()
{
    if (empty($this->_mainTable)) {
        Mage::throwException(Mage::helper('core')->__('Empty main table name'));
    }
    return $this->getTable($this->_mainTable);
}

getTable():
为实体得到表名,通过db适配器进行验证

/**
     * Get table name for the entity, validated by db adapter
     *
     * @param string $entityName
     * @return string
     */
public function getTable($entityName)
{
    if (is_array($entityName)) {
        $cacheName    = join('@', $entityName);
        list($entityName, $entitySuffix) = $entityName;
    } else {
        $cacheName    = $entityName;
        $entitySuffix = null;
    }

    if (isset($this->_tables[$cacheName])) {
        return $this->_tables[$cacheName];
    }

    if (strpos($entityName, '/')) {
        if (!is_null($entitySuffix)) {
            $modelEntity = array($entityName, $entitySuffix);
        } else {
            $modelEntity = $entityName;
        }
        $this->_tables[$cacheName] = $this->_resources->getTableName($modelEntity);
    } else if (!empty($this->_resourceModel)) {
        $entityName = sprintf('%s/%s', $this->_resourceModel, $entityName);
        if (!is_null($entitySuffix)) {
            $modelEntity = array($entityName, $entitySuffix);
        } else {
            $modelEntity = $entityName;
        }
        $this->_tables[$cacheName] = $this->_resources->getTableName($modelEntity);
    } else {
        if (!is_null($entitySuffix)) {
            $entityName .= '_' . $entitySuffix;
        }
        $this->_tables[$cacheName] = $entityName;
    }
    return $this->_tables[$cacheName];
}

以上就是一个几乎完整的获得子类ID方法下包含的所有方法,通过这些方法可以看出来所得到的子类ID是一个二维数组。

相关TAG标签
上一篇:Google Safe Browsing API的使用详情
下一篇:关于java.lang.IllegalStateException: Fragment already added问题的解决办法
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站