Magento - получите наборы продуктов, в которые входит простой продукт

Я хочу показать все пакеты на странице простого продукта, поэтому мне нужно получить информацию. Я много искал и пробовал. Этот пост звучит многообещающе, но либо не работает, либо не подходит для моей проблемы: from-a-product-id?answertab=active#tab-top">Magento — получить список идентификаторов продуктов в комплекте из идентификатора продукта

Я нашел решение для сгруппированных продуктов, но здесь его нельзя применить.

$grouped_product_model = Mage::getModel('bundle/product_selection');
$groupedParentId = $grouped_product_model->getParentIdsByChild($product->getId()); 

Я обнаружил, что таблица catalog_product_bundle_selection является подходящим местом для поиска, но мне интересно, есть ли чистый способ и существующая функция для поиска в этой таблице по product_id, чем просто взломать это.

Я не нашел решения в Mage_Bundle.

Что я пропустил?

Получив первую помощь от vrnet, я написал новый класс блоков, чтобы обновить макет.

class Thomaier_Catalog_Block_Product_View_BundledSelect extends Mage_Catalog_Block_Product_View 
{

    protected $_simpleProducts = array( '3' ); // just an example

    public function getBundles() {

        $bundleIds = array();

        $bundlesCollectionModel = Mage::getResourceModel('bundle/selection_collection');
        $bundlesCollection = $bundlesCollectionModel->getSelect()
             ->where('`selection`.`product_id` in (' . join(',', (array)$this->_simpleProducts) . ')');

        foreach ($bundlesCollection as $bundleItem) {
            $bundleIds[] = $bundleItem->getParentProductId();
        }

        ...
    }
}

Я пропустил некоторые части. Как я уже упоминал в комментарии, SQL-запрос работает нормально, когда я пробую его в phpmyadmin, но $bundleItem не создается, а ->load() выдает исключение.

Спасибо за совет.


person Thomas    schedule 20.10.2011    source источник


Ответы (2)


Ниже приведен метод, который я написал для клиента с тем же запросом, но с дополнительным: возможностью перетасовывать результат.

Надеюсь, поможет.

     protected $_simpleProducts = array(); // Array with IDs of simple products you want bundles from.

     protected $_shuffle = false;

    public function getBundles() {
        $bundleIds = array();

        /*Rather than using a collection model 
and make operations with getSelect,
a more elegant way is to extend
Mage_Bundle_Model_Mysql4_Selection_Collection
with a method that would be something like
setProductIdsFilter($productIds)*/

        $bundlesCollectionModel = Mage::getResourceModel('bundle/selection_collection');
        $bundlesCollection = $bundleCollectionModel->getSelect()
                                         ->where('`selection`.`product_id` in (' . join(',', (array)$this->_simpleProducts) . ')');
        foreach ($bundlesCollection as $bundleItem) {
            $bundleIds[] = $bundleItem->getParentProductId();
        }
        if (count($bundleIds)) {
            $allowBundles = Mage::getResourceModel('catalog/product_collection')
                            ->addIdFilter($bundleIds)
                            ->addFieldToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
            if ($this->_shuffle) {
                $allowBundles->getSelect()->order('rand()');
            }
            if ($allowBundles->count()) {
                return $allowBundles;
            }
        }
        return;
person Hervé Guétin    schedule 21.10.2011
comment
СПАСИБО, что поделились своим решением. Это похоже на решение моей проблемы. Жаль, что нет существующего метода для этой задачи. - person Thomas; 24.10.2011
comment
Рад, что это было полезно. И если вы станете постоянным пользователем StackOverflow, не стесняйтесь возвращаться сюда и +1 к моему ответу :) - person Hervé Guétin; 24.10.2011
comment
Я реализовал его как новый блок в модуле каталога. SQL успешно создан, но цикл foreach не работает. После некоторых исследований кажется, что что-то вроде load() отсутствует, но если я это реализую, я получаю сообщение об ошибке. Что я пропустил? - person Thomas; 25.10.2011
comment
Метод load() не является обязательным для коллекции, если вы зацикливаетесь на ней. Метод load() будет автоматически запускаться базовыми методами Varien для foreach. Не могли бы вы обновить исходный вопрос, указав код своего блока? - person Hervé Guétin; 25.10.2011

Ниже приведен лучший способ работы с ними. Таким образом, вы не полагаетесь на собственный запрос, а вместо этого можете использовать основные методы:

$bundlesCollection = Mage::getResourceModel('bundle/selection')
                             ->getParentIdsByChild($simple_product_ids_array_or_int);
        foreach ($bundlesCollection as $bundleProdId) {
              //do anything you want with the bundleProdId array elements
        }
person Milen Petrov    schedule 13.03.2012