Criando nós e nós referenciados ao mesmo tempo

7

Eu tenho uma situação em que gostaria de poder criar nós e nós referenciados ao mesmo tempo. Existem soluções para isso que funcionam bem para isso?

Para esclarecer o que estou falando, considere a seguinte situação ( altamente simplificada por uma questão de explicação):

Há uma classe do tipo de conteúdo que possui um campo referenciado pelo nó, Student . Gostaria que os usuários pudessem criar nós de classe e de aluno ao mesmo tempo. Também gostaria que eles pudessem usar a referência normal do nó para concluir automaticamente um Aluno que já existe.

Idealmente, eu gostaria que tudo isso funcionasse em uma única página e também dentro dos limites do sistema de permissões Drupal, para que eu possa ter várias funções e várias permissões.

Sim, eu sei que, nesse caso, o Student seria melhor servido como usuário (e não como um nó), mas Class e Student são apenas para ilustrar a situação. O cenário real realmente precisa de referências de nós.

Há uma pergunta semelhante a isso: Criando nós referenciados junto com o nó pai , mas estou especificamente interessado apenas nas soluções Drupal 7.

EDITAR:

Não apenas procurando módulos existentes, mas também um código personalizado.

mpdonadio
fonte
No Drupal 7, escrevi algum código personalizado para fazer isso nos meus sites, simplesmente porque ainda não existem soluções baseadas em módulos que eu possa pensar. Você pode até lançar um formulário para criar o nó do aluno em um modal ctools e depois transmitir o nid para o formulário do nó original usando ajax_command_data () ou outra função de passagem de dados do ajax.
geerlingguy
@geerlingguy, se você escrever isso como uma resposta (especialmente para o módulo AJAX nid passback), seria seriamente considerado uma resposta.
mpdonadio
Vai fazer daqui a pouco.
geerlingguy

Respostas:

4

Eu uso a caixa de diálogo Referências , que coloca um pequeno "+" nos campos de referência existentes, permitindo que o usuário crie um novo aluno diretamente do formulário de edição do nó da classe .

Letharion
fonte
Alguém já usou este módulo? Eu adoraria ouvir alguns comentários sobre os lançamentos alfa.
David John Smith
Para sua informação, basta instalar este módulo e ele parece se encaixar perfeitamente.
David John Smith
8

Para alguns sites diferentes agora, eu fiz isso usando um modal ctools, e aqui está o esboço básico de como eu o implementei (muito simplesmente):

  • Crie um retorno de chamada de página personalizada no hook_menu () do seu módulo que exiba um formulário básico de nó para o nó que você deseja referenciar (para um nó 'aluno', basta ter um campo de nome e talvez um campo de ano de graduação). Nesse formulário, em seu retorno de chamada de envio, salve o nó usando node_save () e armazene o ID do nó (que deve estar em $ node-> nid depois de passar um novo objeto de nó para node_save ()) nos formulários $form_state['storage']['student_id'].

  • Altere o formulário do nó mestre / classe usando hook_form_alter () . Você precisa fazer algumas coisas aqui:

Primeiro, você precisa adicionar o javascript e a funcionalidade modal do ctools para que o ctools saiba o que fazer com o seu link especial:

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

Segundo, você precisa adicionar um link ao retorno de chamada da página criado na etapa 1 no menu hook e, com esse link, adicionar a classe 'ctools-use-modal'. Então, por exemplo:

// 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')))
);
  • No retorno de chamada da página personalizada, é necessário fazer algumas coisas para que funcione com ou sem JavaScript e com as funções de formulário do ctools.

Aqui está um exemplo de retorno de chamada:

<?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();
}
?>
  • Em mymodule_create_student_form($form, $form_state), crie seu formulário como faria normalmente e, na função mymodule_create_student_form_submit(form, &$form_state)(enviar), defina o valor do NID do nó do aluno recém-criado $form_state['storage']['student_id']. É assim que você fará com que o ctools / AJAX repasse o novo nid para o seu formulário de classe original.

  • Na minha situação, eu estava usando o modal para cuspir algumas marcações na página original, então passei a marcação para uma divisão de espaço reservado usando ajax_command_append(), então eu tinha algum jQuery na página original monitorando a divisão de espaço reservado e, quando encontrou conteúdo em moveria o HTML para o local apropriado em outro lugar no formulário do nó. No seu caso, você precisará preencher um campo de referência de nó único ou com vários valores, o que pode ser um pouco mais complexo. Ainda não precisei fazer isso ... então não tenho mais conselhos a oferecer para essa parte da equação.

geerlingguy
fonte
4

Uma opção pode ser adicionar suporte de nó ao módulo Inline Entity Form .

EDIT: Inline Entity Form tem suporte de nó hoje em dia.

Bojan Zivanovic
fonte
2

Os seguintes módulos podem ser usados ​​no 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 criar apenas um novo nó se ele não existir usando o assistente de preenchimento automático. Nodeconnect e entityconnect fornecem o botão adicionar / editar na referência do nó, se o assistente de preenchimento automático for usado. O Nodeconnect fornece apenas para referência do nó, enquanto o entityconnect fornece para referência do nó, referência da entidade, referência do termo e referência do usuário.

Inline_entity_form fornece dois widgets extras para referência de entidade (apenas).

sumanchalki
fonte
0

Se isso é realmente semelhante ao cenário da escola e seus alunos podem participar de várias classes, eu usaria:

  • 3 tipos de conteúdo: Student (* -1) Presença (1- *) Classe
  • Bloco de formulário para inserir dados do aluno diretamente em um bloco;
  • Campo Vistas para exibir uma vista com uma lista de Alunos que participam de uma aula;

Isso também exigiria o uso de Token , filtrando a visualização dependendo do nid de Classe e configurando um valor padrão para o campo de referência do nó de Atendimento como o nid de Classe atual.

Eventualmente, você pode mapear o tipo de conteúdo do aluno para Usuário com uma referência do usuário.

Refineo
fonte
Meus tipos de conteúdo já existem e o site funciona. Adicionar um tipo intermediário exigiria muito retrabalho.
mpdonadio