Создание узлов и ссылочных узлов одновременно

7

У меня есть ситуация, когда я хотел бы иметь возможность создавать узлы и ссылочные узлы одновременно. Есть ли какие-то решения для этого, которые хорошо работают для этого?

Чтобы уточнить, о чем я говорю, рассмотрим следующую ситуацию ( очень упрощенную для объяснения):

Существует класс типа контента с полем, на которое ссылается узел, Student . Я хотел бы, чтобы пользователи могли создавать узлы класса и узлы ученика одновременно. Я также хотел бы, чтобы они могли использовать обычное автоматическое заполнение ссылки на узел, чтобы выбрать ученика, который уже существует.

В идеале я хотел бы, чтобы все это работало с одной страницы, а также работало в рамках системы разрешений Drupal, чтобы у меня были разные роли и разные разрешения.

Да, я знаю, что в этом случае Student лучше всего использовать как пользователя (а не как узел), но Class и Student просто иллюстрируют ситуацию. Реальный сценарий действительно нуждается в ссылках на узлы.

Существует аналогичный вопрос: создание ссылочных узлов вместе с родительским узлом , но меня особенно интересуют только решения на Drupal 7.

РЕДАКТИРОВАТЬ:

Не только поиск существующих модулей, но и поиск собственного кода.

mpdonadio
источник
В Drupal 7 я написал некоторый пользовательский код, чтобы сделать это для своих сайтов, просто потому, что пока нет никаких основанных на модулях решений, о которых я мог бы подумать. Вы даже можете бросить форму для создания студенческого узла в модал ctools, а затем вернуть nid в исходную форму узла, используя ajax_command_data () или другую функцию передачи данных ajax.
geerlingguy
@geerlingguy, если вы напишите это в качестве ответа (особенно для AIDA модуля обратной передачи NID), это будет серьезно рассматриваться как ответ.
mpdonadio
Сделаем чуть позже.
geerlingguy

Ответы:

4

Я использую диалоговое окно «Ссылки» , которое помещает небольшой «+» в существующие поля ссылок, позволяя пользователю создавать нового ученика непосредственно из формы редактирования узла класса .

Letharion
источник
Кто-нибудь использовал этот модуль? Я хотел бы услышать некоторые отзывы о альфа-релизах.
Дэвид Джон Смит
К вашему сведению: Только что установил этот модуль и он, кажется, идеально подходит.
Дэвид Джон Смит
8

Теперь для пары разных сайтов, я сделал это с помощью модальности ctools, и вот основная схема того, как я это реализовал (очень просто):

  • Создайте пользовательский обратный вызов страницы в hook_menu () вашего модуля, который отображает базовую форму узла для узла, на который вы хотите сослаться (для «студенческого» узла просто есть поле имени и, возможно, поле года выпуска). В этой форме в вашем обратном вызове submit сохраните узел с помощью node_save () и сохраните идентификатор узла (который должен быть равен $ node-> nid после передачи нового объекта узла в node_save ()) в форме $form_state['storage']['student_id'].

  • Измените форму узла Master / Class, используя hook_form_alter () . Вам нужно сделать несколько вещей здесь:

Во-первых, вам нужно добавить модальный javascript и функциональность ctools, чтобы ctools знал, что делать с вашей специальной ссылкой:

// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();

Во-вторых, вам нужно добавить ссылку на обратный вызов страницы, который вы создали на шаге 1 в меню ловушек, и с этой ссылкой добавить класс 'ctools-use-modal'. Так, например:

// Add link to custom student form callback with ctools modal.
$form['add_student_link'] = array(
  '#markup' => l(t('Add Student'), 'mymodule/add-student', array('attributes' => array('class' => array('ctools-use-modal')))
);
  • В вашем пользовательском обратном вызове страницы вам нужно сделать несколько вещей, чтобы он работал с JavaScript или без него, а также с функциями форм ctools.

Вот пример обратного вызова:

<?php
function mymodule_student_form_callback($js = FALSE) {
  // Make sure $js (set by ctools) is TRUE/loaded.
  if ($js) {
    // Add in ctools modal form stuff.
    ctools_include('modal');
    ctools_include('ajax');
    $form_state = array(
      'ajax' => TRUE,
      'title' => t('Create a Student'),
    );

    $output = ctools_modal_form_wrapper('mymodule_create_student_form', $form_state);
  }
  else {
    return 'Javascript must be enabled for this feature to work.';
    // Or, if we wanted to load the form normally...
    // return drupal_get_form('mymodule_create_student_form');
  }

  // If the form is executed, dismiss the form and reload the page.
  if ($form_state['executed']) {      
    $commands = array();

    // Close the frame.
    $commands[] = ctools_modal_command_dismiss();

    // Use one of the ajax framework commands to place the returned
    // student node nid into the proper form value, placholder div, etc.
    // See: http://api.drupal.org/api/drupal/includes%21ajax.inc/group/ajax_commands/7
    $commands[] = ajax_command_append('#student-id-placeholder', $form_state['storage']['student_id']);

    $output = $commands;
  }

  // Render the output.
  print ajax_render($output);
  exit();
}
?>
  • В mymodule_create_student_form($form, $form_state), создайте свою форму, как обычно, и затем в функции mymodule_create_student_form_submit(form, &$form_state)(submit) установите значение NID вновь созданного студенческого узла в $form_state['storage']['student_id']. Вот как вы получите ctools / AJAX для передачи нового nid в вашу исходную форму класса.

  • В моей ситуации я использовал модал, чтобы выплевывать некоторую разметку на исходную страницу, поэтому я передал разметку в div-заполнитель, используя ajax_command_append(), затем у меня было несколько jQuery на исходной странице, отслеживающих div-заполнитель, и когда он находил контент в это, это переместило бы HTML в надлежащее место в другом месте формы узла. В вашем случае вам нужно будет заполнить одно-или многозначное поле ссылки на узел, которое может быть немного сложнее. Мне еще не нужно было этого делать ... поэтому у меня нет больше советов, чтобы предложить эту часть уравнения.

geerlingguy
источник
4

Можно также добавить поддержку узла в модуль Inline Entity Form .

РЕДАКТИРОВАТЬ: Inline Entity Form имеет поддержку узлов в настоящее время.

Боян Живанович
источник
2

Следующие модули могут быть использованы в Drupal 7:

  1. https://drupal.org/project/noderefcreate
  2. https://drupal.org/project/nodeconnect
  3. https://drupal.org/project/entityconnect
  4. https://drupal.org/project/inline_entity_form

Noderefcreate создает только новый узел, если он не существует с помощью мастера автозаполнения. Nodeconnect и entityconnect предоставляют кнопку добавления / редактирования для ссылки на узел, если используется мастер автозаполнения. Nodeconnect предоставляет его только для ссылки на узел, тогда как entityconnect предоставляет его для ссылки на узел, ссылку на сущность, ссылку на термин и ссылку на пользователя.

Inline_entity_form предоставляет два дополнительных виджета для ссылки на сущность (только).

sumanchalki
источник
0

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

  • 3 типа контента: Студент (* -1) Посещаемость (1- *) Класс
  • Форма Блок для ввода данных ученика непосредственно в блоке;
  • Поле «Представления» для отображения представления со списком студентов, посещающих занятия;

Это также потребует использования токена , фильтрации представления в зависимости от nid класса и установки значения по умолчанию для поля ссылки на узел присутствия в качестве текущего nid класса.

В конце концов вы можете сопоставить свой тип контента Student с User с помощью пользовательской ссылки.

Refineo
источник
Мои типы контента уже существуют и сайт работает. Добавление промежуточного типа потребует много переделок.
mpdonadio