Drupal Modulentwicklung – Views Integration


Views lässt sich eigentlich extrem einfach in die eigenen Module integrieren. Ich muss zugeben, ich habe ein wenig an der API rumgebastelt, bis ich meine erste View zum laufen gebracht habe, aber wenn man es dann anschaut ist es eigentlich wirklich einfach (auf jeden Fall die Basics und damit kommt man schon weit). Die Infos finden sich ausführlich im Views Handbuch.

Zuerst einmal muss der "hook" von views implementiert werden. Dieser heisst mymodule_views_tables(). Im folgenden Beispiel heisst mein Modul kapitel. Im Modul geht es darum die Permissions für nodes zu erweitern. Standardmässig sind diese auf 0 bzw. 1 für Published und not published. Ich habe jetzt ein Modul geschrieben, welche es ermöglich Statuse von 0-3 zu setzen, für Draft, ready for revision, ready for publishing und published.

Es gibt eine separate Tabelle node_status, welches aus 2 Spalten besteht:

-----------------------------|sid | status_text          |-----------------------------| 0  | draft                || 1  | published            || 2  | ready for revision   || 3  | ready for publishing |-----------------------------

sid bezieht sich auf die Status id, welche sich auch in der node Tabelle wieder finet. So jetzt wollen wir also diese Statuse für Views zugänglich machen. Jetzt folgt das Beispiel für eine einfache Views Integration. Im Kommentar sind die einzelnen Sachen beschrieben.

<!–?php
function kapitel_views_tables() {
$tables["node_status"] = array( //bezieht sich auf die Tabelle, von welcher wir Infos holen wollen
'name' => 'node_status', //in unserem Fall eigentlich überflüssig. Ist einfach nochmals der Name
'join' => array( //Jetzt müssen wir sagen, wie diese Tabelle mit der nodes Tabelle zusammenhängt, passiert mittels join (left joing standardmässig)
'left' => array(
'table' => 'node', //tabelle node
'field' => 'status', //Feld welches für den Join verwendet werden soll
),
'right' => array(
'field' => 'sid', //und dann das Feld aus der Tabelle node_status. Das Feld hier muss mit dem Field aus left übereinstimmen
),
),
'fields' => array( //Jetzt wollen wir ein Feld für die View sichtbar machen.
'status_text' => array( //ist das Feld aus der Tabelle, welche oben spezifiziert wurde, welche wir Sichtbar machen wollen
'name' => t('Node: Status'), //der Name, welcher angezeigt wird im Dropdown bei den Views
'help' => t('Select the status'), //die Hilfe
'sortable' => true, //ob man dieses Feld sortieren kann
),
),
//das wäre eigentlich auch schon das wichtigste gewesen. Jetzt wollen wir aber noch die Möglichkeit geben, daraus einen Filter zu machen:
'filters' => array(
'name' => t('Node: Status'), //der Name welche in dem Dropdown erscheint. Wir befinden uns immer noch in der Tabelle node_status
'field' => 'sid', //Gib das Feld an, welches für den Filter verwendet werden soll. Wenn wir das auf SQL Ebene anschauen, wird hier gesagt, welches Feld in die Where Klausel kommt
'operator' => 'views_handler_operator_andor', //Was für Operatoren. Hier gibt es bereits eine grosse Auswahl an gängigen Operatoren. Hier wird einfach diese Funktion aufgerufen, es kann aber auch ein assoziatives Array verwendet werden, um eigenen Operatoren zu spezifizieren.
'value' => array( //Was für ein Wert. Kann man die FormAPI verwenden
'#type' => 'select',
'#options' => 'views_handler_get_all_status', //hier werden die Valus geholt. Die Funktion welche ich weiter unten reinkopiert habe, wird aufgerufen.
'#multiple' => true,
),
'help' => t('extended status of node.'),
)
);
return $tables;
}
/**

  • get the possible status for a node
    *
  • @return array
    */
    function views_handler_get_all_status(){
    $sql = 'SELECT sid,status_text FROM {node_status}';
    $result = db_query($sql);
    $return = array();
    while ($row = db_fetch_object($result)) {
    $return[$row->sid] = $row->status_text;
    }
    return $return;
    }
    ?>

Das wäre es dann auch bereits gewesen. Mit dem Kommentar sollte es eigentlich recht verständlich sein. Was noch wichtig zu wissen ist, ist bezüglich Testing! Der Drupal Cache ist da ziemlich tricky und kann einem ein wenig verwundern. Ich habe vor jedem neuen Versuch schnell mit dem Devel Modul den Cache geleert, damit ich auch wirklich die neusten Änderungen zu gesicht bekommen habe. Ansonsten klappt das dann nicht.

Update: 26.3.08: Der Kommentar von awesomeg wurde integriert. Sprich, das Return Statement eingefügt… Flüchtigkeitsfehler von meiner Seite.