Version: 1.1
Contenido: 4.6.x
Autor: Stefan Seifarth
Installationsgrad: Fortgeschritten
Modifikationsgrad: Schwer
Szenario:
Sie wollen im WCMS Contenido automatisch Dateien aus einem Ordner im Upload Verzeichnis auf Ihrer Website zum Download anbieten, ohne jede einzelne Datei verlinken zu wollen.
Das können Sie mit diesem Modul. Sie wählen in der Templatekonfiguration das Verzeichnis in Ihrem Upload-Verzeichnis aus, in dem die herunterzuladenden Dateien liegen. Geben Sie darüber hinaus explizit die Dateiendungen der Dateien an, die zum Download angeboten werden sollen (z.B. nur "zip" Dateien). Sie können mehrere Dateitypen einfach durch ein Komma voneinander trennen.
Neu hinzugekommen ist der Dateifilter. Er zeigt nur die Dateien an, die in der Templatekonfiguration in einer Windows-Typische Filter-Schreibweise definiert wurden (z.B. datei?.*, Zeigt alle Dateien die Mit "Datei" beginnen, gefolgt von einem beliebigen Zeichen und einer beliebig langen Dateiendung)
Als erweitertetes Feature steht Ihnen ein Downloadzähler zur Verfügung. Damit dieser korrekt funktioniert muss einem bestimmten Artikel ein leeres Layout mit einem Modul für den Zähler zugewiesen werden. Die Artikel-ID (idart) des soeben angelegten Artikels tragen Sie dann ebenfalls in das Konfigurationsmenü des Templates mit der Download-Liste ein.
Der Artikel für das Herunterladen der Datei muss nur ein mal angelegt werden, auch wenn Sie die Download Liste mehrmals auf Ihrer Website einsetzen!
Wenn in der Templatekonfiguration der Download Liste die Artikel-ID frei lassen, wird der Download der Dateien ohne Zählerfunktion angeboten und direkt auf Ihrem Webserver verlinkt.
Hinweis: Die Verzeichnisauswahl in der Templatekonfiguration sowie die Dateiliste wird automatisch aus der Contenido-eigenen Datenbank generiert, welche Über die Dateiverwaltung (Hauptmenü Content/Dateiverwaltung) gepflegt wird! Wird ein Ordner mit Inhalten nicht korrekt angezeigt, so gehen Sie bitte in der Dateiverwaltung in den entsprechenden Ordner, so dass der Inhalt dieses Ordners automatisch in die Datenbank aufgenommen wird! Sie sollten nie direkt Änderungen per FTP an der Dateiverwaltung vornehmen, da es sonst zu Abweichungen zum tatsächlichen Inhalt des Webservers führt. Das ist kein Fehler vom Modul, das ist die generelle Contenido Arbeitsweise!
Das Modul besteht aus folgenden Teilen, die Sie nachfolgend im Quelltext aufgelistet sehen:
* Modul "Download List" (Beschreibung/Input/Output)
* Modul "Download File" (Beschreibung/Output)
* Template "download_list.html" (gehört ins Verzeichnis cms/templates)
* Template "download_list_counter.html" (gehört ins Verzeichnis cms/templates)
* Layout "Download File" (Achtung! Der Container muss direkt am Anfang des Layouts stehen. Es darf kein weiteres Zeichen (leerzeichen, Zeilenumbruch oder ähnliches) davor stehen!)
Demonstration und Download des kompletten Moduls als Zip
Installationsanleitung
1. 2 Module anlegen/ XML Importieren - so dass wir ein Modul "Download List" und "Download File" haben
2. Das Modul "Download List" in ein bereits bestehendes Template einbinden bzw. ein neues Template für die Liste erzeugen (dieses Modul erzeugt die Liste mit den downzuloadenden Dateien, die später auf der Website zu sehen ist)
3. einem Artikel/Kategorie dieses Template zuweisen (damit man auf der Website auch was sieht)
4. Das neue, leere Layout, nur mit dem Text von Layout "Download File", ohne Leerzechen oder sonstige Zeichen davor oder danach anlegen!
5. Template mit dem Modul "Download File" und diesem Leer-Layout erstellen
6. einen Artikel erstellen, dieses eben erstellte Template zuweisen und die idart notieren
7. Artikel/Kategorie von Punkt 3 konfigurieren und im Feld "Artikel idart für Downloadzähler" die unter Punkt 6 notierte idart angeben.
Fertig.
Die Info "Falsche Parameterübergabe" erscheint immer dann, wenn das Modul "Download File" in ein layout zur Ansicht eingebunden wurde. Dieses Modul wird wie gesagt nur einem absolut leeren Layout zugewiesen, da es für den eigentlichen Download der Datei zuständig ist. Die Darstellung der Dateiliste wird wie der name schon sagt vom Modul "Download List" vorgenommen.
Modul "Download List" Beschreibung:
Code: Alles auswählen
Download List
Generate a List of all downloadable files in a custom "upload"-dir based directory
Autor: Stefan Seifarth <info@polycoder.de>
Version: 1.1
Features:
- set download directory with simple drop down
- count downloads (see module "Download File")
- you can define file extensions which are be visible,
all other files in this directory won't be shown.
- you can use windows wildcard filter for different selection of files
- get specific download information such metaname and description
Important:
Modul use the database entries from the contenido file-management
and don't search physical webspace!
Code: Alles auswählen
?>
<?php
/***********************************************
* CONTENIDO MODUL - INPUT
*
* Modulname : Download List
* Author(s) : Stefan Seifarth <info@polycoder.de>
* Copyright : www.polycoder.de / www.htcm.de
* Created : 2006-01-07
* Modified : 2006-11-06
************************************************/
cInclude ("classes", "class.upload.php");
// get all directories from database
$dllist_collection = new UploadCollection ();
$dllist_collection->select("idclient='".$client."'","dirname","dirname ASC");
$arr_found_dirs = array();
$arr_dirs = array();
while ( $dllist_item = $dllist_collection->next() ) {
$arr_found_dirs[] = $dllist_item->get("dirname");
}
$i = 0;
foreach ($arr_found_dirs as $str_dir) {
$arr_current_dir = explode("/",$str_dir );
array_pop($arr_current_dir);
$depth = count($arr_current_dir);
if ( $depth == 0 ) {
$arr_dirs[$i]["name"] = str_replace("/", "", $cfgClient[$client]["upload"]);
} else {
$arr_dirs[$i]["name"] = $arr_current_dir[$depth-1];
}
$arr_dirs[$i]["depth"] = $depth;
$arr_dirs[$i]["path"] = $str_dir;
$arr_dirs[$i]["indent"] = "";
for ($z = 1; $z <= $depth; $z ++) {
# 3 blanks for every level
$arr_dirs[$i]["indent"] .= " ";
}
$i++;
}
// print out directory selectbox
$str_predefined = trim("CMS_VALUE[110]");
print mi18n("Verzeichnis für Downloads auswählen") . ":\n<br>";
print '<select name="CMS_VAR[110]">' . "\n";
// output of all found directories
foreach ( $arr_dirs as $arr_dir ) {
$str_selected = "";
if ( $str_predefined == $arr_dir["path"] ) $str_selected = ' selected="selected"';
print '<option value="' . $arr_dir["path"] . '"' . $str_selected . '>' . $arr_dir["indent"] . $arr_dir["name"] . '</option>' . "\n";
}
print '</select>' . "\n";
print '<br><br>' . "\n";
// print out fileextensions
print mi18n("sichtbare Dateiendungen<br>(leergelassen = alle Dateien, mehrere Dateitypen durch Komma abtrennen )") . ":\n<br>";
print '<input type="text" name="CMS_VAR[111]" value="CMS_VALUE[111]">' . "<br><br>\n";
// print out fileextensions
print mi18n("Dateifilter<br>(leergelassen = alle Dateien, Filter wie unter Windows nutzen: ?datei*.*, mehrere Filter durch ; abtrennen)") . ":\n<br>";
print '<input type="text" name="CMS_VAR[113]" value="CMS_VALUE[113]">' . "<br><br>\n";
// print out download article
print mi18n("Artikel idart für Downloadzähler<br>(leergelassen = Download ohne Zähler)") . ":\n<br>";
print '<input type="text" name="CMS_VAR[112]" value="CMS_VALUE[112]">' . "\n";
?>
<?php
Code: Alles auswählen
<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname : Download List
* Author(s) : Stefan Seifarth <info@polycoder.de>
* Copyright : www.polycoder.de / www.htcm.de
* Created : 2006-01-07
* Modified : 2006-11-07
************************************************/
cInclude ("classes", "class.upload.php");
cInclude ("classes", "class.properties.php");
cInclude ("classes", "class.htmlelements.php");
cInclude ("includes", "functions.upl.php");
// template defined vars
$dllist_path = "CMS_VALUE[110]";
$dllist_extensions = trim("CMS_VALUE[111]");
$dllist_idart = trim("CMS_VALUE[112]");
$dllist_filenamefilter = trim("CMS_VALUE[113]");
// add filetype condition
$str_where_filetype = "";
if ( strlen ($dllist_extensions) > 0) {
$arr_extensions = explode (",",$dllist_extensions);
$arr_where = array();
foreach ($arr_extensions as $str_extension) {
$arr_where[] = "filetype ='" . trim($str_extension) . "'";
}
$str_where_filetype = ' ( ' . implode( " OR ", $arr_where ) . ' ) AND ';
}
// add filename filter condition
$str_where_filenamefilter = "";
if ( strlen ($dllist_filenamefilter) > 0) {
$arr_filenamefilter = explode(";", $dllist_filenamefilter);
$arr_where = array();
foreach ($arr_filenamefilter as $str_filenamefilter) {
$str_filenamefilter = trim($str_filenamefilter);
// replace special chars for wildcards
$str_filenamefilter = str_replace("%","\%", $str_filenamefilter);
$str_filenamefilter = str_replace("_","\_", $str_filenamefilter);
$str_filenamefilter = str_replace("*","%", $str_filenamefilter);
$str_filenamefilter = str_replace("?","_", $str_filenamefilter);
$arr_where[] = ' filename LIKE "' . mysql_escape_string($str_filenamefilter) . '"';
}
$str_where_filenamefilter = ' ( ' . implode( " OR ", $arr_where ) . ' ) AND ';
}
// get list of all files
$dllist_collection = new UploadCollection ();
$dllist_collection->select($str_where_filenamefilter . $str_where_filetype . " dirname = '" . $dllist_path . "'","","filename ASC");
// initialize needed objects
$obj_file_properties = new PropertyCollection();
$obj_icon = new cHTMLImage();
$obj_description = new cHTMLDIV();
// reset template
$tpl = new Template();
$tpl->reset();
// add head description
$tpl->set("s","HEAD_NAME", mi18n("Dateiname") );
$tpl->set("s","HEAD_FILETYPE", mi18n("Dateityp") );
$tpl->set("s","HEAD_FILESIZE", mi18n("Größe") );
$tpl->set("s","HEAD_COUNTER", mi18n("Downloads") );
// run file list
$image_id = 0;
while ($dllist_item = $dllist_collection->next() ) {
$image_id++;
// icon for file
$obj_icon->setSrc( uplGetFileIcon($dllist_item->get("filename")) );
$obj_icon->setID("dlIco".$image_id);
// file description
$str_file_description = "";
if (strlen($dllist_item->get("description"))> 0) {
$obj_description->setContent($dllist_item->get("description"));
$obj_description->setClass("fileDescription");
$str_file_description = $obj_description->toHTML();
}
// filename
$str_file_name = $dllist_item->get("filename");
$str_file_name_property = $obj_file_properties->getValue("upload", $dllist_item->get("dirname").$dllist_item->get("filename"), "file", "medianame");
if (strlen($str_file_name_property) > 0) {
$str_file_name = $str_file_name_property;
}
// filecounter
$str_file_counter = "0";
$str_file_counter_property = $obj_file_properties->getValue("upload", $dllist_item->get("dirname").$dllist_item->get("filename"), "file", "counter");
if ( strlen ($str_file_counter_property) > 0 ) {
$str_file_counter = $str_file_counter_property;
}
// file url
$str_file_url = $cfgClient[$client]["upl"]["htmlpath"] . $dllist_item->get("dirname") . $dllist_item->get("filename");
if ( isset($dllist_idart) && !empty($dllist_idart) && (int)$dllist_idart > 0 ) {
$str_file_url = $sess->url("front_content.php?idart=" . $dllist_idart . "&changelang=" . $lang . "&client=" . $client . "&sse_idupl=" . $dllist_item->get("idupl") );
}
// fill template
$tpl->set("d", "FILE_ICON", $obj_icon->toHTML() . ' ');
$tpl->set("d", "FILE_NAME", $str_file_name );
$tpl->set("d", "FILE_TYPE", $dllist_item->get("filetype") );
$tpl->set("d", "FILE_SIZE", human_readable_size($dllist_item->get("size")) );
$tpl->set("d", "FILE_COUNTER", $str_file_counter );
$tpl->set("d", "FILE_DESCRIPTION", $str_file_description );
$tpl->set("d", "FILE_URL", $str_file_url );
$tpl->next();
}
// set template
$str_template_name = "download_list.html";
if ( isset($dllist_idart) && !empty($dllist_idart) && (int)$dllist_idart > 0 ) {
$str_template_name = "download_list_counter.html";
}
// print template
print $tpl->generate($cfgClient[$client]["tpl"]["path"] . $str_template_name, 1, 0);
?>
Code: Alles auswählen
Download File
- depends on Module "Download List"
- download a File by using the idupl and increase a download counter
Autor: Stefan Seifarth <info@polycoder.de>
Version: 0.2
Code: Alles auswählen
<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname : Download File
* Author(s) : Stefan Seifarth <info@polycoder.de>
* Copyright : www.polycoder.de / www.htcm.de
* Created : 2006-01-07
************************************************/
cInclude ("classes", "class.upload.php");
cInclude ("classes", "class.properties.php");
// check if download file parameter is given
if ( isset($_REQUEST["sse_idupl"]) && !empty($_REQUEST["sse_idupl"]) && (int)$_REQUEST["sse_idupl"] > 0) {
$int_idupl = (int)$_REQUEST["sse_idupl"];
$obj_file = new UploadItem();
$obj_file->loadByPrimaryKey( $int_idupl );
// get download path
$str_downloadpath = $cfgClient[$client]["upl"]["htmlpath"] . $obj_file->get("dirname") . $obj_file->get("filename");
// increase download counter
$obj_counter = new PropertyCollection();
$int_counter = $obj_counter->getValue( "upload", $obj_file->get("dirname") . $obj_file->get("filename") , "file" , "counter");
(int)$int_counter++;
if ($int_counter == 0) $int_counter = 1;
$obj_counter->setValue("upload", $obj_file->get("dirname") . $obj_file->get("filename"), "file", "counter", $int_counter );
// output file
header("Content-Type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . $obj_file->get("filename"). '"');
header("Content-Transfer-Encoding: binary");
header("Cache-Control: private",true);
header("pragma: no-cache");
header("expires: 0");
readfile($cfgClient[$client]["upl"]["path"] . $obj_file->get("dirname") . $obj_file->get("filename"));
} else {
print '<p>' . mi18n("Falsche Parameterübergabe") . '</p>';
}
?>
Code: Alles auswählen
<!-- download module for contenido 4.6.x - for download visit www.polycoder.de -->
<table border="1">
<thead>
<tr>
<th align="left">{HEAD_NAME}</th>
<th>{HEAD_FILETYPE}</th>
<th>{HEAD_FILESIZE}</th>
</tr>
</thead>
<tbody>
<!-- BEGIN:BLOCK -->
<tr>
<td>{FILE_ICON}<a href="{FILE_URL}">{FILE_NAME}</a>{FILE_DESCRIPTION}</td>
<td>{FILE_TYPE}</td>
<td>{FILE_SIZE}</td>
</tr>
<!-- END:BLOCK -->
</tbody>
<tfoot></tfoot>
</table>
Code: Alles auswählen
<!-- download module for contenido 4.6.x - for download visit www.polycoder.de -->
<table border="1">
<thead>
<tr>
<th align="left">{HEAD_NAME}</th>
<th>{HEAD_FILETYPE}</th>
<th>{HEAD_FILESIZE}</th>
<th>{HEAD_COUNTER}</th>
</tr>
</thead>
<tbody>
<!-- BEGIN:BLOCK -->
<tr>
<td>{FILE_ICON}<a href="{FILE_URL}">{FILE_NAME}</a>{FILE_DESCRIPTION}</td>
<td>{FILE_TYPE}</td>
<td>{FILE_SIZE}</td>
<td>{FILE_COUNTER}</td>
</tr>
<!-- END:BLOCK -->
</tbody>
<tfoot></tfoot>
</table>
Code: Alles auswählen
<container id="1" name="Download File" types="Special" default="Download File" mode="fixed">Download File</container>