سؤال

لديّ اثنين من الأزرار إرسال في النموذج الخاص بي. واحد هو زر الإرسال العادي الذي يستدعي `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 ، ولكن باستخدام اثنين منفصلان عمليات الاسترجاعات).


(إجابة أولية)

هناك العديد من الآليات في العمل هنا:

  1. يمكن تسجيل (والتحقق من صحة) عمليات الاسترجاعات للأزرار الفردية ، ولكن أيضًا للنموذج نفسه ($form['#submit']). يتم استدعاء تلك المسجلة في النموذج لكل زر إرسال ، تلك المسجلة لزر فردي فقط لذلك. (ملاحظة: فرق Drupal 5/6 المهم هنا ، انظر التحرير أدناه.)
  2. يعمل معالجة النماذج الافتراضية (الإرسال والتحقق من صحة المسمى بعد النموذج) بواسطة Drupal لإضافة عمليات عمليات الاسترداد تلقائيًا لتلك النماذج '#submit' و '#validate' المصفوفات.
  3. يستخدم التسجيل المصفوفات من أجل السماح بعدة وظائف إرسال/التحقق من صحة يتم استدعاؤها واحدًا تلو الآخر (بنفس الترتيب الذي تظهر في الصفيف).

لذلك في حالتك ، يمكنك القيام بمفتاح if/elseif الذي اقترحه AX ، أو كنت بحاجة إلى إلغاء ضبط عمليات الاسترداد "العالمية" للنموذج ، ونقله بشكل صريح إلى زر الإرسال الافتراضي:

$form['fieldset']['submit']['#submit'] = $form['#submit'];
unset($form['#submit'];

(نفس الشيء للتحقق من صحة عمليات الاسترداد)

بعد ذلك ، يجب أن يعمل مثالك المنشور للزر الأحمر الكبير الذي ينفذ خطة الشر كما هو متوقع ؛)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top