Views'ın çağrı cihazı ayarlarını dinamik olarak ayarlamak mümkün müdür?


13

Örneğin, belirli bir düğüm türünü görüntülerken görüntülenen bir görünümünüz var, ancak çağrı cihazı ayarlarının her bir düğüm için farklı olmasını istiyorsunuz. Ben "çağrı ayarı" gibi bir CCK alanı yapmayı ve sonra xy tamsayı bir seçenek vermek düşünüyordum. Ancak, bu alanı bir şekilde Görünümlerin ayarlarına dinamik olarak bağlamanın mümkün olup olmadığını bilmiyorum. Yoksa bunu yapmanın başka bir yolu var mı?

Yanıtlar:


18

Kullanmak istediğiniz görünüm kancası hook_views_pre_build, sorgu oluşturulmadan önce çağrılır. Şimdi bu, bazı temel modül geliştirme deneyimine sahip olduğunuzu ve api görünümlerine aşina olduğunuzu varsayar.

Yapabilmeniz gerekenler:

/*
 * Implementation of hook_views_pre_build().
 */
function hook_views_pre_build(&$view) {

  // Make sure this is only for the specific view you want to modified
  if ($view->name == "foo_bar") {

    // Get the x-y value from where you're storing it (in your example the node object).
    $pager_count = get_count_for_this_node();

    // Lets also make sure that this is a number so we won't destroy our view.
    if (is_numeric($pager_count)) {

      // Now lets set the pager item to what ever out count is.
      $view->pager['items_per_page'] = $pager_count;
    }
  }
}

Yukarıda, görünüm sorgusu çağrı cihazının oluşturulmasından önce çağrılan bir görünüm kancası kullanıyoruz ve çağrı cihazı ve diğer her şey değişikliği yansıtacaktır.

Dikkat kelimesi: görünüm kancaları sadece neler olup bittiğini anlarsanız kullanılmalıdır. Yukarıdaki kod görünümler-2.x için yazılmıştır.

Bu yardımcı olur umarım.


Harika. Teşekkürler. Henüz herhangi bir modül geliştirme deneyimim yok, ancak gerçekleştirmek istediğim birkaç şey için işe başlıyorum. Ben PHP yapıştırılmış bir çalışma kavramak var, bu yüzden yukarıda yapıştırılan kod yığınında neler olduğunu takip edebilirsiniz. Bunun bana çok yardımcı olduğunu düşünüyorum. Teşekkür ederim.
Jay

1
Views 3.x için ilgili kod şu şekilde değiştirilmelidir$view->items_per_page = $pager_count;
stevenw00

her sayfanın ofsetini dinamik olarak ayarlamak mümkün müdür?
shekoufeh

2

Drupal 7 için, Sadece aşağıdakileri yazmalıdır:

$view->items_per_page = $pager_count;

Örnekte:

/**
 * Implements hook_views_pre_build().
 */
function module_name_views_pre_build(&$view) {
  if ($view->name == "foo_bar" && $view->current_display == 'foo_display') {
    $pager_count = get_count_for_this_node();
    if (is_numeric($pager_count)) {
      $view->items_per_page = $pager_count;
    }
  }
}

@Ericduran tarafından kod örneği kullanıyorum.


1

Görünüm önişleme işlevini kullanmalısınız

/*
 * Implementation of hook_views_pre_render().
 */
function MYMODULE_views_pre_render(&$view){
  // $view->name
  // $view->current_display
  // ...
  // look for other variables in $view object
}

"önişleme" teması içindir ve ön_kender çok geç (o sorgu zaten çalıştırılmıştı) - ön-inşa kancası çok daha iyi.
mojzis

1

Hook_views_pre_render'da görünüm sonucunu ve çağrı cihazını güncellemek için aşağıdakileri yapabilirsiniz:

<?php

/**
 * Implementation of hook_views_pre_render().
 */
function MODULENAME_views_pre_render(&$view) {
  if ($view->name == 'my_view' && $view->current_display == 'my_display') {
    // View result update logic.
    // e.g.
    // $result = array();
    // foreach ($view->result as $k => $row) {
    //   if (whatever is your condition) {
    //     $result[$k] = $row;
    //   }
    // }

    // Assuming $result has data as per your logic.
    // Update the pager according to result.
    $view->query->pager->total_items = count($result);
    $view->query->pager->update_page_info();
    // Add results to view.
    $view->result = $result;
  }
}

Bu çalışmalı!! ;)


Mükemmel! Sorgu tarafından döndürülen öğelere bağlı olarak belirli bir sayfadaki öğe sayısını sınırlamak istedim. Bu yöntemi en kısa sürede kontrol edecek.
Jens

Tam olarak çalışmıyor. Boşalttığınız satırlar sonraki sayfada açılmaz. Böylece eksik içerik elde edersiniz. Daha fazla araştırmaya ihtiyaç var.
Jens

0

@tanmayk'ın kodu bana hile yaptı. Hook_views_pre_render içinde sadece bu 2 kod satırı eklendi

$view->query->pager->total_items = $nr;
$view->query->pager->update_page_info();

Ancak sonuçları görünüme eklemem gerekmedi.

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.