Dokument Node soll beim Aufruf Download auslösen
Bei grösseren Seiten verwenden wir meistens zur Verwaltung von Dokumenten einen eigenen Inhaltstyp, welcher dann als Nodereferenz in andere Inhalte eingebunden wird (z.B. Download-Seite, Artikel, ...). So können einzelne Dokumente auch mehrfach verwendet werden ohne dass die Datei mehrfach in verschiedenen Inhalten hochgeladen werden muss.
Dieser Dokument Inhaltstyp beinhaltet neben dem Titel logischerweise auch ein File-Field für die Datei, sowie weitere Felder wie Taxonomien oder Beschreibungs-Felder.
Nun hatten wir die Anforderung, dass gleich beim Aufruf der Node-URL (z.B. www.seite.ch/dokumente/preisliste) der Download der Datei ausgelöst wird (z.B. www.seite.ch/sites/default/files/dokumente/preisliste.pdf). Dies ist grundsätzlich auch kein Problem und lässt sich auf verschiedene Arten lösen. Was aber wichtig sein kann ist die Tatsache, dass es so nicht mehr möglich ist die Node Ansicht aufzurufen, da diese gleich den Download auslöst. So kann ein Redaktor also nicht mehr über den Tab auf "Bearbeiten" klicken und er muss über die Administration auf die Dokumente zugreifen. Dies ist nicht immer gewünscht und die Redaktoren orientieren sich gerne anhand der Seitenstruktur. Daher haben wir eine zusätzliche Berechtigung eingeführt, mit welcher die Weiterleitung auf das Dokument unterbindet werden kann.
Zuerst registrieren wir die neue Berechtigung:
/**
* Implements hook_permission().
*/
function mymodule_permission() {
return array(
'disable download redirect' => array(
'title' => t('Disable document download redirect'),
'description' =>
t('With this permission the document download redirect,
when open a Document node, is disabled.'),
),
);
}Danach implementieren wir den hook_view um bei der Ausgabe gleich die Datei zurück zu geben:
/**
* Implements hook_node_view().
*/
function mymodule_node_view($node, $view_mode, $langcode) {
// Trigger file downloads for 'document' content types.
// It is possible to set the permission 'disable download redirect'
// that specific roles not redirected.
if ($node->type == 'document'
&& $view_mode == 'full'
&& !user_access('disable download redirect')) {
// Get the file from the field 'field_document'
$files = field_get_items('node', $node, 'field_document');
// Does a file exists, trigger file download.
// NO PERMISSION CHECK FOR PRIVATE FILES IMPLEMENTED YET,
// but document nodes are not private!
if ($files) {
$file = (object) $files[0]; // File as object needed
$headers = file_get_content_headers($file);
file_transfer($file->uri, $headers);
}
}
}Aktuell wird keine Berechtigungsprüfung auf private Dateien gemacht, wie das zum Beispiel in 'file_download()' (file.inc) der Fall ist! Dies lässt sich aber einfach implementieren.



Neueste Kommentare