代码之家  ›  专栏  ›  技术社区  ›  rockstardev

如何使用hook_views_pre_view()更改视图的排序?

  •  2
  • rockstardev  · 技术社区  · 15 年前

    我有以下几点:

    function view_sorter_views_pre_view(&$view) {  // don't need $items
    
       if ($view->name == 'MOST_RECENT') {
    
            $insert = array();
            $insert[order] = 'DESC'; //SORT ORDER
            $insert[id] = 'title';
            $insert[table] = 'node';
            $insert[field] = 'title';
            $insert[override] = array();
            $insert[override][button] = 'Override';
            $insert[relationship] = 'none';
    
            unset ($view->display['default']->display_options['sorts']['title']);
            $view->display['default']->display_options['sorts']['title'] = $insert;
    
       }
    
    } 
    

    基本上,我只是改变排序顺序…但打开视图时它不会出现在视图上。知道为什么吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   draenen    15 年前

    我相信你想要的是

    /**
     * Implementation of hook_views_pre_view().
     */
    function view_sorter_views_pre_view(&$view) {
      if ($view->name == 'MOST_RECENT') {
        $view->display['default']->handler->options['sorts']['title']['order'] = 'DESC';
      }
    }
    

    视图使用handler对象来构建查询,而不是使用display_选项。显示选项包含视图包含的每种显示类型的所有选项(例如默认、第1页、第1块等)。“handler”对象包含将用于实际生成当前显示的选项。

    注意:我简化了代码,只改变了排序顺序。剩下的代码应该可以工作,只需将最后两行改为

    unset($view->display['default']->handler->options['sorts']['title']);
    $view->display['default']->handler->options['sorts']['title'] = $insert;