Когда товаров в интернет-магазине HostCMS множество, становится трудно уследить за всеми заполненными дополнительными свойствами. Я считаю, что на отметке в несколько тысяч товаров это уже проблематично, не говоря уже от 180000. Дополнительные свойства в случае большого интернет-магазина выгружаются из 1С и их обязательно нужно проверять, потому что модуль обмена может допустить ошибку и не выгрузить значения.

Чтобы найти товары с незаполненным дополнительным свойством в HostCMS нужно узнать номер (ID) необходимого допсвойства.

Как найти ID дополнительного свойства

Заходим в раздел Контент — Интернет-магазины

заходим в интернет-магазин hostcms

Нажимаете на кнопку Товары и выбираете пункт Свойства товара:

как посмотреть дополнительные свойства в hostcms

В списке находим нужное дополнительное свойство и ищем его номер в первом столбце. Пусть для примера будет Поставщик:

ID дополнительного свойства в HostCMS

Теперь нам нужно узнать какой тип у свойства — смотрим на третью колонку и в нашем случае это Строка. Тип дополнительного свойства строка означает, что его значения хранятся в таблице property_value_strings. Знать таблицу необходимо для того, чтобы составить верный запрос на поиск товаров. Номер мы знаем, текст мы знаем — можно приступать.

Создаём динамическую страницу

Вариантов использования кода несколько, но мы остановимся на таком: создадим страницу и на ней просто выведем полученный результат, дальше всё зависит от вашей задачи и фантазии.

Добавляем страницу

Добавляем страницу в HostCMS

Выбираем тип страницы «Динамическая страница», чтобы написать свой код, а не использовать готовый:

создаем динамическую страницу в HostCMS

А вот и сам код:

$OurQuery = Core_Entity::factory('Shop_item');
$OurQuery
   ->queryBuilder()
   ->select('shop_items.*')
   ->leftJoin('shop_item_properties', 'shop_items.shop_id', '=', 'shop_item_properties.shop_id')
   ->leftJoin('property_value_strings', 'shop_items.id', '=', 'property_value_strings.entity_id',
     array(
        array('AND' => array('shop_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_strings`.`property_id`')))
     )
   )
   ->where('shop_item_properties.property_id', '=', 163)
   ->where('property_value_strings.value', 'IS', NULL);
$OurResult=$OurQuery->findAll();

Давайте разберём что же тут происходит: сначала мы используем ORM и создаем новый объект Shop_item_Model без заполнения значениями, затем мы используем Query Builder чтобы выбрать все товары из таблице shop_items объединить её с таблицей property_value_strings по совпадению shop_items.id и property_value_strings.entity_id. Дальше идёт выбор именно нужного нам допсвойства (под номером 163) и самое главное — значения, которые не заполнены ->where(‘property_value_strings.value’, ‘IS’, NULL). Заключительным шагом мы используем метод findAll() чтобы получить все элементы. Предварительно вы можете использовать метод getCount() чтобы узнать количество найденных товаров.

Если вы любитель SQL запросов, вот пожалуйста аналогичный запрос на поиск незаполненных допсвойств через SQL:

SELECT * FROM `shop_items` LEFT OUTER JOIN `shop_item_properties` ON `shop_items`.`shop_id` = `shop_item_properties`.`shop_id` LEFT OUTER JOIN `property_value_strings` ON `shop_items`.`id` = `property_value_strings`.`entity_id` AND `shop_item_properties`.`property_id` = `property_value_strings`.`property_id` WHERE `shop_item_properties`.`property_id` = 163 AND `property_value_strings`.`value` IS NULL AND `shop_items`.`deleted` = 0

А вот инструкция как выполнять SQL запросы в HostCMS.

На этом всё, мы разобрались как найти товары с незаполненным дополнительным свойством в HostCMS, используя Query Builder и ORM. Задавайте вопросы, они наверняка будут.