Bir filtrenin değerini nasıl değiştirebilir ve görünüm oluşturulmadan önce çıktıyı değiştirebilirim?


15

Drupal 7 ve Views 3'ü kullanırken, Görünümler filtre değerini değiştirmenin, görüntülenmek üzere olan içeriği etkilemesi için doğru yolu nedir?

Burada D6 için bahsedilen her şeyi denedim .

Birkaç kişi işe koysa da Merlin, display_options'ı değiştirmenin bunu başarmanın yanlış yolu olduğunu belirtiyor, ancak ne yapacağına cevabında belirsiz ( http://drupal.org/node/789710#comment- 2927556 ).

Denedim:

function pages_views_pre_view($view){
    $view = views_get_view('north_carolina');
    $view->set_display('default');

    $view->display_handler->options['filters']['province']['value'] = 'Georgia';
    dsm($view->display_handler->options['filters']['province']);
}

Notlar:

1) north_carolinaBir sayfa ve bir blok (sayfa_1 ve blok_1) olmak üzere iki tür ekrana sahip bir görünüm oluşturdum .

2) Filtrelerim ekranlarımda aynı olduğundan, 'varsayılan' ekranı değiştirmeye çalışıyorum, böylece hepsini etkiler.

3) Filtremin varsayılan değeri 'Views (Kullanıcı Arayüzünde ayarladığım)' North Carolina ', ancak' Georgia 'olarak değiştirmeye çalıştığımı fark ettim

4) DSM'yi hemen sonra çalıştırırsam filtrenin değiştiğini görüyorum, ancak sonuçlarım hala 'Kuzey Carolina' sonuçlarını gösteriyor. Önbelleğe alma kapalı ve drush cc hepsini çalıştırdıktan sonra hala aynı şeyi alıyorum.

Ayrıca hook_views_pre_buildve aracılığıyla aynı kodu çalıştırmayı denedim hook_views_pre_execute.

Herhangi bir öneri?

DÜZENLE:

Önerildiği gibi ek bilgiye sahip olmak yardımcı olabilir. İşte görüşün bir dökümü:

$view = new view();
$view->name = 'north_carolina';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'North Carolina';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'test nc block';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['label'] = '';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
/* Sort criterion: Content: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = 1;
$handler->display->display_options['filters']['status']['group'] = 1;
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
/* Filter criterion: Location: Province */
$handler->display->display_options['filters']['province']['id'] = 'province';
$handler->display->display_options['filters']['province']['table'] = 'location';
$handler->display->display_options['filters']['province']['field'] = 'province';
$handler->display->display_options['filters']['province']['value'] = 'North Carolina';
$handler->display->display_options['filters']['province']['exposed'] = TRUE;
$handler->display->display_options['filters']['province']['expose']['operator_id'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['label'] = 'State';
$handler->display->display_options['filters']['province']['expose']['operator'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['identifier'] = 'province';
$handler->display->display_options['filters']['province']['expose']['remember_roles'] = array(
  2 => '2',
  1 => 0,
  3 => 0,
  4 => 0,
);

/* Display: Block */
$handler = $view->new_display('block', 'Block', 'block_1');
$handler->display->display_options['block_description'] = 'test nc block';

Bu işleyicilerin konum modülü tarafından sağlandığını unutmayın. Özellikle "Konum: İl" filtresi için otomatik doldurma formu verildi. Kuzey Carolina'ya yazdığımda ortaya çıkıyor ve bunu seçmek zorundayım. Ancak, SQL deyiminde, görünümlerin durum için iki karakter kısaltması kullandığını oluşturduğuna dikkat edin:

SELECT node.title AS node_title, node.nid AS nid, node.created AS node_created
FROM 
{node} node
LEFT JOIN {location_instance} location_instance ON node.vid = location_instance.vid
LEFT JOIN {location} location ON location_instance.lid = location.lid
WHERE (( (node.status = '1') AND (location.province = 'NC') ))
ORDER BY node_created DESC
LIMIT 10 OFFSET 0

Yanıtlar:


8

Değiştirilecek görünümler nesnesinin tam kısmını bulmak zor olabilir. Genellikle ilk olarak görünümü dışa aktarırım ve başlamak için oluşturulan koda bakarım.

Aşağıdaki kod parçası değiştirilmemiştir ve üretim sitelerimden birinde beklendiği gibi çalışmaktadır. Umarım sizi doğru yöne yönlendirmeniz yeterlidir (açıkçası, bu adlı özel bir modüldür offer_select). Kodu dışa aktarılan görünümden sağlayabiliyorsanız, birisi bir göz atabilir.

//Alter the End date filter on the offer views
function offer_select_views_pre_view(&$view) {
  if ($view->name == 'active_offers') {
    $view->display['default']->handler->options['filters']['field_end_value']['value']['value'] = time();
  }
}

--UPDATE--
Özel görünümünüz için Konum modülünü yükledim ve NC'de birkaç düğüm ve Gürcistan'da birkaç düğüm oluşturdum ve testinizi test etmek için içe aktardım . Özel modülümde (adlı dev) bu kodla başladım (devel kurulu halde):

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']);
  }
}

Oradan, ben buraya kadar diziye krumo görüntülenen bariz değerleri eklemeye devam etti:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']['province']['value']);
  }
}

Hangi sadece North CarolinaKrumo'da basılmıştır . Bu noktada değeri yazdırmaktan şu şekilde ayarlamaya geçtim:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    $view->display['default']->handler->options['filters']['province']['value'] = 'Georgia';
  }
}

Ve işte. Hile yaptı.


Güzel. Bir şansım olduğunda, görüşünle oynayacağım ve daha somut bir cevap bulup bulamayacağımı göreceğim.
Adam Balsam

@ blue928 yukarıya bakın. Yanıtımı, sorularınıza özel bir yanıtla ve oraya nasıl geldiğimle ilgili genel talimatlarla güncelledim.
Adam Balsam

harika çalıştı. Doğru cevapla ilgili not: Sorunumun bir kısmı, views_get_view işlevini çağırmam veya ekranı ayarlamam gerekmediğidir.
blue928

2

Birisi (ben yaptığım gibi) D8 aynı çözüm ararken bu iş parçacığı attı durumunda:

Yeni API, bu parametrelerin çok daha net bir şekilde değiştirilmesine izin verir. Referanslar için bu bölüme bakın .

Küçük örnek

function dev_views_pre_view(ViewExecutable &$view, $display_id, array &$args) {
  if ($display_id === 'my_unique_display_name') {
      $args[0] = 'desired_value';
  }
}
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.