Formum neden tablo olarak veriyi doğru şekilde göndermiyor veya düzgün görüntülenmiyor?


10

Yönetici içinde bir form oluşturdum.

$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(),
);

Sonra her satırı aşağıdaki gibi ekleyin:

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),
);

}

Form harika görünüyor! Ancak ilk sorun, atanan değerin #default_valueformda görünmemesidir. #valueDoğru değere değiştirdiğimde ortaya çıkıyor mu? Peki bunun nasıl yapılması gerektiğini merak ediyorum? Drupal belgelerine diyor #valuetam olarak ben işlevine beklenir nasıl çalıştığı halde formlarla kullanılmamalıdır.

Asıl sorun, metin alanlarından birinde bazı test verilerini doldurup gönderdiğimde: İşlevimde gönderilen değerlerin hiçbirini göremiyorum _submit.

Metin alanlarına girdiğim değerlerden hiçbirini $formveya ne $form_stateiçermiyor.

Acaba bunun neden görüntü oluşturduğumdan #theme => "table"mı kaynaklandığını? Bu sorunla karşılaşan var mı? Yapabileceğim değişiklikler hakkında herhangi bir Fikir, formu _submitişleve gönderirken girdiğim değerleri görmemi sağlayacak mı?

Yanıtlar:


13

Sorun, metin alanı öğelerinizin #rowsoluşturma dizinizin özelliği altında bulunmasıdır .

Drupal, ile başlayan herhangi bir dizi anahtarını #bir özellik / öznitelik olarak ve bununla başlamayan herhangi bir dizi anahtarını özyinelemeli olarak katılması gereken bir öğe olarak görür. Bu nedenle, sahip olduğunuz çocuklar #rowsform oluşturucu tarafından göz ardı edilecektir.

Yana theme_tableişlemek dizide çalışacağını, formunuz elemanları olacak aslında ekrana dışında verilecek, fakat (onlar teknik olarak formun çocuklar değildir gibi) formu değerlerin herhangi bir bilgiye sahip olmayacaktır.

Deneyimlerime göre, bu tür bir şey yapmanın en iyi yolu, öğe üzerinde belirli bir tema işlevi kullanmaktır:

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

Daha sonra form işlevinizde aşağıdaki gibi bir kod kullanırsınız

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

Bundan sonra metin alanlarınızın forma kaydedilmesi ve $form_statedizideki değeri normal olarak görebilmeniz gerekir .


Yardımcı cevabınız için teşekkür ederim. 1 sorgu: Tek bir sayfadaki 1000 sonuçlarımı bir sayfadaki 50 sonuçla ve sonraki sayfa için çağrı cihazı ile nasıl sınırlayabilirim? Bu temayı ('çağrı cihazı') oluşturmakta sorun yaşıyorum.
Himanshu Pathak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.