আমি কীভাবে জানতে পারি কোন বোতামটি ক্লিক করা হয়েছিল?


12

আমার কাছে "জমা দিন" এবং "বাতিল" বোতামগুলির সাথে একটি ফর্ম রয়েছে। ইন hook_submit(), আমি কীভাবে জানব যে কোন বোতামটি ক্লিক করা হয়েছিল?


আপনি কি hook_submit()ফর্ম জমা হ্যান্ডলারের কথা বলছেন ? একটি ফর্ম জমা হ্যান্ডলার বাস্তবায়ন হয় না hook_submit()
kiamlaluno

উত্তর:


23

আপনি অবশ্যই ব্যবহার triggering_elementকরুন $form_state['triggering_element']

সেরা অনুশীলন হ'ল #nameআপনার বোতামটির জন্য একটি বৈশিষ্ট্য নির্ধারণ করা , যাতে আপনার মধ্যে এই মানটি থাকতে পারে triggering_element

উদাহরণ স্বরূপ:

$form['delete'] = array(
  '#type' => 'submit',
  '#value' => t('Delete'),
  '#name' => 'delete',
);

আপনি যদি এই বৈশিষ্ট্যটি সংজ্ঞায়িত না করেন triggering_elementতবে বোতামটি ধরে রাখতে হবে #value(ব্যবহারকারী যে পাঠ্যটি পড়তে পারে) তবে এটি নিরুৎসাহিত করা হবে কারণ অন্যান্য মডিউলগুলি এই মান পরিবর্তন করতে পারে বা স্থানীয়করণের পরিবর্তিত হতে পারে)।

আপনি $form_state['clicked_button']খুব ব্যবহার করতে পারেন , তবে এটি অবচয় করা হয়েছে

আপনি drupal_build_for ফাংশন ডকুমেন্টেশন পৃষ্ঠাতে আরও তথ্য পড়তে পারেন ।


7

$form_state['clicked_button']['#value'] ফর্মটিতে কোন বোতামটি ক্লিক করা হয়েছিল তা আপনাকে জানাবে।


$form_state['clicked_button']['#value']:)
user1359

1
আমি যুক্ত করতে চাই, যদি আপনার ফর্মের ক্ষেত্রে ক্ষেত্র (গুলি) প্রয়োজন হয় এবং সেগুলি পূরণ করা হয় না, তবে আপনি দ্রুপাল একটি ফর্ম বৈধতা ত্রুটি ফেলে দেবেন (ফর্ম_সোবমিটকে ফর্ম_সিডিয়েটের পরে ডাকা হবে)। আপনাকে এই ডিভেনগাইনারিং.com
best-

এটা একটা ভাল দিক!
ব্যবহারকারী1359

5
"ক্লিক করা বাটন" এখনও কাজ করার পরে, এটি ডি 7-এ অবমুক্ত করা হয়েছে এবং পরিবর্তে "ট্রিগারিং-এলিমেন্ট" ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। আমার মনে আছে কিছু # জ্যাক্স বাগ (আমার মনে হয়) কেবলমাত্র "ক্লিক করা_বাটন" ব্যবহারকারী কোডগুলিকে প্রভাবিত করেছিল, সুতরাং "ট্রিগারিং-এলিমেন্ট" ব্যবহারের আরও একটি কারণ এটি। এবং সর্বোপরি, এটি $ form_state এ একটি আলাদা কী।
বোজন জিভানোভিক

1
এই পদ্ধতির কাজ করার সময়, এটি অবনমিত এবং সমস্যার ঝুঁকিতে রয়েছে। এটি করার সঠিক দ্রুপাল 7 টি উপায়ের জন্য টিউনিকের উত্তর দেখুন।
অ্যালিস হিটন

3

এই মানগুলির তুলনা করুন $form_stateআমি ড্রুপাল 6 এ যা করছি এবং দ্রুপাল 7 তেও তা হবে

if($form_state['values']['ok'] == $form_state]['clicked_button']['#value']){
    //Process if OK is pressed
}else if($form_state['values']['cancel'] == $form_state]['clicked_button']['#value']) {
    //Process if Cancel is pressed
}

যদি আমি মনে করি সঠিক দ্রুপাল 6 $ ফর্ম_স্টেট] ['এক্স'] এখন rup ফর্ম_স্টেট ['এক্স']
rup

আপনার এই দুটি মানটির তুলনা করা দরকার কেন?
iStryker

ফর্মটিতে একাধিক জমা বোতাম রয়েছে। এই তুলনাটি কোনও একক জমা হ্যান্ডলারে ফর্মটি জমা দেওয়ার জন্য ব্যবহৃত কোন বোতামটি পৃথক করতে সহায়তা করবে। $ form_state ['ক্লিক করা_বাটন'] ['# মান'] = টি ('হ্যাঁ') বহুভাষিক সেটআপের ক্ষেত্রে বিভিন্ন মানের ফলাফল করবে।
শোয়েব নওয়াজ

বহুভাষিক সেটআপে সমস্ত ভাষার তুলনা এড়াতে একটি একক তুলনা সেরা। :)
শোয়েব নওয়াজ

1
@ আইস্ট্রিকার আমি আপনার প্রথম মন্তব্যে কী বোঝাতে চাই তা নিশ্চিত নই।
kiamlaluno

3

#nameবৈশিষ্ট্যযুক্ত বোতামগুলির নাম দিন :

$form['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delete'),
    '#name' => 'delete',
);

এবং তারপরে ব্যবহার করুন:

$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.

সুতরাং দুটি ফর্মের জন্য দুটি সাবমিট বাটনযুক্ত ফাইলের জন্য: $ ফর্ম ['সাবমিট'] = অ্যারে ('# টাইপ' => 'সাবমিট', '# নাম' => 'সাবমিট -১', '# ভ্যালু' => টি ('সাবমিট 1'),); $ ফর্ম ['সাবমিট 2'] = অ্যারে ('# টাইপ' => 'সাবমিট', '# নাম' => 'সাবমিট -2', '# মূল্য' => টি ('সাবমিট 2'),); আমাদের কেবল জমা দেওয়া ফর্ম () ফাংশনে $ form_state-> getTriggeringElement () ['# নাম'] পরীক্ষা করতে হবে?
গাইস

3

আপডেট 2016 ড্রুপাল 8

যারা এখনও ট্রিগারযুক্ত ইভেন্টটিতে অ্যাক্সেস করবেন তা নির্ধারণের চেষ্টা করছেন তাদের জন্য ড্রুপাল 8 সমাধান।

$form_state->getTriggeringElement()

এটি ট্রিগার জমা দেওয়ার উপাদানটির অ্যারে প্রদান করে। যদি আপনি কল করা মার্কআপ যুক্ত করেন #nameতবে আপনি নিম্নলিখিত উপায়ে এটি অ্যাক্সেস করতে পারবেন।

$button_clicked = $form_state->getTriggeringElement()['#name']

এই পরিবর্তনের পিছনে কারণটি FormStateInterfaceহ'ল এখন এমন একটি readOnlyফাইল যা কেবলমাত্র বর্ধিত শ্রেণিগুলি FormStateInterfaceভেরিয়েবল অ্যাক্সেস করতে পারে। সুতরাং আপনাকে getTriggeringElement()ভেরিয়েবল অ্যাক্সেস করার জন্য অ্যাকসেসর পদ্ধতিগুলি ব্যবহার করতে হবে ।


আমার 2018 এ ড্রুপাল 8.4.4 এর জন্য আপডেট রয়েছে: drupal.stackexchange.com/a/256112/1441
user1359

0

দ্রুপাল 8.4.4 এ $form_state->getTriggeringElement()['#name'];আপনাকে মান দেয় op। আপনি যখন ফর্মের রাজ্যের মান অ্যারেতে এই কীটি সন্ধান করেন, আপনি #valueবোতামের ফর্ম উপাদানটির কীটি পেয়ে যাবেন - অন্য কথায়, শেষ ব্যবহারকারীরা পৃষ্ঠার বোতামে যে স্ট্রিংটি দেখেন।

আমি জানি না যে $form_state->getValues()['op']সমস্ত রূপের জন্য সর্বজনীন কিনা তবে আমি এটি আমার মডিউলের আকারে কঠোরভাবে কোডিং করছি।


0

ড্রুপাল 8.6.7

নীচের মতো কিছু বোতাম তৈরি করুন।

$form['my_button'] = [
    '#type' => 'button',
    '#value' => t('Custom Button'),
    '#name' => t('customButton'),
    '#weight' => 0,
    '#attributes' => [
      'class' => ['populate-bib-button', 'btn', 'btn-primary'],
    ],
  ];

আপনার জমা ফাংশনে নীচের কোডের মতো বোতামের নাম পান।

$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton

তুলনা যেমন করা যেতে পারে

if ($input['_triggering_element_name'] == 'customButton') {
  // Do something.
}

# Drupal8

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