असीमित मान फ़ील्ड - नोड संपादन पर अतिरिक्त फ़ील्ड कैसे छिपाएं


9

एक नया नोड बनाते समय, मेरे पास "नया आइटम जोड़ें" बटन के साथ यह असीमित मान फ़ील्ड है।

असीमित मान क्षेत्र - नया नोड

यह ठीक है, अद्भुत है। लेकिन जब मैं एक मौजूदा नोड को संपादित, मैं एक मिल अवांछित खाली अतिरिक्त मूल्य मेरे लिए कहा: असीमित मान क्षेत्र - संपादित करें नोड

मेरा वास्तविक मामला एक बड़े यौगिक क्षेत्र के साथ है, लेकिन मैंने सोचा कि इस छोटे से क्षेत्र का एक उदाहरण के रूप में उपयोग करना आसान होगा।

मेरे पास इस "अतिरिक्त" क्षेत्र को घुसपैठ से जोड़ने से रोकने का कोई तरीका है?


2
स्पष्ट करने के लिए, आप चाहते हैं कि संपादित करने पर कोई खाली फ़ील्ड प्रस्तुत न हो? तो दूसरे क्षेत्र को जोड़ने के लिए, उन्हें "अन्य आइटम जोड़ें" बटन का उपयोग करने के लिए मजबूर किया जाएगा?
टिम.प्लेटकेट

हां, आपने इसे पूरी तरह से समझा।
फिदेलिक्स

@ फ़िडेलिक्स, क्या आपको ऐसा करने के लिए एक मॉड्यूल मिला, या इस बिंदु पर केवल कस्टम कोड?
डेविड बैरेट

@DavidBarratt केवल कस्टम कोड, मुझे डर है।
फिदेलिक्स

जवाबों:


10

यह सभी नोड संपादित रूपों के लिए काम करेगा:

/**
 * Implements hook_form_BASE_FORM_ID_alter().
 */
function MYMODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  $field_name = 'field_YOURFIELD';

  if (empty($form[$field_name])) {
    return;
  }

  $field_language = $form[$field_name]['#language'];
  $max_delta = $form[$field_name][$field_language]['#max_delta'];
  unset($form[$field_name][$field_language][$max_delta]);
}

क्या इस हुक में एक नया खाली क्षेत्र "जोड़ना" संभव है?
फिदेलिक्स

सैद्धांतिक रूप से, आप कर सकते थे। जैसे कुछ $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];काम हो सकता है।
tim.plunkett

इस समाधान में एक समस्या है। यदि कोई मान नहीं है और अधिकतम डेल्टा 0 है और आप किसी अन्य आइटम को जोड़ने पर क्लिक करते हैं, तो यह अतिरिक्त फ़ील्ड नहीं जोड़ेगा। फिर जब आप फिर से एक और आइटम जोड़ने पर क्लिक करेंगे तो यह अतिरिक्त फ़ील्ड जोड़ देगा। इसका मतलब है कि किसी अन्य आइटम को जोड़ने पर डबल क्लिक की आवश्यकता होती है, क्योंकि नोड का उस क्षेत्र के खिलाफ कोई मूल्य नहीं है।
अहमद

3

यह फ़ील्ड नामों को निर्दिष्ट किए बिना सभी नोड संपादित रूपों के लिए भी काम करेगा।

/**
 * Implements hook_form_NODE_FORM_alter().
 */
function MY_MODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  if (isset($form['#node']->nid) && $form['#node']->nid > 0) {
    $form_fields = array_keys($form);

    foreach ($form_fields as $index => $field_name) {
      if (substr($field_name, 0, 6) == "field_") { // Check if the field is a custom field
        $field_language = $form[$field_name]['#language'];
        if (isset($form[$field_name][$field_language]['#cardinality']) && 
            $form[$field_name][$form[$field_name]['#language']]['#cardinality'] == -1) {

          if (empty($form[$field_name])) {
            continue;
          }

          $max_delta = $form[$field_name][$field_language]['#max_delta'];
          unset($form[$field_name][$field_language][$max_delta]);

        }
      }
    }

  }
}

मैं सिर्फ यह सोच रहा था कि आप कार्डिनैलिटी की जांच कर सकते हैं शीर्ष उत्तर पढ़ रहे हैं तो देखा आपने यह किया है!
सेबेस्टियन २ '

एकमात्र फ़ील्ड इनपुट (यदि फ़ील्ड आवश्यक नहीं है) को निकालने से बचने के लिए:if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
QuoteBro

2

आप अवांछित क्षेत्र को हटाने के लिए अपने स्वयं के मॉड्यूल को एक हुक_फॉर्म_फॉर्म_आईडी_अल्टर से लिख सकते हैं । कुछ इस तरह...

function my_module_form_FORM_ID_alter(&$form, &$form_state, $form_id) {
  // Do checks here to make sure this is an existing node...

  // Get the index of the last input element in this field
  $last_index = $form['field_field_name'][LANGUAGE_NONE]['#max_delta'];
  // Get rid of the last input element
  unset($form['field_field_name'][LANGUAGE_NONE][$last_index]);
  // Move back the last index so that any new elements are added correctly
  $form['field_field_name'][LANGUAGE_NONE]['#max_delta'] = $last_index-1;
}

0

यदि बैकएंड के नजरिए से अभी के लिए संभव नहीं है, तो एक विकल्प निम्नलिखित Jquery हो सकता है। यह कोड केवल पहला लक्ष्य निकाल देगा जब पृष्ठ लोड किया जाएगा, और केवल उस लक्ष्य को हटा देगा जब उपयोगकर्ता फ़ाइलों को जोड़ देगा, इसलिए जब आपके पास पहले से फाइलें होंगी तो आपको समस्या नहीं होगी:

<script>
if(!$('div.filefield-file-info').length){
$('table#field_test_file_values tr.even:eq(0)').remove();
}
</script>

( bodyअपने page.tpl.php के समापन टैग से पहले डालें)

मेरे परीक्षण के अनुसार, छवियों को समस्याओं के बिना अपलोड किया जाता है, और जब आप नोड को संपादित करते हैं, तो सभी फाइलें सूचीबद्ध होती हैं।

नोट: इस उदाहरण के लिए 'field_test_file' CCK फ़ील्ड का नाम है, इसलिए अपने cck फ़ील्ड के नाम के अनुसार बदलना याद रखें।


आपके सीएसएस समाधान के बारे में मेरी टिप्पणी अभी भी खड़ी है: जब आप इसे PHP के साथ कर सकते हैं तो ऐसा क्यों करें? Drupal.stackexchange.com/questions/10481/…
tim.plunkett

हैलो टिम, मैं आपकी बात समझ सकता हूं, और मैं कुछ मामलों में सहमत हूं। अगर गलत नहीं है, तो मुझे लगता है कि CCK फ़ाइल फ़ील्ड नए फ़ील्ड दिखाने के लिए जावास्क्रिप्ट का उपयोग कर रही है, और एक अच्छा समाधान है (यदि आप इस सुविधा को अक्षम करते हैं, या जावास्क्रिप्ट नहीं है, तो बैकेंड / php तरीका दूसरे विकल्प की तरह संभव है)। इसके अलावा, मुझे लगता है कि समान आवश्यकता को हल करने के लिए विकल्प जानना अच्छा है।
सिगोटेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.