Creazione di nodi e nodi di riferimento contemporaneamente


7

Ho una situazione in cui vorrei poter creare nodi e nodi di riferimento contemporaneamente. Ci sono soluzioni per questo che funzionano bene per questo?

Per chiarire di cosa sto parlando, considera la seguente situazione ( altamente semplificata a fini di spiegazione):

Esiste una classe di tipo di contenuto con un campo a cui viene fatto riferimento nodo, Studente . Vorrei che gli utenti fossero in grado di creare nodi di classe e nodi di studenti contemporaneamente. Vorrei anche che fossero in grado di utilizzare il normale completamento del nodo di riferimento per scegliere uno Studente che già esiste.

Idealmente, vorrei che tutto questo funzionasse da un'unica pagina, e anche all'interno dei confini del sistema di autorizzazioni Drupal in modo da poter avere vari ruoli e varie autorizzazioni.

Sì, so che in questo caso Student sarebbe meglio servire come utente (piuttosto che come nodo), ma Class e Student sono solo per illustrare la situazione. Lo scenario reale ha davvero bisogno di riferimenti a nodi.

C'è una domanda simile a questa, Creare nodi referenziati insieme al nodo genitore , ma sono specificamente interessato solo alle soluzioni Drupal 7.

MODIFICARE:

Non solo alla ricerca di moduli esistenti, ma anche head start per codice personalizzato.


In Drupal 7, ho scritto un codice personalizzato per farlo per i miei siti, semplicemente perché non ci sono ancora soluzioni basate su moduli che mi vengono in mente. Puoi anche lanciare un modulo per creare il nodo studente in un ctools modale, quindi passare il nid al modulo nodo originale usando ajax_command_data () o un'altra funzione di passaggio dei dati ajax.
geerlingguy,

@geerlingguy, se lo scrivi come una risposta (specialmente un vantaggio iniziale per il pass-back nid del modulo AJAX), sarebbe considerato seriamente come una risposta.
mpdonadio

Lo farà tra un po '.
geerlingguy,

Risposte:


4

Uso la finestra di dialogo Riferimenti , che inserisce un piccolo "+" nei campi di riferimento esistenti consentendo all'utente di creare un nuovo studente direttamente dal modulo di modifica del nodo di classe .


Qualcuno ha usato questo modulo? Mi piacerebbe sentire un feedback sulle versioni alpha.
David John Smith,

FYI Ho appena installato questo modulo e sembra adattarsi perfettamente.
David John Smith,

8

Per un paio di siti diversi ora, l'ho fatto usando un ctools modale, ed ecco lo schema di base di come l'ho implementato (molto semplicemente):

  • Crea un callback di pagina personalizzato nel hook_menu del tuo modulo () che visualizza un modulo di nodo di base per il nodo a cui vuoi fare riferimento (per un nodo 'studente', basta avere un campo nome e forse un campo anno di laurea). In quel modulo, nel callback di invio, salva il nodo usando node_save () e archivia l'ID nodo (che dovrebbe trovarsi in $ node-> nid dopo aver passato un nuovo oggetto nodo a node_save ()) nei moduli $form_state['storage']['student_id'].

  • Modifica il modulo del nodo master / classe utilizzando hook_form_alter () . Devi fare alcune cose qui:

Innanzitutto, devi aggiungere javascript e funzionalità modali di ctools in modo che ctools sappia cosa fare con il tuo link speciale:

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

In secondo luogo, è necessario aggiungere un collegamento al callback della pagina creato nel passaggio 1 nel menu hook e, con quel collegamento, aggiungere la classe 'ctools-use-modal'. Quindi, per esempio:

// 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')))
);
  • Nel callback della pagina personalizzata, devi fare alcune cose per farlo funzionare con o senza JavaScript e con le funzioni del modulo di ctools.

Ecco un esempio di callback:

<?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();
}
?>
  • In mymodule_create_student_form($form, $form_state), crea il modulo come faresti normalmente, quindi nella mymodule_create_student_form_submit(form, &$form_state)funzione (invio), imposta il valore del NID del nodo studente appena creato $form_state['storage']['student_id']. Ecco come farai in modo che ctools / AJAX restituiscano il nuovo nid al modulo di classe originale.

  • Nella mia situazione, stavo usando il modale per restituire un po 'di markup alla pagina originale, quindi ho passato il markup in un div segnaposto usando ajax_command_append(), quindi ho avuto un po' di jQuery nella pagina originale per monitorare il div segnaposto e quando ho trovato contenuto in esso sposterebbe l'HTML nella posizione corretta altrove sul modulo del nodo. Nel tuo caso, dovrai popolare un campo di riferimento nodo singolo o multi-valore, che potrebbe essere un po 'più complesso. Non ho ancora avuto bisogno di farlo ... quindi non ho più consigli da offrire per quella parte dell'equazione.



2

I seguenti moduli possono essere utilizzati in 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 crea un nuovo nodo solo se non esiste utilizzando la procedura guidata di completamento automatico. Nodeconnect e entityconnect forniscono il pulsante Aggiungi / Modifica al riferimento nodo, se viene utilizzata la procedura guidata di completamento automatico. Nodeconnect lo fornisce solo come riferimento nodo mentre entityconnect lo fornisce come riferimento nodo, riferimento entità, riferimento termine e riferimento utente.

Inline_entity_form fornisce due widget extra per riferimento entità (solo).


0

Se questo è davvero simile allo scenario della Scuola e i tuoi Studenti possono iscriversi a più Classi utilizzerei:

  • 3 tipi di contenuto: Studente (* -1 ) Classe di frequenza (1- *)
  • Modulo blocco per inserire i dati degli studenti direttamente in un blocco;
  • Campo Visualizzazioni per visualizzare una vista con un elenco di Studenti che frequentano una Classe;

Ciò richiederebbe anche l'uso di token , filtrando la vista in base al nid di classe e impostando un valore predefinito per il campo di riferimento del nodo Presenze come nid di classe corrente.

Alla fine potresti mappare il tuo tipo di contenuto Studente su Utente con un riferimento utente.


I miei tipi di contenuto esistono già e il sito funziona. L'aggiunta di un tipo intermedio richiederebbe molte rielaborazioni.
mpdonadio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.