অন্য ক্ষেত্রের উপর ভিত্তি করে অটোফিলিং ক্ষেত্র


10

আমার খুব জটিল পরিস্থিতি আছে যেখানে আমার কিছু পরামর্শ দরকার। আমার একটি সামগ্রীর ধরণ রয়েছে my_content, যার সাথে একটি ক্ষেত্র সংগ্রহের ক্ষেত্র যুক্ত field_mycollectionরয়েছে, এতে একটি সত্তা রেফারেন্স ক্ষেত্র ব্যবহারকারী field_my_userreference, একটি ফোন ক্ষেত্র field_my_phone, একটি পাঠ্য ক্ষেত্র field_my_textএবং অন্য পাঠ্য ক্ষেত্রে উল্লেখ করা হয় field_my_anothertext

My Content
|_ field_mycollection
   |_ field_my_userreference
   |_ field_my_phone
   |_ field_my_text
   |_ field_my_anothertext

ব্যবহারকারী সত্তা এছাড়াও ক্ষেত্র আছে করেছে field_my_phone, field_my_textএবং field_my_yetanothertextযা আধুনিক একটি ভিন্ন মেশিন নাম আছে।

আমি কী করতে চাই, যদি কোনও ব্যবহারকারীকে নির্বাচিত বা my_contentফর্ম সম্পাদনা / যুক্ত field_my_userreferenceকরতে হয়, তবে অন্য ক্ষেত্রগুলি নির্বাচিত ব্যবহারকারীর ডেটা থেকে স্বয়ংক্রিয়ভাবে তৈরি হওয়া উচিত। স্ব-জনবহুল ক্ষেত্রগুলি এখনও সম্পাদনাযোগ্য হওয়া উচিত।

আমি কীভাবে এই লক্ষ্য অর্জন করতে পারি? আমি কিছু কোডিং দিয়ে, সম্ভব হলে এটি করতে চাই hook_form_FORM_ID_alter()


আপনার কী এটি ফর্ম বা লাইভ লাইভ হতে হবে?
মোআট

ফর্ম লাইভ। আমি ইতিমধ্যে এটি প্রয়োগ করেছি যে সংরক্ষণের সময়, ডেটা খালি রাখলে ব্যবহারকারী সত্তা থেকে নেওয়া হবে। কিন্তু আসলে কি আমি এটা প্রয়োজন :( ফর্মে
Елин Й.

ঠিক আছে, আমার উত্তর পোজ।
মোআট

উত্তর:


11

যদি আপনি এটি সরাসরি হয়ে যেতে চান এবং সমস্ত ক্ষেত্র ইতিমধ্যে ফর্মটিতে রয়েছে hook_form_FORM_ID_alter()তবে একটি ফর্মের সাথে নিম্নলিখিতগুলি যুক্ত করার জন্য সবচেয়ে নিরাপদ উপায় হ'ল :

$form['#attached']['js'] = array(
  drupal_get_path('module', 'module_name') . '/js/copy_field_value.js',
);

তারপরে copy_field_value.jsআচরণ তৈরিতে:

(function($) {
  Drupal.behaviors.moduleNameCopyFieldValue = {
    attach: function (context, settings) {

      // Repeat this for all fields as needed
      $('#source', context).on('blur', function () { 
        // above you can use change instead of blur if element is not changed by another js
        if (!$('#destination').val() || 0 === $('#destination').val().length) {
          $('#destination').val($(this).val());
          // wrap line above in "if no value" like I did, or other condition you like
        }
      });
      // end of "repeat this"
    }
  };
})(jQuery);

আপনি উত্স ক্ষেত্রে পরামিতিhook_form_FORM_ID_alter() যুক্ত করতেও ব্যবহার করতে পারেন , তবে এটি প্রতিটি ফর্মের অনুলিপিতে একটি সার্ভারকে কল করতে আপনার ফর্ম তৈরি করবে। আপনার যদি সত্যই ডাটাবেসটি জিজ্ঞাসা করতে হয় তবে এটি যাওয়ার উপায়। এটি এখানে নতুনভাবে বর্ণনা করা বেশ বিস্তৃত হবে। ব্যবহারকারীর দ্বারা দেখা প্রকৃত মান আপডেট করতে আপনাকে অ্যারে পরিবর্তন করতে হবে to বিজ্ঞপ্তি এড়ানোর জন্য এটিকে মুড়িয়ে ফর্ম তৈরির কার্যক্রমে করুন ।#ajax$form_state["input"]isset

যদি আপনার ফর্মের উপাদানটি থাকে তবে $form["something"]["something"]["element"]এর মানটি হবে $form_state["input"]["something"]["something"]["element"]- এবং আপনি এটিকে ঠিকঠাকভাবে সেট করতে পারেন hook_form_alter, কেবল উভয় $formএবং $form_stateরেফারেন্সের সাথে নিতে ভুলবেন না ।

দ্রষ্টব্য : .on()পদ্ধতি jQuery 1.7 এ যুক্ত করা হয়েছে, সুতরাং আপনার এই উত্তরটি সরাসরি ব্যবহার করতে jQuery আপডেটের প্রয়োজন হবে বা আমার কোডটি ব্যবহার .change()বা .blur()পদ্ধতিতে অনুবাদ করতে হবে ।


নির্দেশাবলীর জন্য অনেক ধন্যবাদ! দ্রুপালের জেএস এপিআই তে আমি খুব একটা ভাল নই। আমি কীভাবে ব্যবহারকারীর সত্তা থেকে ক্ষেত্রের মান পাব তা ব্যাখ্যা করতে পারেন? উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারী নির্বাচিত হয় তবে কীভাবে আমি এই ব্যবহারকারীর তথ্যের সাথে পরবর্তী ক্ষেত্রগুলি পপুলেট করতে পারি?
Елин Й.

1
@ ЕлинЙ। এখানে কৌশলটি পিএইচপি ব্যাকগ্রাউন্ড সম্পর্কে যত্নশীল নয়। <input>আপনার প্রিয় ব্রাউজারের জন্য ফায়ারব্যাগ বা অনুরূপ সরঞ্জাম ব্যবহার করে ট্যাগগুলির আইডি পরামিতিগুলি সনাক্ত করুন identify বা অন্য যে কোন jQuery নির্বাচনকারী ব্যবহার করুন। এটি কেবল ব্রাউজারেই ঘটবে, সুতরাং আপনার পর্দায় যা আছে তা আপনার কাছে রয়েছে। অন্যদিকে আপনার যদি সত্যিকারের ডাটাবেসটি জিজ্ঞাসা করতে হয় (মনে হয় আমি এটি মিস করেছি), #ajaxযাওয়ার উপায়। তবে এটি বেশ বিস্তৃত হবে। $form_state["values"]ব্যবহারকারীর দ্বারা দেখা প্রকৃত মান আপডেট করতে আপনাকে অ্যারে পরিবর্তন করতে হবে to issetবিজ্ঞপ্তি এড়ানোর জন্য এটিকে মুড়িয়ে ফর্ম তৈরির কার্যক্রমে করুন ।
মোআট

ধন্যবাদ আবার @ মোআওত, আমি আগামীকাল বা সম্ভবত এই সন্ধ্যায় এটি বাস্তবায়নের চেষ্টা করব। দেখে মনে হচ্ছে এটি আরও কার্যকর না হলে আমার এটি কয়েক ঘন্টা লাগবে।
Елин Й.

@ ЕлинЙ। শুভকামনা, আরও প্রশ্ন সহ ফিরে আসতে নির্দ্বিধায় এবং তারা সংযুক্ত থাকলে মন্তব্যে এখানে লিঙ্ক করুন। উত্তরটি কিছুটা আপডেট করেছেন, বিটিডব্লিউ।
Mołot

1
ঠিক আছে, আমি এটি কিছুটা পরীক্ষা করব এবং আমি আমার অভিজ্ঞতা লিখব।
Елин Й.

4

আপনি এটি গণিত ক্ষেত্র মডিউলটি ব্যবহার করে করতে পারেন

গণিত ক্ষেত্রটি একটি অত্যন্ত শক্তিশালী সিসি ফিল্ড মডিউল যা আপনাকে আপনার সামগ্রীর ধরণের জন্য একটি কাস্টম "গণিত ক্ষেত্র" যুক্ত করতে দেয়। এই গণিত ক্ষেত্রগুলি আপনাকে পিএইচপি কোডের মাধ্যমে সংজ্ঞায়িত মানগুলির সাথে পপুলেশন করা হয়। আপনি ড্রুপালের কাছে উপলভ্য যে কোনও কিছুতে অন্য ক্ষেত্র, বর্তমান ব্যবহারকারীর, ডাটাবেস টেবিলগুলি সহ এটি আঁকতে পারেন, আপনি এটির নাম দিন। (এখনও শক্তি অনুভব করছেন? :)) আপনি আপনার গণনা করা ক্ষেত্রের মানগুলি অন্য কন্টেন্ট ক্ষেত্রের সাথে ডাটাবেসে সংরক্ষণ করতে পারেন, বা নোড দর্শনগুলির সময় উড়তে "গণনা" করবেন কিনা তাও আপনি চয়ন করতে পারেন। (যদিও আপনার লক্ষ করা উচিত যে ভিউজ ব্যবহারের জন্য ডেটাবেস সঞ্চিত মান প্রয়োজন)) এই ক্ষেত্রটি আক্ষরিক অর্থে সিসিকে ক্ষেত্রগুলির সুইস আর্মি ছুরি। সুতরাং আপনার পিএইচপি ভিত্তিক মান রান্না শুরু করুন!


দ্রুত সাড়া দেওয়ার জন্য ধন্যবাদ। এটা খুব আশাব্যঞ্জক মনে হচ্ছে। যদিও, আমি এর জন্য কোনও মডিউল ইনস্টল করতে চাই না তবে কেবল কিছু কোড লিখি, যেহেতু কেবলমাত্র সেই ফর্মটিতে আমার এই জাতীয় কার্যকারিতা প্রয়োজন এবং প্রকৃত সিস্টেমটি ইতিমধ্যে অনেক বড় এবং বিভিন্ন ফাংশনটির জন্য অনেকগুলি মডিউল ইনস্টল করা আছে।
Елин Й.

দ্বিতীয়ত, স্বয়ংক্রিয় জনবহুল ক্ষেত্রগুলি ম্যানুয়ালি ওভাররাইড করার জন্য নোড তৈরি বা সম্পাদনা করছেন এমন ব্যবহারকারীদের পক্ষে কি এই মডিউলটি ব্যবহার করা সম্ভব? সুতরাং, ব্যবহারকারীর সত্তা এবং আমার_কন্টেন্টে বিভিন্ন মান সংরক্ষণ করা হয়।
Елин Й.

এটি সেটআপ হওয়ার পথে নির্ভর করবে
লাইফ

ধন্যবাদ @ 4 লাইফ, আমি মোট এর নির্দেশাবলী ব্যবহার করে কোডিং দিয়ে এটি অর্জন করতে না পারলে চেষ্টাও করব।
Елин Й.

2

@ মোউটের দুর্দান্ত সহায়তার জন্য আমি কীভাবে এটি অর্জন করেছি তা পোস্ট করতে চাই।

  1. হুক_ফর্ম_এফএআরএম_আইডি_এল্টার () প্রয়োগ করা হয়েছে ।
  2. ক্ষেত্রের সংগ্রহের চারপাশে একটি মোড়ক ডিভিও যুক্ত করা হয়েছে।
  3. যেহেতু আমার ক্ষেত্রের সংগ্রহটি একটি বহু-মান ক্ষেত্র, এটির উপরে পুনরাবৃত্তি এবং #ajaxক্ষেত্রটির জন্য সম্পত্তি সেট করুন field_my_userreference
  4. একটি কলব্যাক ফাংশন তৈরি করেছে যা কেবল ক্ষেত্রের সংগ্রহ আইটেমটি ফিরিয়ে দেয়।
  5. ক্ষেত্রের সংগ্রহের জন্য যদি $ ফর্ম_স্টেট সেট করা থাকে তবে হুক_ফর্ম_এফএআরএম_আইডি_এলটার () বাস্তবায়নে চেক করা হয়েছে। যদি হ্যাঁ, ব্যবহারকারী সত্তা থেকে মানগুলি পান এবং সেই মানগুলির সাথে ফর্ম ইনপুট ক্ষেত্রগুলি পপুলেট করুন।

আমার কোডটি দেখে মনে হচ্ছে:

function MYMODULE_form_my_content_node_form_alter(&$form, &$form_state, $form_id) {
  $form['field_mycollection']['#prefix'] = '<div id="mycollection-wrapper">';
  $form['field_mycollection']['#suffix'] = '</div>';
  foreach ($form['field_mycollection']['und'] as $key => $fc_mycollection) {
    if (is_numeric($key)) {
      $form['field_mycollection']['und'][$key]['field_my_userreference']['und']['#ajax'] = array(
        'callback' => 'MYMODULE_mycollection_callback',
        'wrapper' => 'mycollection-wrapper',
      );
      if (isset($form_state['values']['field_mycollection']['und'][$key]['field_my_userreference']['und'][0]['target_id'])) {
        $user_wrapper = entity_metadata_wrapper('user', $form_state['values']['field_mycollection']['und'][$key]['field_my_userreference']['und'][0]['target_id']);
        $form_state['input']['field_mycollection']['und'][$key]['field_my_text']['und'][0]['value'] = $user_wrapper->field_my_text->value() ? $user_wrapper->field_my_text->value() : '';
        $form_state['input']['field_mycollection']['und'][$key]['field_my_anothertext']['und'][0]['value'] = $user_wrapper->field_my_text->value() ? $user_wrapper->field_my_yetanothertext->value() : '';
      }
    }
  }
}

function MYMODULE_mycollection_callback($form, &$form_state) {
  return $form['field_mycollection'];
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.