Görünümlere Programlı olarak FİLTRE KRİTERLERİ ekleyin


18

filter criteriaProgramlı olarak eklemek / değiştirmek istiyorum .

Örneğin, bir görünüm için, değeri dinamik olarak değişmesi gereken bir "E-posta Adresi" filtresi ekledim, o anda oturum açmış olan kullanıcının e-posta kimliğine ayarlanması gerekir.

Bunu nasıl başarabilirim? Daha fazla bilgi için lütfen ekteki resme bakın. Lütfen yardım et.

resim açıklamasını buraya girin

Yanıtlar:


24

Kullanım Devel modülü ve dpm($view)ve dpm($query)siz "değer" alanına "test@email.com" gibi koymak sonra pic bulundu. Devel çıktısından görünüm ve sorgunun nesne / dizi yapısına bakın.

Ardından hook_views_query_alter(&$view, &$query), WHERE koşul filtresi koşulunu hedeflemek için modülünüzdeki işlevi kullanın ve istediğiniz değere ayarlayın.

Gibi bir şey:

function MYMODULE_views_query_alter(&$view, &$query) {
  global $user;
  dpm($view, __FUNCTION__);
  dpm($query, __FUNCTION__);
  if ($view->name === 'your_view_machine_name') {
    // This will only work as-is if you always have something in the filter by
    // default, I guess. This hook runs always so you could just put
    // 'test@test.com' as the email to filter by in views and this
    // will always override it. I'm sure there is a cleaner way to put
    // the filter dynamically at runtime. But i think thats more complex
    // php that customizes a view.
    //
    // The index 2 below is the index of the condition for the email filter.
    // Your $query structure may be different in your dpm() of the View $query.
    $query->where[1]['conditions'][2]['field']['value'] = $user->email;
  }
}

Çok teşekkürler! Lütfen bana ilk olarak nerede yazacağımı söyleyebilir misin dpm($view);?
Shafiul

özel bir modül yaparsınız ve yukarıdaki işlevi içine yerleştirirsiniz. görünümler etkinleştirilirse kanca tetiklenir ve özel modülü ve Devel modülünü etkinleştirdikten sonra sayfanın üstünde $ view ve $ sorgusunu görürsünüz. Sonra sadece görünümünüzün makine adını ... ve $ sorgu değerleri tam sorgunuzla çalışır hale getirmek için
kodumu değiştirin

Bu harika bir cevap. Drupal 7'de şunları yapıyorsunuz: $ query-> burada [1] ['koşullar'] [2] ['değer'] = $ kullanıcı-> e-posta
Artur Kędzior

Şahsen aşağıdaki kancaları kullanarak cevap çok daha iyi olduğunu düşünüyorum drupal.stackexchange.com/a/200870/9634
kbrinner

6

İşte bir alternatif:

$view = views_get_view('view_machine_name');
$view->init_display('default');
$view->display_handler->display->display_options['filters']['your_filter_name']['default_value'] = 'your_value';
$view->is_cacheable = FALSE;  
$view->execute();
print $view->render();

Muhtemelen bazı ezoterik, kıvrık bir yöntem kullanarak bunu ayarlamanız gerektiğini biliyorum, ama sadece karışıklık olmadan hızlı ve kirli erişim istiyorsanız bu sizi oraya götürecektir.


5

Site performansını ve önbelleğe almayı baltalamamak için bunları oluşturma zamanında değil kancalarda değiştirmek tercih edilir. Dikkat rakama bana yaş aldı ) (hook_views_pre_build , sen gerek çok geç ateşler hook_views_pre_view () .

$ View-> add_item () kullanarak başvuru buldum , ancak örnekler için mücadele ettik , aşağıda sadece belirli kelimeleri dahil etmek için bir sınıflandırma terimleri filtrelemek için benim çözümüm oldu:

function MODULENAME_views_pre_view(&$view, &$display_id, &$args) {

  if ($view->name == 'VIEWNAME' && $display_id == 'DISPLAYID') {
    // Add all the terms of a vocabulary to the terms listing widget select field
    $vids = array();
    $vocab = taxonomy_vocabulary_machine_name_load('vocab_name');
    $vids[ $vocab->vid ] = $vocab->vid;

    // Get the existing filters
    $filters = $view->display_handler->get_option('filters');

    if (empty($filters['vid'])) {
      // There is no vid filter so we have to add it
      $view->add_item(
        $view->current_display,
        'filter',
        'taxonomy_term_data',
        'vid',
        array(
          'operator' => 'in',
          'value' => $vids,
          'group' => 1
        )
      );
    }
    else {
      // Add to pre-existing filter
      foreach($vids as $vid) {
        $filters['vid']['value'][ $vid ] = $vid;
      }
      $view->display_handler->override_option('filters', $filters);
    }
  }
}

Notu düzenle : do grubu ile ilgili bu yorum , görünüm filtrelerini kullanarak nasıl elde edileceğimi $view->display_handler->get_option('filters')ve ardından bunları geçersiz kılmamı anlamama yardımcı oldu $view->display_handler->override_option('filters', $filters);.


2

Benzer bir sorun yaşadım ama bir filtreye birden fazla argüman geçirmeye çalışıyorum. "Views_get_view" yöntemini kullandım, ancak bağımsız değişkenleri görünüme geçirerek. Umarım birine yardımcı olur. İhtiyaçlarınız için herhangi bir bağımsız değişken türünü veya değerini değiştirebilirsiniz:

Ben görünümün içine bağlamsal filtreler ekledim (gelişmiş görünüm ayarları alan kümesinden). Birincisi "içerik: sınıflandırma terimi kimliği var" dır. İkincisi, "çoklu izin ver" işaretli ve "hariç tut" onay kutusunun işaretli olduğu "içerik: nid" dir (bağlamsal filtre pop-up'ındaki 'diğer' alan kümesinden).

args [] = '1'; // Terim Kimliği
args [] = '1 + 2 + 3'; // Hariç tutulacak / dahil edilecek düğüm kimlikleri

$ view = views_get_view ($ view_name);
$ Görünüm-> init ();
$ Görünüm-> set_display ($ ekran);
$ Görünüm-> set_arguments ($ args);
$ Görünüm->) (yürütmek;
$ Görünüm-> sonuç

Güncelleme: Bağlamsal filtre değerleri içinde, php kodunu seçmeniz ve iletilen görünüm argümanlarını döndürmeniz gerekebilir.

$ view-> args [1];

1

Drupal 8'de ViewExecutable::setHandler($display_id, $type, $id, $item)programlı olarak bir filtre ayarlamak için kullanabilirsiniz .


4
Bu cevap, bunun neden işe yaradığı hakkında biraz daha ayrıntılı olabilir. Genellikle belge sayfalarını bağlamak ve alıntılamak istiyorum. Bu, askerin Drupal API hakkında daha fazla bilgi edinmesine ve gelecekte kendileri için bilgi bulmasına yardımcı olacaktır.
mradcliffe

1

Drupal 8'de filtre ölçütlerinin programlı olarak nasıl eklenebileceğine ilişkin bir örnek:

/**
 * @param ViewExecutable $view
 * @param QueryPluginBase $query
 *
 * Sets a custom custom filter criteria (takes current language into account)
 */
function MODULE_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {
  if ($view->storage->id() === 'my_view_id') {
    $query->addWhere(0, 'node__field_custom_criteria.field_custom_criteria_value', \Drupal::languageManager()->getCurrentLanguage()->getId(), '=');
  }
}

Yukarıdaki sorgu, field_custom_criteriaalanın seçili olan dile eşit olduğu düğümleri filtreleyen bir ölçüt ekleyecektir .

Dokümanlar'da daha fazla bilgi bulunabilir: hook_views_query_alter


0

@ Dayanarak Duncanmoo 'ın yukarıdaki cevabı durumda bunlar olurdu yararlı örnekler, bir başvurulan sınıflandırmasını ancak bunun yerine bir referans unsur veya esaslı filtreye çalışmıyorum sanıyordum - Ben en iyisiydi hissettim, benim görünümüne aşağıdaki filtreleri eklendi bir NID:

function [MYMODULE]_views_pre_view(&$view, &$display_id, &$args) {
  if (($view->name == '[your view name]') && ($display_id == '[your display id]')) {
    // Get referenced service - example for entity reference.
    $node = menu_get_object();
    $node_wrapper = entity_metadata_wrapper('node', $node->nid);
    $referenced_service = $node_wrapper->field_service_ref->value();
    // Add service id as a filter to view.
    $filters = $view->display_handler->get_option('filters');
    if (empty($filters['field_service_ref_target_id'])) {
      // Only display operations nodes that reference the same service.
      $view->add_item(
        $display_id,
        'filter',
        'field_data_field_service_ref',
        'field_service_ref_target_id',
        array(
          'operator' => '=',
          'value' => ['value' => $referenced_service->id],
          'group' => 1
        )
      );
    }
    // Add nid as a filter to view - example for NID filter
    if (empty($filters['nid'])) {
      // Don't include current operation in list of related operations.
      $view->add_item(
        $display_id,
        'filter',
        'node',
        'nid',
        array(
          'operator' => '!=',
          'value' => ['value' => $node->nid],
          'group' => 1
        )
      );
    }
  }
}
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.