Не могу добавить свойство в коллекцию

[16 июля 2019 г.]    Российская сборка Magento 2.52.2
Magento 2: модули и услуги
magereport.com: составление перечня необходимых для установки заплаток SUPEE
#1 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

09.11.2011 17:09

Добрый вечер!
Маженто 1.3

В каталоге при просмотре категории необходимо добавить и вывести аттрибут.
Есть такой блок
class Pro_CatalogProduct_Block_List extends Mage_Catalog_Block_Product_List
{

    protected function _getProductCollection()
    {
        if (is_null($this->_productCollection)) {
            $this->_productCollection = Mage::getModel('catalog/product')->getCollection();
            $attributes = Mage::getSingleton('catalog/config')
                ->getProductAttributes();
            Zend_Debug::dump($attributes);
            $this->_productCollection->addAttributeToSelect($attributes)
                ->addMinimalPrice()
                ->addFinalPrice()
                ->addTaxPercents();
            $this->_productCollection->joinField(
                'qty', 'cataloginventory/stock_item', 'qty', 'product_id=entity_id',
                '{{table}}.qty = 0 AND {{table}}.is_in_stock=0'
            );
             // пытаюсь добавить и вывести нужный аттрибут
            $this->_productCollection->joinAttribute('codefamille', 'catalog_product/codefamille', 'entity_id', null, 'left');
        }

        return $this->_productCollection;
    }
}


В итоговом sql есть ошибка

LEFT JOIN `catalog_product_entity_varchar` AS `_table_codefamille_default` ON (_table_codefamille_default.entity_id = e.) AND (_table_codefamille_default.attribute_id='1029') AND _table_codefamille_default.store_id=0
 LEFT JOIN `catalog_product_entity_varchar` AS `_table_codefamille` ON (_table_codefamille.entity_id = e.) AND (_table_codefamille.attribute_id='1029') AND (_table_codefamille.store_id='5')


(_table_codefamille.entity_id = e.)

Как исправить не пойму, может я не правильно что то делаю.

Весь sql

SELECT 1 AS `status`, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id`, `e`.`name`, `e`.`price`, `e`.`small_image`, `e`.`tax_class_id`, `e`.`url_key`, `e`.`thumbnail`, `e`.`short_description`, `e`.`special_price`, `e`.`special_from_date`, `e`.`special_to_date`, `e`.`news_from_date`, `e`.`news_to_date`, `e`.`required_options`, `e`.`price_type`, `e`.`weight_type`, `e`.`price_view`, `e`.`shipment_type`, `e`.`image_label`, `e`.`small_image_label`, `e`.`thumbnail_label`, `e`.`neufoccasion`, `e`.`atttest`, `e`.`ventes`, `e`.`typeguide`, `e`.`guidenumerique`, `e`.`issue`, `e`.`slug`, `e`.`year`, `e`.`version_simple`, `e`.`price`, `e`.`special_price`, `e`.`special_from_date`, `e`.`special_to_date`, `_table_qty`.`qty`, IFNULL(_table_codefamille.value, _table_codefamille_default.value) AS `codefamille`, `e`.`display_price_group_1` AS `_rule_price` FROM `catalog_product_flat_5` AS `e`
 INNER JOIN `cataloginventory_stock_item` AS `_table_qty` ON (_table_qty.product_id=e.entity_id) AND (_table_qty.qty = 0 AND _table_qty.is_in_stock=0)
 LEFT JOIN `catalog_product_entity_varchar` AS `_table_codefamille_default` ON (_table_codefamille_default.entity_id = e.) AND (_table_codefamille_default.attribute_id='1029') AND _table_codefamille_default.store_id=0
 LEFT JOIN `catalog_product_entity_varchar` AS `_table_codefamille` ON (_table_codefamille.entity_id = e.) AND (_table_codefamille.attribute_id='1029') AND (_table_codefamille.store_id='5') ORDER BY `e`.`ventes` asc



Спасибо!

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8995
  • Регистрация: 20.02.2010

09.11.2011 17:23

А вы в курсе существования метода addAttributeToSelect вместо joinAttribute?
Выглядит так, что вы используете joinAttribute не по назначению.

#3 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

09.11.2011 17:36

Я пробовал $this->_productCollection->addAttributeToSelect('codefamille');
Но эффект нулевой.

#4 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8995
  • Регистрация: 20.02.2010

09.11.2011 17:38

Узнайте, какой запрос SQL получается при addAttributeToSelect и выполните его вручную через phpMyAdmin - там и понятно будет, в чём дело.

#5 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

09.11.2011 17:46

Выводил в запросе нет этого поля.

#6 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8995
  • Регистрация: 20.02.2010

09.11.2011 17:48

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

#7 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

09.11.2011 18:06

В каком смысле? Надо на какой то параметр атрибута обратить внимание? Если я открываю страницу просмотра продукта я могу вывести этот атрибут и имею к нему доступ. На на странице категории, такого атрибута нет.

#8 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8995
  • Регистрация: 20.02.2010

09.11.2011 18:11

  • Прикрепите экран настроек свойства codefamille для того магазина, в контексте которого выполняется ваш программный код.
  • Опубликуйте обновлённую версию программного кода для формирования коллекции. Предварительно для простоты удалите из коллекции другие свойства.
  • Опубликуйте SQL коллекции из п.2


#9 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

09.11.2011 18:55

Прикрепленное изображение: codefamille.jpg
Код
<?php

require_once("../app/code/core/Mage/Catalog/Block/Product/List.php");

class Pro_CatalogProduct_Block_List extends Mage_Catalog_Block_Product_List
{

    protected function _getProductCollection()
    {
        if (is_null($this->_productCollection)) {
            $this->_productCollection = Mage::getModel('catalog/product')->getCollection();

            $this->_productCollection->addAttributeToSelect('codefamille');
        }

        return $this->_productCollection;
    }
}


Запрос
SELECT 1 AS `status`, `e`.`entity_id`, `e`.`type_id`, `e`.`attribute_set_id` FROM `catalog_product_flat_5` AS `e`


#10 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8995
  • Регистрация: 20.02.2010

09.11.2011 19:02

Проверьте то же самое на чистом эталонном сайте.
Заведите одно свойство codefamille, добавьте его к используемому для товаров набору свойств, проведите переиндексацию, а затем выполните ваш программный код.

#11 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

09.11.2011 19:23

Мне бы так, что бы оно работало на этом сайте...

#12 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8995
  • Регистрация: 20.02.2010

09.11.2011 19:59

Испытание ситуации на эталоне позволяет выяснить, является ли причиной дефекта нестандартная доработка ядра.

#13 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

09.11.2011 19:59

Какие есть варианты решения задачи? Может самому достроить нужный запрос? Или еще как...
Код проекта жуткий, и прошлый разработчик вносил много правок в ядро и модули, возможно он где то что то добавил, а в другом месте поломалось.
Но искать времени нет, да и лезть исправлять и ломать тоже.

Ок, завтра попробую на чистой версии.

#14 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8995
  • Регистрация: 20.02.2010

09.11.2011 20:01

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

Поделиться темой: