it-swarm.asia

كيف يمكنني معرفة الزر الذي تم النقر عليه؟

لدي نموذج به زرين "إرسال" و "إلغاء". في hook_submit() ، كيف أعرف الزر الذي تم النقر عليه؟

12
user1359

يجب عليك استخدام $form_state->getTriggeringElement().

أفضل ممارسة هي تحديد سمة #name للزر الخاص بك ، بحيث يمكنك الحصول على هذه القيمة في triggering_element.

فمثلا:

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

في هذا المثال: $form_state->getTriggeringElement()['#name'] سترجع "حذف" عند استدعائها ضمن public function submitForm(&$form, $form_state)

إذا لم تحدد هذه السمة triggering_element ستحتفظ بالزر #value للزر (النص الذي يمكن للمستخدم قراءته) ، ولكن هذا غير محبط لأن الوحدات الأخرى قد تغير هذه القيمة أو يمكن تغييرها عن طريق الترجمة ).

يمكنك استخدام $form_state['clicked_button'] أيضًا ، ولكن هذا مهمل .

يمكنك قراءة المزيد من المعلومات على drupal_build_form صفحة توثيق الوظائف.

23
sanzante

$form_state['clicked_button']['#value'] سيخبرك أي زر تم الضغط عليه في النموذج.

7
iStryker

قارن هذه القيم في $form_state كنت أعمل في Drupal 6 وسوف يكون نفس الشيء في Drupal7

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
}
3
Shoaib Nawaz

قم بتسمية الأزرار بـ #name السمة كالتالي:

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

ثم استخدم:

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

تحديث 2016 Drupal 8

بالنسبة لأولئك الذين لا يزالون يحاولون معرفة كيفية الوصول إلى الحدث الذي تم تشغيله هنا هو الحل Drupal 8 الحل.

$form_state->getTriggeringElement()

يؤدي ذلك إلى إرجاع صفيف عنصر الإرسال المشغّل. إذا قمت بإضافة ترميز باسم #name ، فستتمكن من الوصول إليه بالطريقة التالية.

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

والسبب وراء هذا التغيير هو أن FormStateInterface هو الآن ملف readOnly يمكن فقط للفئات التي تمدد FormStateInterface الوصول إلى المتغيرات. لذلك يجب عليك استخدام طرق الموصل مثل getTriggeringElement() للوصول إلى المتغير.

3
Neoaptt

دروبال 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.
}

# دروبال 8

0
Yogesh Kushwaha

في Drupal 8.4.4 $form_state->getTriggeringElement()['#name']; يمنحك قيمة op. عندما تبحث عن هذا المفتاح في صفيف قيم حالة النموذج ، تحصل على #value مفتاح عنصر شكل الزر - بعبارة أخرى ، السلسلة التي يراها المستخدمون على الزر الموجود في الصفحة.

لا أعرف ما إذا كان $form_state->getValues()['op'] عالميًا لجميع الأشكال ، ولكنني أرمز بشكل ثابت في نموذج الوحدة الخاصة بي.

0
user1359