Besserer Pagespeed mit gn2-CDN

CDN sind ein gutes Mittel, um den Pagespeed von Webseiten zu verbessern, deshalb haben wir dafür einen eigenen Server aufgesetzt, der unter http://libraries.gn2-code.de erreichbar ist. Die Skripte werden wie folgt eingebunden:

<script src="//libraries.gn2-code.de/jquery/1.9.1/jquery.min.js"></script>;

Pull Requests & neue Skripte können direkt auf Github https://github.com/gn2netwerk/libraries eingereicht werden.

OXArchive – schnell OXID-Module auf Kompatibilität testen

Wenn man Module schnell auf Kompatibilität zwischen den verschiedenen OXID-Versionen testen will, ist der normale Installationsvorgang einfach zu zeitraubend. Aus diesem Grund haben wir auf Github OXArchive angelegt, in dem sich alle bisherigen Versionen von OXID esales CE befinden. Alle relevanten Beschreibungen befinden sich auf der Projektseite https://github.com/gn2netwerk/OXArchive, Download für die einzelnen Versionen hier https://github.com/gn2netwerk/OXArchive/tree/releases

Skript des Tages: copycats für REDAXO

Aktuell arbeiten wir an der Aktualisierung einer Seite in einem REDAXO-Multidomainprojekt, um konsistente Daten zu garantieren, musste die bestehende Seite in der Installation komplett dupliziert werden, dafür hat Dave heute ein kleines Shellskript programmiert

#!/usr/bin/php
<?php
error_reporting(0);
include 'redaxo/include/master.inc.php';
error_reporting(E_ALL ^E_NOTICE);
ini_set('display_errors', 1);
$CLONE_THIS_ID = 184;
$DUPLICATE_MODULES = true;
function duplicateModule($id) {
    $sql = new rex_sql;
    $sql->setQuery('SELECT * FROM rex_module WHERE name LIKE "__CLONE__'.$id.'__%"');
    if ($sql->getRows() > 0) {
        return $sql->getValue('id');
    } else {
        // DUPLICATE MODULUE
        $sql = new rex_sql;
        $sql->setQuery('SELECT * FROM rex_module WHERE id = '.$id);
        if ($sql->getRows() > 0) {
            $fields = $sql->getFieldNames();
            $iSql = new rex_sql;
            $iSql->setTable('rex_module');
            foreach ($fields as $field) {
                if ($field != 'id' && $field != 'name') {
                    $iSql->setValue($field, mysql_real_escape_string($sql->getValue($field)));
                }
            }
            $iSql->setValue('name', "__CLONE__".$id."__".$sql->getValue('name'));
            $iSql->insert();
            $newId = $iSql->last_insert_id;
            // DUPLICATE ACTIONS
            $sql = new rex_sql;
            $sql->setQuery('SELECT * FROM rex_module_action WHERE module_id = '.$id);
            for($i=0;$i<$sql->getRows();$i++) {
                $iSql = new rex_sql;
                $iSql->setTable('rex_module_action');
                $iSql->setValue('module_id', $newId);
                $iSql->setValue('action_id', $sql->getValue('action_id'));
                $iSql->insert();
            }
            return $newId;
        }
    }
}
$sql = new rex_sql();
$sql->setQuery('
SELECT
  *, (SELECT (id+1) FROM rex_article ORDER BY id DESC LIMIT 1) as max
FROM
  rex_article
WHERE
  (path LIKE "%|'.$CLONE_THIS_ID.'|%" OR id = '.$CLONE_THIS_ID.')
ORDER BY
  path
');
$PROCESSED_ARTICLES = array();
$PROCESSED_SLICES = array();
$maxAdditional = 0;
for ($i=0;$i<$sql->getRows();$i++) {
    $fields = $sql->getFieldnames();
    // DUPLICATE ARTICLES
    $iSql = new rex_sql;
    $iSql->setTable('rex_article');
    $clang = $sql->getValue('clang');
    foreach($fields as $field) {
        if ($field != 'max' && $field != 'pid') {
            $iSql->setValue($field, $sql->getValue($field));
            if (!in_array($sql->getValue('id'), $PROCESSED_ARTICLES[$clang])) {
                $iSql->setValue('id', $sql->getValue('max')+$maxAdditional);
                $newId = $sql->getValue('max')+$maxAdditional;
            } else {
                $iSql->setValue('id', $PROCESSED_ARTICLES['clang'][$sql->getValue('id')]);
                $newId = $PROCESSED_ARTICLES[$clang][$sql->getValue('id')];
            }
        }
        // Fix re_id
        if ($field == "re_id") {
            if (array_key_exists($sql->getValue('re_id'), $PROCESSED_ARTICLES[$clang])) {
                $iSql->setValue('re_id', $PROCESSED_ARTICLES[$clang][$sql->getValue('re_id')]);
            }
        }
        // Fix path
        if ($field == 'path') {
            $path = explode('|',$sql->getValue('path'));
            foreach ($path as $k=>$v) {
                if (array_key_exists($v, $PROCESSED_ARTICLES[$clang])) {
                    $path[$k] = $PROCESSED_ARTICLES[$clang][$v];
                }
            }
            $iSql->setValue('path', implode('|', $path));
        }
        // Rename to 'cloned_'
        if ($sql->getValue('id') == $CLONE_THIS_ID) {
            $iSql->setValue('catname', 'CLONED_'.$sql->getValue('catname'));
        }
    }
    // DUPLICATE ARTICLE SLICES
    $sliceSql = new rex_sql;
    $sliceSql->setQuery('SELECT * FROM rex_article_slice WHERE article_id = '.$sql->getValue('id').' ORDER BY id ASC');
    $sliceIds = array();
    for ($j=0;$j<$sliceSql->getRows();$j++) {
        $sliceISql = new rex_sql;
        $sliceISql->setTable('rex_article_slice');
        $sliceFields = $sliceSql->getFieldnames();
        foreach ($sliceFields as $sliceField) {
            if ($sliceField != 'id') {
                $sliceISql->setValue($sliceField, mysql_real_escape_string($sliceSql->getValue($sliceField)));
                if ($sliceSql->getValue('article_id') == $sql->getValue('id')) {
                    $sliceISql->setValue('article_id', $newId);
                }
            }
        }
        if ($DUPLICATE_MODULES) {
            $sliceISql->setValue('modultyp_id', duplicateModule($sliceSql->getValue('modultyp_id')));
        }
        $sliceISql->insert();
        $newSliceId = $sliceISql->last_insert_id;
        $sliceIds[] = $newSliceId;
        $PROCESSED_SLICES[$clang][$sliceSql->getValue('id')] = $newSliceId;
        $sliceSql->next();
    }
    // UPDATE ARTICLE SLICE RELATIONS
    if (count($sliceIds) > 0) {
        $sliceSql = new rex_sql;
        $sliceSql->setQuery('SELECT * FROM rex_article_slice WHERE id IN ('.implode(',', $sliceIds).')');
        for ($j=0;$j<$sliceSql->getRows();$j++) {        
            if (array_key_exists($sliceSql->getValue('re_article_slice_id'), $PROCESSED_SLICES[$clang])) {
                $sliceUSql = new rex_sql;
                $sliceUSql->setTable('rex_article_slice');
                $sliceUSql->setValue('re_article_slice_id', $PROCESSED_SLICES[$clang][$sliceSql->getValue('re_article_slice_id')]);
                $sliceUSql->wherevar = ' WHERE id = '.$sliceSql->getValue('id');
                $sliceUSql->update();
            }
            $sliceSql->next();
        }
    }
    $maxAdditional++;
    $iSql->insert();
    $PROCESSED_ARTICLES[$clang][$sql->getValue('id')] = $newId;
    $sql->next();
}

 

Das Ganze gibts auch auf Github https://gist.github.com/dajoho/5117053#file-copycats-php

gn2-hosting.de

Die eigenen Projekte dauern ja bekanntlich immer am längsten, aber heute haben wir endlich eine neue Version unserer Hostingseite online gestellt. Wichtig war uns vor allem, Anregungen unserer Kunden zur besseren Benutzerfreundlichkeit umzusetzen, außerdem werden Tarifdaten jetzt per API direkt aus der Hostingverwaltung ausgelesen und auf der Webseite ausgegeben.

www.gn2-hosting.de

gn2-hosting

Veste Immobilien Coburg

Zusammen mit der Werbeagentur Böss und Fahr haben wir die Webseite für die neu firmierte Veste Immobilien GmbH (ehemals Immobilien Reinhardt GmbH) gestaltet und umgesetzt. Als CMS kam natürlich wieder unser Lieblingssystem REDAXO zum Einsatz, außerdem wurde eine Importschnittstelle für die Immobiliensoftware Lagler programmiert, um Miet- und Kaufobjekte direkt auf der Webseite ausgeben zu können. Für Smartphones gibt es eine optimierte Darstellung, die per HEADjs realisiert wurde.

www.veste-immobilien.de

veste-immo