没有表的自定义视图处理程序


22

乍一看这很容易,但是我为此一头雾水。

我只想添加一个不使用表的自定义视图处理程序。

我尝试按照php提出的观点进行操作,在hook_views_data中使用$ data ['views'] ['mycustomfield'],但是仍然出现“未找到mycustomfield列”。

有什么帮助吗?谢谢 !

Answers:


26

其实很容易。只需查看views.views.inc中可用的Views Global处理程序实现即可

下面是示例,您可以在没有表的情况下添加字段处理程序,

  1. hook_views_data中指定您的自定义处理程序,如下所示,

    /**
     * Implements hook_views_data().
     */
     function my_module_views_data() {
       $data['custom']['table']['group'] = t('Custom');
       $data['custom']['table']['join'] = array(
         // #global is a special flag which let's a table appear all the time.
         '#global' => array(),
       );
    
       $data['custom']['custom_handler'] = array(
         'title' => t('Custom Handler'),
         'help' => t('Custom Handler.'),
         'field' => array(
           'handler' => 'views_handler_custom_handler',
         ),
       );
    
       return $data;
    }
  2. 为您的处理程序创建一个inc文件,然后在其中放置您的逻辑。如下所示,文件名称为views_handler_custom_handler.inc

    /**
     * A handler to provide a field that is completely custom by the administrator.
     *
     * @ingroup views_field_handlers
     */
     class views_handler_custom_handler extends views_handler_field {
       function query() {
         // do nothing -- to override the parent query.
       }
    
       function option_definition() {
         $options = parent::option_definition();
    
         // Override the alter text option to always alter the text.
         $options['alter']['contains']['alter_text'] = array('default' => TRUE);
         return $options;
       }
    
       function options_form(&$form, &$form_state) {
         parent::options_form($form, $form_state);
    
         // Remove the checkbox
         unset($form['alter']['alter_text']);
         unset($form['alter']['text']['#dependency']);
         unset($form['alter']['text']['#process']);
       }
    
       function render($values) {
         // Render your content.
         return 'Sample';
       }
    }
  3. 在模块的信息文件中指定此新处理程序文件

  4. 清除缓存

现在,新的字段处理程序将出现在字段列表中。


1
谢谢 !正是我需要的2件事:通过将查询指定为空来覆盖查询,然后加入“ #global”。
Gregory Kapustin 2013年

有没有办法过滤这些结果?例如,我创建了一个自定义字段处理程序,用于根据用户与实体的关系来计算特殊的“状态”。我希望能够通过该状态进行过滤。有任何想法吗?
tigertrussell 2014年

谢谢,这就是我所需要的!但是似乎我无法为这样的字段处理程序启用视图关系。drupal.stackexchange.com/questions/166734/…有什么想法吗?
donquixote

1

要完整:您还需要添加hook_views_api

function my_module_views_api() {
  return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'my_module'),
  );
}

1
要完成操作:您必须在.info文件文件中包含处理程序[] = views_handler_custom_handler.inc
Fawwad
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.