Archive for the ‘PHP’ Category

Mit Imagemagick eine Maske über ein Bild legen und daraus eine Transparenz generieren

10. September 2014

Es geht ungefähr darum:

Ich habe ein Bild mit den Abmessungen 500×500. Aus diesem soll nun ein 200×200 Bild generiert werden, wo das ursprüngliche Bild kreisrund ausgeschnitten ist und alles außerhalb des Kreises transparent ist. Das ist mit Imagemagick glücklicherweise sehr einfach:

  1. //the base 500x500 image
  2. $baseImage = 'img/base.jpg';
  3. //the mask image, where the circle is transparent and everything outsite is black
  4. $maskImage = 'img/kreis.png';
  5. //step1: resize the base image to 200x200
  6. $minFile = $path.'tmp/'.uniqid("tmp_").'.png';
  7. $cmd = sprintf('convert %s -resize 200x200^ %s', $baseImage, $baseImage);
  8. exec($cmd);
  9. //step2: create a new temporary image in /tmp/ folder
  10. $temp = 'tmp/' . uniqid("tmp_") . '.png' ;
  11. touch( $temp );
  12. //step3: place the mask over it
  13. $cmd = sprintf( "convert %s %s -alpha off -compose CopyOpacity -composite %s", $baseImage, $maskImage, $temp );
  14. exec( $cmd );

Und das wars.

Wetterdaten via google

02. März 2012

Ich brauchte Wetterdaten auf einer WordPress Seite und alle vorhandenen Plugins waren nicht flexibel genug für meine Bedürfnisse. Dann entdeckte ich googles praktische Wetter API, die genau das ist was ich brauchte, aber leider offiziell anscheinend gar nicht dokumentiert ist. Glücklicherweise stieß ich auf die Seite Web-Spirit, wo das ganze extrem gut erklärt ist! Ein kleines Hindernis gab es: das Aufrufen der Funktion mit einer österreichischen Postleitzahl hat so nicht geklappt, das ganze muss man etwas anderes machen:

  1. $wetter =website_wetter("", "Austria", "de", "Linz");

Und es klappt einwandfrei! Google stellt großzügigerweise sogar die Icons bereit, und auch hier nochmal ein herzliches Danke an Web-Spirit, die diese Icons in einer Übersicht bereitstellen.

endlich: einfache Anführungszeichen in WordPress

30. November 2010

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…

09. November 2010

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

03. August 2010

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. function cleanInput($input) {
  17. $search = array(
  18. '@<script[^>]*?>.*?</script>@si', // Strip out javascript
  19. '@<style[^>]*?>.*?</style>@siU', // Strip style tags properly
  20. '@<![\s\S]>@' // Strip multi-line comments
  21. );
  22. $output = preg_replace($search, "", $input);
  23. //entferne nun die html tags
  24. $output = strip_tags($output, '<p><b><br><strike><div><blockquote><sub><sup><ol><ul><li><font>');
  25. return $output;
  26. }

Zusammengesetzte Variablen in Smarty

09. Juli 2010

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

08. Juli 2010

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. //string in kleinbuchstaben umwandeln
  5. $txt = strtolower($txt);
  6. //umlaute umwandeln z.b. ä => ae, ö => oe
  7. $txt = str_replace($umlaute, $umlauts, $txt);
  8. //sonstige sonderzeichen durch underscore ersetzen
  9. $txt = preg_replace( '|[^a-zA-Z0-9]|s', '_', $txt );
  10. //leerzeichen durch underscore ersetzen
  11. $txt = str_replace(" ", "_", $txt);
  12. return $txt;
  13. }
  14. $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. //umlaute umwandeln z.b. ä => ae, ö => oe
  5. $txt = str_replace($umlaute, $umlauts, $txt);
  6. //string in kleinbuchstaben umwandeln
  7. $txt = strtolower($txt);
  8. //sonstige sonderzeichen durch underscore ersetzen
  9. $txt = preg_replace( '|[^a-zA-Z0-9]|s', '_', $txt );
  10. //leerzeichen durch underscore ersetzen
  11. $txt = str_replace(" ", "_", $txt);
  12. return $txt;
  13. }
  14. $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

01. Juli 2010

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

25. März 2010

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

10. März 2010

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&Fsize=".$_GET['Fsize']);
  4. }
  5. }