لدي نموذج به زرين "إرسال" و "إلغاء". في hook_submit()
، كيف أعرف الزر الذي تم النقر عليه؟
يجب عليك استخدام $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 صفحة توثيق الوظائف.
$form_state['clicked_button']['#value']
سيخبرك أي زر تم الضغط عليه في النموذج.
قارن هذه القيم في $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
}
قم بتسمية الأزرار بـ #name
السمة كالتالي:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
ثم استخدم:
$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
بالنسبة لأولئك الذين لا يزالون يحاولون معرفة كيفية الوصول إلى الحدث الذي تم تشغيله هنا هو الحل Drupal 8 الحل.
$form_state->getTriggeringElement()
يؤدي ذلك إلى إرجاع صفيف عنصر الإرسال المشغّل. إذا قمت بإضافة ترميز باسم #name
، فستتمكن من الوصول إليه بالطريقة التالية.
$button_clicked = $form_state->getTriggeringElement()['#name']
والسبب وراء هذا التغيير هو أن FormStateInterface
هو الآن ملف readOnly
يمكن فقط للفئات التي تمدد FormStateInterface
الوصول إلى المتغيرات. لذلك يجب عليك استخدام طرق الموصل مثل getTriggeringElement()
للوصول إلى المتغير.
دروبال 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
في Drupal 8.4.4 $form_state->getTriggeringElement()['#name'];
يمنحك قيمة op
. عندما تبحث عن هذا المفتاح في صفيف قيم حالة النموذج ، تحصل على #value
مفتاح عنصر شكل الزر - بعبارة أخرى ، السلسلة التي يراها المستخدمون على الزر الموجود في الصفحة.
لا أعرف ما إذا كان $form_state->getValues()['op']
عالميًا لجميع الأشكال ، ولكنني أرمز بشكل ثابت في نموذج الوحدة الخاصة بي.