Drupal Commerce. Вывожу каталог вьювзом. Часть товара содержат изображения, часть (которые не содержат) - дефолтное фото-заглушка.
Сортируется по различным полям (наличие, цена и т.д.). Как вывести сначала товар с фото, а затем без фото?
Заранее признателен.
Комментарии
field-foto = not null
При выборе поля фото доступно только "Сортировать по возрастанию" и "Сортировать по убыванию". Другого не дано.
а точнее если нужна сортировка, то по field_foto:fid (desc)
field_foto:fid - это id файла фото, оно не имеет ни какого отношения к наличию отсутствию фото и при его выборе аналогично нет выбора Наличия/Отсутствия (см. предыдущий пост).
Если б было все так просто я бы не спрашивал.
Вероятно нужно какое-то программное решение с hook_views_query_alter() или других функций по работе с вьюз, но как оформить именно эту задачу - непонятно.
file id при отсутствии изображения чему будет равен?
если выбрать сортировку по fid поля с изображением будет выводить вначале без фото , а затем с фото, "Сортировать по убыванию" - наоборот
просто измените порядок сортировки, поставьте эту сортировку первой и убедитесь
Поставил, убедился - не работает.
а скриншот настроек вьюса?
очевидно, что вначале у вас сортировка по цене
хотя если нужны еще сортировки и по другим свойствам, то я сделал бы сортировку по наличию изображения с помощью дельты этого поля, для этого если в настройках поля изображения одно изображение выставить неограниченно
Пожалуйста вьюз
field_images:delta
То же самое.
Вообще приведенные вами способы общеизвестны, и естественно прежде чем написать пост я их все опробовал. Ими можно убрать товар без фото во вьювзе, но отсортировать не получается.
сортировка по delta тоже общеизвестна, другое дело, что вы разберитесь со своими связями, почему не сделать сортировку по (Товар) поле:фото:delta или же не материал referencing products, a материал referenced products
разбирайтесь вообщем со связями, сортировка по дельте работает
Специально для Вас вывел поле дельта. Обратите внимание оно равно нулю как для товара с фото, так и для товара с дефолтным изображением. Как в таком случае может происходить сортировка?. Привел также скрин вьюхи которая это выводит. Если обратите внимание в сортировку добавлена дельта.
вот вам специально сортировка по дельте
ASC,DESC и сам вьюс
если вас смущает вывод дельты, то вот запрос, который формирует вьюс
FROM
node node
LEFT JOIN field_data_field_product field_data_field_product ON node.nid = field_data_field_product.entity_id AND (field_data_field_product.entity_type = 'node' AND field_data_field_product.deleted = '0')
LEFT JOIN commerce_product commerce_product_field_data_field_product ON field_data_field_product.field_product_product_id = commerce_product_field_data_field_product.product_id
LEFT JOIN field_data_field_image commerce_product_field_data_field_product__field_data_field_image ON commerce_product_field_data_field_product.product_id = commerce_product_field_data_field_product__field_data_field_image.entity_id AND (commerce_product_field_data_field_product__field_data_field_image.entity_type = 'commerce_product' AND commerce_product_field_data_field_product__field_data_field_image.deleted = '0')
LEFT JOIN field_data_commerce_price commerce_product_field_data_field_product__field_data_commerce_price ON commerce_product_field_data_field_product.product_id = commerce_product_field_data_field_product__field_data_commerce_price.entity_id AND (commerce_product_field_data_field_product__field_data_commerce_price.entity_type = 'commerce_product' AND commerce_product_field_data_field_product__field_data_commerce_price.deleted = '0')
WHERE (( (node.status = '1') AND (node.type IN ('product_display')) ))
ORDER BY commerce_product_field_data_field_product__field_data_field_ ASC, commerce_product_field_data_field_product__field_data_commer ASC
LIMIT 10 OFFSET 0
и вот его результат
node_title: watch4
nid: 14
commerce_product_field_data_field_product_product_id: 4
commerce_product_field_data_field_product__field_data_field_: NULL
commerce_product_field_data_field_product__field_data_commer: 19000
*************************** 2. row ***************************
node_title: watch5
nid: 15
commerce_product_field_data_field_product_product_id: 5
commerce_product_field_data_field_product__field_data_field_: NULL
commerce_product_field_data_field_product__field_data_commer: 19500
*************************** 3. row ***************************
node_title: watch1
nid: 11
commerce_product_field_data_field_product_product_id: 1
commerce_product_field_data_field_product__field_data_field_: 0
commerce_product_field_data_field_product__field_data_commer: 18000
*************************** 4. row ***************************
node_title: watch2
nid: 12
commerce_product_field_data_field_product_product_id: 2
commerce_product_field_data_field_product__field_data_field_: 0
commerce_product_field_data_field_product__field_data_commer: 18500
*************************** 5. row ***************************
node_title: watch3
nid: 13
commerce_product_field_data_field_product_product_id: 3
commerce_product_field_data_field_product__field_data_field_: 0
commerce_product_field_data_field_product__field_data_commer: 20000
если интересно почему вьюс рендерит не NULL , а 0, смотрите views_handler_field_numeric
$value = $value > 0 ? floor($value) : ceil($value);
$value = number_format($value, 0, '', ',');
print $value;//выведет 0
Вы оказались правы. Ошибка была в том, что была связь дельты с "Материал referencing products from field_product", а нужно было выбрать просто "Product" (я считал что это фактически идентичные составляющие). Благодарю за помощь, приношу извинения за свою невнимательность.