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


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.