একটি সত্তা ফর্ম অন্যটিতে এম্বেড করুন এবং উভয় সংরক্ষণ করুন


9

আমার একটি কাস্টম সত্তা রয়েছে, এটি ব্যবহারকারীর সত্তার উপর নির্ভর করে। প্রকৃতপক্ষে, এটি এতটা নির্ভর করে যে আমি ব্যবহারকারীর প্রোফাইল ফর্মের মধ্যে আমার সত্তা ফর্মটি প্রদর্শন করা বোধগম্য হয়েছিল:

এখানে চিত্র বর্ণনা লিখুন

আমার এখন যে সমস্যা হচ্ছে তা হ'ল নিম্নরূপ; সেখানে 2 টি বাঁচানোর বোতাম রয়েছে। এবং যদি এটি যথেষ্ট পরিমাণে খারাপ না হয় তবে ব্যবহারকারীর (নীচের অংশে) সংরক্ষণের বোতামটি আর কাজ করে না এবং হোয়াইট লেবেল সেভ বোতামটি কেবল সাদা লেবেল সত্তাকেই সংরক্ষণ করে।

ফর্মটি ব্যবহারকারী ফর্মটিতে এভাবে পরিবর্তন করা হয়েছে:

function whitelabel_form_user_form_alter(&$form, FormStateInterface $form_state) {

  $whitelabel = WhiteLabel::load(1);

  $whitelabel_form = \Drupal::service('entity.manager')
    ->getFormObject('whitelabel', 'default')
    ->setEntity($whitelabel);

  $form['whitelabel'] = array(
    '#type' => 'details',
    '#title' => t('White label settings'),
    '#open' => TRUE,
    'form' => \Drupal::formBuilder()->getForm($whitelabel_form),
  );
}

আমি $whitelabel_formঅ্যারেতে কিছু প্যারামিটারগুলি বদলে নেওয়ার আশা করছিলাম (যা দ্রুপাল in তে কাজ করত), তবে সেই অ্যারেটি প্রচুর এবং আমার যে সাবমিট বোতাম এবং হ্যান্ডলারটি প্রয়োজন তা খুঁজে পেলাম না।

সুতরাং প্রশ্ন, এটি করা যেতে পারে? এবং এটি করার প্রস্তাবিত উপায় কী হবে?


এই উত্তরটি দেখুন: drupal.stackexchange.com/questions/203405/…
আইয়াল

ধন্যবাদ, আমি আসলে এই প্রশ্নটি আগে পড়েছিলাম কিন্তু আমি যা চেষ্টা করেছিলাম তা খুঁজে পেলাম না। আমি একবার দেখে নেব
নেওোগ্রাফ 4৪৪

@ আইয়াল, আপনি কি এমন একটি পদ্ধতি জানেন যা আমার ফর্মটি ওভাররাইড করার প্রয়োজন হয় না? আমি ব্যবহারকারীর ফর্মটি যেমন রাখি তেমন পছন্দ করি।
নেওগ্রাফ 734

আমি একটি কাস্টম মডিউলটি অ্যান্টি-রেফারেন্স_ফর্ম লিখেছি তবে এটি যথেষ্ট রক্ষণাবেক্ষণ করা হচ্ছে না। আপনি যদি কাস্টম কোড এড়াতে চান তবে আপনার সম্ভবত ইনলাইন_েন্টি_ফর্মটি ব্যবহার করা উচিত।
আইয়াল

@ আইয়াল, আমি কাস্টম কোড থেকে ভয় পাই না (আমি একটি মডিউল লিখছি: পি)। তবে আপনার উদাহরণে আপনি এমন একটি মাল্টিফর্ম তৈরি করেন যা এখন আর ব্যবহারকারীর ফর্ম নয়। এর অর্থ হ'ল যখনই অন্য কেউ অন্য মডিউলে একই কৌশলটি করার চেষ্টা করবেন, আপনি সর্বদা 3 (বা তার বেশি) উপলব্ধ ফর্মগুলির মধ্যে কেবল 2 টি দেখতে পাবেন। এটাই আমাকে ঘৃণা করে। তবে আমার কাছে ফিরে আসতে সময় দেওয়ার জন্য ধন্যবাদ। আমি 2 দিনের মধ্যে ইনলাইন সত্তা ফর্মটি আবার দেখতে পাব, তবে আমি কোনওভাবে এটির পরিবর্তনের বিকল্পগুলির জন্য উন্মুক্ত থাকব।
নেওগ্রাফ 734

উত্তর:


10

নিজের কাজটি করার চেষ্টা করার পরিবর্তে আপনার ইনলাইন সত্তা ফর্ম মডিউলটি চেষ্টা করা উচিত । এই মডিউলটি এই নির্দিষ্ট ক্ষেত্রে তৈরি করা হয়েছে (সত্তা ফর্মের মধ্যে সত্তা তৈরি / সম্পাদনা)।

আমি জানি ড্রুপাল কমার্সে কর্মপ্রবাহের উন্নতির জন্য এটিতে প্রচুর কাজ করা হয়েছে যার অর্থ এটি ভালভাবে কাজ করা উচিত। আমি নিজে এটি পরীক্ষা করে দেখিনি, তবে যেহেতু দ্রুপাল বাণিজ্য এটি ড্রুপাল 8 এ নির্ভর করে, এটি ইতিমধ্যে বেশ স্থিতিশীল হওয়া উচিত।

মডিউলটি ফর্মটি তৈরি করে এমন সত্তা রেফারেন্স ফিল্ডে একটি উইজেট যুক্ত করে কাজ করে, সুতরাং এটি বেশ প্লাগ এবং প্লে হওয়া উচিত। একমাত্র প্রয়োজন হ'ল ব্যবহারকারীর কাছে আপনার কাস্টম সত্তার একটি উল্লেখ রয়েছে।


আমি এটি সন্ধান করেছি, কিন্তু রেফারেন্সড সত্তা ফর্মটি প্রদর্শিত হয়নি। যদিও আমার পক্ষ থেকে এটি ত্রুটি হতে পারে ...
Neographic734

সমস্ত সত্তা ইনলাইন সত্তা ফর্ম দ্বারা সমর্থিত নয়, যদি এটি একটি কাস্টম সত্তা হয় তবে আপনার কাস্টম ধরণের প্রতিষ্ঠানের জন্য আপনাকে একটি প্লাগইন লিখতে হবে। ফাইল সত্তা ডিফল্টরূপে সমর্থিত নয় এবং এটির প্রয়োজন।
ফ্রাঙ্ক রবার্ট অ্যান্ডারসন

7

আমি বিশ্বাস করি এটি সম্ভব হওয়া উচিত। দুর্ভাগ্যক্রমে, আমার কাছে আজ কোড লেখার সময় নেই, তবে আমি মনে করি আপনার নিম্নলিখিত বিষয়গুলি মনে রাখা উচিত:

  • সাব-ফর্ম সংযোজন করার সময়, নিশ্চিত করুন যে আপনি বিশেষ আইটেম যেমন অপসারণ করতে form_idএবং form_build_idDrupal এর দ্বারা ব্যবহৃত চিনতে যা ফর্ম জমা ছিল।
  • আপনি যদি দ্বিতীয় ফর্মের ফর্ম বোতামগুলি না চান, তবে আপনাকে ফর্ম আইটেমটি মুখ্য করে ফর্ম আইটেমগুলি unset($sub_form['actions'])মুখ্য ফর্মটিতে সংযুক্ত করার আগে যেমন ফর্ম আইটেমটি মুছে ফেলা দরকার ।
  • আপনি #treeফর্মটির জন্য সক্ষম হয়েছেন তা নিশ্চিত করুন যাতে আপনি পোষ্ট ভেরিয়েবলের পৃথক পকেটে উপ-ফর্মের মানগুলি ধরতে পারেন। উদাহরণ, $form['#tree'] = TRUE; $form['sub-form'] = $sub_form; এটি আপনার উপ-ফর্মের মানগুলিকে উপলব্ধ করে তুলবে $form_state['values']['sub-form']
    • আপনি যদি ব্যবহারকারীদের উপ-ফর্মটি স্বতন্ত্রভাবে জমা দিতে সক্ষম হতে চান তবে আপনাকে সাব-ফর্মটির ক্রিয়াগুলির নাম পরিবর্তন করতে হবে যাতে পরবর্তী সময়ে কোন বোতামটি ক্লিক করা হয়েছিল তা আপনি বুঝতে পারবেন। আপনি যদি উভয় জিনিসই সংরক্ষণ করতে ব্যবহারকারী কেবল একটি সেভ বোতাম ব্যবহার করতে চান, তবে এই সমস্যাটি উপেক্ষা করুন তাই সমস্যা কম হবে।
  • এখন, যে ফর্মটি ইউআইতে দৃশ্যমান, পরবর্তী পদক্ষেপটি হ্যান্ডেল জমা দেওয়া হবে। এটি করতে, আপনার মূল ফর্মটিতে একটি ফর্ম জমা কলব্যাক যুক্ত করুন । আপনি সাব-ফর্মটির বৈধতা কলব্যাকগুলি মূল ফর্মেও যুক্ত করতে চাইতে পারেন। কাস্টম কলব্যাকে আপনাকে সাব-ফর্মের জন্য জমা কলব্যাকটি ট্রিগার করতে হবে। ড্রুপাল 7-এ আমরা দ্রুপাল_ফর্ম_সেম্বিট করতাম - আমি এখনও ড্রুপাল 8 এর সমতুল্য ডুনো না। বিকল্পভাবে, আপনি সবচেয়ে খারাপ পরিস্থিতিতে দৃশ্যে সাব-ফর্মের জমা দেওয়ার কলব্যাকগুলি ম্যানুয়ালি ট্রিগার করতে পারেন, তবে নিশ্চিত করুন যে আপনি কেবলমাত্র sub-formমানগুলি পাস করেছেন $form_state['values'](আশা করি আপনি কী বোঝাতে চেয়েছেন)।
  • একবার সাব-ফর্ম কলব্যাক ত্রুটি ছাড়াই কাজ করে, আপনি ধরে নিতে পারেন উভয় ফর্ম জমা দেওয়া হয়েছে এবং সফলভাবে প্রক্রিয়া করা হয়েছে!

আশা করি এটা সাহায্য করবে! এক পরীক্ষার নরকের মতো মনে হচ্ছে! শুভকামনা।


1
ধন্যবাদ, আমি আমার প্রাথমিক কোডটি ইতিমধ্যে প্রদর্শন করার জন্য ফোরামটি পেয়েছি। সরানো হচ্ছে form_build_id, form_token, form_idএবং actionsবোতাম তৈরি অদৃশ্য এবং 'বাইরের ফর্ম' কাজ আবার করেন। আমি এটির সাথে আরও কিছু খেলব এবং কীভাবে এটি কার্যকর হয়েছিল তা আপনাকে জানাব।
নিওগ্রাফ 4৪৪

আমি আপনাকে অনুগ্রহ প্রদান করছি কারণ এটি প্রশ্নের উত্তর দেওয়ার সর্বোত্তম চেষ্টা। আমি এখনও এটি নিয়ে লড়াই করছি কারণ ফর্মটি 'ট্রি মোডে' যেতে অস্বীকার করেছে। আমি যা কিছু চেষ্টা করি না কেন সমস্ত মান সর্বদা শীর্ষ স্তরে সঞ্চিত থাকে। এবং মনে হচ্ছে জমা দেওয়া মানগুলিও এতে নেই $form_state ['values'](ফর্ম উপাদান কীগুলি খালি)। এটি সম্ভবত সম্ভব না (এখনও), তবে আমি আশা করি এটি কোনও দিন বের করে আনা হবে।
নেওগ্রাফ 734

1

তাত্ত্বিক উত্তর (এটি যে কাজ করে না, তবে এটি আমার কাছে নিকটতম)। রেফারেন্স এবং অন্যদের জন্য একটি সূচনা পয়েন্ট জন্য এখানে পোস্ট করা।

ব্যবহারকারীর ফর্মটি পরিবর্তন করুন।

function whitelabel_form_user_form_alter(&$form, FormStateInterface $form_state) {
  $whitelabel = WhiteLabel::load(1);

  $whitelabel_form = \Drupal::entityTypeManager()
    ->getFormObject('whitelabel', 'default')
    ->setEntity($whitelabel);
  $renderable_form = \Drupal::formBuilder()->getForm($whitelabel_form);

  // Remove embedded form specific data.
  unset($renderable_form['actions']);
  unset($renderable_form['form_build_id']);
  unset($renderable_form['form_token']);
  unset($renderable_form['form_id']);

  // Also remove all other properties that start with a '#'.
  foreach ($renderable_form as $key => $value) {
    if (strpos($key, '#') === 0) {
      unset ($renderable_form[$key]);
    }
  }

  // Create a container for the entity's fields.
  $form['whitelabel'] = array(
    '#type' => 'details',
    '#title' => t('White label settings'),
    '#open' => TRUE,
    '#tree' => TRUE,
  );
  $form['whitelabel'] += $renderable_form;

  $form['actions']['submit']['#submit'][] = 'whitelabel_form_user_form_submit';
}

হ্যান্ডলার জমা দিন:

function whitelabel_form_user_form_submit(&$form, FormStateInterface $form_state) {
  $values = $form_state->getValues(); 

  $form_state = new FormState();
  $form_state->setValues($values);
  // Theoretically you'd want to use $values['entity_container']
  // for the dedicated entity values.

  // Obtain or create an entity. (You want to get this from the form.)
  if (!$whitelabel = WhiteLabel::load(1)) {
    $whitelabel = WhiteLabel::create();
  }

\Drupal::entityTypeManager()
  ->getFormObject('whitelabel', 'default')
  ->setEntity($whitelabel) // Current entity.
  ->buildEntity($form, $form_state) // Update with form values.
  ->save(); // Save updated entity.
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.