it-swarm.asia

أضف الحجج إلى تقديم مخصص

أضفت دالة إرسال إضافية إلى النموذج الخاص بي:

$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 وظيفة. كيف أقوم بهذا العمل؟

6
Michiel

لا يمكنك ذلك ولكن يمكنك تخزين القيم في النموذج في مكان ما واستلامها في معالج الإرسال الخاص بك:

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'];
}

ينطبق نفس المبدأ بالضبط إذا كنت تفعل ذلك في شكل تغيير الخطاف.

9
Clive

إرسال معالجات لها $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
}

انظر هنا لبعض المزيد المعلومات.

3
Chapabu

لم تعد معالجات إرسال النموذج تستخدم معلمات مخصصة بعد الآن كما ورد في لم يعد نموذج $ ['# 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'].

3
kiamlaluno

وجدت طريقة جيدة للقيام بذلك عن طريق إرفاق المعلمات بالزر:

عند التوليد

/**
* 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'];
}
1
Tica