snippets
-
PHP: mysql2epub, mit PHP ePub on the fly erstellen
Verfasst von jan am Di, 01/04/2011 - 13:55Schon lange habe ich ein Buch, welches ich einmal von einer Seite gerippt habe in meiner MYSQL Datenbank abgelegt. Da es nun ein eReader in unserem Haus gibt, wollte ich das Buch wieder zurück konvertieren, damit man es auf dem eReader lesen kann. Doch wie bringt man Inhalt aus einer Datenbank in ein ePub Format? Zu meinem Erstaunen war das ganz einfach. Ein paar Kniffe gibt es aber schon. Deshalb möchte ich nun dieses kleine PHP Programm mit allen Teilen. Es darf selbstverständlich abgeändert und weiterverwendet werden und kann auch als Einstieg in die ePub Programmierung dienen. Informationen und Wissen habe ich von folgender Webseite. Sie ist zwar komplex aber komplett:
http://www.idpf.org/doc_library/epub/OPS_2.0.1_draft.htm
Das ganze PHP Script zum konvertieren von MYSQL nach ePub ist unten im Anhang.
Bei Fragen und Anregungen bitte unten kommentieren, ich freue mich auf ein Feedback!Anhang Größe mysql2epub.zip 7.95 KB -
Drupal: CSS Aggregation im Private Mode
Verfasst von jan am Mo, 12/13/2010 - 15:10Hat man keine Kapazitätsprobleme, kann man mit diesem Kleinen Modul die CSS optimieren, vereinigen und Cachen. Leider ist dies ansonsten in Drupal 6 Core nicht möglich. Ich weiss, der Cache braucht relativ viel Platz in der DB, aber dies ist in meinem Fall kein Problem. Das Modul erstellt für jede Seite, welche eine andere CSS Dateien Konstellation hat, ein eigener Cache-Eintrag. Die Geschwindigkeit zum Laden der Seite ist bei mir extrem gestiegen (> 33%). Anregungen bitte im Kommentar posten!
- // die Folgenden Konstanten anpassen
- function minicss_menu() {
- 'title' => 'minicss css',
- 'page callback' => 'minicss_minify',
- 'access callback' => true,
- 'type' => MENU_CALLBACK,
- );
- return $items;
- }
- /**
- * Implementation of hook_preprocess_page()
- */
- function minicss_preprocess_page(&$variables) {
- $variables['styles'] = '<link type="text/css" '.
- 'rel="stylesheet" media="all" '.
- 'href="/minicss/css/'.
- }
- }
- function minicss_minify($files,$type) {
- // The Checksum identifies the unique css-File-Package
- // Recive Cached CSS-Package
- $cache = cache_get('minicss_'.$checksum);
- // If Package does not exist, create it and output
- if (!$cache) {
- $output = '';
- foreach ($files as $file) {
- // remove comments
- //$content = str_replace("\t", ' ', $content); // Removing Tabs somehow creates problems...
- // Remove special chars
- // urls sind relativ zum CSS file und müssen dementsprechend relativ zum miniCSS angepasst werden
- $output .= $content;
- }
- // Write new created Package into Cache for next time
- if (MINICSSCACHE) cache_set('minicss_'.$checksum,$output);
- print $output;
- }
- else {
- // If Cache-package already exists, output cache, also add Information about version
- $output = '/* Retrieved from Cache; Version: '.date('Y.m.d H:i',$cache->created).' */'."\n\n".$cache->data;
- print($output);
- }
- }
Evtl. muss man in der Datenbank Tabelle "System" das Modul-weight noch an den Schluss setzen.
-
Subdomain weiterleiten mit Conf bzw. htaccess
Verfasst von jan am Fr, 11/19/2010 - 17:23Weiterleitung einer Subdomain auf die Hauptdomain kann man direkt über das conf-File bzw über eine .htaccess Datei. Das geht folgendermassen:
# Allen Traffic der supbdomain www.example.com und xyz.example.com weiterleiten nach example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^xyz\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301]Kann man vor allem brauchen, wenn man zwar verschiedene Subdomain anbieten möchte, jedoch nur eine Domain "promoten" möchte. Bei uns war es so, dass wir früher die Drupal Seite über eine Subdomain erreichten, jetzt direkt über die Domain. Die Leute sollen immer noch über die Subdomain draufkommen. Eine Zeit lang benutzten wir einfach einen ServerAlias. Die birgt jedoch gefahren, zB wenn man auf der Seite absolute Verweise hat. So werden nun per sofort alle Subdomain anfragen weitergeleitet.
subdomain2domain, www2domain, www2root
-
Drupal: vCard Export
Verfasst von jan am Mi, 10/06/2010 - 21:26Ich weiss, es gäbe ein Modul um Drupal Kontakte als vCard zu exportieren. Für diese einfache Aufgabe war mir dieses aber einfach viel zu schwerlastig. Also habe ich wieder einmal selber Hand angelegt und der Grössenunterschied des Modules ist beachtlich (ca 1:100!), ist nicht auf die Externe PEAR Lib angewiesen und kann mit Umlauten umgehen. vCard mit Umlauten war unter anderem der Grund, wie ich überhaupt dazu kam, es selber zu machen. Hier mein mini-Modul:
- function uvcard_menu() {
- 'title' => t('vcard'),
- 'type' => MENU_CALLBACK,
- 'page callback' => 'uvcard_fetch',
- );
- return $items;
- }
- /**
- * VCard for direct download
- */
- function uvcard_fetch($uid) {
- $dev = false;
- $eol = "\r\n";
- $vcard = 'BEGIN:VCARD'.$eol.'VERSION:2.1'.$eol;
- $vcard .= 'N:'.$u->profile_nachname.';'.$u->profile_vorname.';;;'.$eol;
- $vcard .= 'FN;CHARSET=ISO-8859-8:'.$u->profile_vorname.' '.$u->profile_nachname.$eol;
- $vcard .= 'TEL;PREF;WORK;VOICE;:'.$u->profile_telefon.$eol;
- $vcard .= 'TEL;WORK;CELL;:'.$u->profile_telefon.$eol;
- $vcard .= 'TEL;WORK;FAX;:'.$u->profile_fax.$eol;
- $vcard .= 'EMAIL;INTERNET:'.$u->mail.$eol;
- $vcard .= 'ADR;DOM;WORK:;;'.$u->profile_strasse.';'.$u->profile_ort.';;'.$u->profile_plz.';'.$eol;
- $vcard .= 'END:VCARD';
- // Set headers
- print $vcard;
- exit;
- }
Wenn man die Variable $def nach true umstellt, bekommt man die erzeugte vCard ausgeprintet und zusätzlich das gesamte Benutzerprofil, dmait man sich die oberen Zeilen gemäss seinen eigenen Wünschen anpassen kann.
Die vCard Spezifikationen habe ich mir von http://en.wikipedia.org/wiki/VCard geholt.
Um die Seite aufzurufen, muss man dann nur noch irgendwo ein Link darauf machen (zB in einer View-Spalte). -
Drupal: fid2nid, nid von fid
Verfasst von jan am Mo, 09/13/2010 - 13:25Für ein Modul musste ich aus einer fid die zugehörige nid herausfinden. Bis anhin habe ich noch keine Funktion in der API gefunden, welche dies erledigt. Hier mein Vorschlag:
- /**
- * Get's the $nid from a File of a CCK File-Field $fid
- */
- function fid2nid($fid) {
- // Get all the CCK-File-Fields
- $sql = "SELECT field_name FROM {content_node_field} WHERE type LIKE 'filefield';";
- $result = db_query($sql);
- while ($r = db_fetch_array($result)) {
- $fields[] = $r['field_name'];
- }
- $found = false;
- foreach ($fields as $field) {
- // Checks if the table exists
- $sql = "SHOW TABLES LIKE 'content_".$field."'";
- $result = db_query($sql);
- $i = false;
- while ($r = db_fetch_array($result)) { $i = true; }
- // If it does, see if fid is in this table
- if ($i) {
- $sql = "SELECT content_".$field.".nid FROM files
- LEFT JOIN content_".$field."
- ON (files.fid = content_".$field.".".$field."_fid)
- WHERE ".$field."_fid = '%d'";
- $result = db_query($sql, $fid);
- while ($r = db_fetch_array($result)) {
- $nid = $r['nid'];
- }
- }
- }
- return $nid;
- }
-
Drupal: Files Ordner verschieben
Verfasst von jan am Fr, 05/28/2010 - 15:20Um den Files Ordner zu verschieben (in meinem Fall im Private Mode), geht man folgendermassen vor:
- per FTP oder shell die Daten an den neuen Ort verschieben
- shell: mv <pfad>/files <neuer pfad>/files
- per FTP sicherstellen das .htaccess Datei mitgneommen wird
- Folgender MYSQL Befehl ausführen (zB in mysqladmin)
- update files set filepath = replace(filepath,'<alter Pfad>','<neuer Pfad>');
- Nach admin/settings/file-system gehen
- neuer Pfad angeben
- Fertig
Achtung: <...> ersetzen durch eigene Werte!
- per FTP oder shell die Daten an den neuen Ort verschieben
-
PHP: Dateien und Ordner rekursive Umbenennen
Verfasst von jan am Fr, 05/21/2010 - 21:36Ein altbekanntes Problem der deutschen Sprache im Zusammenhang mit Linux-Dateinamen: Ich habe von meinem Windows System Dateien per FTP hochgeladen und die eingekaufte PHP Anwendung kann nicht richtig mit den Umlauten im Dateinamen umgehen (oder anderen Sonderzeichen, welche Windows im Dateinamen erlaubt). Also lass ich per PHP Script einen ganzen Verzeichnisbaum rekursive durchgehen und alle Umlaute/Sonderzeichen umwandeln. Das geht mit folgendem Snippet:
<?php
// Directory to scan (Full System Path)
$dir = './';
function cleanName($name)
{
$name = str_replace('ä', 'ae', $name);
$name = str_replace('ö', 'oe', $name);
$name = str_replace('ü', 'ue', $name);
$name = str_replace('Ä', 'Ae', $name);
$name = str_replace('Ö', 'Oe', $name);
$name = str_replace('Ü', 'Ue', $name);
return $name;
}
function getDirectory($path = '.', $ignore = '')
{
$dirTree = array();
$dirTreeTemp = array();
$ignore[] = '.';
$ignore[] = '..';
$dh = @opendir($path);
while (false !== ($file = readdir($dh))) {
if (!in_array($file, $ignore)) {
if (!is_dir("$path/$file")) {
$dirTree["$path"][] = $file;
} else {
$dirTree["$path"] = array();
$dirTreeTemp = getDirectory("$path/$file", $ignore);
if (is_array($dirTreeTemp))
$dirTree = array_merge($dirTree, $dirTreeTemp);
}
}
}
closedir($dh);
return $dirTree;
}
// Get all Files and Folders in an Array
$dirTree = getDirectory($dir, $ignore);
$folders = array();
foreach ($dirTree as $path => $files) {
foreach ($files as $name) {
if (preg_match('/[äöüÄÖÜ]/', $name)) {
echo 'rename(' . $path . '/' . $name . ', ' . cleanName($name) . ');<br></br>';
rename($path . '/' . $name, $path . '/' . cleanName($name));
}
}
$folders[substr_count($path, '/')][] = $path;
}
// Sortiert Ordner nach "Tiefe"
krsort($folders);
// Benennt alle Ordner mit Umlauten um
foreach ($folders as $paths_by_debth) {
foreach ($paths_by_debth as $path) {
$pos = strrpos($path, '/');
$folder = substr($path, $pos);
if (preg_match('/[äöüÄÖÜ]/', $folder)) {
echo 'rename(' . $path . ',' . substr($path, 0, $pos) . cleanName($folder) . ');<br></br>';
rename($path, substr($name, 0, $pos) . cleanName($folder));
}
}
}
?>
<pre>
<?php
// Gibt den ganzen Ordner Baum aus
//print_r($dirTree);
?>
</pre>Das Programm wurde absichtlich ausführlich geschrieben, um die Einzelnen Schritte klar und verständlich darzustellen. Natürlich könnte man das ganze auch abgekürzter schreiben. Die Funktion cleanName kann beliebig erweitert werden. Hier könnte man auch via preg_replace bestimmte Dateinamen nach einem Muster umbenennen.
-
Excel Werte als Bytes und Bites formatieren
Verfasst von jan am Do, 12/03/2009 - 16:45Schon mal versucht in Microsoft Excel Bites in Kilobytes, Megabytes oder Gigabytes umzuwandeln. Hier ist die Formel, um Bites in Bytes umzuwandeln:
=WENN((A1>=POTENZ(2;33));TEXT((A1/POTENZ(2;33));"##0.00\G");WENN((A1>=POTENZ(2;23)); TEXT((A1/POTENZ(2;23));"##0.00\M");WENN((A1>=8192);TEXT((A1/8192);"##0.00\K");TEXT((A1/8);"##0.00\B"))))
Mit dieser Zeile in einer Zelle wird der Wert in der vorderen Spalte (selben Zeile), welcher als Bite-Wert vorliegt, in MB, KB, oder B umgerechnet. "A1" ist die Zelle, welche die anzahl Bites enthält. -
Regular Expressions, nur Buchstaben verwenden inklusive Umlaute
Verfasst von jan am Di, 11/24/2009 - 10:52Deutschsprachige Hilfen für Umlautprobleme sind im Internet immer selten gesät. Hier die Lösung des Problems, wenn man alle Zeichen aus einem String filtern will, welche in deutschen Wörtern nicht vorkommen dürfen:
$filteredword = utf8_encode(preg_replace('/[^a-zA-Z-äöüÄÖÜéàèÉÈ]/i','',$inputstring));Erklärung:
$filteredwordist der gefilterte String ohne unerlaubte Zeichen$inputstringist der String, welcher noch unerlaubte Zeichen enthältutf8_encode: wandelt den gefilterten String in UTF8 um. Dies ist notwendig, wenn man zum Beispiel später den String in einer MYSQL-Datenbank verwenden willmit
preg_replacewerden alle Zeichen, welche dem Suchmuster entsprechen herausgefiltert. In unserem Fall sind das alle Zeichen, welche in den eckigen Klammern stehen.[^a-zA-Z-äöüÄÖÜéàèÉÈ]: [^...] filtert alles raus ausser "..."a-zA-Z: bedeutet alle Buchstaben-: Bindestrich oder Minus sind in der deutschen Wörtern auch erlaubtäöüÄÖÜéàèÉÈ: die spezial-Zeichen. Für uns Schweizer sinds eben noch ein paar mehr. Kann beliebig mit weiteren Zeichen ergänzt werden.mit
'/.../'wird die Reguläre Expression eingegrenzt/ibedeutet: Gross und Kleinschreibung wird nicht berücksitigt; könnte man wahrscheinlich hier auch weglassen