Perché il mio modulo è a tema in quanto la tabella non registra correttamente i dati o viene visualizzata correttamente?


10

Ho creato un modulo nell'amministratore.

$form['things'] = array(
  '#prefix' => '<div id="things">',
  '#suffix' => '</div>',
  '#tree' => TRUE,
  '#theme' => 'table',
  '#header' => array(t('Field Label'), t('Field Name'), t('Location'), t('Stuff')),
  '#rows' => array(),
);

Aggiungo quindi ogni riga come segue:

foreach ($type_fields as $field_name => $attrs) {
  $stuff = array(
    '#type' => 'textfield',
    '#default_value' => $attrs['stuff'],
  );

$form['things']['#rows'][] = array(
  array('data' => 'label'),
  array('data' => $field_name),
  array('data' => $field_name),
  array('data' => $stuff),
);

}

Il modulo sembra fantastico! Ma il primo problema è che il valore assegnato #default_valuenon viene visualizzato nel modulo. Quando lo cambio al #valuevalore corretto, viene visualizzato. Quindi mi chiedo come dovrebbe essere fatto? La documentazione di Drupal dice #valueche non dovrebbe essere usato con i moduli sebbene funzioni esattamente come mi aspetto che funzioni.

Il problema principale è quando inserisco alcuni dati di test in uno dei campi di testo e li invio: non vedo nessuno dei valori inviati nella mia _submitfunzione.

$form, né $form_statecontiene uno dei valori introdotti ho nei campi di testo.

Mi chiedo se questo è perché sto rendering #theme => "table"? Qualcuno ha riscontrato questo problema? Qualche idea sulle modifiche che posso apportare mi consentirebbe di vedere i valori che inserisco quando invio il modulo alla _submitfunzione?

Risposte:


13

Il problema è che gli elementi del campo di testo si trovano sotto la #rowsproprietà dell'array di rendering.

Drupal vede qualsiasi chiave dell'array che inizia con #come proprietà / attributo e qualsiasi chiave dell'array che non inizia con quello come elemento a cui bisogna ricorrere ricorsivamente. Come tale i bambini che hai sotto #rowssaranno ignorati dal form builder.

Poiché theme_tableverrà eseguito sull'array di rendering, gli elementi del modulo verranno effettivamente visualizzati sullo schermo, ma il modulo non avrà alcuna conoscenza dei valori (poiché non sono tecnicamente figli del modulo).

Nella mia esperienza il modo migliore per fare questo genere di cose è usare una specifica funzione del tema sull'elemento:

function MYMODULE_theme() {
  return array(
    'MYMODULE_textfield_table' => array(
      'render element' => 'element'
    )
  );
}

function theme_MYMODULE_textfield_table($vars) {
  $element = $vars['element'];

  $rows = array();
  foreach (element_children($element) as $key) {
    $rows[] = array(
      array('data' => 'label'),
      array('data' => $element[$key]['#extra_data']['field_name']),
      array('data' => $element[$key]['#extra_data']['field_name']),
      array('data' => render($element[$key]))
    );
  }

  $header = array(t('Field Label'), t('Field Name'), t('Location'), t('Stuff'));
  return theme('table', array('header' => $header, 'rows' => $rows));
}

Quindi nella funzione del modulo useresti un codice come il seguente

$form['things'] = array(
  '#prefix' => '<div id="things">',
  '#suffix' => '</div>',
  '#tree' => TRUE,
  '#theme' => 'MYMODULE_textfield_table'
);

foreach ($type_fields as $field_name => $attrs) {
  $form['things'][] = array(
    '#type' => 'textfield',
    '#default_value' => $attrs['stuff'],
    '#extra_data' => array('field_name' => $field_name)
  );
}

Successivamente i campi di testo devono essere registrati nel modulo e dovresti essere in grado di vedere il valore nella $form_statematrice normalmente.


Grazie per la tua utile risposta. 1 query: come limitare i miei 1000 risultati su una singola pagina a 50 risultati in una pagina e un cercapersone per la pagina successiva? Sto avendo problemi a rendere il tema ('cercapersone') con questo.
Himanshu Pathak,
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.