2017-02-05 30 views
0

Я создал пользовательское поле для просмотра с помощью модуля. Чтобы лучше визуализировать здесь, я упростил это: пользовательское поле просто генерирует случайное число от 1 до 10.Пользовательское поле не может быть отсортировано или отфильтровано в представлениях для Drupal 7

Я хочу «Сортировать по» это случайное число. Однако я получаю следующее сообщение об ошибке при использовании этого параметра Фототуров:

SQLSTATE [42S22]: Column не найдено: 1054 Unknown столбца «my_custom_field» в «списке полей»

Я изо всех сил, чтобы найти ошибку в моем коде.

Спасибо за любую помощь, которую вы можете предоставить в моем модульном коде !!

Вот мои файлы:

my_custom_module.info

name = My Custom Module 
description = Implement random number in views. 
core = 7.x 
files[] = includes/views_handler_my_custom_field.inc 

my_custom_module.module

<?php 
/** 
* Implements hook_views_api(). 
*/ 
function my_custom_module_views_api() { 
    return array(
    'api' => 3, 
); 
} 

my_custom_module.views.inc

<?php 
/** 
* Implements hook_views_data(). 
*/ 
function my_custom_module_views_data() { 
    $data['my_custom_module']['table']['group'] = t('My custom module'); 
    $data['my_custom_module']['table']['join'] = array(
    // Exist in all views. 
    '#global' => array(), 
); 

    $data['my_custom_module']['my_custom_field'] = array(
    'title' => t('My custom field'), 
    'help' => t('My custom field displays a random number.'), 
    'field' => array(
     'handler' => 'views_handler_my_custom_field', 
     'click sortable' => TRUE, 
    ), 
    'sort' => array(
     'handler' => 'views_handler_sort', 
    ), 
    'filter' => array(
     'handler' => 'views_handler_filter_numeric', 
    ), 
); 

    return $data; 
} 

views_handler_my_custom_field.inc

<?php 
/** 
* @file 
* Custom views handler definition. 
*/ 

/** 
* Custom handler class. 
* 
* @ingroup views_field_handlers 
*/ 
class views_handler_my_custom_field extends views_handler_field { 
    /** 
    * {@inheritdoc} 
    * 
    * Perform any database or cache data retrieval here. In this example there is 
    * none. 
    */ 
    function query() { 

    } 

    /** 
    * {@inheritdoc} 
    * 
    * Modify any end user views settings here. Debug $options to view the field 
    * settings you can change. 
    */ 
    function option_definition() { 
    $options = parent::option_definition(); 
    return $options; 
    } 

    /** 
    * {@inheritdoc} 
    * 
    * Make changes to the field settings form seen by the end user when adding 
    * your field. 
    */ 
    function options_form(&$form, &$form_state) { 
    parent::options_form($form, $form_state); 
    } 

    /** 
    * Render the random field. 
    */ 
    public function render($values) { 
    $random = rand(1, 10); 
    return $random; 
    } 
} 

ответ

0

Короткий ответ: вы не можете сортировать представление без соответствующего поля базы данных.

Более длинный ответ: hook_views_data() Основная цель - описать таблицу базы данных в представлениях. Вы отображали поле, которое на самом деле не существует в базе данных, используя '#global' => array(), но из-за того, что это конкретное поле не было частью SQL-запроса, вы просто не можете его сортировать. Даже значение случайного числа, которое вы получили в методе views_handler_my_custom_field->render(), было создано после того, как созданные и выполненные SQL-запросы возникли в момент, когда все сортировки уже имели место.

+0

Спасибо, что нашли время ответить! Теперь я лучше понимаю логику. К сожалению, мне приходится менять подход к моей «большей картине», так как этот метод не будет работать. Фактическое настраиваемое поле, которое я создал, является динамическим в соответствии с зарегистрированным пользователем (как с контекстным фильтром). Проблема в том, что мне требуется несколько контекстных фильтров, используя функцию ИЛИ между ними и открытую для пользователя, с которой можно играть. Время найти план B ... – Matt