Ab 15.08.2022 neue Lizenz: nicht mehr kostenlos (CE), sondern min. 111 EU/Monat.
2023: Download der letzten freien Open Source Versionen: https://github.com/proudcommerce/oxid-downloads
Testinstallation, bei der die Namen der CSS-Elemente angezeigt werden
Verwendete Komponenten:
Ansicht aller Module/Elemente im Layout: http://oxid-tpl-debug.stahlwarenhaus-hebsacker.de/azure/
Grafische Hierarchie der Klassen
Tutorials/Understanding OXID eShop Template Hierarchy and Override System
Blog: http://planet.oxidforge.org/
Build an Infinite Scroll List – Implementation
Elemente ausblenden (& Angebote auf Startseite)
Fehler/Exceptions ansehen: Exceptions werden mitgeloggt in: /var/www/webserver/oxid/log/EXCEPTION_LOG.txt
Quelle1):
Diese finden Sie bis Shopversion 4.1.6 im Hauptordner Ihres Shops. In späteren Versionen liegt diese Datei mit dem Namen „EXCEPTION_LOG.txt“ bzw. „oxideshop.log“ im Shop-Unterverzeichnis „log“. Diese Datei erfordert zwingend Schreibrechte.
Fügen Sie vor der Zeile
} catch( oxSystemComponentException $oEx ) { bitte folgenden Absatz ein: } catch (Exception $oEx) { dumpvar($oEx); die();
Der Abschnitt sieht dann wie folgt aus:
try { $this->_process( $sClass, $sFunction ); } catch (Exception $oEx) { dumpvar($oEx); die(); } catch( oxSystemComponentException $oEx ) {
Stellen Sie nach der Fehlersuche unbedingt die Sicherung dieser Datei wieder her!
Nun sollten Sie eine Fehlermeldung sehen, anhand dieser wir das Problem besser einschätzen können.
Tutorials/Getting, updating and storing database data
Quelle2) sehr gut
Ein Model besitzt in der Regel eine dazugehörige Datenbanktabelle. Beispiel die Datenbanktabelle oxarticles wird dem Model /application/models/oxarticle.php zugeordnet.
Zusätzlich gibt es eine Vielzahl von Verknüpfungstabellen. Die Verknüpfungstabellen enthalten meist eine “2” innerhalb ihres Datenbanktabellennamens z.B. oxobject2category.
Datenbank Views werden innerhalb OXID eShops verwendet um z.B. unterschiedliche Sprachen abzubilden.
VIEWs sind Abfragen, die in der Datenbank als Objekt fest gespeichert sind. Sie können als virtuelle Tabellen verstanden werden, deren Inhalt und Struktur auf anderen Tabellen oder Views basieren, und können in (fast) jedem SELECT-Befehl anstelle einer „echten“ Tabelle verwendet werden.
Quelle: Wikibooks – Erstellen von Views
Die Datenverarbeitung läuft über das jeweilige Model der Datenbanktabelle.
Zum Auslesen der Daten instanziiert man die Modelklasse über das OXID Framework und lädt über die OXID den Datensatz in der Datenbanktabelle. Beispiel: Artikel laden
$product = oxNew( 'oxarticle' ); // creating model's object $product->load( 'demoId' ); // loading data
Beispiel: Daten ausgeben
//getting some informations echo $product->oxarticles__oxtitle->value; echo $product->oxarticles__oxshortdesc->value;
Beispiel: Neuen Datensatz speichern
$product = oxNew( 'oxarticle' ); $product->oxarticles__oxtitle = new oxField ( 'productTitle' ); $product->oxarticles__oxshortdesc = new oxField( 'shortdescription' ); $product->save();
Beispiel: Datensatz aktualisieren
$product = oxNew( 'oxarticle' ); $product->load( 'demoId' ); $product->oxarticles__oxtitle = new oxField ( 'productTitle' ); $product->oxarticles__oxshortdesc = new oxField( 'shortdescription' ); $product->save(); $product = oxNew( 'oxarticle' ); $product->setId( 'demoId' ); $product->oxarticles__oxtitle = new oxField ( 'productTitle' ); $product->oxarticles__oxshortdesc = new oxField( 'shortdescription' ); $product->save();
List of Config options
Bestehende Klassen werden durch eigenen überladen (overload).
Tutorial: http://wiki.oxidforge.org/Tutorials
Einführung http://blog.oxid-esales.com/2009/02/how-extend-oxid-eshop-with-modules-part-1/
phpmagazin http://phpmagazin.de/Module-f%C3%BCr-PHP-basierte-E-Commerce-Systeme-schreiben-4487.html
Tutorials/Understanding OXID eShop Template Hierarchy and Override System http://wiki.oxidforge.org/Tutorials/How_template_hierarchy_and_override_system_works
Menupunkte hinzufügen/ändern
Quelle3)
The OXID eShop architecture is based on MVC patterns. To implement models, active record pattern is used. So in general, each model class is linked with a database table. For example, the oxArticle model is linked with the oxarticles table, oxorder with the oxorders table etc. All models are stored in the directory application/models (from OXID eShop v.5.0 and 4.7 on). Let’s take one of them, for example the oxArticle model, and try to fetch the product (with the ID ‘demoId’) data from database.
$product = oxNew( 'oxarticle' ); // creating model's object $product->load( 'demoId' ); // loading data
//getting some informations echo $product->oxarticles__oxtitle->value; echo $product->oxarticles__oxshortdesc->value;
Magic getters are used to get models attributes; they are constructed in this approach:
$model->tablename__columnname->value;
To set data to a model and store it, database magic setters (with the same approach as magic getters) are used:
$product = oxNew( 'oxarticle' ); $product->oxarticles__oxtitle = new oxField ( 'productTitle' ); $product->oxarticles__oxshortdesc = new oxField( 'shortdescription' ); $product->save();
In this example the new record will be inserted into the table. To update an information, we have to load the model, set the new data and call the save()-method:
$product = oxNew( 'oxarticle' ); $product->load( 'demoId' ); $product->oxarticles__oxtitle = new oxField ( 'productTitle' ); $product->oxarticles__oxshortdesc = new oxField( 'shortdescription' ); $product->save();
There are other ways to do the same - without loading the data - just simply setting the ID with the setId()-method:
$product = oxNew( 'oxarticle' ); $product->setId( 'demoId' ); $product->oxarticles__oxtitle = new oxField ( 'productTitle' ); $product->oxarticles__oxshortdesc = new oxField( 'shortdescription' ); $product->save();
In this example, it will be checked if this ID exists and if so, the record in the database will be updated with the new record.
Quelle4)
Oxid Source: Anbei ein Ansatz zum Auslesen von Artikeldetails aus dem Warenkorb…
$basket = oxSession::getInstance()->getBasket(); $oBasket = $basket->getContents(); foreach ( $oBasket as $oBasketItem ) { $oBasketItem->getProductId(); //usw. }
Quelle5)
Oxid Source: Folgendes in invoicepdforder_overview.php unterhalb von createPDF(){…} einfügen.
public function makeValidFileName($sFilename) { $sFilename = preg_replace(‘/[\s]+/’, ‘_’, $sFilename); $sFilename = preg_replace(‘/[^a-zA-Z0-9_\.-äöüÄÜÖß]/’, ”, $sFilename); return str_replace(‘ ‘, ‘_’, $sFilename); }
MySQL: Kundengruppe “Noch nicht bestellt” (ID: ‘oxidnotyetordered’):
SELECT * FROM oxuser WHERE oxid IN (SELECT oxobjectid FROM oxobject2group WHERE oxgroupsid = ‘oxidnotyetordered’)
MySQL: Mit folgendem Befehl können Sie Artikeln einer bestimmten Kategorie nachträglich ein Gewicht hinzufügen:
UPDATE oxarticles SET oxweight = 0 where oxparentid = “” and oxid IN ( SELECT oxobjectid from oxobject2category where oxcatnid = ‘KATEGORIEID‘ )
MySQL:
DELETE FROM oxarticles WHERE oxid IN ( SELECT oxobjectid FROM oxobject2category WHERE oxcatnid = ‘KATEGORIEID‘ )
Smarty:
[{math assign=”ox_ek” equation=”(x-y)” x=$product->oxarticles__oxtprice->value y=$product->oxarticles__oxprice->value }] [{ $ox_ek|number_format:”2″}]
Smarty:
[{assign var=wasauchimmer value=$Price->getBruttoPrice()}] [{php}] $wasauchimmer=& $this->get_template_vars(‘wasauchimmer’); /*jetzt ist die Variable $wasauchimmer in php und kann verarbeitet werden*/ $ergebnis_der_verarbeitung = $xxxxxyyyyyyzzzzz + $wasauchimmer /*jetzt könnte die Variable $ergebnis_der_verarbeitung wieder an Smarty*/ $oSmarty->assign(“ergebnis”, $ergebnis_der_verarbeitung); [{/php}] /*Ergebnis in Smarty ausgeben*/ [{$ergebnis}]
Mit folgendem SQL-Statement kann man Merfachaccounts mit gleichem Nachnamen und PLZ aus der Datenbank auslesen:
SELECT oxuser.oxfname, oxuser.oxlname, oxuser.oxstreet, oxuser.oxstreetnr, oxuser.oxzip, oxuser.oxcity, oxuser.oxboni FROM oxuser, ( SELECT oxlname, oxzip FROM oxuser GROUP BY oxlname, oxzip HAVING COUNT( * ) >1 ) AS doubles WHERE oxuser.oxlname = doubles.oxlname AND oxuser.oxzip = doubles.oxzip ORDER BY oxuser.oxlname, oxuser.oxzip
Quelle6)
Oxid Source: Folgendes in der order_list.php (oxid 4.87) einfügen/ersetzen:
public function render() { parent::render(); $aFolders = $this->getConfig()->getConfigParam( ‚aOrderfolder‘ ); $sFolder = oxConfig::getParameter( „folder“ ); // first display new orders if ( !$sFolder && is_array( $aFolders )) { $aNames = array_keys( $aFolders ); $sFolder = $aNames[-1]; } $aSearch = array( ‚oxorderarticles‘ => ‚ARTID‘, ‚oxpayments‘ => ‚PAYMENT‘); $sSearch = oxConfig::getParameter( „addsearch“ ); $sSearchfld = oxConfig::getParameter( „addsearchfld“ ); $this->_aViewData[„folder“] = $sFolder ? $sFolder : -1; $this->_aViewData[„addsearchfld“] = $sSearchfld ? $sSearchfld : -1; $this->_aViewData[„asearch“] = $aSearch; $this->_aViewData[„addsearch“] = $sSearch; $this->_aViewData[„afolder“] = $aFolders; return „order_list.tpl“; } /** * Adding folder check * * @param array $aWhere SQL condition array * @param string $sqlFull SQL query string * * @return $sQ */ protected function _prepareWhereQuery( $aWhere, $sqlFull ) { $oDb = oxDb::getDb(); $sQ = parent::_prepareWhereQuery( $aWhere, $sqlFull ); $myConfig = $this->getConfig(); $aFolders = $myConfig->getConfigParam( ‚aOrderfolder‘ ); $sFolder = oxConfig::getParameter( ‚folder‘ ); //searchong for empty oxfolder fields if ( $sFolder && $sFolder != ‚-1‘ ) { $sQ .= “ and ( oxorder.oxfolder = „.$oDb->quote( $sFolder ).“ )“; } elseif ( !$sFolder && is_array( $aFolders ) ) { $aFolderNames = array_keys( $aFolders ); //$sQ .= “ and ( oxorder.oxfolder = „.$oDb->quote( $aFolderNames[0] ).“ )“; } return $sQ; }
Quelle7)
Update gemacht? 4.9.7?
Evtl. config.inc.php vergessen?
/** * Captcha encryption key. */ $this->captchaKey = ‚<captchaKey>‘;
Quelle8)
Oxid Source: Folgendes in der order_list.tpl (oxid 4.87) in Zeile 110 einfügen:
<style> .ready{ color:#00CC33; } </style>
Dann unterhalb von:
[{ if $listitem->getId() == $oxid }] [{assign var=“listclass“ value=listitem4 }] [{ /if}]
folgendes einfügen (ca. Zeile 134):
[{assign var=“ready“ value=“ ready“ }] [{ if $listitem->oxorder__oxfolder->value == „ORDERFOLDER_FINISHED“}][{assign var=“listclass“ value=$listclass$ready“ }] [{ /if}]
Ein
cat /var/www/webserver/oxid/log/EXCEPTION_LOG.txt
hilft oft weiter.
Ebenso ein
rm /var/www/webserver/oxid/tmp/* rm /var/www/webserver/oxid/tmp/smarty/*
Problem: Nachdem eine eingerichtete Sprache, die nicht installiert ist (keine Sprachdateien), zeigt der Admin-Bereich nur noch ein 'Array' an. Man kommt nicht mehr rein. Shop an sich funktioniert aber ganz normal.
Lösung: Öffne Datei oxid/core/oxlang.php Ab ca. Zeile 155:
public function getBaseLanguage() { if ($this->_iBaseLanguageId === null) { $myConfig = $this->getConfig(); $blAdmin = $this->isAdmin(); // languages and search engines if ($blAdmin && (($iSeLang = oxRegistry::getConfig()->getRequestParameter('changelang')) !== null)) { $this->_iBaseLanguageId = $iSeLang; } if (is_null($this->_iBaseLanguageId)) { $this->_iBaseLanguageId = oxRegistry::getConfig()->getRequestParameter('lang'); } //or determining by domain $aLanguageUrls = $myConfig->getConfigParam('aLanguageURLs');
Kommeniere eine Zeile aus:
public function getBaseLanguage() { if ($this->_iBaseLanguageId === null) { $myConfig = $this->getConfig(); $blAdmin = $this->isAdmin(); // languages and search engines if ($blAdmin && (($iSeLang = oxRegistry::getConfig()->getRequestParameter('changelang')) !== null)) { //$this->_iBaseLanguageId = $iSeLang; // HIER WEG } if (is_null($this->_iBaseLanguageId)) { $this->_iBaseLanguageId = oxRegistry::getConfig()->getRequestParameter('lang'); } //or determining by domain $aLanguageUrls = $myConfig->getConfigParam('aLanguageURLs');
Jetzt kann man wieder in den Admin-Bereich und die Sprache löschen (statt deaktivieren). Jetzt Kommentar wieder raus. Fertig.
Passiert anscheinend gerne bei der Entwicklung von Modulen: Modulfragmente werden doppelt geparst (also auch angezeigt). Das liegt daran, dass der Einrag in der DB doppelt ist.
Lösung: doppelte Einräge löschen (nur je EINEN Eintrag löschen!).
In Tabelle oxtplblocks nach OXMODULE sortieren und schauen, welche Templates doppelt für den Block geparst werden. Die Doppelten löschen.
In der Tabelle oxconfig & oxconfigdisplay sind die Einstellungen der Module gespeichert. Die kommen auch gerne mal doppelt vor. (oxconfig: nach OXMODULE ordnen)
Nach jeder Änderung müssen die Views geupdated werden. Admin→Service→Tools Dort unten: VIEWS jetzt updaten.
Hat sich wohl erledigt, weil ich die nbnumbers jetzt in pers_params speichere:
ALTER TABLE `oxorderarticles` ADD `nbnumber` VARCHAR( 15 ) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL ALTER TABLE `oxuserbasketitems` ADD `nbnumber` VARCHAR( 15 ) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL
Zum Speichern der Nummern in den Userdaten:
ALTER TABLE `oxuser` ADD `nbnumbers` TEXT NOT NULL , ADD `act_nbnumber` CHAR( 10 ) CHARACTER SET CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
Quelle9)
MySQL: Kopieren von Tag-Inhalten aus der Tabelle oxarticles in die Tabelle oxartextends
UPDATE oxartextends a JOIN oxarticles b ON a.oxid = b.oxid SET a.oxtags = b.oxsearchkeys
Quelle10)
OXID nutzt für die Mehrsprachigkeit die Views von MySQL. Bei einigen Hostern machen diese jedoch Probleme, wenn man die Datenbank per mysqldump sichern möchte.
Glücklicherweise beginnen die Views alle mit “oxv_”, so dass man diese auschließen kann.
Hier das Entsprechende Script für den Aufruf auf der Commandline:
mysql [dbname] -u [username] -p[password] -e 'show tables where tables_in_[dbname] not like "oxv\_%"' | grep -v Tables_in | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]
Es werden alle Tabellen ausgelesen, welche nicht mit oxv_ beginnen und ein Dump mit allen anderen erzeugt.
Nachdem man den Dump in die neue Datenbank importiert hat, im Backend unter “Tools” einfach die Views neu erzeugen.
In manchen Versionen ist jedoch ohne Views gar kein Login ins Backend möglich. Hier hilft das setzen des entprechenden Eintrags in der config.inc.php
$this->blSkipViewUsage = true;
Quelle11)
There is a possibility to use variables with arguments in translations. To use them, you need to know how sprintf or vsprintf methods work and pass the parameters accordingly. Example usage:
[{ oxmultilang ident="VAT_PLUS_PERCENT_AMOUNT" suffix="COLON" args=$key }],
translation:
'VAT_PLUS_PERCENT_AMOUNT' => "plus VAT %s%% Amount",
%s is replaced with $key value. To use translations with multiple arguments, you have to pass an array as „args“ parameter. Example:
[{assign_adv var="invite_array" value="array ( '0' => '$sender_name', '1' => '$shop_name' )"}] [{ oxmultilang ident="INVITE_TO_SHOP" args=$invite_array }]
translation:
'INVITE_TO_SHOP' => "An invitation from %s to visit %s",
The array here is formed in smarty, but it is possible to form the array in the controller, and pass it to the template. When using „oxmultilangassign“, you can use translations with arguments too. Example usage:
[{assign var="_statusMessage" value="THANK_YOU_MESSAGE"|oxmultilangassign:$oxcmp_shop->oxshops__oxname->value}]
Klasse oxViewConfig (views/oxviewsconfig.php)
$oViewConf->getFbAppId() - Returns facebook application key value $oViewConf->getImageUrl() - Returns image url $oViewConf->getResourceUrl() - Returns shops resource url $oViewConf->getHomeLink() - Returns shops home link $oViewConf->getSelfLink() - Returns shops self link $oViewConf->getHelpPageLink() - Returns shop help link $oxViewConfig->getActArticleId() - Returns active article id $oxViewConfig->getActCatId() - Returns active category id $oxViewConfig->getActLanguageId() - Returns session language id $oxViewConfig->getActManufacturerId() - Returns active manufacturer id $oxViewConfig->getActTplName - Returns active template name (if set) $oxViewConfig->getAdminDir() - Returns admin path $oxViewConfig->getBaseDir() - Returns shops base directory path $oxViewConfig->getBasketLink() - Returns shops basket link $oxViewConfig->getCurrentHomeDir() - Returns shops home path $oxViewConfig->getLogoutLink() - Returns shop logout link $oxViewConfig->getSslSelfLink() - Returns shops self ssl link oxViewConfig.getUrlTemplateDir() - Returns shops current templates url
$shop->sid
d3377e513705b17d12c22828b10503a6
$shop->hiddensid
<input type="hidden" name="sid" value="d3377e513705b17d12c22828b10503a6" />
$shop->selflink
http://www.myDomain.de/index.php?sid=d3377e513705b17d12c22828b10503a6& ebenfalls im Admin einsetzbar
$shop->sslselflink https://www.myDomain.de/index.php?sid=d3377e513705b17d12c22828b10503a6&
$shop->basedir
http://www.myDomain.de/
$shop->selfactionlink
http(s)://www.myDomain.de/index.php?sid=d3377e513705b17d12c22828b10503a6& als Target in Formularen zu verwenden
$shop->currenthomedir
http://www.myDomain.de/
$shop->basketlink
http://www.myDomain.de/index.php?sid=d3377e513705b17d12c22828b10503a6&cl=basket
$shop->orderlink
http(s)://www.myDomain.de/index.php?sid=d3377e513705b17d12c22828b10503a6&cl=user
$shop->paymentlink http(s)://www.myDomain.de/index.php?sid=d3377e513705b17d12c22828b10503a6&cl=payment
$shop->exeorderlink http(s)://www.myDomain.de/index.php?sid=d3377e513705b17d12c22828b10503a6&cl=order&fnc=execute
$shop->orderconfirmlink http(s)://www.myDomain.de/index.php?sid=d3377e513705b17d12c22828b10503a6&cl=order
$shop->basetpldir
http://www.myDomain.de/out/oxbaseshop/html/ ebenfalls im Admin einsetzbar
$shop->templatedir
/out/oxbaseshop/html/0/templates ebenfalls im Admin einsetzbar
$shop->urltemplatedir
http://www.myDomain.de/out/oxbaseshop/html/0/templates ebenfalls im Admin einsetzbar
$shop->imagedir
http(s)://www.myDomain.de/out/oxbaseshop/html/0/images ebenfalls im Admin einsetzbar
$shop->nosslimagedir
http://www.myDomain.de/out/oxbaseshop/html/0/images ebenfalls im Admin einsetzbar
$shop->dimagedir
http(s)://www.myDomain.de/out/oxbaseshop/html/0/dyn_images
$shop->admindir
admin
URL-Erweiterung für Adminbereich, nur im Admin verfügbar
$shop->isSSL
true oder false Prüfung auf SSL-Mode
$shop->IP
217.237.149.225
$shop->blUseStock
true oder false
Prüfung, ob Lager genutzt wird
$shop->cl
user
aktuell genutzte Klasse
$shop->tpl
impressum.tpl
aktuell genutztes Template
$shop->lang
0
aktuelle Sprache
$shop->helplink
http://www.myDomain.de/index.php?sid=d3377e513705b17d12c22828b10503a6&cl=help&page=user&tpl=
$shop->logoutlink
http(s)://www.myDomain.de/index.php?sid=d3377e513705b17d12c22828b10503a6&cl=user&cnid=&fnc=logout&tpl=&redirect=1
Wird als Beispiel "http" bzw. "https" verwendet. wird auch nur explizit diese im Shop registrierte Adresse verwendet. Steht hingegen "http(s)", schaltet der Shop die Variable je nach Shopzustand selbst.
Sehr guter Überglick (auch technisch): http://www.marmalade.de/magazin/2014/07/oxid-wann-wird-die-offline-seite-angezeigt/
http://wiki.oxidforge.org/Tutorials/Check_vor_dem_Livegang
Stammdaten →Grundeinstellungen → Haken bei Produktivmodus
Stammdaten →Grundeinstellungen → Perform. → Überprüfen ob Templates neu kompiliert werden müssen. Schalten Sie diese Einstellung aus, wenn der eShop in den Live-Betrieb geht.