Валидация ноды

Прислано: Vladimir_Z

ср, 10/03/2010 - 10:19

Есть тип материала с CCK полем nodereference.
У пользователя не должно быть двух нод этого типа с одинаковым значением этого поля.
Поэтому при создании новой ноды этого типа нужно сделать проверку на наличие в базе ноды с таким же значением nodereference, автором котороя является текущий пользователь.

Как правильно сделать эту проверку? Создав свой модуль и в нем использовать hook_validate или hook_nodeapi?
Про hook_validate написано, что
«To validate nodes of all types (not just nodes of the type(s) defined by this module), use hook_nodeapi() instead.»
Если я не определяю тип ноды в своем модуле значит для него hook_validate работать не будет?

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано penexe в ср, 10/03/2010 - 10:26.

hook_nodeapi, но ведь nodereference можно подставить список значений сгенереный views`ом?
или они не проходят потом валидацию?


Опубликовано Vladimir_Z в ср, 10/03/2010 - 10:33.

Такой вариант я тоже рассматривал, но вьюсом не получится.
Есть тип нод А и есть тип нод Б.
Поле nodereference в нодах типа Б.
Пользователь может ссылаться только на ноды типа А где он автор - эту выборку можно сделать с помощью вьюса, но как из нее исключить ноды на которые уже есть ссылки из нод Б этого пользователя?


Опубликовано riyuzakki в ср, 10/03/2010 - 10:48.

"Vladimir_Z" написал(а):

Если я не определяю тип ноды в своем модуле значит для него hook_validate работать не будет?

Очевидно, не будет. Но почему бы Вам не определить типы в своем модуле? Это будет быстрее работать, чем hook_nodeapi.


Опубликовано Vladimir_Z в ср, 10/03/2010 - 18:49.

"riyuzakki" написал(а):

Но почему бы Вам не определить типы в своем модуле?

Можно и так конечно.
А если я определю тип ноды с собственным полем (вместо nodereference) как значение этого поля сделать доступным для Views?


Опубликовано PanDa777 в ср, 10/03/2010 - 19:15.

Ещё можно воспользоваться  Unique field


Опубликовано riyuzakki в ср, 10/03/2010 - 19:29.

"Vladimir_Z" написал(а):

А если я определю тип ноды с собственным полем (вместо nodereference) как значение этого поля сделать доступным для Views?

Своему типу ноды Вы можете добавить атрибут тем же CCK. Скорее всего он таки будет доступен во Views, точно не знаю. С вьюсами ознакамливался поверхностно, т.к. привык отображать агрегированную информацию своими, специально заточенными модулями.
А вообще, замечательный пример уберкарт - свой тип ноды, своя валидация, с CCK работает, с вьюсами скорее всего тоже.


Опубликовано Vladimir_Z в ср, 10/03/2010 - 20:00.

"PanDa777" написал(а):

Ещё можно воспользоваться Unique field

Спасибо огромное! Отличный модуль, именно то, что нужно.


Опубликовано orangeudav в ср, 10/03/2010 - 23:58.

а еще есть модуль nodereferrer - список обратных ссылок у таргет-ноды, наверняка можно проверять чтобы количество обратных ссылок было не больше 1


Опубликовано Vladimir_Z в чт, 11/03/2010 - 11:50.

"orangeudav" написал(а):

проверять чтобы количество обратных ссылок было не больше 1

Так, к сожалению, не пойдет. Обратных ссылок может быть больше одной. Условие, что каждый пользователь не может ссылать больше одного раза.


Опубликовано Обухов Никита в пт, 12/03/2010 - 20:07.

Этот чудо-модуль Unique field ведь проверяет по всем нодам.

То есть у вас в принципе не может быть 2-х нод с одним значением поля nodereference

А вам нужна проверка только по нодам конкретного юзера.

вам надо юзать hook_nodeapi

В функции валидации запрос типа:

db_result(db_query("SELECT COUNT(n.nid) FROM {node} n INNER JOIN {content_type_mynodetype} cck ON cck.nid = n.nid WHERE n.uid = %d AND cck.field_myfield = %d", $user->uid, $form_state['values']['myfield']));


Опубликовано Vladimir_Z в пн, 29/03/2010 - 20:34.

"Обухов Никита" написал(а):

Этот чудо-модуль Unique field ведь проверяет по всем нодам.

То есть у вас в принципе не может быть 2-х нод с одним значением поля nodereference

Модуль позволяет проверять по сочетанию любых полей. В моем случае Author + Nodereference.
То есть он не допустит двух нод у которых одновременно равны поля Author и Nodereference. Все работает так как мне нужно.

Хотя, вероятно, решение с собственным модулем и вашим кодом в nodeapi будет работать быстрее.


Новое на сайте