it-swarm.asia

ما هو $ form_state المستخدم؟

ما هو $form_state تستخدم عادةً في سياق Form API إذا تم استخدامها كوسيطة؟

على وجه التحديد ، أبحث عن مثال عن وقت استخدامه.

32
chrisjlee

$form_state هي إحدى الوسيطات التي تم تمريرها إلى معالج إرسال النموذج ، أو معالج التحقق من صحة النموذج ؛ استخدامه الرئيسي هو استرداد القيم التي تم إدخالها من المستخدم في النموذج ، راجع محتوى $form_state['values']) ، ولكنه يحتوي على قيم أخرى يمكن استخدامها لأغراض أخرى.
تحتوي وثائق drupal_build_form () على قائمة بالقيم الأخرى الواردة في ذلك الصفيف ، والتي تتضمن القيم التالية:

  • إعادة البناء: عادة ، بعد اكتمال معالجة النموذج بالكامل وتشغيل معالجات الإرسال ، يعتبر النموذج قد تم القيام به وسيقوم drupal_redirect_form () بإعادة توجيه المستخدم إلى صفحة جديدة باستخدام طلب GET (لذلك لا يقوم تحديث المتصفح بإعادة الإرسال الاستمارة). ومع ذلك ، إذا تم تعيين "إعادة الإنشاء" على TRUE ، فسيتم إنشاء نسخة جديدة من النموذج على الفور وإرسالها إلى المتصفح ، بدلاً من إعادة التوجيه. يتم استخدام هذا للنماذج متعددة الخطوات ، مثل المعالجات ونماذج التأكيد. عادة ، يتم تعيين $form_state['rebuild'] بواسطة معالج التقديم ، لأنه عادة ما يكون منطقًا داخل معالج التقديم الذي يحدد ما إذا كان النموذج قد تم أو يتطلب خطوة أخرى. ومع ذلك ، قد يقوم معالج التحقق بالفعل بتعيين $form_state['rebuild'] ليجعل معالجة النموذج تتجاوز معالجات الإرسال وإعادة إنشاء النموذج بدلاً من ذلك ، حتى إذا لم تكن هناك أخطاء في التحقق.
  • إعادة التوجيه: يستخدم لإعادة توجيه النموذج عند التقديم. قد تكون سلسلة تحتوي على عنوان URL المقصود ، أو مصفوفة من الوسيطات المتوافقة مع drupal_goto(). راجع drupal_redirect_form() للحصول على معلومات كاملة.
  • ذاكرة التخزين المؤقت: إذا تم تعيينها على TRUE سيتم تخزين بنية النموذج الأصلية غير المعالجة مؤقتًا ، مما يسمح بإعادة إنشاء النموذج بالكامل من ذاكرة التخزين المؤقت. يتضمن سير عمل النموذج النموذجي طلبين للصفحة ؛ أولاً ، يتم إنشاء نموذج وتقديمه ليملأه المستخدم. ثم ، يقوم المستخدم بتعبئة النموذج وإرساله ، مما يؤدي إلى طلب صفحة ثانية يجب أن يتم فيها إنشاء النموذج ومعالجته. افتراضيًا ، يتم إنشاء $form و $form_state من البداية أثناء كل طلب من هذه الصفحات. غالبًا ، من الضروري أو المطلوب الاستمرار في المتغيرات $form و $form_state من طلب الصفحة الأولي إلى الذي يعالج الإرسال. يمكن تعيين "ذاكرة التخزين المؤقت" إلى TRUE للقيام بذلك. ومن الأمثلة البارزة نموذجًا ممكّنًا لأياكس ، حيث يتيح ajax_process_form() التخزين المؤقت للنماذج لجميع النماذج التي تتضمن عنصرًا بخاصية #ajax. (ليس لدى معالج Ajax طريقة لإنشاء النموذج نفسه ، لذلك يجب الاعتماد على النسخة المخبأة.) لاحظ أن استمرار $form و $form_state يحدث تلقائيًا للنماذج (متعددة الخطوات) مجموعة علامة "إعادة البناء" ، بغض النظر عن قيمة "ذاكرة التخزين المؤقت".
  • التخزين: $form_state['storage'] ليس مفتاحًا خاصًا ، ولا يتم توفير دعم محدد له في Form API. حسب التقليد ، كان الموقع الذي تم فيه تخزين البيانات الخاصة بالتطبيق للتواصل بين وظائف التقديم والتحقق ومنشئ النماذج ، خاصة في نموذج متعدد الخطوات. قد تستخدم تطبيقات النموذج أي مفتاح (مفاتيح) ضمن $form_state (بخلاف المفاتيح المدرجة هنا والمفاتيح الأخرى المحجوزة المستخدمة بواسطة نماذج API API الداخلية) لهذا النوع من التخزين. الطريقة الموصى بها لضمان عدم تعارض المفتاح الذي تم اختياره مع المفاتيح التي تستخدمها Form API أو الوحدات النمطية الأخرى هي استخدام اسم الوحدة كاسم المفتاح أو بادئة لاسم المفتاح. على سبيل المثال ، تستخدم الوحدة Node الوحدة $form_state['node'] في نماذج تحرير العقدة لتخزين معلومات حول العقدة التي يتم تحريرها ، وتظل هذه المعلومات متاحة عبر النقرات المتتالية لزر "معاينة" وكذلك عند النقر على زر "حفظ" أخيرًا.

الدالات الأخرى التي تحصل على $form_state كوسيطة هي hook_form_alter () و hook_form_FORM_ID_alter () .

كمثال على الكود الذي يستخدم تلك الوسيطة ، يمكنك إلقاء نظرة على comment_form_submit () ، الذي يحتوي على الكود التالي:

function comment_form_submit($form, &$form_state) {
  $node = node_load($form_state['values']['nid']);
  $comment = comment_form_submit_build_comment($form, $form_state);
  if (user_access('post comments') && (user_access('administer comments') || $node->comment == COMMENT_NODE_OPEN)) {
    // Save the anonymous user information to a cookie for reuse.
    if (user_is_anonymous()) {
      user_cookie_save(array_intersect_key($form_state['values'], array_flip(array('name', 'mail', 'homepage'))));
    }

    comment_save($comment);
    $form_state['values']['cid'] = $comment->cid;

    // Add an entry to the watchdog log.
    watchdog('content', 'Comment posted: %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid)));

    // Explain the approval queue if necessary.
    if ($comment->status == COMMENT_NOT_PUBLISHED) {
      if (!user_access('administer comments')) {
        drupal_set_message(t('Your comment has been queued for review by site administrators and will be published after approval.'));
      }
    }
    else {
      drupal_set_message(t('Your comment has been posted.'));
    }
    $query = array();
    // Find the current display page for this comment.
    $page = comment_get_display_page($comment->cid, $node->type);
    if ($page > 0) {
      $query['page'] = $page;
    }
    // Redirect to the newly posted comment.
    $redirect = array('node/' . $node->nid, array(
        'query' => $query,
        'fragment' => 'comment-' . $comment->cid,
      ));
  }
  else {
    watchdog('content', 'Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject), WATCHDOG_WARNING);
    drupal_set_message(t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject)), 'error');
    // Redirect the user to the node they are commenting on.
    $redirect = 'node/' . $node->nid;
  }
  $form_state['redirect'] = $redirect;
  // Clear the block and page caches so that anonymous users see the comment
  // they have posted.
  cache_clear_all();
}

لفهم ما يحتويه $form_state['values'] ، تحتاج إلى إلقاء نظرة على القيم المضافة إلى $form في comment_form () . على سبيل المثال ، يحتوي $form_state على $form_state['values']['name'] لأن $form يحتوي على $form['author']['name']. بشكل عام ، إذا كان $form['field'] حقل نموذج ، فإن $form_state سيحتوي على $form_state['values']['field'].

48
kiamlaluno