web-gelistirme-sc.com

$ Form_state ne için kullanılır?

Nedir $form_state genellikle bir argüman olarak kullanılırsa Form API bağlamında kullanılır?

Özellikle, ne zaman kullanıldığına dair bir örnek arıyorum.

32
chrisjlee

$form_state, Form gönderme işleyicisine veya form doğrulama işleyicisine iletilen bağımsız değişkenlerden biridir; asıl kullanımı kullanıcıdan $form_state['values'] içeriğini görmek üzere formda girilen değerleri almaktır, ancak başka amaçlar için kullanılabilecek başka değerler içerir.
drupal_build_form () belgeleri, bu dizide bulunan ve aşağıdakileri içeren diğer değerlerin listesini içerir:

  • yeniden oluşturma: Normal olarak, tüm form işleme tamamlandıktan ve gönderme işleyicileri çalıştıktan sonra, bir form yapıldığı kabul edilir ve drupal_redirect_form (), kullanıcıyı bir GET isteği kullanarak yeni bir sayfaya yönlendirir (böylece tarayıcı yenilemesi yeniden göndermez form). Ancak, 'yeniden oluşturma' DOĞRU olarak ayarlandıysa, formun yeni bir kopyası derhal oluşturulur ve yeniden yönlendirme yerine tarayıcıya gönderilir. Bu, sihirbazlar ve onay formları gibi çok adımlı formlar için kullanılır. Normalde, $form_state['rebuild'] Bir gönderme işleyicisi tarafından ayarlanır, çünkü bir gönderme işleyicisi içinde genellikle bir formun yapılıp yapılmayacağını veya başka bir adım gerektirip gerektirmediğini belirleyen mantıktır. Ancak, bir doğrulama işleyicisi zaten $form_state['rebuild'] Ayarını, doğrulama hatası olmasa bile form işlemenin gönderme işleyicilerini atlamasına ve formu yeniden oluşturmasına neden olacak şekilde ayarlayabilir.
  • yönlendirme: Gönderim sırasında formu yeniden yönlendirmek için kullanılır. Hedef URL'yi içeren bir dize veya drupal_goto() ile uyumlu bir dizi bağımsız değişken olabilir. Tam bilgi için drupal_redirect_form() sayfasına bakın.
  • önbellek: TRUE olarak ayarlanırsa, orijinal, işlenmemiş form yapısı önbelleğe alınır ve bu da tüm formun önbellekten yeniden oluşturulmasını sağlar. Tipik bir form iş akışı iki sayfa isteği içerir; ilk olarak, kullanıcının doldurması için bir form oluşturulur ve oluşturulur. Daha sonra, kullanıcı formu doldurur ve göndererek formun oluşturulması ve işlenmesi gereken ikinci bir sayfa isteğini tetikler. Varsayılan olarak, bu sayfa isteklerinin her biri için $form Ve $form_state Sıfırdan oluşturulmuştur. Genellikle, ilk sayfa isteğinden gönderimi işleyen değişkene kadar $form Ve $form_state Değişkenlerini devam ettirmek gerekir veya istenir. 'cache' bunu yapmak için TRUE olarak ayarlanabilir. Önemli bir örnek, ajax_process_form() işlevinin #ajax özelliğine sahip bir öğe içeren tüm formlar için form önbelleğe almayı etkinleştirdiği Ajax etkin bir formdur. (Ajax işleyicisinin formun kendisini oluşturmasının bir yolu yoktur, bu nedenle önbelleğe alınmış sürüme bağlı olmalıdır.) $form Ve $form_state Öğelerinin kalıcılığının (çok adımlı) formlar için otomatik olarak gerçekleştiğine dikkat edin. 'önbellek' değerine bakılmaksızın 'yeniden oluştur' bayrak kümesi.
  • storage: $form_state['storage'] özel bir anahtar değildir ve Form API'sında özel bir destek sağlanmamıştır. Geleneksel olarak, gönderme, doğrulama ve form oluşturucu fonksiyonları arasındaki iletişim için uygulamaya özel verilerin depolandığı konumdur, özellikle çok adımlı bir formda. Form uygulamaları, bu tür depolama için $form_state İçindeki (burada listelenen anahtarlar ve Form API dahili tarafından kullanılan diğer ayrılmış anahtarlar hariç) herhangi bir anahtarı kullanabilir. Seçilen anahtarın Form API veya diğer modüller tarafından kullanılan anahtarlarla çakışmadığından emin olmanın önerilen yolu, modül adını anahtar adı veya anahtar adı için önek olarak kullanmaktır. Örneğin, düzenlenen düğüm hakkında bilgi depolamak için düğüm düzenleme formlarında Node modülü $form_state['node'] Kullanır ve bu bilgiler "Önizleme" düğmesine arka arkaya tıklandığında kullanılabilir "Kaydet" düğmesine nihayet tıklandığında.

Bağımsız değişken olarak $form_state Alan diğer işlevler hook_form_alter () ve hook_form_FORM_ID_alter () şeklindedir.

Bu bağımsız değişkeni kullanan kod örneği olarak, aşağıdaki kodu içeren comment_form_submit () adresine bakabilirsiniz:

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'] Öğesinin ne içerdiğini anlamak için comment_form () içindeki $form Öğesine eklenen değerlere bakmanız gerekir. Örneğin, $form_state$form_state['values']['name'] İçerir, çünkü $form$form['author']['name'] İçerir. Genel olarak, $form['field'] Bir form alanı ise, $form_state$form_state['values']['field'] İçerir.

48
kiamlaluno