أضفت دالة إرسال إضافية إلى النموذج الخاص بي:
$submit = array('_check_value_public_catalog');
$form['actions']['submit']['#submit'] = array_merge($submit, $form['actions']['submit']['#submit']);
لذلك يبدو النموذج كما يلي:
array
0 => string '_check_value_public_catalogue'
1 => string 'node_form_submit'
ولكن أود أن أعرض بعض الحجج على _check_value_public_catalog
وظيفة. كيف أقوم بهذا العمل؟
لا يمكنك ذلك ولكن يمكنك تخزين القيم في النموذج في مكان ما واستلامها في معالج الإرسال الخاص بك:
function mymodule_my_form($form, &$form_state) {
$form['saved_value_1'] = array(
'#type' => 'value',
'#value' => 'The Value'
);
$form['#submit'][] = 'mymodule_my_form_submit';
return $form;
}
function mymodule_my_form_submit(&$form, &$form_state) {
$saved_value_1 = $form_state['values']['saved_value_1'];
}
ينطبق نفس المبدأ بالضبط إذا كنت تفعل ذلك في شكل تغيير الخطاف.
إرسال معالجات لها $form
و $form_state
يتم تمريرها إليهم تلقائيًا كحجج ($form_state
سوف يحتوي على القيم المرسلة لنموذجك).
بافتراض عدم وجود وسيطات مقدمة بالفعل ، يجب أن يبدو معالج الإرسال الخاص بك كما يلي:
_check_value_public_catalog($form, $form_state) {
//do funky stuff here
}
إذا كنت بحاجة إلى وسيطات محددة تم إرسالها إلى الوظيفة ، فيمكنك إما كتابة رد اتصال مختلف لسحب البيانات خارج $form_state
وأرسله إلى _check_value_public_catalog
الوظيفة ، أو أعد كتابة دالة الإرسال الخاصة بك على النحو التالي (قبل افتراض الحجج).
قبل:
function _check_value_public_catalog($foo, $bar) {
//cool stuff here with $foo and $bar
}
بعد:
function _check_value_public_catalog($form, $form_state) {
$foo = $form_state['values']['foo'];
$bar = $form_state['values']['bar'];
//cool stuff with $foo and $bar
}
انظر هنا لبعض المزيد المعلومات.
لم تعد معالجات إرسال النموذج تستخدم معلمات مخصصة بعد الآن كما ورد في لم يعد نموذج $ ['# Submit'] و $ form ['# validate'] و $ form ['# process'] يدعمان المعلمات المخصصة =. في تلك الصفحة ، وهي مخصصة لتحويل الوحدات من Drupal 5 to Drupal 6 ، يُقترح استخدام $form['#custom_parameter']
، حيث "#custom_parameter" هي سلسلة لا تتعارض مع سلسلة مستخدمة بالفعل من قبل دروبال.
function my_form() {
// form definition code goes here...
$form['#submit'][] = 'my_submit_function';
$form['#my_form_param1'] = $param1;
$form['#my_form_param2'] = $param2;
}
كبديل ، الحجج التي تم تمريرها إلى أداة إنشاء النماذج متوفرة في $form_state['build_info']['args']
. (انظر drupal_build_form () ، الذي يصف القيم الواردة في $form_state
.)
إذا تم تعريف مُنشئ النموذج كما في الكود التالي ، فإن $form_state['build_info']['args']
صفيف يحتوي على "this is"
، و "a test"
.
$item['mymodule/test'] = array(
'title' => 'Test',
'description' => 'This is a test menu.',
'page callback' => 'drupal_get_form',
'page arguments' => array('node_admin_content', 'this is', 'a test'),
'access arguments' => array('access test pages'),
);
في الحقيقة كود drupal_get_form () هو التالي:
function drupal_get_form($form_id) {
$form_state = array();
$args = func_get_args();
// Remove $form_id from the arguments.
array_shift($args);
$form_state['build_info']['args'] = $args;
return drupal_build_form($form_id, $form_state);
}
تقوم الدالة بإزالة الوسيطة الأولى التي تحصل عليها ، وهي معرف النموذج ، ووضع الوسيطات الأخرى في $form_state['build_info']['args']
.
وجدت طريقة جيدة للقيام بذلك عن طريق إرفاق المعلمات بالزر:
عند التوليد
/**
* Implements hook_form_alter
*/
function MYMODULE_form_alter(&$form, $form_state, $form_id) {
$nrbuttons = 10;
for($i = 0; $i < $nrbuttons; $i++){
$form['button_' . $i] = array(
'#type' => 'submit',
'#value' => t('button ' . $i),
'#submit' => array('MYMODULE_form_submited'),
'#attributes' => array(
'button_index' => $i,
'other_parameter'=>'value',
),
);
}
}
/**
* Custom submit handler
*/
function MYMODULE_form_submited($form, &$form_state){
$i = $form_state['clicked_button']['#attributes']['button_index'];
$other_param = $form_state['clicked_button']['#attributes']['other_parameter'];
}