Сортировка по математическому выражению во Views

Аватар пользователя icedfox icedfox 17 ноября 2013 в 9:58

Доброго времени суток, в виду слабых познаний в PHP (примерно "0") обращаюсь к тем, кто готов решить мою задачу за оговоренное вознаграждение . Думаю решение задачи обязательно выложим в виду его актуальности.
Имеем:
-Четыре значения по каждой ноде из модуля fivestar
-Значения выведены с помощью математического выражения во Views

Задача:
Уговорить Views адекватно делать сортировку по результатам поля с математическим выражением

Оплата:
После согласования суммы, предоплата 50%(если исполнитель уже известен здесь) , остальные 50% после выполнения задачи
Способ оплаты webmoney, qiwi, visa, на мобильный телефон, безнал, пиво (бандеролью через почту России)

П.С.
Из гугла узнал, что подобные поля не имеют фиксированных значений в базе, а Views такие сортировать не умеет.

0 Thanks

Комментарии

Аватар пользователя alex_shut alex_shut 17 ноября 2013 в 11:24
"icedfox" wrote:

Уговорить Views адекватно делать сортировку

Еслиб сюда еще подробностей.
как выводит сейчас?
И как адекватно?

Это поможет в определении кандидатов)

Аватар пользователя sg85 sg85 17 ноября 2013 в 11:30

начнем с того, что вьювс вообще ни хрена не делает, кроме того, что позволяет мышью построить запрос к БД, а так же при помощи той же мыши отрисовывает результат. И если у Вас используются какие-то совсем странные вычисления при построении сортировки, то решить задачу можно парой способов:
Способ 1й, прямой:
1 Покупаем VPS
2 Пишем пользовательскую функцию с данными вычислениями для СУБД
3 Компилируем СУБД
4 Пишем обработчик для вьювс для поддержки этой самой пользовательской функции в СУБД
Недостаток способа - его сложность и зависимость сайта от собственной компиляции СУБД.

Способ 2й:
Записываем значение этого поля в реально существующем поле(можно просто прицепить самое обычное поле от модуля Fields), для этого можно попытаться использовать Rules, либо использовать кастомный код, недостатком этого способа - не годится, если значения в этом поле постоянно меняются.
Вообще, на сколько помню, поля модуля Custom Fields или как там его, могли хранить вычисленные значения в БД специально для того, чтоб с ними мог работать Views, для этого в настройках поля достаточно было поставить какую-то галочку.

Способ 3й:
За место Fields используем индексы какого-нибудь поискового движка, то бишь через Search Api, то есть тот же 2й способ, только ввиду использования поискового движка отпадает необходимость добавлять еще одно поле.

Аватар пользователя icedfox icedfox 17 ноября 2013 в 12:18

ту alex_shut, никак не сортирует вот вывод на текущий момент http://help-host.ru/hosting_raring
ту sg85, благодарю вас за развернутый ответ.
1. Первый способ отпадает в виду последующей зависимости сайта к серверу, т.е. его привязке. (не дай бог перенос, и это будет гемор)
2. С полями мне ваша идея понравилась, на сколько сложно реализовать ?
3. мне кажется индексы поиска использовать не совсем логично.

для ясности картины, собственно сама форума мат. выражения ([value]+[value_1]+[value_2]+[value_3])/10
вот SQL запрос вьюхи

SELECT node.nid AS nid, node.title AS node_title, votingapi_cache_node_vote1_average.value AS votingapi_cache_node_vote1_average_value, votingapi_cache_node_vote2_average.value AS votingapi_cache_node_vote2_average_value, votingapi_cache_node_vote3_average.value AS votingapi_cache_node_vote3_average_value, votingapi_cache_node_vote4_average.value AS votingapi_cache_node_vote4_average_value, node_comment_statistics.comment_count AS node_comment_statistics_comment_count, 'node' AS field_data_field_votes1_node_entity_type, 'node' AS field_data_field_votes2_node_entity_type, 'node' AS field_data_field_votes3_node_entity_type, 'node' AS field_data_field_votes4_node_entity_type
FROM
{node} node
LEFT JOIN {field_data_field_host_title} field_data_field_host_title ON node.nid = field_data_field_host_title.entity_id AND (field_data_field_host_title.entity_type = 'node' AND field_data_field_host_title.deleted = '0')
LEFT JOIN {taxonomy_term_data} taxonomy_term_data_field_data_field_host_title ON field_data_field_host_title.field_host_title_tid = taxonomy_term_data_field_data_field_host_title.tid
LEFT JOIN {votingapi_cache} votingapi_cache_node_vote1_average ON node.nid = votingapi_cache_node_vote1_average.entity_id AND (votingapi_cache_node_vote1_average.entity_type = 'node' AND votingapi_cache_node_vote1_average.tag = 'vote1' AND votingapi_cache_node_vote1_average.function = 'average')
LEFT JOIN {votingapi_cache} votingapi_cache_node_vote2_average ON node.nid = votingapi_cache_node_vote2_average.entity_id AND (votingapi_cache_node_vote2_average.entity_type = 'node' AND votingapi_cache_node_vote2_average.tag = 'vote2' AND votingapi_cache_node_vote2_average.function = 'average')
LEFT JOIN {votingapi_cache} votingapi_cache_node_vote3_average ON node.nid = votingapi_cache_node_vote3_average.entity_id AND (votingapi_cache_node_vote3_average.entity_type = 'node' AND votingapi_cache_node_vote3_average.tag = 'vote3' AND votingapi_cache_node_vote3_average.function = 'average')
LEFT JOIN {votingapi_cache} votingapi_cache_node_vote4_average ON node.nid = votingapi_cache_node_vote4_average.entity_id AND (votingapi_cache_node_vote4_average.entity_type = 'node' AND votingapi_cache_node_vote4_average.tag = 'vote4' AND votingapi_cache_node_vote4_average.function = 'average')
INNER JOIN {node_comment_statistics} node_comment_statistics ON node.nid = node_comment_statistics.nid
WHERE (( (node.status = '1') AND (node.type IN  ('hostcompany')) ))
ORDER BY votingapi_cache_node_vote1_average_value DESC, votingapi_cache_node_vote4_average_value DESC
LIMIT 30 OFFSET 0
Аватар пользователя imarat imarat 17 ноября 2013 в 16:45

2 вариант самый простой
пояснили бы что за value1 value2.. - откуда они берутся?

Аватар пользователя imarat imarat 17 ноября 2013 в 23:08

думаю пара тыс - потолок
хотя все еще не ясно что именно за значения
если интересует - контакты в профиле

Аватар пользователя sg85 sg85 21 ноября 2013 в 3:28
"icedfox" wrote:

С полями мне ваша идея понравилась, на сколько сложно реализовать ?

это не сложно, однако, необходимо, как минимум, знание php хотя бы на среднем уровне в случае с Custom Fields, либо еще и Drupal API уровнем несколько выше начинающего в случае без Custom Fields, словом, если не обладаете хотя бы этими скиллами, у Вас может уйти от недели до пары месяцев на то, чтобы со всем этим разобраться, в этом случае возможно выгоднее будет обратиться к специалисту, советую рассмотреть предложение Имарата.

судя по Вашей формуле, думаю можно построить и прямой запрос, но, во первых, Views без костылей таких запросов строить не умеет, во вторых, при большом числе записей, тот же MySQL от подобного запроса попросту ляжет.

Аватар пользователя icedfox icedfox 21 ноября 2013 в 8:05

sg85, вы отчасти правы. Мне сделали сортировку прямыми запросами, но это не то, что надо. При базовой сортировке запрос создается 3 мс, а с такой сортировкой 1800мс. Пока оставил так, думаю как это реализовать по изящней.