Magento: Ошибка при получении коллекции товаров по категориям - PullRequest
0 голосов
/ 09 ноября 2011

Я пытаюсь получить коллекцию товаров с фильтром категорий, который принимает категорию как объект.Проблема в том, что я получаю следующую ошибку:

Неустранимая ошибка: вызов функции-члена getId () для необъекта в / var / www / vhosts / officeaccounts / subdomains / ls /httpdocs / app / code / core / Mage / Catalog / Model / Resource / Product / Collection.php в строке 557

Когда я закомментирую фильтр категорий, он не получит ошибок.

Это говорит о том, что я не передаю объект.Но все же я все еще могу получить доступ к методу getId () объекта, выполнив var_dump($category->getId()); Это возвращает идентификатор в виде строки.

$category = Mage::registry('current_category');
if (!$category) {
    $product = $this->getProduct();
    $cats = $product->getCategoryIds();
    $category = Mage::getModel('catalog/category')->load($cats[0]);
}

function getFallbackItems() {
    $productCollection = Mage::getResourceModel('catalog/product_collection')
                    ->addAttributeToSelect('*')
                    ->addCategoryFilter($category);
    $productCollection->getSelect()->order(new Zend_Db_Expr('RAND()'));
    return $productCollection;
}

Любые идеи кто-нибудь?

Ответы [ 3 ]

0 голосов
/ 04 мая 2015

Чтобы получить коллекцию товаров по категориям, сделайте следующее:

$category = Mage::getModel('catalog/category')->load(12);
$productCollection = $category->getProductCollection();
$productCollection->getSelect()->order(new Zend_Db_Expr('RAND()'));
print_r($productCollection->getData());

Примечание: здесь 12 - это идентификатор_категории

0 голосов
/ 25 ноября 2015

Есть некоторые проблемы с вашим кодом:

  1. Вам следует зарегистрировать категорию (current_category), если она не существует.
  2. Я не вижу объявления переменной $ category где-либо в вашей функции getFallbackItems (я полагаю, вы следуете кодированию ООП) Так что наверняка вы получите ошибку при использовании фильтра addCategoryFilter ($ category)
  3. Вы должны всегда проверять существование переменной перед ее использованием.

====>

Таким образом, код можно улучшить, как показано ниже:

$category = Mage::registry('current_category');

if (!$category) {
    $product = $this->getProduct();
    $cats = $product->getCategoryIds();
    $category = Mage::getModel('catalog/category')->load($cats[0]);
    Mage:register('current_category', $category);
}

// Suppose it will be called somewhere
function getFallbackItems() {
    $category = Mage::registry('current_category');
    $productCollection = Mage::getResourceModel('catalog/product_collection')
        ->addAttributeToSelect('*');

    if ($category && $category->getId()) {
        $productCollection->addCategoryFilter($category);
    }

    $productCollection->getSelect()->order(new Zend_Db_Expr('RAND()'));

    return $productCollection;
}
0 голосов
/ 23 января 2012

Если последний блок if else функции addAttributeToFilter () Mage_Catalog_Model_Resource_Product_Collection, попробуйте этот код

    elseif(is_string($attribute) && $attribute == 'category_ids'){

        if(isset($condition['eq'])){
            $this->getSelect()->join(
            array('category' => $this->getTable('catalog/category_product')),
            'category.product_id=e.entity_id AND category.category_id='.$condition['eq'],
            array()
            );
        }
        return $this;

    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...