Wie kann ich einer Ansicht, die mit anderen Feldern berechnet wird, ein Feld hinzufügen?

7

Wie kann ich einer Ansicht, die mit anderen Feldern berechnet wird, ein neues Feld hinzufügen?

Gibt es eine Möglichkeit native Ansichten dies zu erreichen?


Wenn die ursprüngliche Ansicht die Zeile zurückgibt: X | Y | Z

Und ich habe eine Funktion, die neue Daten berechnet: $new = do_something(X, Y, Z);

Wie kann ich $ new als vierte Spalte einfügen, um Folgendes zu erzielen: X | Y | Z | $new


Ich habe versucht, eine Ansichtsvorlage zu verwenden, um dies zu erreichen, bin aber gespannt, ob es einen besseren Weg gibt, dies mit Ansichten-Hooks oder einem anderen Modul zu tun.

Welche Vorlagen, Hooks oder Module sind dafür am besten geeignet?

Citricguy
quelle

Antworten:

3

Ich denke, das Computed Field-Modul passt gut dazu: http://drupal.org/project/computed_field

Auf diese Weise können Sie Ihrem Inhaltstyp ein Feld für den berechneten Typ hinzufügen. Sie können Berechnungen basierend auf den Werten anderer Felder durchführen.

Wenn Sie das Feld einrichten, müssen Sie es einfach in Ihre Ansicht einfügen, wie Sie es mit x, y und z getan haben.

Ich habe es einmal für ein Preisfeld verwendet, das vom Benutzer in USD angegeben wurde, und als ich ein anderes Feld mit dem in EUR umgerechneten Preis erstellen musste, sah es ungefähr so ​​aus, verwendet von einem benutzerdefinierten Modul:

function computed_field_field_euro_compute(&$entity_field, $entity_type, $entity, $field, $instance, $langcode, $items) {
  $value = $entity->field_price;
  // do some calculations with the value of field_price
  $entity_field[0]['value'] = $value; //return your modified value to your computed field
}

Sie können Ihren Code im Drupal-Administrator in den Einstellungen Ihres Felds eingeben oder wie oben beschrieben in ein benutzerdefiniertes Modul einfügen.

Bálint Deáki
quelle
1
Das berechnete Feld kommt nahe, aber bevor Ansichten auf die Daten zugreifen können, muss es zunächst in der Datenbank gespeichert werden. drupal.org/node/126522 Die in der Funktion do_something () berechneten Werte sind niemals zweimal gleich, was das Vorspeichern zu einer Nichtoption macht. Ich kann jedoch mehrere andere Stellen sehen, an denen dieses Modul verwendet werden kann. Vielen Dank für den Code-Snippit!
Citricguy
6

Sie können Ihren eigenen Ansichtsfeldhandler in einem benutzerdefinierten Modul erstellen. Implementieren Sie hook_views_api und hook_views_data_alter (& $ data), als Sie Ihren eigenen Feldhandler schreiben können.

Nicky Vandevoorde
quelle
1
Als die am höchsten
bewertete
3

Sie können hook_views_datain einem benutzerdefinierten Modul verwenden. Die Implementierung dauert etwas länger, ist jedoch eine sehr modulare Lösung, da Sie ein VIRTUELLES Ansichtsfeld erhalten.

Deklarieren Sie Ansichten API-Version in Ihrer MODULE_NAME.moduleDatei

function MODULE_NAME_views_api($module = NULL, $api = NULL) {
  return array('api' => '3.0');
}

Datei MODULE_NAME.views.incmit Inhalt hinzufügen

function MODULE_NAME_views_data() {
  $data = array();

  $data['node']['virtual_views_field'] = array(
    'title' => t('Virtual views field from X Y Z'),
    'help' => t('Virtual views field from X Y Z fields.'),
    'field' => array(
      'handler' => 'MODULE_NAME_virtual_views_field',
    ),
  );    
  return $data;
}

Datei MODULE_NAME_handlers.incmit Inhalt hinzufügen

class MODULE_NAME_virtual_views_field extends views_handler_field {

  /**
   * Overrides views_handler_field::render().
   */
  function render($values) {
    //uncomment following to see the actual values available
    //need DEVEL module for this
    //dpm($values);

    $X = $values->field_field_X[0]['raw']['value'];
    $Y = $values->field_field_Y[0]['raw']['value'];
    $Z = $values->field_field_Z[0]['raw']['value'];

    //implement your logic here and get result
    $result = $X . " " . $Y . " " . $Z;
    return $result;
  }

  function query() {
    // do not need to override the parent query.
  }
}

Ihre MODULE_NAME.infoDatei sollte ähnlich aussehen

name = Custom Virtual Views Field 
description = takes X Y Z fields to create virtual field
core = 7.x
package = custom
dependencies[] = views
files[] = MODULE_NAME_handlers.inc
core = "7.x"

Aktivieren Sie Ihr Modul (oder bereinigen Sie Ihr Modul, class registrywenn Sie ein vorhandenes / aktiviertes Modul ändern), und Sie sollten in der Lage sein, das aufgerufene virtuelle Feld anzuzeigen / hinzuzufügenVirtual views field from X Y Z

Dies kann verwendet werden und hat die Vorteile aller anderen regulären Ansichtsfelder.

GiorgosK
quelle
2

Ich denke, Ihre beste Option ist die Verwendung des Moduls views_customfield . Auf diese Weise können Sie benutzerdefinierte Felder (einschließlich PHP) für eine Ansicht definieren, ohne dieses Feld an anderer Stelle haben zu müssen (z. B. Inhaltstyp).

Wenn Sie Drupal 7 verwenden, wird dies jetzt als Views PHP bezeichnet, da einige der Funktionen im neueren Views-Modul enthalten sind

Rider_X
quelle
1
Ansichten PHP sieht aus wie es funktionieren könnte. Ich würde es jedoch vorziehen, den PHP-Eingangsfilter zu vermeiden, wenn dies überhaupt möglich ist. Vielen Dank für die von Ihnen aufgelisteten Module. Ich werde sie durchsehen, um zu sehen, wie sie sich in Ansichten eingebunden haben.
Citricguy
2
Ich würde es vermeiden, basierend auf dem "Kleingedruckten" auf der Views PHP-Seite. "Mit diesem Modul können Sie PHP-Innenansichten direkt verwenden, was für schnelle und einfache Lösungen hilfreich sein kann. Es ist jedoch sehr ratsam, normale Handler und Plugins zu verwenden, sofern verfügbar (oder sogar selbst eine zu erstellen)."
sea26.2
1
@ user908998 - Ich bin damit einverstanden, dass PHP in der Datenbank im Allgemeinen keine bewährte Methode ist (das hat mich einmal gebissen). Dies kann jedoch für Modellzwecke oder eine schnelle Bereitstellung nützlich sein. Es ist eine Menge Arbeit, einen neuen Views-Handler zu erstellen, um eine Idee zu testen.
Rider_X