Использование правил для создания ссылки на сущность, если совпадают два поля в разных сущностях?


Я пытаюсь использовать "регистрационный код", введенный во время регистрации пользователя, для создания ссылки на сущность на узел с соответствующим кодом.

Мы будем очень признательны за любую помощь.

Конкретный случай использования:

У "Профессора" (пользователей) есть "Классы" (узлы), которые содержат текстовое поле с уникальным 5-значным кодом (созданным с помощью вычисляемого поля).

У "Студентов" есть поле "Регистрационный код" на странице регистрации и профиля пользователя (он же a текстовое поле в сущности пользователя) для ручного ввода 5-значного кода, который должен "назначить" их "Классу", имеющему тот же регистрационный код.

Я не программист, но это может иметь больше смысла:

Если [ 5-значный регистрационный код пользователя-студента] = [" Класс" 5-значный регистрационный код узла] затем создается ссылка на сущность между [ пользователем-студентом] и [ узлом "класс"]

Я бы хотел, чтобы правило, которое срабатывает, когда пользователь обновляет поле регистрационного кода.

По сути, я пытаюсь избежать отображения виджета автозаполнения ссылки на сущность для пользователей.

Author: user2461917, 2015-06-18

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;
        }
      }
    

Если вы измените имена машин для полей, вам нужно будет настроить код в соответствии с

 0
Author: Geoff, 2015-06-18 21:57:24