كيف يمكنني إضافة زرين إرسال إلى نموذج Drupal 5؟
-
05-07-2019 - |
سؤال
لديّ اثنين من الأزرار إرسال في النموذج الخاص بي. واحد هو زر الإرسال العادي الذي يستدعي `my_form_submit` مثل-ah-so:
$form['fieldset']['submit'] = array(
'#type' => 'submit',
'#value' => 'Show Applications',
);
أرغب في إضافة زر آخر من شأنه إرسال النموذج ، لكن اتصل بمعالج إرسال مختلف. هل هناك أي طريقة للقيام بذلك؟ لقد نظرت إلى إضافة #submit
خاصية لعنصر مثل آه-
$form['fieldset']['evil_plan'] = array(
'#type' => 'submit',
'#value' => 'Big Red Button',
'#submit' => array('steal_formula_for_icantbeliveitsnotbutter'),
);
على أمل الاتصال بوظيفة steal_formula_for_icantbeliveitsnotbutter `ولكن لا توجد وظيفة. عندما أقوم بالنقر فوق الزر الأحمر الكبير ، يتم استدعاء وظيفة my_form_submit` العادية ، والتي تعيد خطتي لتجعل الملايين من بديل الزبدة. من يمكنه إلقاء بعض الضوء على هذه الفوضى المظلمة؟
المحلول
بالنسبة إلى Drupal 5 ، هذا هو الحل الوحيد:
function my_form_submit($form_id, $form_values) {
if ($form_values['op'] == 'Show Applications') {
// handle 'Show Applications' submission
}
elseif ($form_values['op'] == 'Big Red Button') {
// handle 'Big Red Button' submission
}
}
الشيء نفسه بالنسبة ل my_form_validate
.
في Drupal 6 ، يمكن القيام بذلك من خلال تقديمه حديثًا Custom #Submit و #Validate معالجات لأزرار النموذج.
نصائح أخرى
يحرر: كشفت فحص أوثق لوثائق API Forms أن إجابتي الأولية أدناه صالحة لـ Drupal 6 ، ولكنها صالحة جزئيًا فقط لـ Drupal 5. مقارنة دروبال 5 مستندات مع ال دروبال 6 مستندات يوضح أنه في Drupal 5 ، يمكنك فقط تسجيل وظائف رد الاتصال على النموذج نفسه - خاصية "#Submit" للزر هي مجرد منطقية تشير إلى أن الزر يجب التعامل معه كزر إرسال. مضيفا "Per Button" عمليات الاسترجاعات هي ميزة Drupal 6 فقط!
للسؤال المحدد, ، هذا يعني أنه لا يوجد سوى خيار if/elseif الذي اقترحه AX ، أو تباين تسجيل اثنين من عمليات الاسترجاع لتقديم النموذج ، كل شيء يتحقق إذا تم استدعاؤه للزر الأيمن (أساسا إصدار if/elseif ، ولكن باستخدام اثنين منفصلان عمليات الاسترجاعات).
(إجابة أولية)
هناك العديد من الآليات في العمل هنا:
- يمكن تسجيل (والتحقق من صحة) عمليات الاسترجاعات للأزرار الفردية ، ولكن أيضًا للنموذج نفسه (
$form['#submit']
). يتم استدعاء تلك المسجلة في النموذج لكل زر إرسال ، تلك المسجلة لزر فردي فقط لذلك. (ملاحظة: فرق Drupal 5/6 المهم هنا ، انظر التحرير أدناه.) - يعمل معالجة النماذج الافتراضية (الإرسال والتحقق من صحة المسمى بعد النموذج) بواسطة Drupal لإضافة عمليات عمليات الاسترداد تلقائيًا لتلك النماذج
'#submit'
و'#validate'
المصفوفات. - يستخدم التسجيل المصفوفات من أجل السماح بعدة وظائف إرسال/التحقق من صحة يتم استدعاؤها واحدًا تلو الآخر (بنفس الترتيب الذي تظهر في الصفيف).
لذلك في حالتك ، يمكنك القيام بمفتاح if/elseif الذي اقترحه AX ، أو كنت بحاجة إلى إلغاء ضبط عمليات الاسترداد "العالمية" للنموذج ، ونقله بشكل صريح إلى زر الإرسال الافتراضي:
$form['fieldset']['submit']['#submit'] = $form['#submit'];
unset($form['#submit'];
(نفس الشيء للتحقق من صحة عمليات الاسترداد)
بعد ذلك ، يجب أن يعمل مثالك المنشور للزر الأحمر الكبير الذي ينفذ خطة الشر كما هو متوقع ؛)