সীমাহীন মান ক্ষেত্র - নোড সম্পাদনায় অতিরিক্ত ক্ষেত্রটি কীভাবে আড়াল করা যায়


9

একটি নতুন নোড তৈরি করার সময়, "নতুন আইটেম যুক্ত করুন" বোতামটি সহ আমার এই সীমাহীন মান ক্ষেত্র রয়েছে।

সীমাহীন মান ক্ষেত্র - নতুন নোড

ঠিক আছে, দুর্দান্ত। তবে আমি যখন একটি বিদ্যমান নোড সম্পাদনা করি তখন আমি আমার জন্য একটি শূন্যপদ খালি অতিরিক্ত মান পাই : সীমাহীন মান ক্ষেত্র - নোড সম্পাদনা করুন

আমার আসল কেসটি একটি বৃহত যৌগিক ক্ষেত্রের সাথে সম্পর্কিত, তবে আমি ভেবেছিলাম উদাহরণ হিসাবে এই ছোট ক্ষেত্রটি ব্যবহার করা আরও সহজ হবে।

এই "অতিরিক্ত" ক্ষেত্রটি অনুপ্রেরণামূলকভাবে যুক্ত হওয়া থেকে রোধ করার কোনও উপায় আছে কি?


2
স্পষ্ট করার জন্য, আপনি চান যে সম্পাদনার সময় কোনও খালি ক্ষেত্র উপস্থাপিত হবে না? সুতরাং অন্য ক্ষেত্রটি যুক্ত করতে, তারা "অন্য আইটেম যুক্ত করুন" বোতামটি ব্যবহার করতে বাধ্য হবে?
tim.plunkett

হ্যাঁ, আপনি এটি পুরোপুরি বুঝতে পেরেছিলেন।
ফিদেলিক্স

@ ফিডেলিক্স, আপনি কি এটি করার কোনও মডিউল পেয়েছেন, বা কেবলমাত্র এই সময়ে কাস্টম কোড?
ডেভিড ব্যারেট

@ ডেভিডবার্যাট শুধুমাত্র কাস্টম কোড, আমি ভীত।
ফিডেলিক্স

উত্তর:


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 হয় এবং আপনি অন্য আইটেম যুক্ত করতে ক্লিক করেন তবে এটি অতিরিক্ত ক্ষেত্র যোগ করবে না। তারপরে আপনি যখন অন্য আইটেম যুক্ত করতে আবার ক্লিক করবেন তখন এটি অতিরিক্ত ক্ষেত্র যুক্ত করবে। এর অর্থ অন্য আইটেম যুক্ত করতে ডাবল ক্লিক প্রয়োজন ff ক্ষেত্রটির বিরুদ্ধে নোডের কোনও মূল্য নেই।
আহমাদ

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]); }
কোট ব্রো

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

যদি ব্যাকএন্ড দৃষ্টিকোণ থেকে আপাতত সম্ভব না হয়, তবে বিকল্পটি নিম্নলিখিত জ্যাকুয়ারি হতে পারে। পৃষ্ঠাটি লোড করার সময় এই কোডটি কেবলমাত্র প্রথম লক্ষ্যটিকে সরিয়ে ফেলবে, এবং ব্যবহারকারী যখন ফাইল যুক্ত করবে তখনই লক্ষ্যটি সরিয়ে ফেলবে, সুতরাং আপনার যদি ইতিমধ্যে ফাইল থাকে তখন আপনার সমস্যা হবে না:

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

( bodyআপনার পেজ.tpl.php এর সমাপ্তি ট্যাগের আগে রাখুন)

আমার পরীক্ষা অনুসারে, সমস্যাগুলি ছাড়াই চিত্রগুলি আপলোড করা হয় এবং আপনি নোড সম্পাদনা করার সময় সমস্ত ফাইল তালিকাভুক্ত হয়।

দ্রষ্টব্য: এই উদাহরণে 'ফিল্ড_টেষ্ট_ফায়াল' সিসিকে ক্ষেত্রের নাম, সুতরাং আপনার সিসি ফিল্ডের নাম অনুসারে পরিবর্তন করতে ভুলবেন না।


আপনার সিএসএস সমাধান সম্পর্কে আমার মন্তব্য এখনও দাঁড়িয়ে আছে: আপনি যখন পিএইচপি দিয়ে এটি করতে পারতেন তখন কেন এটি করবেন? দেখুন drupal.stackexchange.com/questions/10481/…
tim.plunkett

হ্যালো টিম, আমি আপনার দৃষ্টিভঙ্গি বুঝতে পারি এবং আমি কিছু ক্ষেত্রে সম্মত। যদি ভুল না হয় তবে আমার ধারণা যে সিসি ফাইল ফাইল ক্ষেত্রগুলি নতুন ক্ষেত্রগুলি দেখানোর জন্য জাভাস্ক্রিপ্ট ব্যবহার করছে, এবং এটি একটি ভাল সমাধান (যদি আপনি এই বৈশিষ্ট্যটি অক্ষম করেন, বা জাভাস্ক্রিপ্ট না থাকে তবে, ব্যাকএন্ড / পিএইচপি উপায়টি দ্বিতীয় বিকল্পের মতো সম্ভব)। এছাড়াও, আমি একই প্রয়োজনীয়তা সমাধানের বিকল্পগুলি জানা ভাল বলে মনে করি।
সিগোটে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.