Archive for the ‘PHP’ Category.

endlich: einfache Anführungszeichen in WordPress

Jetzt hab ich mich endlich bequemt, das mal zu googeln. WordPress macht aus einem Anführungszeichen ein anderes Zeichen und damit sämtliche meiner Codeschnipsel unbrauchbar für copy&paste. Das ganze lässt sich folgendermaßen ändern:

1. die functions.php im aktuellen Theme öffnen
2. folgenden Code einfügen:

  1. remove_filter('the_content', 'wptexturize');

Das war's schon. Jetzt kann man meinen Code auch einigermaßen vernünftig kopieren.

Die Anleitung hab ich hier gefunden, Punkt 6 "Using Normal Quotes Instead of Curly Quotes".

Class ‘CakeLog’ not found in…

Aus irgendeinem Grund kriegte ich diese Meldung nach einem Umzug von cakePHP auf einen anderen Server. Die Lösung: in cake\libs\cake_log.php

  1. if (!defined('DISABLE_DEFAULT_ERROR_HANDLING')) {
  2.     set_error_handler(array('CakeLog', 'handleError'));
  3. }

ändern in

  1. if (!defined('DISABLE_DEFAULT_ERROR_HANDLING')) {
  2.     $cakeLog =& CakeLog::getInstance();
  3.     set_error_handler(array(&$cakeLog, 'handleError'));
  4. }

Lösung gefunden auf dieser Seite.

POST variablen bereinigen

Eine kleine Funktion zum Bereinigen von POST variablen. Die Funktion stammt ursprünglich von dieser Seite, ich hab sie für meine Zwecke etwas modifiziert, da ich nicht den gesamten HTML Code rausfiltern konnte.

  1. function sanitize($input) {
  2.     if (is_array($input)) {
  3.         foreach($input as $var=>$val) {
  4.           $output[$var] = sanitize($val);
  5.         }
  6.     }
  7.     else {
  8.         if (get_magic_quotes_gpc()) {
  9.             $input = stripslashes($input);
  10.         }
  11.         $input  = cleanInput($input);
  12.         $output = mysql_real_escape_string($input);
  13.     }
  14.     return $output;
  15. }
  16.  
  17. function cleanInput($input) {
  18.  
  19. $search = array(
  20.     '@<script[^>]*?>.*?</script>@si',   // Strip out javascript
  21.     '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
  22.     '@<![\s\S]>@'         // Strip multi-line comments
  23. );
  24.  
  25.     $output = preg_replace($search, "", $input);
  26.  
  27.     //entferne nun die html tags
  28.     $output = strip_tags($output, '<p><b><br><strike><div><blockquote><sub><sup><ol><ul><li><font>');
  29.     return $output;
  30. }
  31.  

Zusammengesetzte Variablen in Smarty

Die Ausgangslage: Ich habe ein Produkt, dem in der Datenbank eine Statusvariable zugewiesen wird (0=normal, 1=abgelaufen, 2=ausverkauft, usw). Beim Ansehen des Produkts möchte ich jetzt den entsprechenden Text ausgeben über den Status des Produkts. Da meine Seite mehrsprachig ist, sind meine Texte alle in einem großen $trans Array gespeichert. Heißt, wenn ich den jeweiligen Status ausgeben will, muss ich

  1. {if $product.status == 0}
  2.   {$trans.statusmeldung0}
  3. {elseif $product.status == 1}
  4.   {$trans.statusmeldung1}
  5. {elseif $product.status == 2}
  6.   {$trans.statusmeldung2}
  7. {elseif $product.status == 3}
  8.   {$trans.statusmeldung3}
  9. {/if}

schreiben. Da noch nicht feststeht, ob nicht weitere Zustände für den Status hinzukommen, hab ich mir in den Kopf gesetzt, das mit zusammengesetzten Variablen zu machen. Und siehe da, im Gegensatz zu Typo3 und seiner stinkenden Community wurde ich binnen kürzester Zeit fündig und gebe meine Statusmeldung jetzt so aus:

  1. {assign var=thestatus value="statusmeldung%s"|sprintf:$product.status}
  2. {$trans.$thestatus}

eigene Smarty Funktion und Umlaute

Sehr interessant. Um Titel URL-tauglich zu machen, habe ich eine Funktion geschrieben, die mir einen Titel in eine URL umwandelt. Weil ich die Funktion gerne gleich direkt im HTML nutzen wollte, hab ich mir die Funktion dann im Smarty registriert. Das ganze sah so aus:

  1. function cleanName($txt) {
  2.   $umlaute = Array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß");
  3.   $umlauts = Array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss");  
  4.  
  5.   //string in kleinbuchstaben umwandeln
  6.   $txt = strtolower($txt);
  7.  
  8.   //umlaute umwandeln z.b. ä => ae, ö => oe
  9.   $txt = str_replace($umlaute, $umlauts, $txt);
  10.  
  11.   //sonstige sonderzeichen durch underscore ersetzen
  12.   $txt = preg_replace( '|[^a-zA-Z0-9]|s', '_', $txt );
  13.  
  14.   //leerzeichen durch underscore ersetzen
  15.   $txt = str_replace(" ", "_", $txt);
  16.   return $txt;
  17. }
  18.  
  19. $smarty->register_modifier('productCleanName', 'cleanName');

Das ganze funktionierte grundsätzlich auch gut, nur stellte ich nach einer Weile fest, dass Umlaute nicht wie geplant durch ae, oe, ue ersetzt wurden, sondern als Sonderzeichen gewertet und durch underscore ersetzt wurden. Wenn $var = "Statistik für Anfänger" dann ergibt

{$var|productCleanName}

komischerweise

statistik_f__r_anf__nger

Ich hab ne ganze Weile gebraucht, um zu begreifen, woran das liegt und eigentlich hab ichs auch nur durch Zufall entdeckt. Ich suchte nach Umlautproblemen in Smarty Funktionen und stieß dabei auf allgemeine Umlautprobleme mit strtolower. Und siehe da, als ich strtolower auskommentierte, funktionierte das Umlaut Ersetzen plötzlich einwandfrei.

Jetzt habe ich meine Funktion etwas umgestellt und plötzlich funktionierts:

  1. function cleanName($txt) {
  2.   $umlaute = Array("ä", "ö", "ü", "Ä", "Ö", "Ü", "ß");
  3.   $umlauts = Array("ae", "oe", "ue", "Ae", "Oe", "Ue", "ss");  
  4.  
  5.   //umlaute umwandeln z.b. ä => ae, ö => oe
  6.   $txt = str_replace($umlaute, $umlauts, $txt);
  7.  
  8.   //string in kleinbuchstaben umwandeln
  9.   $txt = strtolower($txt);
  10.  
  11.   //sonstige sonderzeichen durch underscore ersetzen
  12.   $txt = preg_replace( '|[^a-zA-Z0-9]|s', '_', $txt );
  13.  
  14.   //leerzeichen durch underscore ersetzen
  15.   $txt = str_replace(" ", "_", $txt);
  16.   return $txt;
  17. }
  18.  
  19. $smarty->register_modifier('productCleanName', 'cleanName');


Nachtrag:

Inzwischen kenne ich noch eine andere Lösung. Danke an meinen Lieblingsleser für den Hinweis. strtolower ist generell wohl nicht geeignet, mit Umlauten umzugehen. Deshalb sollte man statt strtolower besser folgendes verwenden:

  1.  //string in kleinbuchstaben umwandeln
  2.   $txt = mb_strtolower($txt, "UTF-8");

fonts für fpdf

Ums mir mal zu notieren, wie man für fpdf seine Fonts umwandelt...

Dieses Turotial erklärts ausführlich und gut.

php mail und Umlaute in fromName

Ich hasse Umlaute. Wann immer ich ein MailScript schreibe, kann ich sicher sein, dass früher oder psäter Umlautprobleme auftauchen. Ich. Hasse. Es.

Jedenfalls wollte ich heut mein Script dazu bringen, dass auch Umlaute im Absendernamen in Outlook richtig dargestellt sind. Knappe 3 Stunden hats gedauert, dann hatte ich eine Lösung gefunden, von der ich fast sicher bin, dass es nicht die eleganteste ist, allein schon weil ich von phpmailer Abstand nehmen musste. Aber hier ist sie:

  1. $From = ($_POST['vorname']." ".$_POST['nachname']." <".$_POST['email'].">");
  2. $Subject = "Gewinnspiel Teilnahme";
  3. $header = "MIME-Version: 1.0\r\n";
  4. $header .= "From: =?ISO-8895-15?Q?".imap_8bit($From)." <".$_POST['email']."> ?=\r\n";
  5. $header .= "Subject: =?ISO-8859-15?Q?".imap_8bit($Subject)."?=\r\n";
  6. $to = "chi@ccc.at";
  7. $text = utf8_decode(str_replace("<br>", "\n", $text));
  8. mail($to,$Subject, $text, $header);

Typoscript: PHP Funktion einbinden

Ich bin gut in PHP und schlecht in Typoscript. Logisch, dass ich jede Möglichkeit nutze, schnödes PHP einzubinden. Allerdings ist die Doku dermaßen spärlich, dass ich bisher keine Möglichkeit gefunden habe, PHP einzubinden. Bis heute. Und deshalb binde ich das im Setup so ein:

  1. includeLibs.lang_redirect = fileadmin/php/redirect.php
  2. [globalVar = GP:loc=1]
  3.         page.100= USER
  4.         page.100.userFunc = user_301redirect->user_main
  5. [global]

und die PHP Datei sieht so aus:

  1. class user_301redirect {
  2.   function user_main(){
  3.     header("Location:index.php?id=98&amp;Fsize=".$_GET['Fsize']);
  4.   }
  5. }

Alle Sonderzeichen entfernen

Simpel, aber ich muss es mir notieren...
So entferne ich alle Sonderzeichen aus einem String:

  1. $txt= preg_replace("/[^a-zA-Z0-9_]/" , "" , $txt);

einen Text kürzen, ohne mitten im Wort abzubrechen

Wie man eine Zeichenkette kürzt, ist denke ich hinlänglich bekannt. Möchte man aber einen Text kürzen, ohne mitten im Wort abzubrechen, dann hilft substr alleine nicht mehr weiter. Deshalb hab ich mir eine Funktion geschrieben, mit der ich meine Texte bequem kürzen kann:

  1. /**
  2.  * einen Text kürzen
  3.  * @param string $txt der zu kürzende Text
  4.  * @param int $length Anzahl der maximalen Zeichen
  5.  * @param boolean $dots Soll bei Kürzung am Ende ein "..." angehängt werden?
  6.  */
  7. function getShortText($txt,$length, $dots = true){
  8.  
  9.  //html tags entfernen.
  10.  $txt = preg_replace("/(<\/?)(\w+)([^>]*>)/e","",$txt);  
  11.  
  12.  //wordwrap.
  13.  $trenner = "~|~";
  14.  $tmp = explode($trenner,wordwrap($txt,$length,$trenner));
  15.  $str = $tmp[0];
  16.  
  17.  //für den Fall eines komplett geistesgestörten Eintrags ohne Leerzeichen...
  18.  if(strlen($str) > $length)
  19.    $str = substr($txt,0,$length);
  20.  
  21.  //wurde der Text tatsächlich verkürzt oder nicht?
  22.  if(strlen($str) < strlen($txt)){
  23.    if($dots)
  24.      $str.="...";
  25.  }
  26.  return $str;
  27. }

Das vorherige Entfernen von HTML tags brauchte ich für meine Funktion, da nicht gewährleistet war, dass im Text keine HTML tags vorkommen. Und mitten in einem Tag zu unterbrechen oder Text ohne schließende tags in eine Seite einzufügen war mir definitiv zu unsauber und zu riskant. Deshalb werden zuerst alle tags entfernt.