Сортировка views по наличию/отсутствию изображений

Главные вкладки

Аватар пользователя kstukstu kstukstu 4 сентября 2014 в 17:35

Drupal Commerce. Вывожу каталог вьювзом. Часть товара содержат изображения, часть (которые не содержат) - дефолтное фото-заглушка.
Сортируется по различным полям (наличие, цена и т.д.). Как вывести сначала товар с фото, а затем без фото?
Заранее признателен.

Комментарии

Аватар пользователя kstukstu kstukstu 4 сентября 2014 в 18:05

При выборе поля фото доступно только "Сортировать по возрастанию" и "Сортировать по убыванию". Другого не дано.

Аватар пользователя kstukstu kstukstu 4 сентября 2014 в 18:10

field_foto:fid - это id файла фото, оно не имеет ни какого отношения к наличию отсутствию фото и при его выборе аналогично нет выбора Наличия/Отсутствия (см. предыдущий пост).
Если б было все так просто я бы не спрашивал.
Вероятно нужно какое-то программное решение с hook_views_query_alter() или других функций по работе с вьюз, но как оформить именно эту задачу - непонятно.

Аватар пользователя drupby drupby 4 сентября 2014 в 18:24

"kstukstu" wrote:
field_foto:fid - это id файла фото, оно не имеет ни какого отношения к наличию отсутствию фото и при его выборе аналогично нет выбора Наличия/Отсутствия (см. предыдущий пост).
Если б было все так просто я бы не спрашивал.

"kstukstu" wrote:
"Сортировать по возрастанию"

file id при отсутствии изображения чему будет равен?
если выбрать сортировку по fid поля с изображением будет выводить вначале без фото , а затем с фото, "Сортировать по убыванию" - наоборот
просто измените порядок сортировки, поставьте эту сортировку первой и убедитесь

Аватар пользователя drupby drupby 4 сентября 2014 в 20:08

"kstukstu" wrote:

Поставил, убедился - не работает.

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

Аватар пользователя kstukstu kstukstu 4 сентября 2014 в 20:33

Вообще приведенные вами способы общеизвестны, и естественно прежде чем написать пост я их все опробовал. Ими можно убрать товар без фото во вьювзе, но отсортировать не получается.

Аватар пользователя drupby drupby 4 сентября 2014 в 21:07

"kstukstu" wrote:
Вообще приведенные вами способы общеизвестны, и естественно прежде чем написать пост я их все опробовал. Ими можно убрать товар без фото во вьювзе, но отсортировать не получается.

сортировка по delta тоже общеизвестна, другое дело, что вы разберитесь со своими связями, почему не сделать сортировку по (Товар) поле:фото:delta или же не материал referencing products, a материал referenced products
разбирайтесь вообщем со связями, сортировка по дельте работает

Аватар пользователя kstukstu kstukstu 10 ноября 2015 в 11:49

Специально для Вас вывел поле дельта. Обратите внимание оно равно нулю как для товара с фото, так и для товара с дефолтным изображением. Как в таком случае может происходить сортировка?. Привел также скрин вьюхи которая это выводит. Если обратите внимание в сортировку добавлена дельта.

Аватар пользователя drupby drupby 10 ноября 2015 в 11:49

"kstukstu" wrote:
Специально для Вас вывел поле дельта.

вот вам специально сортировка по дельте
ASC,DESC и сам вьюс

Аватар пользователя drupby drupby 5 сентября 2014 в 1:08

если вас смущает вывод дельты, то вот запрос, который формирует вьюс

SELECT node.title AS node_title, node.nid AS nid, commerce_product_field_data_field_product.product_id AS commerce_product_field_data_field_product_product_id, commerce_product_field_data_field_product__field_data_field_image.delta AS commerce_product_field_data_field_product__field_data_field_, commerce_product_field_data_field_product__field_data_commerce_price.commerce_price_amount AS commerce_product_field_data_field_product__field_data_commer
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

и вот его результат

*************************** 1. row ***************************
                                                  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 = NULL;
$value = $value > 0 ? floor($value) : ceil($value);
$value = number_format($value, 0, '', ',');
print $value;//выведет 0
Аватар пользователя kstukstu kstukstu 5 сентября 2014 в 1:38

Вы оказались правы. Ошибка была в том, что была связь дельты с "Материал referencing products from field_product", а нужно было выбрать просто "Product" (я считал что это фактически идентичные составляющие). Благодарю за помощь, приношу извинения за свою невнимательность.