OXID eShop version 4.1.4

General hints for this package

  • Removed WYSIWYG-editor from admin UI for guestbook entries – changed to textarea since in frontend it is simple text entries only.
  • Enabled language abbrevation support for SEO URLs. After you update shop to newest version go to “Master Settings -> Core Settings –> SEO” and press “Update SEO URLs” to enable language abbrevation support for current shop.


See http://www.oxid-esales.com/en/resources/help-faq/eshop-manual/update-one-release-another


Mostly admin templates had to be changed. For detailled information and differences, see “/templ_docu/index.html” in your update package.

Fixed Bugs

  • 0001047: [GUI & Navigation & Sorting] Firefox doubles HTTP request
  • 0000820: [Admin area] recalculateOrder in Shop-Admin for existing order
  • 0001077: [Files & Source code & Database] Deprecated warnings on PHP5.3.0
  • 0001040: [RSS] fatal crashes if article does not return price object
  • 0000821: [Admin area] delete article from shop causes error message in Bestellungen->Stamm
  • 0001116: [Core Settings] Back to main product not availaible
  • 0001079: [Currencies] Volume discount calculation with foreign currency works wrong
  • 0001013: [SEO] SEO concept for foreign languages changed?? – no language abreviation in URL
  • 0001016: [Users] Parsing of special charactes like “&” is not correctly handled
  • 0001032: [3rd party libraries] WYSIWYG editor replaces shop URL with [{$oViewConf->getCurrentHomeDir()}]
  • 0001127: [Core Settings] “Notice: Undefined variable:” because of oxsession.php
  • 0001051: [eFire integration] eFire connector does not work
  • 0001009: [PDF invoice] The date overwrite the invoice number

You may find the complete list of bugfixes in our bugtracking system: https://bugs.oxid-esales.com/changelog_page.php.

New Features

No new features in this revision.

Important information for developers

  • oxOrder::getUser renamed to oxOrder::getOrderUser (conflicted with oxSuperCfg::getUser)
  • implemented oxUtils::toFileCache() race condition safe caching (means another proccess does not overwrite cache if one process already started doing this)
  • oxUtils::toFileCache() does not write it every time it is called, but it writes on the end all caches at once. For this reason oxUtils::fileCacheCommit() method was introduced.
  • oxUtils::_oxFileCache() method was removed, it was confusing and not useful
  • Enabled language abbrevation support for SEO urls. Non primary language (by default primary language is first, german, but can be changed at “Master Settings -> Core Settings -> SEO -> Default language for SEO URLs “) urls will be prefixed with language specific prefix editable in “Master Settings -> Languages -> Abbreviation”). After you update shop to newest version go to “Master Settings -> Core Settings -> SEO” and press “Update SEO URLs” to enable language abbrevation support for current shop. SEO engine changes:

New methods:

oxSeoEncoder::addLanguageParam() - adds language abbrevation to seo url;
oxSeoEncoder::_processSeoUrl() - processes seo url before saving to DB - calls oxseoencoder::addLanguageParam(),
oxseoencoder::_getUniqueSeoUrl(). Can be usefull for custom functionality impl;
oxSeoEncoder::getDynamicObjectId() - generates dynamic url object id (calls oxseoencoder::_getStaticObjectId);
oxSeoEncoder::_getUrlExtension() - returns url extension (currently returns null);
oxSeoEncoderArticle::_getUrlExtension() - returns url extension ".html";
oxSeoEncoderCategory::_getUrlExtension() - returns url extension "/";
oxSeoEncoderContent::_getUrlExtension() - returns url extension "/";
oxSeoEncoderManufacturer::_getUrlExtension() - returns url extension "/";
oxSeoEncoderVendor::_getUrlExtension() - returns url extension "/".
oxArticle::getStdTagLink() - returns standard product Tag URL.

Deprecated methods:

oxSeoEncoder::_getDynamicObjectId() - is now deprecated, use public oxSeoEncoder::getDynamicObjectId() instead;

NOTICE: if you change default language static SEO URLs “Master Settings -> Core Settings -> SEO -> Static URLs” will not be changed automatically!

  • Order recalculation was improved. Core changes were made:
    • if order is recalculated products are loaded from oxorderarticle table. This prevents from price changes, discount loss etc. Thus “oxIArticle” interface was introduced. It defines core methods which must be implemented for classes which are used by oxbasket, oxbasketitem and others (please review source code documentation for more details).
    • when adding additional products (“Administer Orders -> Orders -> Products” input field “Prod.No.”) to existing order new product is appended to order using current oxarticle table data. If you just want to change ordered items count – reduce or increase – fill in new stock values in order product list and press update button. All product data (price stocks) will be loaded from oxOrderArticle table, but delivery costs, additional discounts, payment costs will be loaded according to actual shop configuration. If you need to change them manually – go to “Administer Orders -> Orders -> Main” and modify existing values.

New methods:

oxBasket::addOrderArticleToBasket() - adds order article to basket (method normally used while recalculating order);
oxBasket::setVoucherDiscount() - voucher discount setter, normally executed when recalculating order by setting used vouchers;
oxBasketItem::initFromOrderArticle() - initializes basket item from oxorderarticle object;
oxBasketItem::_setFromOrderArticle() - assigns general product parameters to oxbasketitem object, similar to
oxOrder::_getOrderBasket() - returns basket object filled up with discount, delivery, wrapping and all other info;
oxOrder::setDelivery() - sets new delivery id for order and forces order to recalculate using new delivery type;
oxOrder::getOrderUser() - returns current order user object;
oxOrder::_addOrderArticlesToBasket() - adds order articles back to virtual basket. Needed for recalculating order;
oxOrder::_addArticlesToBasket() - adds new products to basket/order;
oxOrder::reloadDelivery() - tells to keep old or reload delivery costs while recalculating order;
oxOrder::reloadDiscount() - tells to keep old or reload discount while recalculating order;

Changes in interfaces:

oxOrder::recalculateOrder() - now only accepts list of newly added products;

oxArticle and oxOrderArticle implements oxIArticle interface, so oxOrderArticle now implements these new methods:

oxOrderArticle::getProductId() - returns ordered article id;
oxOrderArticle::getProductParentId() - returns product parent id (oxparentid);
oxOrderArticle::_setArticleParams() - sets oxArticle fields;
oxOrderArticle::checkForStock() - returns true (check oxArticle::checkForStock() documentation);
oxOrderArticle::_getOrderArticle() - loads, caches and returns real order article instance. If article is not available (deleted from db or so) false is returned;
oxOrderArticle::getSelectLists() - returns article select lists (tries to load from real oxArticle);
oxOrderArticle::getOrderArticleSelectList() - returns order article selection list array;
oxOrderArticle::getBasketPrice() - returns basket order article price;
oxOrderArticle::skipDiscounts() - returns false (check oxArticle::skipDiscounts() documentation);
oxOrderArticle::getCategoryIds() - returns oxArticle::getCategoryIds() if real product is still available;
oxOrderArticle::getBasePrice() - returns base article price from database;
oxOrderArticle::getPrice() - returns order article unit price;
oxOrderArticle::setIsNewOrderItem() - marks object as new order item (this marker useful when recalculating stocks after order recalculation);
oxOrderArticle::isNewOrderItem() - returns TRUE if current order article is newly added to order;
oxOrderArticle::setNewAmount() - ordered article stock setter. Before setting new stock value additionally checks for original article stock value. Is stock values <= preferred, adjusts order stock according to it;
oxOrderArticle::isOrderArticle() - returns TRUE as current class is oxOrderArticle;

New oxArticle methods:

oxArticle::getProductId() - returns product id (oxid); should be used everywhere in basket and order calculations;
oxArticle::getProductParentId() - returns product parent id (oxparentid); should be used everywhere in basket and order calculations;
oxArticle::isOrderArticle() - returns false, as this object is not derived from oxOrderArticle class;
oxArticle::isVariant() - return true if product is variant;