Пожалуйста помогите советом!
Есть большое количество нод - каждая содержит информацию о товаре, также каждая нода содержит Computed field которое вычисляет цену товра в рублях с учётом текущего курса валюты (курс обновляется ежедневно по крону).
Чтобы отображать это Computed field во Views требуется включить его хранение в базе данных.
И тут начинаются проблеммы.
Computed field хранимое в базе данных обновляется только при пересохранении ноды.
Аргумент для вычисления этого Computed field обновляется каждый день.
Поэтому в виде предоставляемым полем Views - есть поля которые неизменяются.
Как решить такую проблемму?
Может есть какие нибудь альтренативы модулю Computed Field?
Спасибо!
Комментарии
http://drupal.org/project/views_customfield
Либо при обновлении курсов валют делай node_load, пересчет значения поля, node_save для всех нод.
Хотя пожалуй, для сотни нод такой скрипт будет очень долго выполнятся. Но можно составить прямой запрос в базу на изменение конкретных полей.
С БД наверное наиболее оптимальный вариант тем более на кроне все равно получается курс и если есть поле цены в уе то вся проблема решается селектом по типу нод, прохождением одним циклом по nid и апдейтом соотв поля в БД.
Думаю, можно и одним апдейтом - подзапрос там сконструировать.
Ну там надо творчески подходить к проблеме ))). Иногда 1000 маленьких апдейтов отрабатывает быстрее одного монстроподобного запроса.
А что вы на апдейты зациклились? Есть понятие - нормализация бд
А как может помочь нормализация БД?
както так: $node->field__[1]['value'], придётся грузить ноду каждый раз.
Или делать селект, что в принципе не есть хорошо в обеих случаях.
Надо посмотреть что views сам дает, в этом случае более оптимально выйдет.
Views читает поля из базы как они там лежат. Проблема, как я понимаю, в том, что при обновлении курса валют (интересно, оно идет как поле ноды или как отдельная величина?) вычисляемые поля не пересчитываются. Решение: пересчитывать в кроне при обновлении курса, а вот как? Пересохранение нод или прямой запрос по базе. Вроде других вариантов не видать.
Ну оптимальная задача: избавиться от пересохранения. Пусть views читает, надо както вот это прочитанное достать и вычислить требуемое.
Тогда computed field нафик не нужно, там должна стоять цена в одних единицах. А пересчитывать нужно в функции, что перехватит функцию темизации, которую использует views для вывода этого поля.
во, через тематизацию.
Кстати да - через темизацию довольнотаки практичное решение!Спасибо! Но на лицо явная недоработка интсрументария - Views явно не хватает своего собственного computed поля.
Курсы хранятся в отдельной таблице базы SQL.
Подскажите по подробней как вы сделали в ноде поле Computed field которое вычисляет цену товра в рублях с учётом текущего курса валюты (курс обновляется ежедневно по крону).
Ато разобраться никак не могу.
Забудьте computed field, если данные не нужно хранить в бд, имхо для курса валют это и не нужно, для этого у Views2 есть модуль views_customfield.
Для тематизации тем более computed field не нужен, всё можно вычислить и по php.
Чтобы не разбросать код, можно описать функцию "гдето".