Bir görünümün sonuçlarını yinelemenin en iyi yolu programlı olarak nedir?


12

'Çocuklar' adlı bir görünüm verildiğinde (iki alanlı: child_node_id ve birth_order_value) 'default' display_id ve üst düğüm kimliğini içeren bir argüman verilen görünüm sonuçları kümesini yinelemenin en iyi yolu nedir?

Daha önce, aşağıdakine benzer kodu kullanarak bir blokta Görünüm kullandım:

if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)) {
   $node = node_load(arg(1));
   $args = array($node->nid);
   $view = views_get_view('Children');
   print $view->preview('default', $args);
}

Ancak, başka bir blokta görünümde bulunan değerlere dayalı bazı mantık gerçekleştirmek istiyorum. İş mantığımın son gerekliliğime dayalı olduğunu tahmin edebilirsiniz: Görünümü destekleyen kod bloğunun ('Çocuklar') birden çok kez çağrılmasını istiyorum. Görünüm veri kümesi sonuçlarını yinelediğimde, çocuklarını sorgulayan çocuk düğümleri arasında yinelemeli olarak yineleme yapmak istiyorum.


Yaklaşımınız iyi görünüyor. Bir yanıta koyarsanız, insanlar oy verebilir ve onaylayabilir. Deneyebileceğiniz bir şey, görünümü her seferinde ayarlamaktan ziyade. Yürütmeden önce $ view-> clone_view () yapın. Görünüm yüklemesi oldukça ağırdır ve bu bellek ve performansa yardımcı olabilir.
Jeremy French

Pardon burada temelden uzaktayım, ancak bu, üst tablodaki bir alandaki ilişkileri kullanarak ve gruplamayı kullanarak gerçekleştirebileceğiniz bir şey mi? Henüz kod yazmanız gerektiğinden emin değilim. Üst şablon geçersiz kılma işleminden alt görünümü ve mantığı çağırmak da daha kolay olabilir.
Jason Smith

foreach (.. sizeof ()) yerine düşünmelisiniz , çok daha iyi performans gösterir (çünkü PHP yerine C'dir).
berkes

Dikkat edilmesi gereken bir şey, yapmak yerine, if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2))kullanmak daha iyi olabilir if ($node = menu_get_object()).
Chris Pliakas

Sorunun cevabını kestim ve cevap olarak gönderdim. Bu şekilde, sitenin kullanıcıları için bu sorunun bir cevabı olduğu daha açıktır.
Jeremy French

Yanıtlar:


2

Views ile biraz oynamak bir yaklaşım geliştirmiş gibi görünüyor. Ancak sorumu diğer cevaplara ve daha iyi çözümlere açık bırakmak istiyorum.

<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
   $node = node_load(arg(1));
   $args = array($node->nid );
   unset($view);
   $view = views_get_view('Children');
   $view->set_display('default');  
   $view->set_arguments($args);
   $view->set_items_per_page(20);
   $view->execute();
   $newarg = array();
   for ($i=0; $i<sizeof($view->result); $i++) {
      $newarg[$i] = $view->render_field('nid_1', $i);
   }
   for ($i=0; $i<sizeof($newarg); $i++) {
      unset($view);
      $view = views_get_view('Children');
      $view->set_display('default');  
      $view->set_arguments($newarg[$i]);
      $view->set_items_per_page(20);
      $view->execute();
      ....
   }
}
?>

Sonuç kümesiyle işim bittiğinde, görünümü birden çok kez yürütmenin anahtarı ayarlamayı kaldırmamdı ($ view).


1

Aşağıdaki fonksiyondan iyi bir kilometre aldım. Dönüş değeri, tüm görünüm kayıtlarının bir dizisidir. Dsm ($ return_value) çağrısı size kendi görünümünüzün yapısı hakkında iyi bir fikir verecektir.

function _get_view_data($view_name, $args, $page = NULL, $page_size = 0 ) {
    $view = views_get_view($view_name);
    $view->pager['items_per_page'] = $page_size;
    $view->set_arguments($args);
    if ($page) {
        $view->build($page);
        $view->execute($page);
    }
    else {
        $view->execute();
    }
    return $view->result;
}

1

Drupal API'sında zaten yerleşik olan bir yardımcı işlev. (Bir süre Drupal Dokümanlar'da dolaşarak geçirdim ve sonunda buldum. Diğerleri de bu yardımcıyı kullanmayan çözümler üretti ve ayrıca bu yardımcı diğer çözümlerin yapmadığı ilginç bir adım attı. çalıştırmadan önce $ view nesnesinde pre_render öğesini çağırmak için).

İyi çalışıp çalışmadığına dair kefil olamıyorum, ama en azından bu yaklaşımlarla ilgili sorunları dile getirmek için belirli bir yer.

D6 için http://api.drupal.org/api/views/views.module/function/views_get_view_result/6

Ve D7 için http://api.drupal.org/api/views/views.module/function/views_get_view_result/7

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.