Drupal: Programlı bir görünüm sıralama

2 Cevap php

Hey orada. () Fonksiyonunun views_get_view_result kullanarak - - Ben bir bakış sonuçlarını almaya çalışıyorum ve ben İzlenme arayüzü içinde yapamadığı bir şekilde diziyi sıralamak. Şimdiye kadar iyi. Ben ihtiyacım şeyler her ile bir $ satır değişkeni var.

Şimdi ... Ben nasıl geri koymak? Ben bu tür bir ihtiyaç önce :) ben () views_embed_view kullanılır, ama artık bunu yapamam.

Bunu çatlama çok yakın olduğum gibi bu konuda herhangi bir yardım için minnettar hissediyor!

$important_var = important_function();
$result = views_get_view_result($view, $display, $args);
$result = sorting_function($result, $important_var);

//TODO: Put the result back into the view

2 Cevap

Sadece Drupal çekirdek gibi 'dış' manipülasyonları için Gösterim modülü provides some hooks.

Sen uygulamak hook_views_pre_render(&$view) within a custom module and manipulate the result array available in $view->result yapabilirsiniz:

/**
 * Implementation of hook_views_pre_render()
 *
 * @param view $view
 */
function YourModuleName_views_pre_render(&$view) {
  // Check if this is the view and display you want to manipulate
  // NOTE: Adjust/Remove the display check, if you want to manipulate some/all displays of the view
  if ('YourViewName' == $view->name && 'YourDisplayName' == $view->current_display) {
    // EXAMPLE: Just reverse result order
    // TODO: Replace with your desired (re)ordering logic
    $view->result = array_reverse($view->result);
  }
}

Kanca tüm sonuç veri monte edildikten sonra, görünüm oluşturma sürecinin ortasında çağrılır, ancak gerçek çıkış render alır önce, yani sonuç dizide değişiklikler görünümleri son çıkış yansıyacaktır.

EDIT: Alternatif olarak, views_get_view_result() fonksiyonunun davranışını kopyalayarak, 'elle' görünümü süreç olabilir, ancak bunun yerine sonuç dönen, onu işlemek ve görünümü vermeye devam ediyor:

function yourModule_get_custom_sorted_view($display_id = NULL) {
  // As the custom sorting probably only works for a specific view,
  // we 'demote' the former $name function parameter of 'views_get_view_result()'
  // and set it within the function:
  $name = 'yourViewName';
  // Prepare a default output in case the view definition can not be found
  // TODO: Decide what to return in that case (using empty string for now)
  $output = '';

  // Then we create the result just as 'views_get_view_result()' would do it:
  $args = func_get_args();
  if (count($args)) {
    array_shift($args); // remove $display_id
  }

  $view = views_get_view($name);
  if (is_object($view)) {
    if (is_array($args)) {
      $view->set_arguments($args);
    }
    if (is_string($display_id)) {
      $view->set_display($display_id);
    }
    else {
      $view->init_display();
    }
    $view->pre_execute();
    $view->execute();
    // 'views_get_view_result()' would just return $view->result here,
    // but we need to go on, reordering the result:
    $important_var = important_function();
    $view->result = sorting_function($result, $important_var);
    // Now we continue the view processing and generate the rendered output
    // NOTE: $view->render will call $view->execute again,
    // but the execute method will detect that it ran already and not redo it.
    $output = $view->render();
    // Clean up after processing
    $view->post_execute();
  }

  return $output;
}

Note: Bu bir kod çoğaltılması yeri ve dolayısıyla hata eğilimli - Ben içinde kendi '$ important_var' erişmek için bir yol bulmaya çalışırken, bu tavsiye etmiyoruz ve oldukça yukarıda kanca uygulanması ile gitmek istiyorum söyledi.

Lütfen sıralama mantığı bağlı olarak, sorgu içine doğrudan sıralama uygulamak için () hook_views_query_alter kullanarak çalışıyor olabilirsiniz.

Bu olsa biraz zor olabilir, views_query nesne ile kendinizi tanımak için olabilir.

Burada ayrıca sıralama kuralları ekledi sonra, sayfanın bağlamına dayalı bir birleşim kuralı uygulanan gerçek bir dünya örneğidir.

/** 
 * Implementation of hook_views_query_alter(). 
 */ 
function yourmodule_views_query_alter(&$view, &$query) { 
  if ($view->name == 'view_projects' && $view->current_display == 'panel_pane_4') { 
    if (arg(0) == 'node' && is_numeric(arg(1))) { 
      $node = node_load(arg(1)); 
      if ($client_nid = $node->field_ref_client[0]['nid']) { 
        $query->table_queue['node_node_data_field_ref_client']['join']->extra = "field_ref_client_nid = " . $client_nid;
        $query->add_orderby('node', NULL, 'DESC', 'node_node_data_field_ref_client_nid'); 
        $query->add_orderby('node', 'created', 'DESC'); 
      } 
    }
  } 
}

Bkz: http://drupalcontrib.org/api/function/hook_views_query_alter/6