Drupal 7 पर एक्सपोज़्ड व्यू फिल्टर्स पर hook_form_alter का उपयोग करना


12

मुझे hook_form_alter()व्यू 3 और ड्रुपल 7 के साथ कुछ परेशानी हो रही है ।

यदि मैं किसी दृश्य को विशिष्ट रूप से पहचानने के लिए कोई कथन जोड़ने में असमर्थ हूँ; मैंने जो कुछ भी कहा, यदि वह कथन कभी सत्य नहीं पाया गया। हालाँकि, मैं निम्नलिखित का उपयोग करके आसानी से form_id का उपयोग कर सकता हूं इसलिए मुझे यकीन नहीं है कि मैं गलत कहाँ जा रहा हूँ!

if ($form_id == 'views_exposed_form') {
}

मैं अपने hook_form_alter()एक एकल दृश्य को विशिष्ट रूप से बदलने के लिए कैसे उपयोग करूं ?

जवाबों:


25

आप तक पहुँच कर hook_form_alter के भीतर दृश्य ऑब्जेक्ट तक पहुँच प्राप्त कर सकते हैं $form_state['view']। यह आपको एक विशिष्ट दृश्य की पहचान करने की अनुमति देता है:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id == 'views_exposed_form') {
        $view = $form_state['view'];
        if ($view->name == 'my_view_machine_name' && $view->current_display == 'display_name') {
            // alter your exposed form here
        }
    }
}

यह एक बेहतर समाधान है क्योंकि $ form_id उजागर रूपों के लिए पर्याप्त नहीं है (अन्य उत्तरों के विपरीत कैसे राज्य), दुर्भाग्य से current_display पर्याप्त नहीं हो सकता है कुछ स्थितियों में एक ही पृष्ठ पर विचारों के जटिल सेट के साथ कुछ स्थितियां हैं
रोटारी रादू

सहमत - यह अधिक लक्षित समाधान है। बहुत उपयोगी है यदि आप कई विचारों को उजागर फ़िल्टर रूपों का उपयोग कर रहे हैं।
ऋषि

Drupal_set_message ($ दृश्य-> नाम) का उपयोग करें; & drupal_set_message ($ दृश्य-> current_display); अपने नाम पाने के लिए। मैं यह सोचकर थोड़ा भ्रमित हो गया कि यह "views_deals" था, लेकिन यह मेरे मामले में सिर्फ "सौदे" था।
कोलिन्स

हम एक ही काम Drupal 8 कैसे कर सकते हैं?
शारिक

mymodule_form_views_exposed_form_alter() इसके बजाय उपयोग करने के लिए बेहतर है mymodule_form_alter, तो आप चेक को छोड़ सकते हैं $form_id
बेरेंड डी बोअर

18

मैं क्या करूंगा इसे एक कदम पीछे ले जाऊंगा और देखूंगा कि क्या आप इस हुक को पंजीकृत कर रहे हैं। अक्सर $form_idबदलाव।

डिबगिंग प्रक्रिया:

  • Devel चालू करें
  • अपने हुक के अंदर dsm ($ form_id) डालें जैसा कि आपने D6 के साथ उपयोग किया था
  • अपना कैश साफ़ करें

Drupal.org से उदाहरण कोड (अंदर mymodule.moduleया template.phpफ़ाइल) :

<?php
/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'form_views_exposed_form') {
    drupal_set_message("Form ID is : " . $form_id);
  }
}
?>

आपको फॉर्म आईडी का प्रिंट आउट दिखाई देगा, फिर अपने विचार उजागर फॉर्म हुक का चयन करें और वहां से काम करें।

इसके अलावा, ड्रुपल 7 के साथ आप सीधे आईडी द्वारा विशिष्ट रूपों को लक्षित कर सकते हैं

उदाहरण:

<?php
/**
 * Implements hook_form_alter().
 */
function mymodule_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
  drupal_set_message("Form ID is : " . $form_id);
}
?>

ध्यान दें कि यदि आप एक से अधिक एक्सपेक्टेड फॉर्म का उपयोग कर रहे हैं, तो आप फॉर्म में परिवर्तन समारोह में $ फॉर्म ['# id'] की जांच करके एक विशिष्ट दृश्य की जांच कर सकते हैं।

अंत में, अगर वह काम नहीं करता है, तो मैं इस मुद्दे की समीक्षा करने की सिफारिश करूंगा कतार: उजागर फ़िल्टर में फ़िल्टर कैसे बदलें गर्त form_lter हुक


2

हाल ही में मैं इस मुद्दे पर भी टकरा गया हूं, लेकिन मैं कस्टम मॉड्यूल के बजाय फीचर मॉड्यूल का उपयोग कर रहा हूं। इससे मुझे समस्या को हल करने में मदद मिली।

/**
 * Implements hook_views_api_alter()
 */
function MY_FEATURE_views_api_alter(&$vars) {
  if (isset($vars['MY_FEATURE'])) {
    $vars['MY_FEATURE']['path'] = drupal_get_path('module', 'MY_FEATURE');
  }
}

और फिर आप अपने हुक_फॉर्म_व्यूज_एक्सपोज्ड_फॉर्म_ल्टर () का उपयोग कर सकते हैं:

/**
 * Implements hook_form_views_exposed_form_alter().
 */
function MY_FEATURE_form_views_exposed_form_alter(&$form, &$form_state) {
  if($form['#id'] == 'views-exposed-form-search-products-page') {
    $form['price'] = array(
      '#type'    => 'select',
      '#size'    => NULL,
      '#options' => _getPriceOptions(),
    );
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.