snippets

  • PHP: mysql2epub, mit PHP ePub on the fly erstellen

    Schon 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!

    AnhangGröße
    mysql2epub.zip7.95 KB
  • Drupal: CSS Aggregation im Private Mode

    Hat 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!

    1. // die Folgenden Konstanten anpassen
    2. define('MINICSSDPATH', '/var/www/vhosts/yourhost/httpdocs');
    3. define('MINICSSCACHE', true);
    4.  
    5.  
    6. function minicss_menu() {
    7. $items = array();
    8. $items['minicss/css'] = array(
    9. 'title' => 'minicss css',
    10. 'page callback' => 'minicss_minify',
    11. 'page arguments' => array(2,'css'),
    12. 'access callback' => true,
    13. 'type' => MENU_CALLBACK,
    14. );
    15. return $items;
    16. }
    17.  
    18. /**
    19.  * Implementation of hook_preprocess_page()
    20.  */
    21. function minicss_preprocess_page(&$variables) {
    22. if (!empty($variables['styles'])) {
    23. preg_match_all('|href="(.*?\.css)|', $variables['styles'], $matches1);
    24. $variables['styles'] = '<link type="text/css" '.
    25. 'rel="stylesheet" media="all" '.
    26. 'href="/minicss/css/'.
    27. base64_encode(implode(',',$matches1[1])).'" />';
    28. }
    29. }
    30.  
    31. function minicss_minify($files,$type) {
    32. header('Content-Type: text/'.$type);
    33. header('Cache-control: public');
    34.  
    35. // The Checksum identifies the unique css-File-Package
    36. $checksum = md5($files);
    37. // Recive Cached CSS-Package
    38. $cache = cache_get('minicss_'.$checksum);
    39. // If Package does not exist, create it and output
    40. if (!$cache) {
    41. $output = '';
    42. $files = explode(',',base64_decode($files));
    43. foreach ($files as $file) {
    44. $content = file_get_contents(MINICSSDPATH.$file);
    45. // remove comments
    46. $content = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $content);
    47. //$content = str_replace("\t", ' ', $content); // Removing Tabs somehow creates problems...
    48. // Remove special chars
    49. $content = str_replace(array("\r\n", "\r", "\n", ' ', ' ', ' '), '', $content);
    50.  
    51. // urls sind relativ zum CSS file und müssen dementsprechend relativ zum miniCSS angepasst werden
    52. $path = str_replace(array_pop(explode('/',$file)), '', $file);
    53. $content = str_replace('url(', 'url('.$path,$content);
    54. $output .= $content;
    55. }
    56. // Write new created Package into Cache for next time
    57. if (MINICSSCACHE) cache_set('minicss_'.$checksum,$output);
    58. header ("Content-Length: " . strlen($output));
    59. print $output;
    60. }
    61. else {
    62. // If Cache-package already exists, output cache, also add Information about version
    63. $output = '/* Retrieved from Cache; Version: '.date('Y.m.d H:i',$cache->created).' */'."\n\n".$cache->data;
    64. header ("Content-Length: " . strlen($output));
    65. print($output);
    66. }
    67. }

    Evtl. muss man in der Datenbank Tabelle "System" das Modul-weight noch an den Schluss setzen.

  • Subdomain weiterleiten mit Conf bzw. htaccess

    Weiterleitung 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

    Ich 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:

    1. function uvcard_menu() {
    2. $items = array();
    3. $items['user/%/uvcard'] = array(
    4. 'title' => t('vcard'),
    5. 'type' => MENU_CALLBACK,
    6. 'page callback' => 'uvcard_fetch',
    7. 'page arguments' => array(1),
    8. 'access arguments' => array('access content'),
    9. );
    10. return $items;
    11. }
    12.  
    13. /**
    14.  * VCard for direct download
    15.  */
    16. function uvcard_fetch($uid) {
    17. $dev = false;
    18. $eol = "\r\n";
    19. $u = user_load(array('uid' => $uid)); // gesamtes Benutzer-Profil laden
    20. $vcard = 'BEGIN:VCARD'.$eol.'VERSION:2.1'.$eol;
    21. $vcard .= 'N:'.$u->profile_nachname.';'.$u->profile_vorname.';;;'.$eol;
    22. $vcard .= 'FN;CHARSET=ISO-8859-8:'.$u->profile_vorname.' '.$u->profile_nachname.$eol;
    23. $vcard .= 'TEL;PREF;WORK;VOICE;:'.$u->profile_telefon.$eol;
    24. $vcard .= 'TEL;WORK;CELL;:'.$u->profile_telefon.$eol;
    25. $vcard .= 'TEL;WORK;FAX;:'.$u->profile_fax.$eol;
    26. $vcard .= 'EMAIL;INTERNET:'.$u->mail.$eol;
    27. $vcard .= 'ADR;DOM;WORK:;;'.$u->profile_strasse.';'.$u->profile_ort.';;'.$u->profile_plz.';'.$eol;
    28. $vcard .= 'REV'.date("Ymd\THis",$u->access).$eol;
    29. $vcard .= 'END:VCARD';
    30.  
    31. $vcard = utf8_decode($vcard);
    32.  
    33. if ($def) { print $vcard.$eof; print '<pre>'.print_r($u,1).'</pre>'; exit;}
    34. // Set headers
    35. header('Content-type: text/x-vcard');
    36. header('Content-Disposition: attachment; filename="'. $u->name .'.vcf"');
    37. print $vcard;
    38. }

    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

    Fü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:

    1. /**
    2.  * Get's the $nid from a File of a CCK File-Field $fid
    3.  */
    4. function fid2nid($fid) {
    5. // Get all the CCK-File-Fields
    6. $fields = array();
    7. $sql = "SELECT field_name FROM {content_node_field} WHERE type LIKE 'filefield';";
    8. $result = db_query($sql);
    9. while ($r = db_fetch_array($result)) {
    10. $fields[] = $r['field_name'];
    11. }
    12. $found = false;
    13.  
    14. foreach ($fields as $field) {
    15. // Checks if the table exists
    16. $sql = "SHOW TABLES LIKE 'content_".$field."'";
    17. $result = db_query($sql);
    18. $i = false;
    19. while ($r = db_fetch_array($result)) { $i = true; }
    20. // If it does, see if fid is in this table
    21. if ($i) {
    22. $sql = "SELECT content_".$field.".nid FROM files
    23. LEFT JOIN content_".$field."
    24. ON (files.fid = content_".$field.".".$field."_fid)
    25. WHERE ".$field."_fid = '%d'";
    26. $result = db_query($sql, $fid);
    27. while ($r = db_fetch_array($result)) {
    28. $nid = $r['nid'];
    29. }
    30. if (count($nid)) {break;} // if fid is in table, stop while and return nid
    31. }
    32. }
    33. return $nid;
    34.  
    35. }

  • Drupal: Files Ordner verschieben

    Um 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! 

  • PHP: Dateien und Ordner rekursive Umbenennen

    Ein 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($path0$pos) . cleanName($folder) . ');<br></br>';
                  
    rename($pathsubstr($name0$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

    Schon 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

    Deutschsprachige 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:

    $filteredword ist der gefilterte String ohne unerlaubte Zeichen

    $inputstring ist der String, welcher noch unerlaubte Zeichen enthält

    utf8_encode: wandelt den gefilterten String in UTF8 um. Dies ist notwendig, wenn man zum Beispiel später den String in einer  MYSQL-Datenbank verwenden will

    mit preg_replace werden 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

    /i bedeutet: Gross und Kleinschreibung wird nicht berücksitigt; könnte man wahrscheinlich hier auch weglassen

     

Inhalt abgleichen