तालिका को डेटा सही तरीके से पोस्ट नहीं करने, या सही तरीके से प्रदर्शित करने के रूप में मेरे फ़ॉर्म को थीम क्यों बनाया गया है?


10

मैंने एडमिन में एक फॉर्म बनाया है।

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

मैं फिर प्रत्येक पंक्ति को इसमें शामिल करता हूं:

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

}

रूप बहुत अच्छा लग रहा है! लेकिन पहली समस्या यह है कि असाइन किया गया मान #default_valueफॉर्म में दिखाई नहीं दे रहा है। जब मैं इसे #valueसही मान में बदलता हूं तो यह दिखाई देता है। तो मुझे आश्चर्य है कि यह कैसे किया जाना चाहिए? Drupal प्रलेखन कहते #valueरूपों हालांकि यह वास्तव में कैसे मैं इसे समारोह की उम्मीद करेंगे कार्य कर रहा है के साथ नहीं किया जाना चाहिए।

मुख्य समस्या तब होती है जब मैं किसी एक टेक्स्टफिल्ड में कुछ परीक्षण डेटा भरता हूं और इसे प्रस्तुत करता हूं: मुझे अपने _submitफ़ंक्शन में कोई भी प्रस्तुत मान दिखाई नहीं देता है।

न तो $formहै और न ही $form_stateपाठ खानों में मूल्यों मैं इनपुट के किसी भी शामिल हैं।

मुझे आश्चर्य है कि अगर यह है क्योंकि मैं प्रदान कर रहा हूँ #theme => "table"? क्या कोई इस मामले में भाग गया है? परिवर्तनों के बारे में कोई भी विचार जो मैं कर सकता हूं वह मुझे उन मानों को देखने की अनुमति देगा जो मैं _submitफ़ंक्शन में फॉर्म पोस्ट करते समय इनपुट कर रहा हूं ?

जवाबों:


13

समस्या यह है कि आपके टेक्स्टफील्ड तत्व #rowsआपके रेंडर सरणी की संपत्ति के तहत स्थित हैं।

Drupal किसी भी सरणी कुंजी #को गुण / विशेषता के साथ शुरू करता है, और किसी भी सरणी कुंजी को उस तत्व के रूप में शुरू नहीं करता है, जिसे पुनरावृत्ति करने की आवश्यकता है। जैसे कि आपके द्वारा प्राप्त किए गए बच्चों #rowsको फॉर्म बिल्डर द्वारा नजरअंदाज कर दिया जाएगा।

चूंकि theme_tableरेंडर एरे पर चलेगा, आपके फॉर्म एलिमेंट्स को वास्तव में स्क्रीन पर प्रस्तुत किया जाएगा , लेकिन फॉर्म में मूल्यों का कोई ज्ञान नहीं होगा (क्योंकि वे तकनीकी रूप से फॉर्म के बच्चे नहीं हैं)।

मेरे अनुभव में इस तरह का काम करने का सबसे अच्छा तरीका तत्व पर एक विशिष्ट थीम फ़ंक्शन का उपयोग करना है:

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

फिर अपने फॉर्म फंक्शन में आप निम्न की तरह कोड का उपयोग करेंगे

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

उसके बाद आपके टेक्स्टफील्ड को फॉर्म में पंजीकृत किया जाना चाहिए और आपको $form_stateएरे में मूल्य को सामान्य रूप में देखने में सक्षम होना चाहिए ।


आपके उपयोगी उत्तर के लिए धन्यवाद। 1 क्वेरी: एक पृष्ठ पर मेरे 1000 परिणामों को एक पृष्ठ पर 50 परिणाम और अगले पृष्ठ के लिए पेजर कैसे सीमित करें? मुझे इसके साथ थीम ('पेजर') रेंडर करने में समस्या हो रही है।
हिमांशु पाठक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.