Magento - получайте в комплекте продукты, к которым относится простой продукт - PullRequest
1 голос
/ 20 октября 2011

Я хочу показать все пакеты на странице простого продукта, поэтому мне нужно получить информацию.Я искал и много пробовал.Это сообщение звучит многообещающе, но оно либо не работает, либо, возможно, не из-за моей проблемы: 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 () выдает исключение.

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

Ответы [ 2 ]

0 голосов
/ 13 марта 2012

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

$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
        }
0 голосов
/ 21 октября 2011

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

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

     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;
...