hook_form_alter निष्पादन आदेश


10

क्या मॉड्यूल के वजन को बदलने या Drupal Core को हैक किए बिना Drupal 7 में hook_form_alter के निष्पादन के क्रम को बदलने का एक तरीका है?

मैं अनुवाद मॉड्यूल से ट्रांसलेशन_फॉर्म_नोड_फॉर्म_अल्टर में जोड़े गए तत्व को बदलने की कोशिश कर रहा हूं । जब मैं डिबगिंग करता हूं तो मुझे तत्व नहीं मिल रहा है इसलिए मुझे लगता है कि अनुवाद मॉड्यूल में से एक से पहले मेरा हुक निष्पादित किया जा रहा है।

जवाबों:


2

मुझे ऐसा नहीं लगता। जो मैं मानता हूं उसके बादtranslation_form_node_form_alter() लागू hook_form_BASE_FORM_ID_alter()किया जाता है , इसलिए मॉड्यूल वजन को बदलना भी पर्याप्त नहीं होगा। मुझे लगता है कि आपके दो विकल्प हैं एक का उपयोग करना और यह सुनिश्चित करना कि आपके पास पर्याप्त उच्च मॉड्यूल वजन है, या उपयोग (यदि संभव हो)। hook_form_alter()hook_form_BASE_FORM_ID_alter()hook_form_FORM_ID_alter()



हुक_फॉर्म_फॉर्म_िड_लाइटर और मॉड्यूल वजन का उपयोग करके इसे हल किया।
बार्ट

@ अगर आपने उपयोग किया है hook_form_FORM_ID_alter()तो मेरी समझ यह है कि आपको वजन को बिल्कुल भी संशोधित करने की आवश्यकता नहीं है (क्योंकि सभी hook_form_FORM_ID_alter()कॉल सभी के बाद किए जाते हैं hook_form_BASE_FORM_ID_alter())।
एंडी

@ और, अगर मैं वजन समायोजित किए बिना foo_form_page_node_form_alter का उपयोग करता हूं तो यह काम नहीं करता है।
बार्ट

1
@ मैं आपको उन विवरणों को देने के लिए स्रोत को देख रहा था - नीचे drupal_prepare_form()और नीचे की जाँच करें drupal_alter()। मैंने पहले ही देखा कि डॉक्स बंद लग रहे थे, इसलिए मैंने एक मुद्दा बनाया । डनो क्यों यह आपके लिए सिस्टम वज़न में बदलाव किए बिना काम नहीं करता है!
एंडी

17

इसके अलावा उल्लेख के लायक, एक नया ड्रुपल 7 एपीआई है जिसे हुक_मॉड्यूल_इम्प्लीमेंट्स_लेटर () कहा जाता है जो आपको मॉड्यूल वेट टेबल को बदलते हुए हुक हुक के लिए निष्पादन आदेश को बदलने की सुविधा देता है।

एपीआई डॉक्स से नमूना कोड दिखा रहा है कि यह करना कितना आसान है:

<?php
function hook_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'rdf_mapping') {
    // Move my_module_rdf_mapping() to the end of the list. module_implements()
    // iterates through $implementations with a foreach loop which PHP iterates
    // in the order that the items were added, so to move an item to the end of
    // the array, we remove it and then add it.
    $group = $implementations['my_module'];
    unset($implementations['my_module']);
    $implementations['my_module'] = $group;
  }
}
?>

मैं अपने हुक को इस सटीक कोड के साथ निष्पादित करने में सक्षम था। धन्यवाद!
ब्यू

4

यहां बताया गया है कि यह सुनिश्चित करने के लिए कि आपका hook_form_alter किसी अन्य मॉड्यूल hook_form_alter के बाद कहा जाता है:

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, &$form_state, $form_id) {
  // do your stuff
}

/**
 * Implements hook_module_implements_alter().
 *
 * Make sure that our form alter is called AFTER the same hook provided in xxx
 */
function my_module_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'form_alter') {
    // Move my_module_rdf_mapping() to the end of the list. module_implements()
    // iterates through $implementations with a foreach loop which PHP iterates
    // in the order that the items were added, so to move an item to the end of
    // the array, we remove it and then add it.
    $group = $implementations['my_module'];
    unset($implementations['my_module']);
    $implementations['my_module'] = $group;
  }
}

यह तब भी काम करता है जब अन्य मॉड्यूल ने रूपांतर में एक form_alter हुक प्रदान किया है: hook_form_FORM_ID_alter। (वे बताते हैं कि प्रलेखन में: hook_module_implements_alter )।

मुझे पता है कि यह पोस्ट wiifm की पोस्ट से काफी मिलती जुलती है, लेकिन इसे हुक_फॉर्म_ल्टर के उदाहरण के साथ उपयोगी माना गया


मेरे लिए काम नहीं किया।
अचराफ जेडए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.