हुक_फॉर्म_ल्टर का उपयोग करके आसानी से क्षेत्र कैसे बनाया जाए


12

मैं कुछ Drupal प्रोफाइल फॉर्म फील्ड को केवल एडिट मोड में पढ़ने के लिए बनाने की कोशिश कर रहा हूं। मैं निम्नलिखित कोड का उपयोग हुक_ल्टर में कर रहा हूं

$form[field_organisation_company_name][und][0]['#after_build'][]='_build_element_readonly';

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    return $element;
}

दायर यूआई में केवल पढ़ने के रूप में दिखाया जा रहा है, लेकिन फिर भी, मैं फायरबग का उपयोग करके मूल्य को बदल सकता हूं और बचा सकता हूं। क्या इस व्यवहार को रोकने का कोई तरीका है?

जवाबों:


6

ऐसा लगता है कि आप फ़ील्ड अनुमतियों के साथ क्या कर सकते हैं । क्षेत्र-दर-क्षेत्र के आधार पर आप इसके लिए अनुमतियाँ सेट कर सकते हैं:

  • क्षेत्र के लिए खुद का मूल्य बनाएं
  • क्षेत्र के लिए अपना मूल्य संपादित करें
  • क्षेत्र के लिए किसी का मान संपादित करें
  • क्षेत्र के लिए अपना मूल्य देखें
  • क्षेत्र के लिए किसी का भी मूल्य देखें

तो आप आसानी से अपने उपयोगकर्ताओं को शुरू में फ़ील्ड के लिए मान बनाने की अनुमति दे पाएंगे, लेकिन जैसे ही उनके पास यह केवल एक व्यवस्थापक द्वारा संपादन योग्य हो जाएगा।


+1। जैसा कि ओपी मानदंड को संपादित करने की अनुमति देना चाहता है, field_permissionsकाम को गंदे तरीके से करने से आसान होगा।
आयशेक

हां, यह मेरा बहुत बेहतर जवाब है :)
अल्फ्रेड आर्मस्ट्रांग

6

जब आप किसी फ़ील्ड को सेट करते हैं readonly, तो ब्राउज़र फ़ील्ड को लॉक करता है और सबमिट करने पर सर्वर को डेटा वापस भेजता है । अन्य विशेषता यह है disabledकि फ़ील्ड को लॉक करता है और सर्वर पर डेटा वापस नहीं भेजता है।

दोनों मामलों के लिए, आप सबमिशन के बाद समान रूप से मान सेट कर सकते हैं। तो, भले क्षेत्र के लिए सेट जब है readonlyया disabled, और उपयोगकर्ता एचटीएमएल संशोधित करने और विभिन्न डेटा भेजा, $form_state['values']यथावत रहेगा।

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    $element['value']['#value'] = isset($element['value']['#default_value']) 
       ?  $element['value']['#default_value']
       :  ''; 
    return $element;
}

ध्यान दें कि हम #value #default_value से सेट करते हैं। #default_value डिफ़ॉल्ट मान सेट करने का सामान्य तरीका है जो फ़ॉर्म का निर्माण करते समय लोड होता है, और $form_state['values']इसमें default_value या उपयोगकर्ता-इनपुट शामिल होगा। जब आप #valueस्पष्ट रूप से सेट करते हैं , तो उपयोगकर्ता-इनपुट को अनदेखा #valueकिया जाता है और इसका उपयोग किया जाएगा।

वैसे भी, मैं '#access' => FALSE,फार्म तत्वों को छुपाते समय उपयोग करने की सलाह दूंगा। यह तत्व को पूरी तरह से हटा देगा, जबकि आपको इसके मूल्यों का उपयोग करने की अनुमति देगा।


1

आप Firebug को आसानी से फ़ील्ड्स को बदलने से रोक नहीं सकते हैं। लेकिन अगर टेक्स्टफील्ड आसानी से पढ़ा जाता है, तो इसका उद्देश्य केवल डेटा प्रदर्शित करना है। तो एक पाठ-तत्व के खिलाफ इनपुट-तत्व को क्यों नहीं बदला जाए?

आप इसके बजाय "अक्षम" विशेषता का उपयोग कर सकते हैं, क्योंकि अक्षम इनपुट-फ़ील्ड सर्वर पर नहीं भेजे जा रहे हैं।

आप फायरबग के साथ "अक्षम" विशेषता को हटा सकते हैं, लेकिन ड्रुपल कोर अक्षम इनपुट फ़ील्ड के परिवर्तनों पर प्रतिक्रिया नहीं करता है!


मदद के लिए धन्यवाद larrydahooster। मेरी आवश्यकता पंजीकरण के समय उपयोगकर्ता द्वारा भरे गए कुछ क्षेत्रों को लॉक करने की तरह है। प्रोफाइल एडिट मोड पर उपयोगकर्ता को यह जानकारी प्रदर्शित करना चाहते हैं, लेकिन उपयोगकर्ता को इन फ़ील्ड को अपडेट करने से रोकना चाहते हैं। केवल सुपर उपयोगकर्ता इन क्षेत्रों को संपादित कर सकते हैं
जयेश जोस

1

ऐसा करने का सबसे सुरक्षित तरीका है कि क्षेत्र के प्रकार को बदलकर 'आइटम' किया जाए। http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#item


#Disabled विशेषता का उपयोग करके मैं समस्या का समाधान करता हूं। मेरे मामले में केवल कुछ उपयोगकर्ता फ़ील्ड को संपादित कर सकते हैं, जहाँ अन्य केवल फ़ील्ड देख सकते हैं। मैंने उपयोगकर्ता की भूमिका के आधार पर एक तर्क लिखा और समस्या का समाधान किया। आप सभी को धन्यवाद
जयेश जोस

1

आप फ़ील्ड अनुमतियाँ + फ़ील्ड रीडॉनली का उपयोग कर सकते हैं ।

फ़ील्ड अनुमतियाँ आपको अपने कुछ क्षेत्रों को कुछ उपयोगकर्ताओं के लिए गैर-सुलभ बनाने की अनुमति देंगी।

फ़ील्ड Readonly आपको गैर-पहुंच वाले फ़ील्ड को केवल संपादित प्रपत्रों पर (केवल उन्हें छुपाने के बजाय) आइटम के रूप में प्रदर्शित करने की अनुमति देगा।


1

मुझे लगता #disabled = true;है कि अपने कोर में कुछ भारी मॉड्यूल को जोड़ने के बजाय इसे प्राप्त करने का सबसे आसान तरीका है, उदाहरण के रूप में जब मैं उपयोगकर्ता द्वारा पहले भरा हुआ है, तो मैं user_profile_form में कस्टम छवि फ़ील्ड के संपादन को अक्षम करता हूं।

function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){

        if($form_id == 'user_profile_form'){
            if($form['field_national_front']['und'][0]['#default_value']['fid']){
                $form['field_national_front']['und']['#disabled'] = true;
             }
          //ym($form);
        }
}

इसके अलावा, आप उपयोगकर्ता की भूमिका की जांच कर सकते हैं और उपयोगकर्ताओं को प्रशासित नहीं करने के लिए बस (आसानी से फ़ील्ड) अक्षम कर सकते हैं।

    function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){
       global $user;
       if($form_id == 'user_profile_form'){
           if($form['field_national_front']['und'][0]['#default_value']['fid'] && !in_array('webadmin', $user->roles)){
              $form['field_national_front']['und']['#disabled'] = true;
         }
//ym($form);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.