Eine typische Anforderung bei einer Liste von z.B. ungelesenen Artikeln ist die Möglichkeit, diese per Checkbox und Knopfdruck auf gelesen zu setzen.

In Drupal kann für solche Massenaktionen über Views das Views Bulk Operations Module (VBO) genutzt werden. Der Haken hierbei war leider, dass es für „set to read“ keine Action gab. Diese musste daher selbst programmiert werden. Das geschah ausgehend vom Node-Module im Core und mit einem Blick auf Advanced Forum, in dem es eine analoge Funktion für ganze Foren gibt.

„Set to read“ bedeutet effektiv, dass der Timestamp-Eintrag in der Tabelle „history“ für diese nid und uid geändert wird. Dies würde mit einem Replace gehen, aber da beide andere Codestellen mit Delete/Insert arbeiten, habe ich es analog implementiert.

Der gesamte Integrationspfad ins Drupal-Projekt ist:

  1. Ein set-to-read Module anlegen und in der Modules-Liste unter admin/build/modules aktivieren.
  2. Unter admin/settings/actions/manage prüfen, ob das Module aktiv und die Node-Action „Set to read“ verfügbar ist.
  3. Ein Seite mit einem „Bulk Operations“ View bauen, und als Action „Set to read“ auswählen. Bei sofortigem Abarbeiten sieht der User wenig Effekt, bei der Batch API erscheint der blaue Fortschritsbalken (meiner Meinung nach weniger schön). Auf eine Sicherheitsabfrage und eine Rückmeldung habe ich in meinem Projekt verzichtet, da es sich um keinen kritischen Schritt wie z.B. Löschen handelt.
  4. Dann den View speichern und im Projekt prüfen.

Code für set_to_read.module-Datei (Achtung, beim Insert gibt es zwei unschöne Zeilenumbrüche):

<?php
/**
* Implementation of hook_action_info().
*/
function set_to_read_action_info() {
return array('set_to_read_noderead_action' => array(
'description' => t('Set to read'),
'type' => 'node',
'configurable' => FALSE,
'hooks' => array(
'nodeapi' => array('presave'),
'comment' => array('insert', 'update'), )
)
);
}
/**
* Implementation of the actual function set_to_read_noderead_action()
*/
function set_to_read_noderead_action(&$node) {
global $user;
if ($user->uid) {
$sql = 'delete from {history} ' .
"where nid='" . $node->nid . "' ".
"and uid='" . $user->uid . "'";
db_query($sql);
$sql = 'insert into {history} (nid,uid,timestamp) ' .
"values ('" . $node->nid . "', '" . $user->uid . "', unix_timestamp()) ";
db_query($sql);
}
}
?>

Share

  One Response to “Drupal Action „Set to read“”

  1. Danke ! geht super !
    Hier noch der Inhalt der set_to_read.info-Datei:

    ; $Id: set_to_read.info,v 1.0 2010/07/09 09:11:15 bgrossmann Exp $
    name = set_to_read
    description = Set to Read Action
    core = 6.x
    ; Information added by drupal.org packaging script on 2010-03-03
    version = "6.x-1.0"
    core = "6.x"
    project = "set_to_read"

Sorry, the comment form is closed at this time.

   
© 2012 Doku-Hotline Suffusion theme by Sayontan Sinha