gn2 Processor für OXID-Shops

Ein kleines Vorweihnachtsgeschenk für alle OXID-Shopbetreiber gn2 Processor:

Turbo-Charge your OXID-eSales

Processor minifies, compresses and hashes any .css and .js files within your OXID-Installation. All resources use ‘forever-caching’ or ‘fingerprinting’ to prevent unnecessary 304 requests (see https://developers.google.com/speed/docs/best-practices/caching?hl=de#gc-content). This speeds up your page quite dramatically.

Everything is automatic. Install into /modules/processor. Activate. Clear your /tmp/ cache. Done.

Download und weitere Informationen: https://bitbucket.org/gn2netwerk/processor/

  • Veröffentlicht in: OXID

TOPIX 8: die (für uns) optimale CRM/ERP-Lösung

TOPIX

Bei Barcamps oder anderen Treffen mit Agenturen und Entwicklern ist eine häufig wiederkehrende Frage, mit welcher Software denn die firmenrelevanten Tätigkeiten wie Faktura, Projektplanung und auch die normale Kommunikation abgewickelt werden. Wenn ich dann regelmässig begeistert von TOPIX berichte, ernte ich meist erstaunte Blicke, weil diese Software in Agenturen eher unbekannt zu sein scheint.
Als nächstes folgt dann fast immer: “schön ist die Software ja nicht” und “das ist aber schon teuer”, wenn ich die Preise für unsere Netzwerkvariante nenne. Damit haben wir gleich zum Anfang die zwei wirklichen Kritikpunkte erledigt, denn beide stimmen. TOPIX ist gerade für verwöhnte Mac-User-Augen kein optisches Highlight und in der Mehrplatzvariante nicht billig, trotzdem kann ich mir heute keine bessere und flexiblere Firmensoftware mehr vorstellen. Wir haben auch im Laufe der Jahre verschiedenste Lösungen getestet, cloudbasierend (OpenSource und kommerzielle Anbieter) und auch lokale Installationen (wobei es da für OS X sowieso nur eine überschabare Anzahl gibt). Alle Versuche hatten ihre ganz spezifischen Nachteile, seien es Bugs in der Software an sich, mangelnde Performance bei Suchabfragen oder fehlende Funktionalitäten, auf die wir zwingend angewiesen sind.

Weiterlesen →

goetz-puppen.de

In Zusammenarbeit mit der Sellando GmbH haben wir die neue Version der Firmenwebseite der GÖTZ Puppenmanufaktur Int. GmbH realisiert. Schwerpunkt war die Übernahme des bestehenden Designs in ein CMS, was bessere Möglichkeiten für Inhaltseinpflege und SEO-Optimierungen bietet. Basis ist wie immer bei uns das CMS REDAXO, technisch wurden spezielle Addons programmiert, so können Produkte aus dem Götz-Shop ausgelesen werden, was doppelte Einpflege bei Änderungen vermeidet. Außerdem gibt es ein Addon zur Händlersuche und einen geschützten Bereich für Fachhändler.

www.goetz-puppen.de

 Puppen aus der Götz Puppenmanufaktur 2013-07-23 16-54-31

 

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