2017-02-05 2 views
0

sortiert oder gefiltert werden Ich habe ein benutzerdefiniertes Feld für eine Ansicht mit einem Modul erstellt. Um es hier besser zu visualisieren, habe ich es vereinfacht: Das benutzerdefinierte Feld generiert einfach eine zufällige Zahl zwischen 1 und 10.Benutzerdefiniertes Feld kann nicht in Ansichten für Drupal 7

Ich möchte diese Zufallszahl "Sortieren nach". Allerdings erhalte ich folgende Fehlermeldung, wenn Sie diese Einstellung in Ansichten mit:

SQLSTATE [42S22]: Column nicht gefunden: 1054 Unknown column 'my_custom_field' in 'field list'

Ich kämpfe um den Fehler zu lokalisieren in meinem Code.

Danke für jede Hilfe, die Sie in meinem Modul-Code zur Verfügung stellen können !!

Hier sind meine Dateien:

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; 
    } 
} 

Antwort

0

Kurze Antwort: Sie können nicht eine Sicht ohne entsprechende Datenbankfeld sortieren.

Ein bisschen längere Antwort: hook_views_data() der Hauptzweck ist es, eine Datenbanktabelle zu Ansichten zu beschreiben. Mit '#global' => array() haben Sie ein Feld angezeigt, das in der Datenbank nicht wirklich existiert, aber da dieses bestimmte Feld nicht Teil der SQL-Abfrage war, können Sie einfach nicht danach sortieren. Sogar der Wert der Zufallszahl, die Sie in der Methode views_handler_my_custom_field->render() erhalten haben, wurde generiert, nachdem die Sichten erzeugt und die SQL-Abfrage ausgeführt wurden, in einem Moment, als die gesamte Sortierung bereits stattgefunden hat.

+0

Danke, dass Sie sich die Zeit genommen haben zu antworten! Ich verstehe jetzt die Logik besser. Leider muss ich den Ansatz meines "größeren Bildes" ändern, da diese Methode nicht funktioniert. Das tatsächliche benutzerdefinierte Feld, das ich erstellt habe, ist gemäß dem angemeldeten Benutzer dynamisch (wie bei einem Kontextfilter). Das Problem ist, dass ich mehrere kontextabhängige Filter benötige, die eine ODER-Funktion zwischen ihnen verwenden und für die der Benutzer mitspielen kann. Zeit Plan B zu finden ... – Matt

Verwandte Themen