Проблема с Views и Computed Field - если хранить в базе данных значения, то они обновляются только при пересохранении ноды

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

Аватар пользователя Ne_L Ne_L 10 ноября 2008 в 22:13

Пожалуйста помогите советом!
Есть большое количество нод - каждая содержит информацию о товаре, также каждая нода содержит Computed field которое вычисляет цену товра в рублях с учётом текущего курса валюты (курс обновляется ежедневно по крону).
Чтобы отображать это Computed field во Views требуется включить его хранение в базе данных.
И тут начинаются проблеммы.
Computed field хранимое в базе данных обновляется только при пересохранении ноды.
Аргумент для вычисления этого Computed field обновляется каждый день.
Поэтому в виде предоставляемым полем Views - есть поля которые неизменяются.

Как решить такую проблемму?
Может есть какие нибудь альтренативы модулю Computed Field?
Спасибо!

Комментарии

Аватар пользователя Ne_L Ne_L 11 ноября 2008 в 23:50

Nikit wrote:
http://drupal.org/project/views_customfield[/quote]
Спасибо! Хороший модуль, но он, при вычислении, позволяет обращаться только к стандартным полям ноды (во всяком случае обратится к CCK полю у меня не получилось).
Подскажи если знаешь.

Аватар пользователя direqtor direqtor 11 ноября 2008 в 5:58

Либо при обновлении курсов валют делай node_load, пересчет значения поля, node_save для всех нод.
Хотя пожалуй, для сотни нод такой скрипт будет очень долго выполнятся. Но можно составить прямой запрос в базу на изменение конкретных полей.

Аватар пользователя glu2006 glu2006 11 ноября 2008 в 9:28

direqtor wrote:
Либо при обновлении курсов валют делай node_load, пересчет значения поля, node_save для всех нод.
Хотя пожалуй, для сотни нод такой скрипт будет очень долго выполнятся. Но можно составить прямой запрос в базу на изменение конкретных полей.

С БД наверное наиболее оптимальный вариант тем более на кроне все равно получается курс и если есть поле цены в уе то вся проблема решается селектом по типу нод, прохождением одним циклом по nid и апдейтом соотв поля в БД.

Аватар пользователя glu2006 glu2006 11 ноября 2008 в 11:42

direqtor wrote:
Думаю, можно и одним апдейтом - подзапрос там сконструировать.

Ну там надо творчески подходить к проблеме ))). Иногда 1000 маленьких апдейтов отрабатывает быстрее одного монстроподобного запроса.

Аватар пользователя Nikit Nikit 12 ноября 2008 в 3:49

както так: $node->field__[1]['value'], придётся грузить ноду каждый раз.
Или делать селект, что в принципе не есть хорошо в обеих случаях.
Надо посмотреть что views сам дает, в этом случае более оптимально выйдет.

Аватар пользователя direqtor direqtor 12 ноября 2008 в 5:48

"Nikit" wrote:
Надо посмотреть что views сам дает, в этом случае более оптимально выйдет.

Views читает поля из базы как они там лежат. Проблема, как я понимаю, в том, что при обновлении курса валют (интересно, оно идет как поле ноды или как отдельная величина?) вычисляемые поля не пересчитываются. Решение: пересчитывать в кроне при обновлении курса, а вот как? Пересохранение нод или прямой запрос по базе. Вроде других вариантов не видать.

Аватар пользователя Nikit Nikit 12 ноября 2008 в 6:52

Ну оптимальная задача: избавиться от пересохранения. Пусть views читает, надо както вот это прочитанное достать и вычислить требуемое.

Аватар пользователя direqtor direqtor 12 ноября 2008 в 7:19

Тогда computed field нафик не нужно, там должна стоять цена в одних единицах. А пересчитывать нужно в функции, что перехватит функцию темизации, которую использует views для вывода этого поля.

Аватар пользователя Ne_L Ne_L 12 ноября 2008 в 22:48

Кстати да - через темизацию довольнотаки практичное решение!Спасибо! Но на лицо явная недоработка интсрументария - Views явно не хватает своего собственного computed поля.
Курсы хранятся в отдельной таблице базы SQL.

Аватар пользователя arefkin arefkin 18 июня 2009 в 20:03

Подскажите по подробней как вы сделали в ноде поле Computed field которое вычисляет цену товра в рублях с учётом текущего курса валюты (курс обновляется ежедневно по крону).
Ато разобраться никак не могу.

Аватар пользователя Nikit Nikit 19 июня 2009 в 2:20

Забудьте computed field, если данные не нужно хранить в бд, имхо для курса валют это и не нужно, для этого у Views2 есть модуль views_customfield.
Для тематизации тем более computed field не нужен, всё можно вычислить и по php.
Чтобы не разбросать код, можно описать функцию "гдето".