[РЕШЕНО] как отследить кол-во нод с заданным значением поля

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

Аватар пользователя Nilagor Nilagor 28 июля 2012 в 2:31

Грубо говоря задача такая - есть тип материала, к примеру "статья", у этого типа есть поле к примеру "тематика" и там набор значений, например "политика", "искусство", "природа" и тп. Так вот как поставить условие, что можно создавать не более, скажем, 5 статей одной тематики?
Причём не одному пользователю, а вообще - как только набирается 5 статей с одинаковым значением поля "тематика" дальнейшее создание таких статей запрещается?

Или аналогичная ситуация с модулем webform - к примеру есть форма заказа мастера на дом, и в ней, среди прочих, есть поле "мастер" со списком тех самых мастеров. Но один мастер может взять не больше 5 заказов одновременно. Как, в таком примере, "прекратить" приём заказов с определённым значением поля "мастер", если уже есть 5 заказов с таким значением именно этого поля?

Комментарии

Аватар пользователя Nilagor Nilagor 28 июля 2012 в 3:00

да что-то не нашёл я у rules условий, мол такое-то поле равно такому-то значению.
по крайней мере в стандартном rules и rulse webform точно нет

Аватар пользователя iGusev iGusev 28 июля 2012 в 3:08

"Nilagor" wrote:
да что-то не нашёл я у rules условий, мол такое-то поле равно такому-то значению.

а php условие на что?

Аватар пользователя Nilagor Nilagor 28 июля 2012 в 3:31

боюсь показаться нубом, но раньше с rules работать не приходилось, можно поподробней?

разобрался, просто не знал куда писать эти условия, теперь узнал. буду ковыряться.
Если вдруг появятся идеи более изящного решения буду крайне благодарен

Аватар пользователя iGusev iGusev 28 июля 2012 в 3:38

Если поле с тематиками - список, то можно вешать на сохранение ноды правило и в нем уже с помощью php изменять параметры (допустимые значения) созданного поля, но тогда могут возникнуть проблемы с изменением предыдущих значений (при каждом изменении ноды с удаленной тематикой будут ошибки валидации сыпаться). Если же тематики определяются таксономией, то тут хз как сделать не влезая в код.

Я бы создал словарь с терминами (тематиками) и написал бы модуль со своим полем. За основу можно взять поле таксономии из стандартного модуля field, только нужно изменить выборку подставляемых значений (те термины, у которых количество нод <=5). Задача довольно специфическая и нестандартная, что и сказывается на сложности (для новичков) ее решения.

Может кто еще что-то посоветует...

Аватар пользователя Nilagor Nilagor 28 июля 2012 в 3:47

мда уж. Разбираться с написанием модулей немного некогда.
А если через условие на сохранение ноды такой алгоритм
Если такое-то поле (банальный список) равно такому-то значению, то такой-то счётчик плюс один, если счётчик равен 5 - выводить сообщенице, мол облом, и удалять ноду.
Но что за счётчики? Я полный ноль в апи друпал, куда приплюсовывать эту единичку?

Аватар пользователя iGusev iGusev 28 июля 2012 в 3:51

"Nilagor" wrote:
Если такое-то поле (банальный список) равно такому-то значению, то такой-то счётчик плюс один, если счётчик равен 5 - выводить сообщенице, мол облом, и удалять ноду.
Но что за счётчики? Я полный ноль в апи друпал, куда приплюсовывать эту единичку?

Зачем счетчики? Тут опять же проще программно запрос к бд написать для определения количества повторений определенного значения у поля.

Аватар пользователя Nilagor Nilagor 28 июля 2012 в 4:09

Легко сказать. У меня не получается даже написать банальное правило - если выбрано первое значение из списка, то вывести ноду на главную. ночь ещё впереди конечно, да и гугл работает.
Кстати если не лень, скажи в чём здесь ошибка?

return $node->field_user_kurs_nkurs[0]['value'] == 'one';

field_user_kurs_nkurs - поле со списком
one - ключ первого значения

Аватар пользователя iGusev iGusev 28 июля 2012 в 4:11

"Nilagor" wrote:
return ($node->field_user_kurs_nkurs[0]['value'] == 'one';

Конкретно в этой строке в синтаксисе, скобочки не хватает перед ;

Аватар пользователя Nilagor Nilagor 28 июля 2012 в 4:28

скобочка перед $node затесалась случайно.
я создал правило "после добавления материала", там два условия через AND, первое про тип материала, второе php, на всякий случай взял другое поле, без списка, просто текстовое, вот весь код, который я написал в условие:

return $node->field_user_kurs_phone[0]['value'] == '123';

в итоге при добавлении материала вылазит ошибка:
Notice: Undefined offset: 0 в функции eval() (строка 1 в файле Z:\home\aqua.ru\www\sites\all\modules\rules\modules\php.eval.inc(146) : eval()'d code).

и, судя по логу, именно php условие не срабатывает, хотя я явно прописываю в это поле 123

Аватар пользователя Nilagor Nilagor 28 июля 2012 в 4:38

хо хо! да ты маг Smile спасибо) я бы ещё часа два лазил по гуглам в поисках этого und) а смысл ошибки только щас понял) ладно, будем упражняться со значениями полей и запросами в базу) ещё раз спасибо Smile

Аватар пользователя Nilagor Nilagor 28 июля 2012 в 9:01

Всё сделал методом, который предложил iGusev - Rules ловит создание материала, проверяет тип, дальше php условие, запрос в базу данных на кол-во записей с нужным содержанием нужного поля, в конце ретурн с проверкой полученного кол-ва.