it-swarm.asia

باستخدام form_set_value () في Drupal 7

أحاول تحديث قيمة أثناء مرحلة التحقق من نموذج العقدة ، أي إذا تم تشغيل خطأ التحقق المخصص ، فقط قم بإفراغ أحد الحقول.

خلال الثلاثين ساعة الماضية أحاول فهم معنى drupal api ، لكنني أستسلم. لا يبدو لي أن أحصل على فكرة ما تعنيه القيم المختلفة.

الوظيفة هي: form_set_value ($ element و $ value و & $ form_state)

الآن أفهم أن القيمة الأخيرة هي ببساطة $ form_state ، التي أواجهها من خلال وظيفة التحقق. ولكن ماذا عن عنصر $ وقيمة $؟

كنت أحاول كثيرًا ويبدو أن القيمة المطلوبة موجودة في شكل $ ['field_name'] ['und'] [0] ['value'] ['# value'] وهناك فقط.

ولكن عندما أحاول form_set_value ($ form ['field_name'] ['und'] [0] ['value'] ['# value']، 'foo'، $ form_state)

    Recoverable fatal error: Argument 2 passed to drupal_array_set_nested_value() must be an array, string given, called in /includes/form.inc on line 2436 and defined in drupal_array_set_nested_value()

وعندما أحاول:

    $newvalue = $form['field_name']['und'][0]['value'];
    $newvalue['#value']='foo';
    form_set_value($form['field_name']['und'][0]['value'],$newvalue,$form_state);

فإنه يثير:

    Warning: mb_strlen() expects parameter 1 to be string, array given in drupal_strlen()

شكرا على اي مساعدة!

[تعديل]

وظيفتي الكاملة هي:

    function hook_node_validate($node,$form,&$form_state) {
      if(fancy_stuff){
        form_set_value();
        form_set_error();
      } 
    }

[EDIT2]

    //calls when node is being created
    function eventcheck_node_validate($node,$form,&$form_state) {
      //checks if the node type is applicable
      if($node -> type=='article') {
        //checks if field 'field_event_choose' AND either 'field_event_title' 
        //or 'field_event' is supplied, if so, fire form_set_value() and form_set_error()
        if ((array_key_exists('endpoints',$node -> field_event_choose['und'][0])) && 
        (($node -> field_event_title['und'][0]['value']<>'') || (isset($node -> 
        field_event['und'][0]['value'])))) {

          //fire away
          $form_set_value(???);
          $form_set_error('event_checker_group',t('sorry blabla'));

        }
      }
    }

أتمنى أن يساعد ذلك.

4
alex

بعد الكثير من التصحيح ، تمكنت أخيرًا من جعل هذا العمل. الحيلة تكمن داخل $form['complete form']. ولكن أولاً ، كيف يعمل form_set_value() وماذا يعمل؟

دالة form_set_value()

كما تقترح الوثائق:

إذا كنت تريد تحديث قيمة $form['elem1']['elem2'] ، التي يجب تخزينها في $form_state['values']['elem1']['elem2'] ، يجب عليك تعيين $element['#parents'] = array('elem1','elem2').

الآن ماذا يعني ذلك؟ في حالتي ، كان لدي حقل نص يسمى "field_event_title" ، وهو الاسم الذي أعطيته عند الإنشاء. في $form ، تحتوي جميع الحقول على مصفوفة فرعية في $form['field_name'] ، وهي في حالتي $form['field_event_title']. هذا هو المكان الذي يتم فيه تخزين القيمة المقدمة أيضًا. نظرًا لأنه حقل نص ، Drupal يحافظ على كل من اللغة والدلتا [سؤال للمحررين: هل هذا صحيح؟] من بيانات الإدخال. لذا في الواقع ، لا يتم تخزين القيمة في $form['field_name']['value'] ، ولكن في $form['field_name']['und'][0]['value'] (['und']=language; [0]=delta). لاحظ أن "und" هو مفتاح Drupal للغة الافتراضية للموقع ؛ إذا كان باللغة الألمانية ، عندئذٍ ستكون "de" ؛ ومع ذلك ، في معظم الحالات يجب أن تكون "und".

لتغيير القيمة فعليًا باستخدام form_set_value() ، يجب على المرء استدعاء الوظيفة عن طريق الكتابة:

form_set_value($form['field_name'], array('und' => array(0 => array('value' => 'foo'))), $form_state);

تحديث نموذج لاعادة ملؤه بقيم مختلفة عن المقدمة (أو محوها)

حتى الآن ، كان هذا ما اقترحه كريستر أندرسون ، لكن هذا لم ينجح في حالتي ، حيث أردت مسح الحقول بمجرد استدعاء خطأ تحقق مخصص. يمكن للمرء أن يشك في أن النموذج يعيد ملء نفسه باستخدام القيم داخل $form_state['values'] (وهو في الواقع المكان الذي يتم فيه تخزين القيم ، والمكان الفعلي الذي يتم تحديثه عند استخدام form_set_value() والمكان الذي يولد $form لاحقًا) ، لكن الأمر ليس كذلك: يستخدم القيم الموجودة داخل $form_state['complete form'] ، وهي عبارة عن "نسخة" من $form (لاحظ أنه مكتوب "النموذج الكامل" '، بمسافة ، وليس بشرطة سفلية).

استخدام $form_state['complete form']['field_name']['und'][0]['value']['#value'] = 'foo'; هو ما يحدِّث القيم التي تعيد ملء النموذج بالفعل على خطأ التحقق من الصحة. (ملاحظة: يمكنك ، كما أفعل في حالة الاستخدام الخاصة بي ، تعيينه على =NULL لتفريغ الحقل ببساطة.)

ملخص

أين الفرق بين $form['field_name'] (على سبيل المثال ، التحديث من خلال form_set_value()) و $form['complete form']؟ حسنًا ، يقوم الأول بتحديث القيمة الفعلية ، والتي يتم تخزينها بعد ذلك داخل قاعدة البيانات ؛ يتم استخدام هذا الأخير لإعادة ملء نموذج عندما فشل التحقق من الصحة.

11
alex

تمكنت من جعلها تعمل من خلال القيام بذلك:

// hook_form_alter, check so it's the correct form and attach a validate function
function sample_form_alter(&$form,&$form_state,$form_id) {
  if ($form_id == "sample_dummy_node_form") {
    $form['#submit']['#validate'] = 'sample_dummy_node_form_validate';
  }
}

// validate function, wich just sets the `title` field to `tjoohooo` using `form_set_value`
function sample_dummy_node_form_validate($form, &$form_state) {
  $form['title']['#parents'] = array('title');
  form_set_value($form['title'],t('tjoohooo'), $form_state);
}

إذا لم تكن قد فعلت ذلك بالفعل ، فيجب أن تلقي نظرة على الوثائق form_set_value

* تحرير *

في مثالك ، أعتقد أن الرمز في أسلوب التحقق الخاص بك يجب أن يكون:

function hook_node_validate($node,$form,&$form_state) {
  if (fancy_stuff){
    $form['field_name']['#parents'] = array('field_name');
    form_set_value($form['field_name'],t('foo'),$form_state);
  } 
}

من وثائق المعلمات:

عنصر $: عنصر النموذج الذي يجب تحديث قيمته ؛ في معظم الحالات ، يمكنك فقط تمرير العنصر من مصفوفة النموذج $ ، على الرغم من أن المكون الوحيد المستخدم بالفعل هو "#parents". إذا قمت ببناء نفسك ، قم بتعيين $ element ['# الآباء'] ليكون مصفوفة تعطي المسار من خلال مفاتيح مصفوفة النموذج إلى العنصر الذي تريد تحديث قيمته. على سبيل المثال ، إذا كنت ترغب في تحديث قيمة $ form ['elem1'] ['elem2'] ، والتي يجب تخزينها في $ form_state ['القيم'] ['elem1'] ['elem2'] ، يمكنك تعيين $ element ['# الآباء'] = المصفوفة ('elem1'، 'elem2').

1
Cyclonecode