Drupal 7'de açıkta kalan görünüm filtrelerinde hook_form_alter kullanma


12

hook_form_alter()Views 3 ve Drupal 7 ile kullanmakta sorun yaşıyorum .

Bir görünümü benzersiz şekilde tanımlamak için bir if ifadesi ekleyemiyorum; ne yazıyorsam, if ifadesinin hiçbir zaman doğru olmadığı anlaşılır. Ancak, nerede yanlış gidiyor emin değilim aşağıdaki form kullanarak kolayca form_id kullanabilirsiniz!

if ($form_id == 'views_exposed_form') {
}

hook_form_alter()Tek bir görüşümü benzersiz olarak değiştirmek için nasıl kullanabilirim ?

Yanıtlar:


25

Hook_form_alter içindeki görünüm nesnesine erişerek erişebilirsiniz $form_state['view']. Bu, belirli bir görünümü tanımlamanızı sağlar:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id == 'views_exposed_form') {
        $view = $form_state['view'];
        if ($view->name == 'my_view_machine_name' && $view->current_display == 'display_name') {
            // alter your exposed form here
        }
    }
}

Bu $ form_id beri daha iyi bir çözüm, yeterli olmayabilir unfortunetly current_display aynı sayfada görüşlerin karmaşık setleri ile bazı durumları ise (ne kadar diğer cevaplar devlet aksine) maruz formlar için yeterli değildir değildir
Rotari Radu

Kabul edildi - bu daha hedefli çözüm. Açıkta kalan filtre formlarını birden çok kez kullanıyorsanız çok kullanışlıdır.
Sage

Drupal_set_message ($ view-> name) kullanın; & drupal_set_message ($ view-> current_display); isimlerini almak için. Ben "views_deals" olduğunu düşünüyorum biraz karışık, ama benim durumumda sadece "fırsatlar" oldu.
Collins

Aynı şeyi Drupal 8 nasıl yapabiliriz?
Sharique

mymodule_form_views_exposed_form_alter() Bunun yerine kullanmak daha iyi mymodule_form_alter, daha sonra kontrolü atlayabilirsiniz $form_id.
Berend de Boer

18

Ne yapacağım bir adım geri almak ve hatta bu kanca kayıt olup olmadığını görmek. Genellikle $form_iddeğişim.

Hata ayıklama işlemi:

  • Devel'i aç
  • D6 ile alıştığınız gibi kancanıza dsm ($ form_id) ekleyin
  • Önbelleğinizi temizleyin

Drupal.org'dan örnek kod (içeride mymodule.moduleveya template.phpdosyada) :

<?php
/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'form_views_exposed_form') {
    drupal_set_message("Form ID is : " . $form_id);
  }
}
?>

Bir grup form kimliğinin yazdırıldığını göreceksiniz, ardından görünümünüze maruz kalan form kancasını seçip oradan çalışacaksınız.

Ayrıca, drupal 7 ile belirli formları doğrudan kimliğe göre hedefleyebilirsiniz .

Misal:

<?php
/**
 * Implements hook_form_alter().
 */
function mymodule_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
  drupal_set_message("Form ID is : " . $form_id);
}
?>

Birden fazla açıkta kalan form kullanıyorsanız, form değiştirme işlevinde $ form ['# id'] inceleyerek belirli bir görünümü kontrol edebileceğinizi unutmayın.

Son olarak, bu işe yaramazsa ben bu sorun kuyruğu gözden geçirilmesini tavsiye ederim: Form_alter hook yalak filtreler formunda filtre nasıl değiştirilir


2

son zamanlarda bu konuda da çarptım, ama özel bir yerine özellik modülü kullanıyorum. Bu, sorunu çözmeme yardımcı oldu.

/**
 * Implements hook_views_api_alter()
 */
function MY_FEATURE_views_api_alter(&$vars) {
  if (isset($vars['MY_FEATURE'])) {
    $vars['MY_FEATURE']['path'] = drupal_get_path('module', 'MY_FEATURE');
  }
}

Ve sonra hook_form_views_exposed_form_alter () yönteminizi kullanabilirsiniz:

/**
 * Implements hook_form_views_exposed_form_alter().
 */
function MY_FEATURE_form_views_exposed_form_alter(&$form, &$form_state) {
  if($form['#id'] == 'views-exposed-form-search-products-page') {
    $form['price'] = array(
      '#type'    => 'select',
      '#size'    => NULL,
      '#options' => _getPriceOptions(),
    );
  }
}
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.