Kategorien
Yii Framework

Yii Installation und Hallo Welt

yiiDas Yii Framework für PHP ist zur Zeit das beste Framework für Web Applikationen, wenn man der Meinungen von vielen Freelancern und phpframeworks.com vertraut.

Die Vorteile von Yii

  • einfacher Einstieg: keine neue Templating oder Konfigurationssprache nötig
  • einfache Konfiguration durch Default Werte: die Konfiguration muss nur bei speziellen Aufgaben angepasst werden (convention over configuration)
  • High Perfomance optimiert
  • sehr hohe Code Wiederverwendbarkeit
  • MVC
  • Extensions: unbegrenzte Anzahl von Komponenten, die einfach installiert werden können, wie z.B. eine User-Verwaltung mit Login, Registrierung usw. yii-user extension
  • RESTful und SOAP Web Services
  • DAO, Active Record, Caching, I18N Mehrsprachigkeit

Unterstütze Datenbank Systeme

  • MySQL ab 4.1.
  • PostgresSQL 7.3.
  • SQLite 2 und 3
  • Microsoft SQL Server ab 2000er Version
  • Oracle

Die Installation von Yii

Kategorien
WordPress

WordPress Posts mit Custom Field finden

Mit einem einfach Query lassen sich Posts mit einem bestimmten custom-field suchen und ausgeben. Die Posts werden zusätzlich nach dem Erscheinungsdatum sortiert.

$my_custom_field = 'my_cool_custom_field';

$queryCustomField = new WP_Query(
    array (
        'meta_key' => $my_custom_field,
        'orderby' => 'date',
        'order' => 'DESC',
        'posts_per_page' => 5,
        'post_status' => array( 'publish')
    )
);

while ($queryCustomField->have_posts()) :;
    $queryCustomField->the_post();
    $my_custom_field = get_post_meta($post->ID, $my_custom_field, true);
endwhile;

wp_reset_postdata();
Kategorien
WordPress

WordPress: Kategorien ermitteln mit den meisten Artikeln innerhalb x Tage

Um eine solche Abfrage zu realisieren, braucht es ein wenig MySQL in Verbindung mit WordPress. Mit der Funktion getCategoriesWithMostArticlesInLastDays() kann man die beliebtesten X Kategorien innerhalb der letzten Y Tage bestimmen:

function getCategoriesWithMostArticlesInLastDays($categoriesCount, $lastDaysCount)
{
    global $wpdb;
    $querystr = "
    SELECT $wpdb->terms.name AS categoryName,COUNT($wpdb->terms.term_id) AS countCategory, $wpdb->terms.term_id as categoryId
    FROM $wpdb->posts
        LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
        LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
        LEFT JOIN $wpdb->terms ON ($wpdb->terms.term_id = $wpdb->term_taxonomy.term_id)
    WHERE
        $wpdb->posts.post_status = 'publish'
        AND $wpdb->posts.post_type = 'post'
        AND $wpdb->posts.post_date > TIMESTAMP(DATE_SUB(NOW(), INTERVAL $lastDaysCount DAY ))
        AND $wpdb->term_taxonomy.taxonomy = 'category'
    GROUP BY $wpdb->terms.term_id
    ORDER BY COUNT($wpdb->terms.term_id) DESC
    LIMIT $categoriesCount
";
    $categoriesWithMostArticlesInLastDays = $wpdb->get_results($querystr, ARRAY_A);
    foreach($categoriesWithMostArticlesInLastDays as  $key => $category)
    {
        $categoriesWithMostArticlesInLastDays[$key]["link"] = get_category_link($category['categoryId']);
    }
    return $categoriesWithMostArticlesInLastDays;
}
Kategorien
Server Administration

PHP und MySQL auf Root Server updaten SSH unter Ubuntu

Für einen frisch aufgesetzten Server lohnt es sich die aktuellste Version von MySQL und PHP zu installieren, falls diese noch nicht vorinstalliert sind.

PHP und MySQL updaten

Bestehende PHP Installation kann man mit dem folgenden Befehl finden:

php -v

Bei meinem Server war u.a. zu lesen:

PHP 5.3.2-1ubuntu4.18 with Suhosin-Patch (cli) (built: Sep 12 2012 19:12:47)

Also ist ein Update sinnvoll auf die neuste PHP Version 5.4.12. Dafür gibt es ein praktisches Tutorial, was bei mir ohne Probleme funktioniert hat. Damit wird sowohl MySQL, PHP und Apache auf die neuste Version geupdatet mit ein paar einfach Befehlen.
Dies kann kontrolliert werden durch erneutes php -v

PHP 5.4.12-1~lucid+1 (cli) (built: Feb 25 2013 18:20:00)

Sicherheits Konfiguration

Kategorien
Webdeveloper Tools WordPress

WordPress Tools: Speakreader

Ein interessanter Service für barrierefreie Webseiten: der Speakreader für das automatische Vorlesen einer Seite und als Cloud-Service ohne Aufwand:

  • schnell installiert, WordPress etc. als Plugin downloadbar
  • Cloud basiert
  • Barrierefreiheit +
  • nicht kommerziell: kostenlos,
  • kommerziell auf Anfrage…
Kategorien
WordPress

WordPress Addthis Plugin selber positionieren

Das Addthis Plugin wehrt sich mit Händen und Füßen an sich positionieren zu lassen. Mit einem kleinem Hack funktioniert dies aber auch ohne die Backend Einstellungsmöglichkeiten zu verlieren (siehe Share Box unterhalb des Artikels)

Im Backend stellt man das gewünschte Aussehen und Verhalten ein und aktiviert einen Option, z.B:

Enable the following sharing tool at the Bottom of posts

addthis_backend

Kategorien
WordPress

WordPress related Artikel aus denselben Kategorien

Um bei WordPress die letzten 5 Artikel aller Kategorie eines Artikels (es kann mehrere geben) auszugeben, braucht man den folgenden Code:

function getMyRelatedPosts()
{
    $categories = get_the_category();
    $categoriesArray = array();
    if($categories){
        foreach($categories as $category) {
            $categoriesArray[] = $category->term_id;
        }
    }
    $queryRelatedPosts = new WP_Query(
        array (
            'category__and' => $categoriesArray,
            'orderby' => 'date',
            'order' => 'DESC',
            'posts_per_page' => 5,
            'post_status' => array( 'publish')
        )
    );
    return $queryRelatedPosts;
}
                        $relatedPosts = getMyRelatedPosts();
                            while ( $relatedPosts->have_posts() ) :
                                $relatedPosts->the_post();
                                echo " <a class='relatedPosts' href='".get_permalink()."' title='".the_title_attribute('echo=0')."'>".get_the_title()."</a><br>";
                            endwhile;
                            wp_reset_postdata();
Kategorien
HTML5 JavaScript

HTML5 Datenbank mit persistence.js Tutorial

Mit persistence.js lässt sich eine lokale Datenbank mit Javascript erstellen ohne einen Datenbank-Server und eine Internet Verbindung.

Unterstütze mobile OS von persistence.js:

Kategorien
jQuery

jQuery asynchroner Ajax Call mit Callback Success Funktion

Bei der Programmierung von asynchronen Funktionen mit Ajax steht man vor dem Problem, dass die Funktion keinen Rückgabewert im herkömmlichen Sinne haben. Die folgende Funktion gibt nicht etwa die Variable response zurück, obwohl der Ajax Request erfolgreich ausgeführt wurde aufgrund der Asynchronität.

function test()
 {
 $.ajax({
 async: true,
 cache:false,
 url: "testUrl.php",
 beforeSend: function (jqXHR, settings) {
 url = settings.url;
 console.log(url);
 },
 success: function (response) {
 console.log("Ajax Call Success");
 },
 error: function (response) {
 handleError(response);
 }
 }
 );
 return response;
 }

Um eine das Ergebnis eines asynchronen Calls (Ajax) weiterverarbeiten zu können, kann man entweder eine Funktion aufrufen (schlecht, weil feste Bindung):

Kategorien
jQuery Mobile

Google Analytics und jQuery Mobile

Bei der Benutzung von Google Analytics mit jQuery Mobile gibt es ein paar Besonderheiten zu beachten. So wird nicht jede Seite neu geladen bei jQuery Mobile, sondern der Inhalt (per Ajax) in die bestehende Seite eingefügt und die URL angepasst, so dass der Eindruck einer App entsteht.

Für die Verwendung von Google Analytics mit jQuery Mobile bedeutet dies, dass man am besten manuell die Pageviews zählen sollte:

Man integriert in den <head> Teil der Applikation den Code:

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXXX']);
/* do not track first page here*/
/*_gaq.push(['_trackPageview']);*/

(function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();