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


33

$form_stateBağımsız değişken olarak kullanılıyorsa , genellikle Form API bağlamında ne kullanılır?

Özellikle, ne zaman kullanıldığını gösteren bir örnek arıyorum.

Yanıtlar:


48

$form_stateform gönderme işleyicisine veya form doğrulama işleyicisine iletilen argümanlardan biridir; Başlıca kullanımı, kullanıcıdan içeriğe bakınız şeklinde girilen değerleri almaktır $form_state['values'], ancak başka amaçlar için kullanılabilecek diğer değerleri içerir. Drupal_build_form ()
belgesinde, aşağıdakileri içeren, bu dizide bulunan diğer değerlerin listesi bulunur:

  • yeniden oluşturma: Normalde, tüm form işlemleri tamamlandıktan ve gönderim işleyicileri çalıştıktan sonra, bir form yapılmış sayılır ve drupal_redirect_form () kullanıcıyı GET isteğini kullanarak yeni bir sayfaya yönlendirir (böylece bir tarayıcı yenilemesi yeniden gönderilmez) formu). Bununla birlikte, 'yeniden oluşturma' TRUE olarak ayarlanmışsa, formun yeni bir kopyası derhal oluşturulur ve yönlendirmek 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önderim işleyicisi tarafından belirlenir, çünkü genellikle bir form işleyicisinin içinde bir formun yapılıp yapılmayacağını veya başka bir adım gerektirip gerektirmediğini belirleyen bir gönderim işleyicisi içinde mantıktır. Bununla birlikte, bir doğrulama işleyicisi zaten $form_state['rebuild'], form işleminin gönderim işleyicilerini atlamasına ve doğrulama hataları olmasa bile formu yeniden oluşturmasına neden olacak şekilde ayarlanmış olabilir.
  • redirect: Gönderim sırasında formu yönlendirmek için kullanılır. Hedef URL'yi içeren bir dize veya uyumlu bir argüman dizisi olabilir drupal_goto(). Tüm drupal_redirect_form()bilgiler için bakınız .
  • önbellek: TRUEOrijinaline ayarlanırsa , işlenmemiş form yapısı önbelleğe alınır ve bu da tüm formun önbellekten yeniden oluşturulmasına olanak tanır. Tipik bir form iş akışı, iki sayfa isteği içerir; ilk önce, kullanıcının doldurması için bir form oluşturulur ve oluşturulur. Ardından, kullanıcı formu doldurup gönderir ve formun oluşturulup işlenmesi gereken ikinci bir sayfa isteğini tetikler. Varsayılan olarak $formve $form_statebu sayfa isteklerinin her biri sırasında sıfırdan oluşturulur. Genelde $formve $form_statedeğişkenlerin ilk sayfa talebinden gönderimi işleyene devam etmesi gerekir veya istenir . 'önbellek' bunu yapmak için TRUE olarak ayarlanabilir. Öne çıkan bir örnek, içinde Ajax etkin bir formdur.ajax_process_form()#ajax özelliğine sahip bir öğe içeren tüm formlar için form önbelleğe almayı sağlar. (Ajax işleyicisinin, formun kendisini oluşturmak için hiçbir yolu yoktur, bu nedenle önbelleğe alınmış sürüme dayanmalıdır.) Notun değeri ne olursa olsun, 'yeniden oluştur' bayrağının ayarlandığı (çok adımlı) formların kalıcılığını $formve $form_state'cache'.
  • depolama: $form_state['storage']özel bir anahtar değildir ve Form API'sinde belirli bir destek sağlanmaz. Geleneğe göre, özellikle çok adımlı bir biçimde, gönderme, doğrulama ve form oluşturucu işlevleri arasındaki iletişim için uygulamaya özel verilerin depolandığı konumdu. Form uygulamaları, $form_statebu tür bir depolama için içindeki (burada listelenen anahtarlar ve Form API içindekiler tarafından kullanılan diğer ayrılmış olanlar hariç ) herhangi bir anahtar kullanabilir . Seçilen anahtarın Form API'si veya diğer modüller tarafından kullanılanlarla ç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, Node modülü kullanır$form_state['node'] Düğüm düzenleme formlarında, düzenlenmekte olan düğüm hakkındaki bilgileri saklamak için kullanılır ve bu bilgi "Önizleme" düğmesinin art arda tıklanmasının yanı sıra "Kaydet" düğmesinin tıklandığında da kullanılabilir.

$form_stateArgüman olarak elde edilen diğer işlevler , hook_form_alter () ve hook_form_FORM_ID_alter () 'dır .

Bu argümanı kullanan kodun bir örneği olarak , aşağıdaki kodu içeren comment_form_submit () 'e 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();
}

Ne olduğunu anlamak için $form_state['values']içerir, sen eklenen değerlere bakmak gerekir $formyılında comment_form () . Örneğin, $form_stateiçerir $form_state['values']['name']çünkü $formiçerir $form['author']['name']. Genellikle, $form['field']bir form alanı ise, $form_stateiçerecektir $form_state['values']['field'].


Hook_form_alter kullanarak form değerlerini değiştirmek veya multivalue alan düğmelerini devre dışı bırakmak istiyorsak, hangi değişken $ form veya $ from_state? (AJAX kullanılarak veya AJAX olmadan uygulandığında) değiştirilmelidir. $ Form_state özellikle ajax için kullanılıyor mu?
15'te

1
@kiranking Normalde, AJAX geri çağrısı $formdizinin bir bölümünü döndürür ; içeriğini kontrol eden form oluşturucu $form_state. Doğru olanı yapan modüller tarafından uygulanan tüm AJAX geri aramalarında bu gördüm.
kiamlaluno
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.