Использование правил для создания ссылки на сущность, если совпадают два поля в разных сущностях?
Я пытаюсь использовать "регистрационный код", введенный во время регистрации пользователя, для создания ссылки на сущность на узел с соответствующим кодом.
Мы будем очень признательны за любую помощь.
Конкретный случай использования:
У "Профессора" (пользователей) есть "Классы" (узлы), которые содержат текстовое поле с уникальным 5-значным кодом (созданным с помощью вычисляемого поля).
У "Студентов" есть поле "Регистрационный код" на странице регистрации и профиля пользователя (он же a текстовое поле в сущности пользователя) для ручного ввода 5-значного кода, который должен "назначить" их "Классу", имеющему тот же регистрационный код.
Я не программист, но это может иметь больше смысла:
Если [ 5-значный регистрационный код пользователя-студента] = [" Класс" 5-значный регистрационный код узла] затем создается ссылка на сущность между [ пользователем-студентом] и [ узлом "класс"]
Я бы хотел, чтобы правило, которое срабатывает, когда пользователь обновляет поле регистрационного кода.
По сути, я пытаюсь избежать отображения виджета автозаполнения ссылки на сущность для пользователей.
1 answers
Я не думаю, что начал бы с Правил, особенно с точки зрения производительности. Я бы сначала попробовал что-то вроде этого:
- в типе контента "Учащийся" создайте поле Ссылка на сущность для ссылки, убедившись, что оно имеет значение по умолчанию, скажем 0 для удобства доступа позже
- Используя Разрешения на поля , скройте это поле для всех, кроме администратора
Модуль Разрешений на поля позволяет администраторам сайта устанавливать уровень полей разрешения на редактирование, просмотр и создание полей для любого объекта.
Создайте пользовательский модуль
Используя hook_node_validate(), проверьте список классов на наличие правильного кода
Используя hook_node_presave(), обновите скрытое поле ссылки после его проверки
Теперь у вас есть что-то, что позволяет учащемуся ввести значение, проверить его, а затем скопировать это значение в соответствующий справочное поле для последующего использования
РЕДАКТИРОВАТЬ
Мне было любопытно, был ли я прав в своем первоначальном ответе, поэтому я решил проверить, и это сработало - для этого примера:
Создайте класс типа контента, используя поле заголовка в качестве кода класса
Создайте ученика типа контента
Добавить поле в тип контента учащегося:
field_student_class_code
, ссылка на сущность для типа контента классаИспользуйте разрешения на поля, чтобы скрыть
field_student_class_code
для всех но АдминистраторДобавить поле в тип контента для учащихся:
field_student_visible_class_code
, текстовое поле-
Создайте новый модуль под названием custom_node_reference и включите этот код:
function custom_node_reference_node_validate($node, $form, &$form_state) { if($node->type == 'student') { $lang = $form['field_student_visible_class_code']['#language']; $class_value = check_plain($form['field_student_visible_class_code'][$lang][0]['value']['#value']); $result = db_select('node', 'table_alias') ->condition('type', 'class', '=') ->condition('title', $class_value, '=') ->fields('table_alias') ->execute(); if($result->rowCount() <= 0) { form_set_error('field_student_visible_class_code', 'That class code does not exist, please re-enter a valid class code'); } } } function custom_node_reference_node_presave($node) { if($node->type == 'student') { $lang = $node->language; // get entity_id for current class code $val = db_select('node', 'n') ->fields('n', array('nid')) ->condition('type', 'class', '=') ->condition('title', $node->field_student_visible_class_code[$lang][0]['value'], '=') ->execute() ->fetchField(); $node->field_student_class_code[$lang][0]['target_id'] = $val; } }
Если вы измените имена машин для полей, вам нужно будет настроить код в соответствии с