Skip to navigation

Changelog

Release 0.9.10

  • restructure store and admin code into separate apps with most of the store code shared
  • remove custom Toolbox class and just use the setting to configure tools; this simplifies code at the cost of a little less documentation (tools are no longer visible via phpdoc)
  • move viewDir support from SavantView to ZMSavantView and make 'views/' the default
  • make default db provider more resiliant against loss of native resource (may happen if used in session handler)
  • add zen cart compatible session handler for db storage
  • add sacs handler for admin that supports roles
  • make view data set via the controllers findView() method take precendence over data from getViewData()
  • streamline saving/loading messages to/from the session
  • implement ZMRequest::setFollowUpUrl() and getFollowUpUrl(), deprecate overriden versions in Request
  • port zen_ functions into ZMZenCartAuthentication
  • allow to set the single entry point filename (default is index.php) via setting: 'zenmagick.mvc.request.index'
  • adjust exception logging log level a bit
  • captcha: avoid using undefined define
  • ZMCategories: add parent_id to SQL sort order
  • flyoutCategories: initial version
  • jscrollerSideboxes: initial version
  • integrate ZMViewUtils into ZMSavantView; provide new $resources view var replacing the $utils method wrapper around ZMTemplateManager
  • properly split template and resource path for view related methods
  • fix b:#2996120 - missing parameter in pagination links
  • add link to new admin UI to ZenMagick admin menu (marked experimental)
  • add ZMNetUtils::getDomain()
  • ZMDatabase providers: allow to return all unmapped values as string
  • pageStats: add option to display SQL queries and time used
  • create setting 'isShowCategoryCount' that defaults to false...
  • limit ZMProducts::getNewProducts() to (3 * $max) or 50 (if $max == 0)
  • simplify generated search SQL if no categories are involved
  • add ZMCategories::getRootCategories() and use in meta data tool
  • FirePHP: allow to enable on demand via request parameter
  • fix b:#2998413 corrupt ipn_main_handler url
  • make languageId mandatory in ZMCoupons; templates affected: coupon_help.php [getCouponForId()]
  • make languageId mandatory in ZMEZPages; templates affected: ezpages.php [getPagesForChapterId],
  • make languageId mandatory in ZMReviews; templates affected: reviews.php [getRandomReviews: signature changes],
  • drop languageId in ZMAttributes [languageId is a property on ZMProduct]
  • make languageId mandatory in ZMManufacturers
  • make languageId mandatory in ZMTheme, ZMThemes
  • add Plugin::upgrade()
  • make languageId mandatory in ZMOrders; templates affected: checkout_success.php, order_history.php [getOrdersForAccountId: signature changes], account_history_info.php: [ZMOrder::getOrderStatusHistory(): signature changes]
  • make languageId mandatory in ZMCategories
  • make the actual view instance the source of view_start/view_end events
  • change ZMCaches::getCache() to allow specifying specific cache implementations as well as the predefined TRANSIENT and PERSISTENT
  • pageCache: change to load in both storefront and admin to allow the cache to be visible in cache admin
  • change ZMCategories to using a regular cache via ZMCaches::getCache(); the cache type may be set via 'apps.store.categories.cache' (for example: 'file', 'memcache')
  • ZMMemcacheCache: add support for 'compress' config option (true/false)
  • pageStats: allow to limit SQL timings displayed to the top X queries in descending time order
  • add initial(partial) support using MySQL fulltext to ZMProductFinder; enable via ZMSettings::set('apps.store.search.fulltext', true);
  • add ZMPhpSourceAnalyzer plus tests
  • add default order by relevance when using fulltext search
  • make ZMPhpPackagePacker use ZMPhpSourceAnalyzer and core.php work
  • add Swift Mailer to core
  • added custom zipdiff.jar
  • start converting cli scripts to pack libaries into something that can be run by ant
  • add ZMMailer as convenience wrapper around SwiftMailer
  • perform SACS authorization on method level for ajax calls only if a method level mapping exists; this means the controller mapping applies to all methods unless a more specific rule is configured
  • sacs: change mapping format; split into default: and mappings: with default: being a default mapping and mappings: being explicit mappings
  • change returned data type of ZMOrders::getOrderStatusList from ZMObject to ZMOrderStatus
  • move REGISTERED, GUEST and ANONYMOUS consts to ZMAccount, mark deprecated in ZMZenCartSacsHandler
  • upgrade Cache_Lite to 1.7.8
  • add simpltest packer; upgrade simpletest to 1.1b (18/05/2010) tarball
  • allow to delegate session user creation to ZMUserFactory implementations
  • minify: add support for new ZMViewUtils methods; this does work in the new admin UI too!
  • minify: add code to group css files with matching attributes (and prefix/suffix)
  • revert change in SavantView and make template and resource path the same for storefront
  • add ZMAjaxResponse interface and JSON implementation
  • start using new ZMAjaxResponse code
  • add ZMScaffoldController base class that can be used as base class for new ajax controller (and eventually for proper scaffolding)
  • change javascript var name for validation rules; changes validation.js
  • add initial locale service
  • add support for (multiple) filter in ZMSavantView
  • add support for PHP short tags '<%=' with '<?php echo '; disabled per default view definition setting
  • add ZMFileLocale - a locale provider using the ZenMagick zm_l10n_get function
  • update core/mvc to using _zm
  • introduce and load config/validation.yaml
  • add sendmail/PHP options to ZMMailer
  • add generic ZMEmails service that wraps some things around creating email content via a view
  • changed the theme folder containing email templates from email to emails
  • add ZMObject::getProperties() method
  • add additional logic that prepends viewIds with 'ajax_' if the request is assumed to be initiated by ajax (by looking at the X-Requested-With' header')
  • add demo code to demo theme to show how to use Ajax to login
  • allow to override ZMController::isAjax($request) with ajax=false in the request
  • remove Runtime::getBaseURL() in favour of ZMRequest::getBaseURL()
  • remove Runtime::getContext() in favour of ZMRequest::getContext()
  • add sql patch to set up admin roles
  • add code to load roles from database
  • add minify packer
  • add ZMPhpPacker::patchFile() to allow custom file patching
  • add openID packer
  • allow singletons to be bean definitions
  • useo2: remove dependency on admin patch class
  • move more stuff into admin app
  • add _vzm() function as convenience wrapper arount _zm() acting the same as zm_l10n()
  • cleanup ZMTools
  • fixed b:#3014025 - rss feed broken
  • extend RSS controller to allow to configure RSS sources as bean definition via the setting 'apps.store.rss.sources'
  • refactor existing feeds from ZMRssController into ZMDefaultRssFeedSource
  • add proper support for custom channel/item elements
  • add new catalog (all products / categories) RSS feed
  • move ZMRssController into mvc; add some new utils to hold helper functions
  • pomo: update to implement ZMLocale properly
  • move most RSS code into mvc
  • start migrating backend code to using _zm() and _zmn()
  • xinha: upgraded to 0.96.1
  • fix broken global/product notification updates
  • convert l10n.php to l10n.yaml
  • modify and rename ZMFileLocale to ZMThemeYamlLocale and implement own internal map of translations
  • make zm_l10n functions use the new locale framework and change ZMTheme to load the new l10n.yaml into the locale implementation
  • upgrade all code to using _zm, _vzm
  • fix updateViewCount for products
  • upgrade affected general plugins admin controllers to the new UI
  • pomo: add packer following the new packer concept; also add code to prefix all pomo classes with 'ZM' to avoid possible conflicts
  • make Runtime::getLanguage() obsolete
  • add code to convert zen_cfg_xxx() config setter to widgets in ZMConfig
  • add style option to ZMSelectFormWidget and support 'select' and 'radio' options; if multiple is set, default to 'select'
  • add ZMUserRoleSacsHandler and ZMUserRoleCredentials to mvc and user in admin
  • add ZMCoupons::getCoupons() method
  • add generic yaml based ZMLocale implementation - ZMYamlLocale
  • dropped Creole
  • add optional T&C checkout checkbox/message
  • move catalog default tab into admin and drop the plugin
  • add (empty) ZMApplicationContext context base class
  • add method to ZMView to expose view utils
  • category, category_list: make subcategory link with image support
  • add var_arg support to ZMFileUtils::mkPath()
  • make context usable; this allows to map arbitrary implementations (irrespective of the name or prefix) to any class instantiated via ZMBeanUtils; also means that full bean definitions may be mapped to something different! (this obsoletes the previouosly introduces option to configure singletons via the setting 'zenmagick.core.singleton.NAME')
  • split install/readme into separate files for each package type (mod/full/admin) and move into release root folder
  • ZMFileUtils::normalizeFilename(): call realpath() only if valid filename to avoid losing the path
  • add code to initialize locale based on setting 'zenmagick.core.locales.locale'; this is assumed to be in the form 'de_DE' or just 'de' (language code), rather than the directory; existing translations will continue to work, though
  • add session backed language selector to sample app
  • add ZMLocale::getCode()
  • add new setting 'zenmagick.core.events.listeners' to register default event handler
  • fix missing order form values; b:#3033472
  • dropped 'zenmagick.mvc.json.header'
  • add new RPC controller for abstract RPC calls; also add JSON RCP implementation and use for admin dashboard
  • imageHandler2: fix bug where additional ImageInfo parameter where ignored
  • ZMToolboxMacros: add 'attribute' element to productAttribute details to allow to access the underlying ZMAttribute instance
  • fix currency selection regression that would cause the form to post rather than get and thus not update the session
  • paymentSurcharge: fix spelling of setting name
  • template: account_newsletter: fix checkbox checking
  • product notifications: fix code (invalid product id '0' added with each update) b:#3038016
  • boxes: make form use secure action if page is secure to avoid secure/unsecure warning; (most places where $form->open(..) is used)
  • default theme: add jquery and static JS to dynamically change the state field based on the country
  • fix ZMOrder::hasShippingAddress() logic (regression)
  • fix: add saved tax rate on value returned by ZMOrderItem::getCalculatedPrice()
  • ZMCurrency: fix formatting of negative values
  • recaptcha: upgrade to library version 1.11
  • ckeditor: upgrade to 3.3.2
  • tinymce: upgrade to 3.3.8
  • move editor plugins into general section
  • ZMSacsmanager::authorize(): allow to suppress redirect and only perform the actual check
  • add new setting 'apps.store.request.enableZCRequestHandling' to explicitely allow zencart request handling for the listed request ids
  • add setting to enforce site to be secure: 'zenmagick.mvc.request.allSecure'
  • fix broken HTML email; regression
  • add CSV file utils
  • add custom locale sprintf to allow to replace blocks
  • change signature of ZMCategories::getCategories() - the optional ids parameter was first!
  • add initial APC based cache implementation
  • make template caching work
  • add ZMSavantCache and ZMSimpleSavantCache; uses a comma separated list of template names in setting 'zenmagick.mvc.templates.simpleCache.templates' to decide whether a template is cacheable or not
  • add setting 'zenmagick.mvc.templates.simpleCache.cacheTTL'
  • add init of default timezone from new setting 'zenmagick.core.date.timezone' and re-init the setting with the actually used timezone (should be the same as long as the setting is valid)
  • add database table optimize option in installation page
  • ckEditor: upgrade to 3.4
  • upgrade to jquery UI 1.8.4
  • deprecate zm_get_email_contents
  • ad readonly to list of supported form widget attributes

Release 0.9.9

  • in ZMDbTableMapper handle database exception building auto mappings
  • fix SQL errors in ZMZenCartDatabase
  • unitTests: add new create/update database test class
  • remove support for setting 'isZMDefinePages'
  • add full-release patch to make $db throw ZMDatabaseException rather than die()
  • removed smarty
  • introduce yaml based theme config and remove ZMThemeInfo
  • remove ToolboxHtml::onload
  • remove ZMhemeInfo and use theme.yaml file instead
  • fix popups; b:#2927276
  • added full release SQL to hide the following config options: # 8 = Configuration - Product Listing # 10 = Configuration - Logging # 14 = Configuration - GZip Compression # 18 = Configuration - Product Info # 21 = Configuration - New Listing # 22 = Configuration - Featured Listing # 23 = Configuration - All Listing # 24 = Configuration - Index Listing # 25 = Configuration - Define Page Status # 30 = Configuration - EZ-Pages Settings
  • tentatively remove $echo parameter from methods; temlate functions affected: staticPageContent(), getPaymentsJavaScript(), getOrderFormContent(); this leaves just toolbox tools using this...
  • wordpress: Change the way the WP API is loaded to avoid 404 header; see: http://www.ardamis.com/2006/07/10/wordpress-googlebot-404-error/
  • added ZMSeoRewriter interface to make SEO url rewriting a bit nicer
  • fix SEO plugins breaking the site; b:#2927984
  • start changing prepopulated template vars: zm_cart=shoppingCart, zm_resultList=resultList, zm_account=currentAccount, zm_product=currentProduct, zm_coupon=currentCoupon, zm_coupon_code=currentCouponCode, zm_order=currentOrder, zm_page=ezPage, zm_review=currentReview, zm_emailMessage=emailMessage, zm_category=currentCategory, zm_addressList=addressList
  • zm_deprecated: dropped - it's just too hard to maintain and not enough gain
  • zm_geo_id: dropped - no use case so far and no interest, so why keep it?
  • zm_phpbb2: dropped - too old
  • zm_wiki: dropped - not good enoug and no interest
  • zm_scaffold: dropped - not complete and no motivation to do so (perhaps as part of the MVC framework?)
  • add ZMOrderTotal and ZMCreditClass interfaces (drafts!)
  • rename ZMOrderTotal to ZMOrderTotalLine
  • move methods from ZMShipping to ZMShoppingCart and ZMToolboxUtils
  • rename ZMOrder::getOrderTotals() to getOrderTotalLines() to reflect the changed class name
  • fix wrong ZMEZPage variable spelling for sidebox sort order
  • extend EZPages service with create/update/remove methods
  • converted all use of zm_l10n_chunk_get() to using static pages
  • change static page code to allow PHP everywhere
  • allow to create beans via settings using set::[setting]
  • fix static page editor; b:#2934676
  • make static page editor work with the new editor code
  • add ZMEditorSelectFormWidget
  • settings: add support for ZMEditorSelectFormWidget
  • templates: rename ZMToolboxNet::absolute() to absoluteURL()
  • templates: drop $echo parameter in ZMToolboxHtml::more() and encode()
  • templates: drop $echo parameter in ZMToolboxLocale::shortDate()
  • templates: drop $echo parameter in ZMToolboxUtils::getTitle() and formatMoney()
  • templates: drop $echo parameter in ZMToolboxMetaTags::getTitle(), getKeywords() and getDescription()
  • admin: drop $echo parameter in ZMToolboxAdmin::url()
  • templates: drop $echo parameter in ZMToolboxMacro::phpinfo(), formatAddress(), showBanner(), productPrice()
  • reimplement ZMCoreCompressor based on ZMPhpPackagePacker
  • full: update session setting to force cookies
  • templates: drop $echo parameter in ZMToolboxForm::open(), addProduct(), hiddenCartFields(), fieldLength(), idpSelect() and hiddenList()
  • templates: drop $echo parameter in ToolboxHtml::image(), strip(), productImageLink(), hrefTarget(), fieldMessages(), backLink() and ezpageLink()
  • templates: drop $echo parameter in ToolboxNet::product(), staticPage(), ezpage() [note that the name is now ezPage], image(), redirect() [also renamed to trackLink()], ajax(), rssFeed(), resultListBack(), resultListNext() and url()
  • remove setting 'isEchoHTML' and define ZM_ECHO_HTML
  • full: drop docs, pub, download and media folder
  • full: remove classic and template_default template folder
  • full: SQL: disable downloads (attributes), set default template to 'default' (the default ZenMagick theme id)
  • installer: drop welcome, change location of not-installed page
  • add basic branding to full install build script
  • implement ajax to toggle boolean ezpage properties
  • add ZMController::isAjax(), add code to set content type to 'text/plan' if ajax request detecetd and also set view layout to null (in anticipation of layout support moving into mvc)
  • add ZMAjaxUtils and move ZMAjaxController::flattenObject there
  • move layout config into url mappings, remove layout related code in ZMTheme
  • drop layout settings in all theme.yaml (default)
  • move default layout into setting 'zenmagick.mvc.view.defaultLayout'
  • converted subscriptions plugin
  • add similar orders example to the demo store's product_info.php template
  • migrate from ZMOrderTotalPlugin base class to ZMOrderTotal interface
  • change data structure in ZMOrderTotalLineDetails to allow to create subtotals by tax class id
  • update subtotal and total plugin, although those might get dropped in favour of getSubtotal() and getTotal methods on ZMShoppingCart
  • add ezpage manager link to ZenMagick admin menu; todos: redirect after update, sorting, multi page list
  • extend ZMTemplateManager to allow group proccessing of (for now) js files
  • optionally allow to prepend scheme,hostname,[port] calling ZMToolboxNet::absoluteUrl
  • make ZMToolboxNet::url depend entirely on SEO rewriter - still need to add a default one...
  • make the request id query key configurable via 'zenmagick.mvc.request.idName'
  • refactor the 'zencart style' url creation into a (default) SEORewriter plus some cleanup (more to come)
  • use 'category_not_found' and 'product_not_found' more often
  • drop $zm_theme from the view (finally!) and replace with utils method
  • default 'zenmagick.mvc.view.defaultLayout' to null if not set
  • save original requestId in rootRequestId when forwarding
  • remove trailing ?> from all .php files in lib
  • remove 'errorPage' key (error page view) from theme.yaml as it is not used any more
  • fix invalid l18n key 'LC_TIME_LOCALE' to 'LC_TIME'
  • themes: change zm_i18n_get to using ZMSettings to pull the charset; (all default_layout.php)
  • move i18n settings from language/english/i18n.php to theme.yaml
  • add ZMLangUtisl::arrayMergeRecursive()
  • refactor i18n init code
  • drop lib/store/i18n.php
  • ih2: Simplify installation by automatically injecting the .js and .css files, unless hover is disabled (changed the expected path to content/ih2)
  • move store yaml files into config folder
  • add initial redirector plugin code
  • add basic namespace support to the loader
  • always add plugins directories to the template path; this obsoletes ZMPluginView
  • add basic support for product meta tags
  • fix: do not display inactive categories
  • allow plugins to add to the extras menu
  • resurrect and improve music product info plugin; remove extras in full release and allow plugin to populate this on demand
  • add music related SQL to musicProductInfo plugin
  • hoverbox3: converted
  • fualSlimbox: converted
  • add initial admin user service and associated class
  • renamed ZMZenCartUserSacsHandler to ZMZenCartAccountSacsHandler; this affects the order_status email
  • rename SSL related settings
  • add option to ZMPhpCompressor to strip old PHP reference style code; ie: &$, = & new
  • allow to set url mappings in theme.yaml!
  • add ZMController::getViewData($request) as convenience method for controller to provide custom data to views
  • move function overrides to avoid collisions in admin when uninstalling all file patches; this required to manually delete - includes/functions/extra_functions/zenmagick_zencart_overrides.php - admin/includes/functions/extra_functions/zenmagick_zencart_overrides.php
  • make ZMShippingProviders and ZMShippingProviderWrapper work!
  • make the new shipping code available for testing via ajax_demo2 in the demo theme
  • added a new event fired on each search
  • added a new event when insufficient credentials
  • change checkout_shipping and ZMShoppingCart to using the new shipping service class
  • make ZMCheckoutShippingController actually work; right now this is disabled as there is still functionallity missing
  • changed ZMShoppingCart methods getShippingMethod and getShippingMethodId to getSelectedShippingMethod and getSelectedShippingMethodId, respectively; affects checkout_confirmation
  • pageStats: add loader object instatiation to stats
  • full-release: add all stuff that gets removed from zc-base as zip to zc_install/optional
  • move ZMToolboxNet::url() to ZMRequest
  • actually use ZMStoreDefaultSeoRewriter
  • reduce toolbox dependencies
  • move isFreeShipping method to ZMCheckoutHelper
  • change checkout_shipping to allow to display other shipping options together with free shipping (this is of limited use as zencart disables other modules when free shipping is detected. it also means that there might be more than one free shipping option during checkout)
  • ZMUrlManager: fix merging of viewId specific mappings and controller defaults
  • moved absoluteURL from ZMToolboxNet to ZMRequest; affects product_info pages (any type)
  • make sure the PDO database provider returns booleans as boolean!
  • groupPricing: allow to edit/delete group pricings
  • unitTests: add all available plugin 'tests' subfolder to class path; this means all plugins have to do is stick to the convention of having a 'tests' subfolder for tests and add tests to the custom setting 'plugins.unitTests.tests.custom'
  • add fix to make free_free shipping work as expected
  • improve ZMEmailView isValid() method
  • fix ZMOrder::hasShippingAddress()
  • add missing echo for gv related data to views; gv_send.php, email/gv_send.text.php
  • add more error checking for missing products/categories/reviews
  • add custom getAllHeaders method as getallheaders is not available for FastCGI or non apache httpd
  • move all store code into store/lib to follow MVC folder layout
  • add ZMDefaultSeoRewriter class as default default
  • resolve database mapping filename relative to the configured application path rather than installation path
  • autostart session if not new (ZMSession)
  • drop Runtime::finish and replace with $request->closeSession(); exit; for now
  • add decode method to ZMSeoRewriter interface and empty (return false;) implementation to all classes implementing the interface
  • add new setting 'apps.store.request.enableZMCheckoutShipping' to make ZenMagick handle the checkout shipping page; this is disabled by default, so if you want to try it you'll have to enable (set to true) this first
  • add ZMConfig::loadAll()
  • change location of templating content in plugins to [plugin-dir]/content and move current [plugin-dir]/views folder to [plugin-dir]/content/views
  • change Plugin::getGlobal() signature and remove references from generic code
  • change installation sidebox dummy patch to create dummies for **all** themes and also **installed** plugins
  • add exists() and asUrl() wrapper to ZMView to avoid having to expose savant to non core code
  • remove validation check from ZMTemplateManager's sidebox code; this means templates need to validate configured boxes
  • delete obsolete ZMBoxPlugin class
  • merge ZMToolboxNet and ToolboxNet thus making mvc's ZMToolboxNet obsolete
  • merge ZMToolboxHtml and ToolboxHtml thus making mvc's ZMToolboxHtml obsolete
  • converted: googleAdSense, whoIsOnline
  • removed: zm_dual_pricing; this is replaced by the productGroupPricing plugin
  • remove rss.in.php and rss.php from default boxes
  • add rss.php to demo boxes
  • pageStats: display total number of included/required files
  • cleanup init_override scripts; requires to delete includes/init_includes/overrides/init_languages.php
  • useo2: fix code that uses references to not doing that!
  • templates: gv_send_confirm.php: change open form code from: $form->open('gv_send_confirm', null, true, array('onsubmit'=>null)) to: $form->open('gv_send_confirm', '', true, array('onsubmit'=>null))
  • gv redemption: Handle gv_mail generated redemption URL (gv_no instead of couponCode)
  • add ZMRequest::seoDecode() [and call] to allow registered seo rewriters to decode the request
  • add path style seo rewriting in the mvc default seo rewriter; the setting 'zenmagick.mvc.seo.type' needs to be set to 'path' for this [this is part of the generic MVC code and not available as option for the store ATM]
  • further improve unitTests code to scan all plugins 'tests' folder for tests (files starting with 'Test')
  • add 'realpath' default seo rewrite type that is the same as path, except that 'index.php/' is also dropped from the url; this requires a single rewrite rule (.htaccess, etc.) same as, for example, Wordpress uses
  • prefix set_magic_quotes_runtime in Cache_Lite.php with '@'
  • pageCache: avoid using $request->getQueryString() as that might not be what you expect if SEO plugins/rewriter are active
  • zm_rss_boxes: removed
  • add zenmagick/shared to the root loader class path
  • fix ZMRequest::getContext() for empty context; change returned value to omit the trailing '/' to conform to what the context should be
  • improve rounding in ZMTaxRate
  • rename setting 'isTaxInclusive' to 'showPricesTaxIncluded'

Release 0.9.8

  • add Savant3 and experimental views (not used yet)
  • fix forward view bug; b:#2880154
  • fix error in SACS manager that breaks automatic redirects to secure pages where configured
  • more changes to use $request where possible
  • zm_quick_edit: allow non form widgets, for example read only data
  • add custom SavantView and start using (regular pages, popups, forward, redirect, plugin, function views)
  • update email view to extending SavantView; views now need a relative path with the views folder as base
  • fix bug in KeepItSimple theme's local.php; b:#2879221
  • fix bug in ZMFileUtils; b:#2880149
  • fix file permission bug; b:#2880151
  • update theme infos and add preview images
  • allow to set custom preview image with ZMThemeInfo::setPreview('image'); default is 'preview.jpg'
  • zm_theme_switch: if no config setting is found, display all existing themes
  • modify plugin build script to make plugins.properties only file to be changed for new plugins (except new groups)
  • change plugins build script to generate a zip of all released plugins (this only makes sense if all plugins are released all the time)
  • move template variable container from controller to view; drop exportGlobal() and getGlobal()/getGlobals() from ZMController
  • adjust controller settings to follow core/mvc naming pattern
  • refactor toolbox code; allow custom tools via setting; migrate code to require $request as parameter for the instance() method (any other suggestions?)
  • zm_wordpress: do observe the syncUser flag
  • make the toolbox a property of the request as a lot of tools depend on it anyway; this avoids having to reference both toolbox and request as singleton
  • upgrade to Savant 3.0.1 (includes a bug fix for PHP5.3 compatibility)
  • zm_openid: upgrade to PHP5.3 compatible version of php-openid-2.1.3
  • make crumbtrail and meta tags properties of Request; requires minor template changes where ZMCrumbtrail::instance() and ZMMetaTags::instance() are used
  • change my mind and make crumbtrail and meta tags toolbox tools!
  • add meta tag support for categories
  • add inital work for building a full release that includes already patched zen cart sources
  • add build scripts (and other changes) to build a full ZenMagick release that already contains all file and SQL patches; also, the sideboxes are defaulted as for zencart's classic theme
  • ZMFormBean renamed to ZMFormData and moved to mvc
  • renamed ZMController::handleRequest to preProcess
  • pass $request into validator and extend ZMRule's validate method with an $request parameter
  • zm_tests: patch simpletest to get rid of deprecated use of '&' to dereference object instances
  • add new, Savant based, view helper methods to handle resources
  • convert themes to using ZMTemplateManager ($utils) for CSS
  • add custom attributes 'prefix'/'suffix' to allow to wrap CSS link elements in conditional code (HTML comments)
  • zm_minify: remove builder code and leave just the runtime
  • zm_minify: pack minify as much as possible
  • add support for template caching to ZMSavant
  • 'not available' image to be used for themes that do not include a preview image when the dummy file is generated
  • simplify file error logging in ZMLogging
  • fix strict warnings
  • replace define ZM_DEFAULT_THEME with 'defaultThemeId' setting
  • get ZMSession and Session a bit closer together
  • rename sessions getLoginFollowUp() and markRequestAsLoginFollowUp() and move to ZMRequest as markSticky() and getSticky()
  • add build patch to remove the phpBB options during install
  • add ZMOrders::restockFromOrder(..) method
  • add ZMSimpleFormPluginPage class to make function based plugin admin pages can be expired
  • add temp. setting 'zenmagick.core.plugins.useNewConvention' to enable support for new plugin naming/code conventions
  • start porting plugins for new naming/code convention in group 'general'; eventually this should replace the current 'request' group
  • make the used view available to listeners of the finalize_contents event
  • fix broken logic for using/skiping empty category pages
  • merge remaining init plugins into EventFixes class; create new settings 'verifyCategoryPath' and 'configureLocale' (both boolean)
  • make admin zmPluginPage.php and zmCatalogManager.php use the same code for invoking plugins
  • add ZMReservedQtyWidget
  • make ZMPluginView add the plugin folder as another fallback for templates and resources
  • add admin sql patch functions
  • refactor all admin pages in preparation for using regular controller for all admin pages including plugins
  • convert PluginPage classes and code to using regular controller + custom admin plugin views
  • remove setting 'zenmagick.core.plugins.useNewConvention'; will go live with this
  • ensure $request is always in the event args of the theme_resolved event
  • add contents to event args of all_done; this is read only, any changes will be lost; the reason is that it allows caching code to ensure it captures the final, final response
  • update copyright: change ZenMagick to zenmagick.org
  • quickEdit: change custom field settings from function to setting
  • add ZMAjaxPluginAdminController
  • add ajax support for plugin status; make status image clickable to toggle status
  • change full-release build to move the extras folder into install_zc
  • upgrade PasswordHash to version 0.2
  • add spyc: a simple YAML class.
  • refactor ZMUrlMapper into ZMUrlManager, adding YAML support for loading mappings
  • add ZMRuntime::yamlLoad() to wrapp spyc
  • create individual versions of init_includes used; add code to admin to load language defines for converted admin pages
  • make all ZMRule c'tor parameter optional and add getter/setter to allow using rules via bean definition
  • refactor init.php and store.php into bootstrap.php and mvc.php; (so far we'll be still using init.php and store.php, though)
  • move ob_start() from init.php to ZMDispatcher (that where the corresponding ob_get_clean() is)
  • default the requestId to 'index' if not set at all
  • update themes to use more of ZMSavant methods rather than zm_theme
  • themeSwitcher: underline the active theme
  • remove depreacted plugin utils
  • add code to load product meta tags (not used yet)
  • make bean::null resolve to null in bean definition and all other values with bean:: prefix be treated as bean definitions to actually set objects based on those definitions; also allow this syntax for property values in bean definitions
  • implement code for 'ref::' prefix similar to 'bean::' prefix with the difference that with 'ref::' singletons will be used rather than creating new objects all the time
  • make Savant compiler actually work
  • add experimental haml compiler
  • use spl_autoload_register to register the loaders resolve method rather than the magic __autoload function
  • added basic Twig plugin
  • expose all used databases via ZMRuntime::getDatabases()
  • pageStats: display stats for each used database
  • unitTests: allow to configure alternative database connection for tests
  • make ',' the default delimiter for ZMSettings::append()
  • unitTests: allow to register test cases by appending the test case class to the setting 'plugins.unitTests.tests.custom'; classes need to be in the class path!
  • unitTests: handle missing tests, allow to display messages

Release 0.9.7

  • add ZMProductAssociation service and related code
  • Move zm_token plugin into core
  • removed zm_product_associations plugin
  • add support for initQuery parameter to ZMDatabase (and ZMRuntime::getDatabase())
  • add ZMSimilarOrderProductAssociationHandler and new setting 'defaultProductAssociationHandler'
  • start migration of code into new lib folder
  • zm_firephp: fix issue with logging after response already written
  • reorganize setting names; format for custom database fields is now: 'zenmagick.core.database.sql.[table].customFields', 'zenmagick.core.authentication.minPasswordLength' now has a default of 8 if not set
  • update demo theme with new(er) json2.js script from json.org
  • fix missing 'new' in ZMProductSorter.php
  • zm_auto_login: refresh cookie on onZMFinaliseContents rather onZMAllDone; can't update headers after content has been sent!
  • zm_auto_login: change to always use token service; this might invalidate old cookies and force users to login again (once)
  • remove obsolete bootstrap.php
  • split ZMRuntime - all store code now uses Runtime
  • zm_goggle_analytics: fix conversion URL (missing '/')
  • move responsibility for model data from ZMController to ZMView [deprecate exportGlobal() and getGlobals()]
  • change all templates to use $this rather than $zm_view; remove $zm_view
  • move (and split) ZMPlugin; store and all plugins now use Plugin as base class
  • move and split ZMPlugins and make it regular service, rather than a container of static methods to make it easier to extend
  • zm_wordpress: allow to disable URL rewriting; this allows to display any WP content in store pages while linking back to the actual blog
  • zm_firephp: upgrade to FirePHP 0.3.1
  • improve ZMException's __toString() method
  • simplify and speed up __autoload handling
  • remove debug code from ZMCheckoutAddressController
  • zm_init_category_path: add option to verify (and fix) incomplete path
  • add ZMRequestHandler interface in anticipation of having a proper request object again
  • implement ZMRequestHandler in sample_plugin
  • introduce proper request instance in top levels of request processing and also templates; this requires to uninstall/install a couple plugins that generate code that will break with these changes
  • move session token validation from validator to controller
  • zm_seo2: change htaccess_samle - use main_page=categroy rather than main_page=index to display category/manufacturer data; this is required as using index will result in an ugly endless loop using ZMForwardView
  • make category and manufacturer filter SQL aware to fix page number calculations
  • remove obsolete/unused init plugins from repository; merge others into additional store init code; merged language and currency plugins into new locale plugin
  • zm_openid: fix! and upgrade to openidenabled 2.1.3
  • remove dependency onf ZMFilePatch in ZMPhpPackagePacker
  • add putFileLines, getFileLines to ZMFileUtils
  • zm_settings: fix update with incomplete values (happends after a new setting was added, but no page refresh done yet)
  • allow plugin controllers to request a page request
  • zm_settings: reverse order of forms on plugin page
  • move form widget attribute handling into base class
  • add new ZMTextAreaFormWidget class
  • split ZMToolboxHtml, moved widgets into mvc
  • add select widget and add to settings plugin
  • cleanup widgets, add manufacturer select widget
  • zm_quick_edit: convert to using widgets and simplify
  • refactor the xxxModel() methods of all database provider implementations to avoid updating fields that are not set; there remains a limit in that it is currently not possible to update columns with null
  • zm_hoverbox3: fix cut&paste errors; b:#2824026
  • changed ZMMessages::T_GLOBAL to ZMMessages::
  • zm_settings: add option to show core and mvc settings
  • zm_subscriptions: add option to do *hard* cancel of subscriptions
  • add new theme PrecisionReloaded
  • add new INIT_PLUGIN_GROUP_DONE event
  • zm_recaptcha: upgrade to recaptcha lib 1.10
  • zm_recaptcha: fix bugs as per b:#2824617
  • fix b:#2824616 - plugin globals not available in templates
  • zm_recaptcha: added option to disable captcha for registered (logged in) users
  • addded: zm_fual_slimbox
  • added test theme; this is for development only and not intended to be released at all
  • added ZMOrders::getOrderStatusList(), ZMOrderStatusSelectFormWidget, corresponding test and added new widget to options drop down of zm_settings
  • zm_settings: add special case to allow to intialize generic select dropdowns with options via the value field (create only, of course)
  • add password widget, add to zm_settings
  • add support for attributes without value ('multiple', for example) to ZMFormWidget
  • add support for widgets with multi values
  • remove Plugin methods: getKeys(), setKeys(), setTraditional(), isTraditional() zcoSubscribe(), zcoUnsubscribe()
  • zm_master_password: change to using a password widget
  • screw up most plugins by refactoring the config value handling to use widgets; this will require a re-install of all plugins!
  • allow plugins to hide widgets from plugin manager by setting hidden=true
  • log used memory as per memory_get_usage() for each event and report via zm_page_stats
  • fix regression in ZMToolboxMacro::formatAddress() [missing address line 1]
  • fix another addressLine1 regression in ZMOrder
  • add $request as first parameter to ZMController::validateFormBean()
  • always do output buffering
  • send content type header only if content type on view is not null
  • refactor SACS code and move to generic bits to mvc
  • zm_site_switch: change SQL to set a default of '' to make the more restrictive database code work
  • improve excpetion handling in ZMCreoleDatabase, add new test to test exception handling (not complete)
  • add zm_vbulletin

Release 0.9.6

  • add sanitize parameter to ZMRequest::getParameterMap()
  • add form bean code to ZMController
  • convert review form to using the new mapping based form handling and validation code
  • convert contact us form to new form bean stuff; get rid of contact_us_success view
  • convert tell a friend form to new form bean stuff
  • fix product search price filter
  • add special case to ZMRequest::getParameter() to handle checkbox form fields via a _[name] name
  • convert search to using form beans
  • remove unused class ZMReceiver
  • fix broken redeem coupon; b:#2689552
  • fix missing decimalPoint property in currencies; b:#2689542
  • convert ZMGVRdeem to form bean
  • create proper ZMWebTestCase base class for zm_tests
  • converted registration to form bean; requires new versions of phpBB plugins as the nickname field name changed
  • use ZMBeanUtils::obj2map in ZMValidator to convert form beans to maps
  • extend ZMRequiredRule (and the default validation.js) to accept multiple names either as array or comma separated string; validation is successfull if at least one of the fields is not empty
  • remove ZMModel
  • split ZMAddressBookProcessController into individual controller
  • convert zm_dispatch (and stopre.php) into ZMDispatcher (still needs store.php)
  • remove Runtime::instance()
  • introduce define ZM_BASE_DIR that is going to replace ZM_ROOT in conjunction with Zen Cart path defines (DIR_WS_xxx)
  • make loader return files per level (accross the scanned tree); this means all 2nd level files come before any 3rd level file
  • add empty ZMFormBean
  • move user types (REGISTERED, GUEST, ANONYMOUS) from ZMAccounts to ZMSacsMapper
  • another small attribute related optimization reducing SQL queries
  • allow the view (ZMView) to control the content type and encoding.
  • wrap PDOException in ZMException
  • allow to send alternative HTTP status code with redirects
  • add toolbox utils wrapper for template manager CSS/JS methods and use
  • allow controller to set the used id as c'tor arg in ZMController
  • fix zm_multi_qty issue (needs cleanup, though)
  • add order_total proxy and ZMOrderTotalPlugin class to allow plugins to act as order total
  • add new order_total plugin type
  • make plugin type list configurable
  • import initial version of zm_surcharge order total plugin
  • add admin toolbox item
  • add zm_deprecated plugin
  • make ZMUrlMapper::setMapping() throw an exception due to being removed
  • change ZMDatabase::setAutoCommit() to ZMDatabase::beginTransaction()
  • add support for nested transactions in ZMPdoDatabase (MySQL5 and PostgreSQL)
  • allow to set validation rule aliases
  • use alias to share address rules between address book and checkout; this allows now to have separate rules if required; f:#2009313
  • changed radio name of existing checkout address in list from address to addressId
  • form object name in checkout addresses changed from zm_address to shippingAddress and billingAddress, respectively (following the naming convention of the form definition in url_mappings.php)
  • merge checkout address controller into single ZMCheckoutAddressController
  • improve default address handling
  • renamted Lite.php to Cache_Lite.php to follow loader conventions
  • removed code that preloads classes as the loader now supports __autoload()
  • convert code to use new where explicitely ZM prefixed classes are used
  • add simple stats to ZMLoader and display with zm_page_stats plugin
  • upgrade admin to jquery 1.3.2
  • fix admin ajax
  • make ZMQueryPager use the database instace provided by ZMQueryDetails to allow to use this on any database connection
  • disable plugins for CLI calls (may be overridden by local.php, though)
  • add new getJSName() method to ZMRule; this allows the JS code to correctly handle multi value fields (typically checkbox groups) where the JS fieldname has a '[]' suffix
  • removed isLegacyAPI setting and all use; the pluing zm_deprecated covers most of these changes with the exception that static theme code doesn't have automatically $zm_ globals in scope
  • set initial default authentication provider to ZMSha1Authentication
  • make db mapping cache code self contained in ZMDbTableMapper
  • add more checks for empty nickName in zm_phpbb3
  • start dismantling ZMThemeInfo
  • add missing products_id parameter to 'Read Reviews' link in product_info template (default theme)
  • change default theme CSS to float the EZPage TOC on the right hand side
  • remove unused methods in ZMShoppingCart (and move into new ZMCheckoutHelper class)
  • disable zen-cart request handling for shopping cart; use checkout helper in ZMShoppingCartController instead
  • improve zm_phpbb3 (and fix some minor things)
  • add user syncing to zm_wordpress
  • fix text/upload attribute values in ZMShoppingCartItem and also cache the attributes internally
  • add new low_stock viewId to redirect to the shopping cart
  • add new methods to ZMCheckoutHelper to validate a checkout request - this can be shared between all checkout controllers and more
  • do not encode the product description on the product page; this means HTML is allowed agan ;)
  • introduce new settings for default file/folder permissions of newly created files
  • fix ZMTools::setFilePerms()
  • use new file permission defaults where possible
  • enable file permission adjustments method
  • make the static page editor default to the current theme
  • check status of ZMThemeBuilder, add status to messages, fix some typos

Release 0.9.5.1

  • fix broken price filter in product search; b:#2689495
  • fix broken redeem coupon; b:#2689552
  • fix missing decimalPoint property in currencies; b:#2689542

Release 0.9.5

  • add ZMDbUtils::buildTableMapping(...)
  • add new setting 'isEnableDBAutoMapping' to enable auto table mapping; default is false/off
  • add ZMDatabase::loadModel as the next/last step to abstract the SQL away if desired
  • change ZMBanners::getBannersForGroupName() access to protected
  • add code for banner group 2 to default theme
  • change banner code to use symbolic names rather than index
  • change getBannerForGroupName to getBannerForSet
  • zm_imagehandler2: add new plugin option to disable IH2 img attributes
  • add some initial widget code
  • review / reorganize SEO related functions - there were still cases were zen_href_link parameters got lost; affectes all SEO related plugins and core
  • add widget form utility class to allow widgets to have a go at submitted form data in case they need to twiddle with it (so far only checkboxes need this
  • fix missing calculated price on order items; b:#2544585
  • refactor and streamline admin menu handling; add ZMAdminMenu class; use ZMAdmin constants rather defines for menu ids, add new const to add items to the tools menu
  • more define/const refactoring
  • allow event subscribers to implement update(..) to receive all zen-cart events
  • add new patch to be able to filter the HTML response using zen-cart templates; this will enable most storefront plugins for zen-cart templates!
  • cache reflection data (class methods) in ZMEvents
  • convert ZMPlugins::filterRequest() into a regular event to allow non plugins to access/modify the final contents
  • add proper auto purge to ZMFileCache
  • fix ZMReviews::createReview(); b:#2560302
  • fix ignored review approval flag; b:#2563338
  • added new setting 'isEnablePlugins' to globally enable/disable plugins; default is true, of course ;)
  • rename ZMLayout to ZMTemplateManager to reflect the additional functionality; this affects most templates layout files and a few more classes
  • add cssFile(..) and jsFile(..) to ZMTemplateManager; PAGE_NOW option not yet implemented
  • change dummy sidebox patch to look at both the current ZM and ZC theme
  • change getProductIdsForCategoryId() to (optionally) work recursive to scan the category incl. all sub-categories
  • oops: random constants moved to ZMTools; b:#2588405
  • remove obsolete ZMZcoObserver
  • remove obsolete ZMSimpleResultList
  • clean up some more (c) notes
  • change shipping/billing address checking for guest checkout
  • use $session to explicitely set the languageId on service calls
  • add ZMBeanUtils::getBean() and some related unit tests
  • add new define ZM_PAGE_KEY
  • allow to override existing validation rules and rulesets
  • refactor ZMUrlMapper to use ZMBeanUtils::getBean(); this now allows to add properties to viewClass, controllerClass and formClass if required.
  • add boolean createDefaultAddress property to ZMCreateAccountController to configure whether or not to create a default address during registration.
  • allow PluginView to accept the plugin as object or string (plugin id)
  • allow optional index in SQL data names to be able to use multiple values of a column in a single SQL statement
  • remvove deprecated defines and method(s): ZMRequest::getRequestParameter(), ZMPlugin::filterResponse(), ZMPlugin::setLoaderSupport(), ZMPlugin::getLoaderSupport(), ZMTools::ui2date(), ZMTools::parseDate(), ZM_DB_xxx defines, ZMObject::create(), ZMPlugins::filterResponse()
  • add code to support SQL based pagination via result lists and prepare to use it
  • add ZMSQLAware support to ZMOrders
  • add initial ZMSQLAware support to ZMObjectResultSource (no filter/sorter support yet); this should speed up things in admin a bit where longer lists need to be handled
  • make sure that plugins are found if no plugin status cache is set yet - thanks William for letting me have a look at that; b:#2634910
  • add PasswordHash (http://www.openwall.com/phpass/) with a slight modification to allow to change the hash identifier
  • allow create/update/remove model methods to handle array data
  • make auto DB mappings work on non default databases
  • fix SQL generation to ignore properties/columns not set on a model object
  • add new authentication provider using phpass; http://www.openwall.com/phpass/
  • avoid using plugin globals
  • remove use of $zm_order global from zm_google_analytics plugin; b:#2639645
  • change default of 'isEnableDBAutoMapping' to true
  • add new PASSWORD_CHANGED event to allow 3rd party integration plugins easy access to changed password (in particular requesting a new password was tricky/impossible to track)
  • use anchor elements to return to active plugin in plugin manager
  • make plugin handling more stable in plugin manager
  • ensure proper init before a plugin is installed/removed
  • add message type constants
  • implement basic support for sql aware sorters and filters
  • add SQL script to (re-)create zen-cart's initial tax setup (which is part of the main SQL, not the demo data)
  • make all service tests pass with dropped/reloaded demo data (and the tax settings)
  • zm_tests: mark skipped tests gray
  • convert ZMProductFinder to using ZMDatabase
  • rename ZMProducts::getProducts() to getAllProducts()
  • make simple search use query pager to paginate results from ZMProductFinder
  • change search sidebox to use the new simple search
  • add sql aware support for ZMProducts::getProductsForCategoryId
  • remove advanced_search_result.php from default theme, mark ZMAdvancedSearchResultController as deprecated
  • more improvements to discount calculations
  • move code depending on Runtime::getDB() from ZMDbUtils to ZMZenCartDatabase
  • re-added ZMPdoDatabase and improved on the last known version
  • change TestZMDatabase to run all tests on all supported implementations
  • add db test for value arrays
  • inherit from ZMObject rather than ZMModel, unless it is really required
  • remove obsolete zm_split_page_result_list plugin

Release 0.9.4.2

  • improve ZMAjaxController::flattenObject(); using ZMBeanUtils, correct handling of hasXXX() properties
  • allow to ignore generic ZMObject properties in ZMBeanUtils::obj2map() by adding a new optional parameter
  • upgrade admin to jquery 1.2.6
  • extract JSON properties of products, cartItems, countries, zones into class properties to allow to modify them in subclasses
  • remove max-width of #content div in default theme to accomodate higher resolutions
  • change internal category cache in ZMCategories to protected to allow sublcasses access
  • add GV FAQ; b:#2508343
  • change ZMObject's bean behaviour to report undeclared class properties as warning
  • add ZMObject::attachMethod(..) to allow dynamic method resolution/injection
  • fix broken edit-new-file in static page editor; b:#2511994
  • upgrade zm_openid to use version php-openid-2.1.2
  • add code to ZMAjaxController to allow using method injection
  • handle generic properties (ZMObject) in BeanUtils::obj2map if properties are explicitely set
  • fix bug in generic getXXX()/setXXX() code in ZMObject
  • change setting isEnableZenMagick to isEnableZMThemes to make it clearer what the setting actually does; also some code changes to exclude more code and leave admin working ;)
  • code cleanup: use in_array rather than a combination of array_flip and array_key_exists!
  • add getProductTypeIds() method to ZMCategory; f:#2522171
  • allow to configure Ajax access/authentication on method level; $page format: [page]#[method]; for example 'ajax_catalog#getProductForId'

Release 0.9.4.1

  • add support for DB transactions in controller code [ZMController::process()]
  • add ZMDatabase::getConfig() to allow to retreive the db configuration
  • add ZMDbUtils::resolveSQLFilename(..) to allow loading of DB driver specific SQL from files following the convention [name]-[driver].sql; example: install-mysql.sql
  • fix SQL patch spelling mistake that breaks installing ZenMagick SQL; b:#2487507
  • fix broken ZMProducts::getProductForModel(); b:#2487519
  • use new ZMDbUtils::resolveSQLFilename() method in plugins that require SQL
  • fix catalog manager's product list
  • fix zen_href_link override to use the toolbox if available to re-enable SEO for code that still uses this function
  • fix catalog manager warning that shows up if no plugins installed; b:#2497431
  • fix getManufacturerForId broken if id parameter empty or null; b:#2497461
  • do not show Plugins menu item for catalog manager plugins; b:#2497486
  • use preg_xxx instead of ereg_xxx
  • remove unused and undocumented parameter from ZMAjaxController::toJSON()
  • remove core/ext/JSON.php and use native 5.2.x json methods instead
  • upgrade zm_firephp to FirePHP 0.2.1

Release 0.9.4

  • prepend log messages with log level labels
  • change ZMCache signature; updated all cache using plugnis!
  • fix zm_site_switch: sql created different column than code expects! b:#2384579
  • use configured themeId to lookup static contents and boxes layout info; [this will make a difference only if the theme id is explicitely set using Runtime::seThemeId(...)]
  • decouple cache type from actual implementation
  • add memcache cache provider
  • make group text clickable in cache admin
  • fix missing review sidebox image; b:#2384599
  • fix b:#2387935; display configured site switch data
  • more define/const refactoring
  • make zm_page_stats create valid HTML/XHTML
  • add ZMPlugin::getConfigPath() to allow plugins to store user/config data in a separate area
  • try to ber good with file permissions
  • add Salemaker service
  • get a bit further with rebuilding the price lookup code
  • create theme dummy for ZenMagick default theme
  • add xcache based cache provider
  • move resolveZCClass from ZMLoader to ZMTools
  • update copyright / author note of pure ZenMagick files (not complete)
  • create and use new plugin loader policy constants
  • refactor setting downloadOrderStatusList to downloadOrderStatusRange
  • deprecate ZM_FILENAME_xxx defines
  • deprecate ZM_ADMINFN_xxx defines
  • retire ZM_THEME_xxx defines
  • show PayPal Express Checkout button on shopping cart; b:#2415830
  • deprecate ZM_DB_xxx defines except for ZM_DB_PREFIX
  • fix broken zm_product_resultlist() function (drives the products list in CatalogManager)
  • replace rating star images with contributed from http://www.zenflavor.com/category/free-images
  • update to latest creole version (1.2.0 svn snapshot)
  • add PDO ZMDatabase provider - ZMPdoDatabase (not complete)
  • add new setting 'isSetFilePerms' to allow to enable file permission fixing; disabled as per default
  • change ZMTemplateManager to allow to rewrite resource urls
  • add basic zm_minify plugin
  • introduce new mvc ZMSession class (not used as not compatible with zc session handling)

Release 0.9.3

  • prefix all variables used in init.php and store.php with _zm_, as some might conflict with zm_wordpress
  • add support for permalinks to zm_wordpress (Apache httpd only)
  • set authorization flag properly for new accounts
  • fix broken gv_mail emails; b:#2090853
  • zm_site_switch: improve db access code, fix view warning
  • fix broken use of deprecated $zm_xxx global
  • add support for new ZM_EVENT_CREATE_ORDER event
  • fixed some confusion about ZMOrder::status - needs template changes to: * resultlist/order.php * emails/order_status.html.php * emails/order_status.text.php getStatus() changed to getStatusName() [read only]
  • make custom fields work properly on orders table
  • zm_auto_login: update cookie only if it exists; otherwise a new cookie will be set even with opt in enabled!
  • zm_cron: fix broken 'Missed run policy' setting
  • zm_cron: supress warning if history file is not found (which will happen the first time the plugin is run)
  • switch to proper logging service; add new setting to allow to configure the actual implementation: 'loggingProvider'
  • catch controller exceptions
  • zm_page_stats: handle exception if available
  • removed unused setting 'defaultProductSortOrder'
  • move plugin init further up; this means plugins can't use the legacy globals any more
  • add class loader support for filesnames a la [class name].class.php
  • improve logging
  • add exception handler to ZMLogging
  • change ZMRegexpRule to use preg_match and be case sensitive
  • add licence files for compressed 3rd party libraries
  • add new optional parameter to ZMToolboxMacro::productPrice() that allows to explicitely enable/disable tax
  • add/improve unit tests
  • move who's online code into plugin
  • add ZMTestCase base class to allow comparing arrays
  • add first draft of a product finder (not yet used)
  • fix broken catalog manager category tree
  • reworked the result list classes and related code; this requires a simple template change, as ZMResultList::getCurrentPageNumber() changed to ZMResultList::getPageNumber()
  • made resultlist package a sub-package of rp
  • add simple meta data support to ZMDatabase
  • fix broken admin ajax support
  • rename zm_php_bb to zm_phpbb2
  • allow array($obj, "method") as function parameter for ZMWrapperRule
  • improve for custom database connections
  • make nickname read-only in account_edit
  • add ZMPluginPageController class and allow plugins to use that to generate admin page content
  • add support for keyword to views/resultlist/options.php to make the new simple search page work
  • rearrange page title of all admin pages
  • refactored bits of order status handling; this changes the meaning of the id property on ZMOrderStatus! instead of setId() to set the order status type you'll have to use setOrderStatusId() instead
  • remove dependency on zen-cart's order class from ZMOrders
  • prepare zm_tests to allow to display single tests (methods), run tests in controller rather than view, prepare ZMHtmlReporter to allow excluding tests
  • add support for content files in plugins [ZMPlugin::pluginURL(..)]
  • use treeview to display unit tests
  • convert ZMReviews and ZMTaxRates to using ZMDatabase
  • change ZMLoader::findIncludes() to allow controlling the filename suffix
  • allow to manually register classes
  • convert zm_cross_sell to using ZMDatabase
  • add ZMOffers::getQuantityDiscounts()
  • add new ZMListRule class to validate against a list of values
  • add first draft of ZMBeanUtils class
  • change product and manufactuer URL methods to use Url (getUrl()/setUrl())
  • various db related improvements/fixes that affect ZMCreoleDatabase
  • add ZMToolboxMacro::buildQuantityDiscounts
  • refactor some of ZMLoader; remove dependency on ZM_SINGLE_CORE define, soften inheritence requirement from extending ZMObject to at least one parent starting with the set prefix ('ZM'), add some tests
  • allow to set login redirect URL as request parameter (redirect=)
  • optionally cache parsed database mappings
  • allow to configure controller class for page (name)
  • add ZMUrlMapper::setMappingInfo(), remove secure=true from URL mappings as that information should be taken from the sacs mapping
  • change ZMController to use sacs mapper to ensure views have the correct secure flag value set
  • add authentication manager
  • use authentication manager and implementations; sha1 implementation requires at least 49 chars to store the encrypted password, so the db needs to be changed in order to use
  • improve update bahavior of the quick edit plugin; update only product that actually changed, load immediately before update to keep the time window for stale data as small as possible
  • update master password plugin to use new auth code
  • move account type constants into ZMAccounts
  • move event constants into ZMEvents
  • remove code to handle setting 'isLogMissingSettings'
  • remove legacy support for plugins - seeing that I maintain all plugins I guess that should be ok
  • make quick edit detect stale data and skip affected products/updates
  • show tab related error messages in catalog manager
  • improve local.in.php a bit, rename settings.php and zenmagick.php to defaults.php and constants.php, respectively
  • rename local.in.php to local.php.in to make it clearer that the file needs to be renamed in order to be useful
  • removed incomplete ZMPdoDatabase
  • add ZMDatabase::removeModel(..)
  • populate manufacturerId in case there istn't a info record; b:#2500202
  • fix broken currency selection box; b:#2497530

Release 0.9.2

  • add database support for data type blob
  • add ZMModel::populateCustom($table) to populate custom fields
  • add zm_openid
  • set content type for views as 'text/html; charset='.HTML_CHARSET
  • make ZMToolboxHtml::encode() preserve exising entities in strings
  • make admin language tool mark duplicate mappings and add inline warnings if duplicate keys with different values exist; b:#1993788
  • add missing support for blocking accounts
  • added new event to track account creation (ZM_EVENT_CREATE_ACCOUNT)
  • make backtrace more readable
  • ZMDatabase: * add support for date and datetime * define fixed format for ZMDatabase API date and datetime formats (this means all dates and datetimes will now have to follow that format.
  • make all date related operations use ZMTools::translateDateString, rather than using a mixture of zen_date_raw, ZMTools and PHP functions; this means date formats all use the same syntax (dd, mm, cc, yy (or yyyy), hh, ii, ss) it is still possible to use PHP date/time functions on model date values, though
  • add 'dbMappings' setting pointing to the db mapping file (relative to ZM root)
  • make date validation smarter
  • refactor some code in ZMAddress; this requires a simple change to address.php, to get the countryId using $address->getCountryId() rather via the country itself; create_account.php needs update, too
  • add transparent support for using value lists to ZMDatabase (and implementations)
  • fix category admin plugin to update only if actually active
  • make db table mapper a proper service to allow dynamic additions (plugins)
  • cache cart items in ZMShoppingCart rather than recreating every time
  • make ZMPopupView obsolete by adding a new subdir property to ZMView
  • extend ZMLoader to allow plugins and other code to include files as true global
  • fix potential issue with wrong shipping cost due to multiple order instances created
  • allow plugin property to be set on ZMPluginView - that allows to create proper mappings rather than returning hardcoded view instances.
  • add support for subdir to ZMPluginView; now a plugin may generate storefront view contents by: a) having a view template in the plugin folder b) having a view template in a subdirectory of the plugin folder c) providing a function to generate the contents
  • changed all plugins to have plugin settings start with plugins. rather plugin.
  • added two new events: ZM_EVENT_LOGIN_SUCCESS, ZM_EVENT_LOGOFF_SUCCESS
  • allow optional fieldName/property as third parameter for custom SQL fields; eg: ZMSettings::set('sql.customers.customFields', 'site_id;string;siteId');
  • allow zm_site_switch to enforce separate accounts per domain (for the same email address)
  • try to set owner/group of new theme files to something useful; f:#2002830
  • add generic event when generating emails: ZM_EVENT_GENERATE_EMAIL; this will allow listeners to modify the eventual email view context
  • add gv_mail email templates and supporting code
  • make $language available to all email tempalates
  • move all code to extract template vars from email templates to ZMEventFixes; this might need some changes to email templates (see default templates)
  • var name for new passwords changed from $newPassword to $password
  • add qv_queue email templates (and supporting code)
  • add new patch to make coupon_admin mails usable
  • add new coupon email templates
  • add setting 'downloadOrderStatusList' as list of enabled order stati to show downloads
  • add ZMDownload model class (not used yet)
  • make plugin order consistent (as per API docs ordered by sort_order/name)
  • add support for view functions even if layout is null
  • added zm_tests plugin
  • fix a few pricing regressions :/
  • added new setting 'tokenSecuredForms' to allow configuration of forms to secure with session token
  • added support POST forms with session token (hidden field with name ZM_SESSION_TOKEN_NAME); f:#2013028
  • make ZMRegexpRule pass if field is empty
  • reimplement SQL in ZMOffers using the already loaded product / attribute data
  • deprecate zm_get_online_counts()
  • moved remaining zm_ wrapper functions from zen_bridge to deprecated/misc
  • moved zen_href_link() replacement into zenmagick_zencart_overrides.php
  • do not encode module output during checkout as it might contain HTML...
  • properly implement unsubscribe (default or anonymous)
  • added setting 'isAllowAnonymousUnsubscribe' to allow unsubscribe without logging in
  • fix access setting for account_newsletters
  • changed plugin startup to first load all plugin types before calling init; this allows plugins to safely override classes before any instances are created;
  • change plugins so custom fields are set in c'tor to have all fields set up before any instances are created
  • make all plugins append custom fields, rather than just set! (openid, site_switch)
  • add new plugin zm_dual_pricing to support the dual pricing mod
  • add ZMSettings::append(..) which should be useful to set custom fields without overriding others
  • renamed ZMBanners::getBannerForName to getBannersForGroupName
  • make ZMBanners return no results if no identifiers are set for a group
  • add transaction support to ZMDatabase (not used, yet)
  • modify ZMDatabase to allow to return raw SQL data from query() and update()
  • start with exceptions (database)
  • allow to set arbitrary attributes on generated HTML; f:#2033441
  • fix zm_site_switch (missing global...)
  • extend zm_google_analytics
  • added auto_login plugin
  • add customer_authorization view
  • add init plugin to check for pending authorization
  • add new settings 'resultListProductFilter' and 'resultListProductSorter' to allow to configure filter and sorter
  • replace ZMSearch with ZMSearchCriteria in preparation for a replacement of zen-cart's search code (refactored to fit into the updated result list system); required template changes to advanced_search.php
  • move result list back/next url generation into the toolbox
  • strip dash '-' from class names; b:#2063126
  • add inital refactoring of result list code
  • fix price sorting; b:#2019589

Release 0.9.1

  • zm_custom_validate_password in zm_master_password does not return a reference!
  • fix invalid/short PHP tags
  • always enable HTML echo'ing in admin
  • make fields for zm_quick_edit plugin configurable; this also includes support for custom fields via generic get/set methods
  • add categoryId parameter to zm_product_href; this requires changes to a few templates that use the echo parameter
  • add categoryId parameter to zm_product_image_link(..); together with the previous change this allows to preserve the categoryId for category listings
  • add group pricing service, fix spelling mistake: _newPriceGgroup() rather than _newPriceGoup()
  • disable caching of ajax requests (otherwise cart contents, etc would be cached...)
  • remove code that added form parameter to the form action (this was done to get around some bits of zen-cart code that were looking at $_GET and $_POST at the same time...)
  • add function zm_ui2date()
  • add ZMService::map2obj(..)
  • change the i18n file patch to make theme date settings work in admin
  • make plugin scope more efficient
  • changed loading of static code which stops static variables from being globals
  • start implementing singletons to replace all zm_ globals
  • streamline init process (in particular when not using core.php)
  • removed obsolete ZMDao class
  • removed all $zm_loader references; there is a new setting 'isLegacyAPI' that may be set to true to keep creating zm_xxxxx globals
  • get rid of ZMService::getDB()
  • mark ZMService deprecated; use ZMDbUtils methods instead
  • moved zm_log and zm_backtrace into ZMObject
  • refactor ZMRuntime and make all methods static; some of the theme related methods moved into ZMThemes
  • made ZMAttributes a proper service
  • moved ZMOffers into model/catalog
  • added a simple request based cache to ZMProducts
  • removed function zm_call_zc_page(..) and updated external.php accordingly
  • removed document_product_info.php view; there is no difference to the default product view and ZenMagick does not support any document specific things
  • moved features code into zm_product_features plugin; this requires changes to the product_info view template
  • merged zm_stripslashes into zm_sanitize
  • use empty where possbile rather than zm_is_empty(); made zm_is_empty a simple wrapper around empty rather than trying to be clever
  • removed zm_fire_event()
  • add ZMProducts::getProducts()
  • add zm_hoverbox3 plugin
  • refactored caching
  • get rid of ZMPluginHandler
  • convert ZMRequest methods into static ones, make $zm_request obsolete
  • move cache admin page back into core, remove from zm_page_cache
  • refactor cache code, add remove method to remove expired cache entries
  • remove most global statements!
  • make $zm_view and $zm_theme basic view variables, but not actual globals!
  • add support for generic getXXX()/setXXX()/isXXX() model methods via the magic PHP5 method __call(..)
  • fix wrong error message in installation page when main.htaccess file does not exist
  • fix tag and entity handling in static page editor (thanks, Matt)
  • make the random product access methods in ZMProducts reliably return the expected number of results (or as much as possible)
  • allow custom form element functions to customize zm_quick_edit fields
  • dropped individual result list pagination settings in favour of a single setting 'defaultResultListPagination'; changed templates where appropriate to set individual pagination
  • add ZMResultSource interface and ZMObjectResultSource (default) implementation
  • add a (incomplete) interface ZMDatabase as a thin database layer; this should make switching to another db package easier once all databse access is replaced with the new code; also, this will focrce completing the missing bits in the model classes as it uses object - array mappings and back
  • moved zm_sql_patch(..) into ZMDbUtils::executePatch(..)
  • remove obsolete ZMService
  • remove deprecated zm_shipping_id(..)
  • removed setting 'flagMaxColumns' - this should be coded in the template
  • marked zm_setting, etc functions as deprecated, the new (and hopefully final) way is ZMSettings::get(), ZMSettings::set()
  • cleaned up local.in.php
  • removed the following settings: 'firstNameMinLength', 'lastNameMinLength', 'phoneMinLength', 'addressMinLength', 'postcodeMinLength', 'cityMinLength', 'stateMinLength', 'passwordMinLength'
  • fix new products query (date restriction)
  • remove 'isDisplayTimerStats', add zm_page_stats plugin
  • removed setting 'isShowCategoryProductCount'; default behaviour is now to show the count
  • removed setting 'isPageNotFoundDefinePage'; default is to show static page content
  • removed setting 'isSiteMapAccountLinks'; default is now to show account links
  • removed setting 'isEnableUnsubscribeLink'; default is to show the link
  • removed setting 'isContactUsStoreAddress'; default is to show the address
  • removed setting 'isCustomerProductNotifications'; default is to show notofication options
  • changed the default for 'isLogoffGuestAfterOrder' from true to false
  • do no use page cache for POST requests
  • if 'isLogoffGuestAfterOrder' is set to true, logout user only *after* the checkout success page is shown (that means isGuest() will still return true in checkout_success.php)
  • changed default for 'isLogoffGuestAfterOrder' from true to false
  • removed settings isShowEZHeaderNav, isShowEZBoxesNav, isShowEZFooterNav
  • removed setting isShowCrumbtrail
  • removed settings isEnableLeftColumn and isEnableRightColumn
  • added etc/legacy_settings.php; this can be copied into zenmagick/core/settings to re-add removed settings to make old themes work
  • removed setting 'maxRandomReviews'
  • drop 'globalNewProductsLimit' and use 'maxNewProducts' instead
  • removed setting 'isReviewsDefaultToRandom'; reviews sidebox changed to implement this rather having this rather obscure behaviour in ZMReviews
  • added new setting 'maxRandomReviews'
  • specials view was missing result page navigation
  • added new setting 'isLogMissingSettings' with a default of false as this was starting to annoy me
  • addes option to remove cache entries
  • removed a ton of PHP4 constructor methods
  • decouple services (and other classes) instance method from ZMObject's instance() method (renamed to singleton())
  • changed the init code to require the language and category path init plugins
  • add Creole based ZMDatabase implementation (not yet complete)
  • removed unused function zm_check_stock(..), zm_get_info_page(..)
  • deprecate ZMProduct::isAttributePrice() use the existing ZMOffers method instead
  • remove unused function zm_has_product_attributes_values(..)
  • added setting 'isShowCartAfterAddProduct'
  • make products in category lookup perform much better than before (it's now a single query plus some array juggling)
  • made ZMLoader::create(..) protected to force use of ZMLoader::make(..) instead; affects 2 boxes, 2 views and 1 popup
  • add (limited) update functionality to category maintenance
  • streamline category handling
  • make ZMEvents log events and allow zm_page_stats to show those
  • encode address output and improve phpdoc; b:#1937505
  • remove invalid HTML from error view
  • add mappings for category/product not found and map to error page as default
  • fix null errors when trying to display non existing category/product; b:#1937559
  • add new setting 'isShowBacktrace' to either show backtrace as before, or to just create an error log record
  • fix broken guest checkout validation, add missing URL mapping to re-display login when validation fails; b:#1937568
  • fix wrong date field names in advanced search form; b:#1937582
  • make ZMProducts::getFeaturedProducts(..) work as expected; b:#1937548;
  • add new parameter to ZMProducts::getFeaturedProducts(..) to allow inclusion of child categories
  • add always free shipping property to ZMProduct; f:#1937525
  • added ZMLayout::getFieldLength(..) to replace usage of zen_field_length(..); also the meta data is cached, so should slightly reduce db access
  • fix broken gv_send form validation
  • add new validation rule ZMMaxFieldLengthRule that validates max length based on the corresponding database column length
  • added field length validation for address, account and gv-send; f:#1937566
  • do not hide primary address checkbox in address edit page when ticked and validation fails; f:#1937628 (template change in address.php)
  • change login logic to show the login page to guest users when they try to access resources that require full registration
  • add initial toolbox version; enable isXHTML setting as this will be supported by the toolbox
  • add ZMLayout::getProductTemplate() and ZMProducts::isQuantityAvailable() and use
  • moved zm_media_href into the zm_music_product_info plugin
  • moved zm_list_values into zm_product_features plugin
  • add out of stock warning/error for shopping cart; f:#1937570
  • sort reviews in revers order of date added; f:#1937532
  • introduced ZMTools as container for various helper methods
  • added new setting 'isLogPageStats' to be able to switch off page stats that may be via web stats tools; currently this are page and review stats
  • allow to enter two char zone/state code
  • distinguish between guest and registered users on order status email
  • execute email views always with 'isAdmin' set to false to allow proper URL generation
  • clear advanced search default from/to date before executing a search
  • add optional notify parameter to some cart methods (will be passed on to the underlying zen-cart code); f:#1963535
  • change zm_page_cache to be opt-in rather out-out; re-organized settings, updated Readme and simplified a couple things; f:#1937578
  • make zm_page_stats handle the new stats event fired by zm_page_cache
  • make ZMAccounts::getAccountForEmailAddress(..) find only registered accounts
  • initialize DOB_FORMAT_STRING with the value of UI_DATE_FORMAT; (moved to zc_fixes)
  • Change suggested filename for Language Tool downloads to l10n.php
  • make the methods getProductsForCategoryId and getProductIdsForCategoryId in ZMProducts use the same logic to guarantee the same sort order, number of results, etc.
  • disable zen-carts product id check to allow the error page (or product not found, etc) to be displayed properly (and not only every second request!)
  • make ZenMagick resolve themes in admin too, as this is required to pick up the appropriate email templates!
  • add Runtime::getDefaultLanguage() - right now this defaults to 'en' as we know that it exists!
  • added new setting 'storeDefaultLanguageId' to be used by Runtime::getDefaultLanguage()
  • added ZMSettings::exists() method to allow for unambiguous checks for existence of settings

Release 0.9.0

  • move cache manager page from core to zm_page_cache plugin
  • added ZMShoppingCartItem::getProduct()
  • make zm_catalog_tree support displaying products
  • use create(..) rather than new to create new ResultList instances
  • add custom result list for products to allow to replace with custom class; this will make the zm_split_page_result_list plugin a lot easier and allow to use the same code also in the admin area
  • move admin zm_category_tree function into core/admin/html.php rather than sitting in a zen-cart folder; requires deleting the file manually
  • properly populate a products status (changed to boolean)
  • add parameter to allow to query all products (ignoring the status)
  • make zm_href() and zm_secure_href() work in admin pages
  • add simple zm_product_resultlist() admin function for plugins to use
  • rename ZMPlugin::getOrder() to ZMPlugin::getSortOrder() and add setter
  • optimize themeId lookup
  • add support to set the selected (zen-cart) theme id
  • add (default) option in theme builder to automatically create dummy files and select a newly created theme
  • added new setting 'invalidSessionPage' (default is FILENAME_COOKIE_USAGE)
  • fixed bug to show a session/cookie required page if neccessary; #1836136
  • moved tax rate from ZMShippingProvider to ZMShippingMethod
  • add method to ZMShippingProviders that allows to calculate shipping for a given address
  • added a static page editor that supports editing static (define) pages in the theme's language directories; this will show up only if 'isZMDefinePages' is set to true
  • fix ZMCategory::getImageInfo()
  • changed a couple template files as the method getStaticPageContent() changed
  • added default theme static pages
  • enabled usage of theme static pages for the demo theme via it's local.php file
  • set static pages located in the theme's language directory as default; this will break sites using traditional define pages, so either revert this by setting 'isZMDefinePages' to false, or copy your files from includes/languages/english/html_includes/YOUR_THEME/ to zenmagick/themes/YOUR_THEME/lang/english/static
  • ensure that ZMOffers does not divide by 0; #1868900
  • fixed ZMReviews::updateViewCount()
  • build the category tree on first access
  • renamed ZMAjaxProductController to ZMAjaxCatalogController
  • remove obsolete ZMAjaxCatalogController::getAttributesForProductIdJSON()
  • make zm_ajax_href work in admin pages
  • make themeId case sensitive
  • use ZMRequest::getSession() rather than new ZMSession()
  • make the following methods deprecated: Runtime::getLanguageId(), Runtime::getLanguageName() and Runtime::getCurrencyCode(); this change affects a large number of files including the currency sidebox and the plugins zm_page_cache and zm_product_music_info
  • explicitely display the coupon code in gv_send emails
  • populate coupon code for gv_send with dummy text for gv-send_confirm
  • remove support for 'isPageCacheEnabled', both in ZenMagick (local.in.php) and in the zm_page_cache plugin
  • let plugins decide their type rather than assume it from the plugin folder
  • make new catalog tree a proper tree
  • remove plugin type change as this breaks a lot of stuff (will revisit)
  • add more jquery stuff
  • fix bad method name in ZMTellAFriendController
  • add new setting 'sqlProductFields that allows to query custom product fields; data can be accessed using the generic get() method: read only ATM
  • change the new 'sqlProductFields' setting to something more generic; the setting format is: 'sql.[table name].customFields', where [table name] is the table name without the prefix
  • add (limited) update functionality to ZMProducts; this changes the format of settings for custom fields to: fieldname;type,fieldname;type,...
  • add new setting 'admin.isShowCatalogTreeProducts' for the new catalog manager
  • replace the current catalog manager page with a new, plugin based, version
  • removed type parameter from ZMPlugin constructor
  • added scope property to ZMPlugin and support during init
  • move plugin init code into separate function
  • fix plugin support mode 'FOLDER' for core.php
  • add (very limited, status only) update method to ZMOrders
  • cleanup ZMOrderHistory, add orderId property
  • marked ZMOrder::getOrderStati() deprecated; instead use ZMOrderi:getOrderStatusHistoryForId() or ZMOrder::getOrderStatusHistory()
  • add method in ZMOrders to create order status history entries
  • make zm_format_currency default to the setting 'defaultCurrency' if no other currency is found (this will make it work in admin)
  • allow to search for orders by status id
  • add custom field support to ZMManufacturers
  • add support to load/update the account (price) group id
  • changed the constructor signature of ZMCategories
  • refactored ZMCategories (again!) to properly allow languageId as optional parameter;
  • fixed bug in index controller that would not create an empty result list if the category is empty
  • make ZMCategory have a proper default constructor
  • make language selection in static page editor actually work
  • change ZMTheme to use languageId rather than languageName for static page content methods (languageName was actually the directory to mak matters worse!); also non existing language directories are now created on save
  • add setting 'defaultAccessLevel'; default is null so no change; however, setting this to ZM_ACCOUNT_TYPE_REGISTERED would mean *all pages** require to be logged in (unless configured differently)
  • introduce ZM_FILENAME_CATEGORY and refactor most of ZMIndexController into ZMCategoryController
  • fix billing address controller
  • patch zm_useo2 to support ZM_FILENAME_CATEGORY
  • update demo design, add view source (sorry!)
  • add setting 'isEchoHTML' that allows to control the default value of the $echo parameter, that most HTML generating methods and functions have
  • improve zm_smarty plugin by adding a function proxy class that can be used to access ZenMagick (and other) functions without having to write wrapper plugins for each and every function
  • use new 'isEchoHTML' setting to disable echoing of HTML, so there is no need to explicitely set that parameter in Smarty templates every time
  • make ZMThemes more tolerant when hittin invalid themes
  • add 'product_not_found' view as custom error page for products not found or unavailable

Release 0.8.6.1

  • fix hardcoded tablename in ZMBanners; #1856664

Release 0.8.6

  • added setting 'isAccountNickname' to control use of nickname in account creation
  • removed Runtime::isBBActive(); this requires a couple template changes; please refer to the default theme changes to see what needs to be done
  • removed Runtime::reconnectDB()
  • removed all phpBB references (functions, nickname validation, controller code) plus the settings 'isEnablePHPBBLinks'
  • fix nickname population in ZMAccount
  • fix broken ZMView::getMappingId()
  • populate nickname when loading accounts from db
  • use user name/email address for contact us email sender details (so reply to email will reply to user, rather than the store email)
  • fix missing crumbtrails when form submission fails
  • added new settings 'isEnableStock' and 'isAllowLowStockCheckout'
  • do not use printf(..) if no parameters are given to replace '%s' or similar
  • added generic properties support to ZMModel; this means it is is now possible to attach custom properties to all model classes
  • add code to evaluate cPath directly rather than use zen-cart's code (not active yet)
  • add support for init plugins (no loader support, so single file only please)
  • added convenience method ZMCategory::getImageInfo()
  • remove 'Popup ' prefix from popup window titles
  • added coupon help popup
  • fixed some PHP4 related coupon restriction issues
  • removed dependency of ZMLanguages from zen-cart's languages class;
  • added zm_get_browser_language() as described at: http://zencart-solutions.palek.cz/en/multilanguage-zencart/default-language-by-browser.html
  • added settings 'isUseBrowserLanguage' and 'defaultLanguageCode'
  • make plugin code respect plugin sort order
  • use init plugins only for storefront
  • rename getCurrencyId() to getCurrencyCode() where appropriate to reflect the fact that we are dealing with the code rather than the id
  • refactored tax calculation; this includes: * removed zm_add_tax() and zm_get_tax_rate() * added new ZMTaxRates service ($zm_taxes) * taxRate is now of type ZMTaxRate rather than float
  • changed ZMCategories service to lazy loading - this should help requests that do not need categories, for example some Ajax calls
  • simplify follow up redirects by accepting a URL property in ZMRedirectView
  • add language support to ZMManufacturers
  • add redirect controller and other related bits + pieces
  • show sort order of plugins in admin
  • add reimplementations for a couple zen-cart functions
  • add coupon balance update to ZMCoupons.php; this was missing redeeming coupons and would result in the coupon value just disappearing rather than being credited
  • changed checkout_success to reflect the fact that the 'continue' button is, in fact, just the update button for the product notifications
  • removed defunct ZMTheme::isValidRequest(..) and ZMController::validateRequest()
  • fix delete address (address book); #1843152
  • removed setting 'seoEnabledPagesList' from core; both zm_seo2 and zm_seo3 support this as a plugin specific setting, though
  • removed now obsolete function zm_useo_enabled()
  • removed pretty link support from core
  • added support for optional function zm_build_seo_href(..) which will be used for link generation if present
  • modified both zm_seo2 and zm_seo3 plugins to support the new SEO API
  • removed now obsolete setting 'isZMPrettyLinks'
  • added pretty links plugin
  • removed main .htaccess file as this moves as sample configuration into the new plugin
  • add support using the configured default image if product image not set; #1844024
  • make gvredeem actually credit the redeemed amount; #1842973
  • added a new plugin that uses zen-cart's SQL based result list handling. This should be preferrable for very large categories
  • uncommented code to update view counts for products and reviews which previously were not needed when still using zen-cart's header_php.php
  • make templates more consistent in the way a non existing shipping address is handled; also make address formating default to store country for formatting if no address found (even though this should never happen)
  • file change list is now sorted and file names link to subversion
  • move default crumbtrail handling back into default controller
  • wrap all messages in zm_l10n_get(..) calls (thanks Markku)
  • added ZMPlugin::setPreferredSortOrder(int); this allows plugins to set their preferred (initial) sort order
  • added new event ZM_EVENT_THEME_RESOLVED/onZMThemeResolved(); the parameter map contains 'theme' => $theme.
  • move page caching into plugin; note that the default caching strategy function name changed, so make sure to use the setting 'pageCacheStrategyCallback' to pick up the current setting; This also requires to delete a few classes/files to avoid conflicts
  • fix bug in zm_useo2 that will cause the plugin not getting installed due to the USEO code removing all %SEO% configuration settings during install!
  • for a guest order history make sure the given email address matches the email address of the order to authenticate; #1852133
  • change all layout files to use the configured 'HTML_CHARSET' rather the hardcoded 'iso-8859-1'
  • use 'HTML_CHARSET' setting for calls of both htmlspecialchars() and htmlentities
  • renamed ZMOffers::getDiscount() to getDiscountPercent(), added a new function getDiscountAmount()

Release 0.8.5

  • add 'php_flag register_globals off' to main .htaccess file
  • fix wrong price when product is free and sale/special set
  • streamlined some ZMProducts SQL to make the results more uniform (different lookups would result in different product attributes populated)
  • added ZMProduct::getAverageRating() convenience method
  • add missing URL mappings for popups
  • rename setting isEchoJSON to isJSONEcho and add isJSONHeader setting to allow to return onr or the other or both; default is now to echo
  • set crumbtrail in POST processing for create_account
  • added new plugin loader support mode 'FOLDER'; this is similar to 'ALL', just not recursive which is handy if you want to include PHP files that can't be added to core.php
  • enable session handling in external.php to be able to read the account type from the session data
  • added new setting 'templateSuffix' with default of '.php'
  • refactor ZenMagick's .htaccess files using Limt rather than LimitExcept
  • added ZMTheme::themeFileContents(..)
  • added experimental plugin that allows to use the Smarty templating engine for themes
  • after a successful registration, redirect to the protected page requested before (if any), same as login
  • change all packages to org.zenmagick, update all references to homepage, etc to zenmagick.org
  • cleanup category JS code and move to common.js
  • fix broken product_reviewsd_info.php
  • do not append store name to tile for homepage
  • fix cart id compatibility issue with Ajax addProduct
  • use loader to create ZMEmailView instances
  • make email and popup views work with the Smarty plugin
  • added event fix to get zen_back_link() working
  • fix 'read reviews' link on product page
  • fix invalud URLs when redirecting after login/create account (&amp; in query); #1797600
  • fix more &amp; issues in zm_redirect(..)
  • removed deprecated method ZMTheme::includeStaticPageContent(..)
  • added new setting 'isZMDefinePages' that will make the code look in the themes folder for define pages (example: lang/english/static/main_page.php)
  • fix some typos in ZMRssItem
  • add examples for debug config (error logging) to local.in.php
  • added ZMShippingMethod::getShippingId() and made zm_shipping_id(..)
  • add new setting 'staticHome' which can be set to any file to be used as homepage; this is not ideal yet, as it needs most of the init code to be able to access the setting.
  • add new setting 'discountDecimals', to set the number of decimals used for discount calculations (eg. Save: 15.3% for one decimal point)
  • add new constants for different sale types
  • add new setting 'calculationDecimals' to set the number of decimal digits used internally (default is 4) (Note: This is hardcoded in zen-cart 1.3.7)
  • fix rounding bug in sales prices; this was a random rounding bug caused by tax applied too early in the calculation
  • check for error/info messages in request (error_message/info_message) as used by, for example, payment modules (why the heck??)
  • add new method ZMShoppingCart::hasOutOfStockItems()
  • default to gv as payment type if none found (that's what zen-cart does)
  • add traditional property to ZMPlugin to allow plugins to declare whether they require traditional configuration handling or not.
  • add support for custom password validation function (for master password support or custom encryption)
  • fix broken text confirmation email if no shipping address exists (virtual orders);
  • removed obsolete function zm_quote(..)
  • all strings generated by the admin language tool (zmL10n.php) are now wrapped in double quotes '"'; this fixes #1834415 and also makes other special chars like "\n" work properly
  • create validaiton ruleset if rule added to nonexistent set (rather than doing nothing!)
  • merge rules when adding a validation ruleSet that does already exist
  • added missing sort by products_sort_order, products_name to category list
  • added sortOrder property to ZMProduct
  • check for 'credit_class_error' error messages (coming from ot_coupon/ot_gv modules!)
  • added ZMSession::isOpen() method
  • fix: ZMProducts::getProductForModel(..) broken

Release 0.8.4

  • make gv_send form secure
  • add validation to gv_send form
  • add another parameter to zm_format_currency to be able to format only without converting (sorry, needs updated to a few templates again...)
  • added new custom rule to validate a given amount against the current account's voucher balance
  • added ZMCurrency::parse(..) to allow for reasonable currency parsing.
  • added zm_parse_money(..) to allow simple money parsing based on the sessions currency
  • added ZMGVSendConfirmController to make GV handling simpler
  • fix zm_htmlencode(..) for other languages (for example, Chinese); #1796776
  • move getVoucherBalanceForId(..) from ZMAccounts to ZMCoupons
  • reimplemented GV send as ZenMagick controller and services
  • logout only guest users if isLogoffGuestAfterOrder is set to true; #1796979
  • add gv_redeem code! #1796794
  • update ZMThemeSupportPatch to disable zen-cart header.php processing except for checkout; #1778150 and performance
  • fix incompatibility of zm_useo2 and core.php; #1798448
  • fix ZMCoreCompressor for plugins that contain subdirectories; #1798440
  • fix plugin filterResponse handling; #1799509
  • add sort order config value to plugins
  • make zones load according to the inital country for registration and address forms
  • allow validation rules to fail without an error message (this can be useful if the rule needs to generate multiple messages using zm_messages directly)
  • added dynamic state reloading to the demo store for create_account using jQuery
  • fixed privacy statement in create_account
  • re-added external.php (lost since 0.8.1)
  • added ZM_EVENT_CONTROLLER_PROCESS_END event (with the view as parameter)
  • make code more robust when using brute force disabling ZenMagick (ie removing/renaming the zenmagick folder) without disabling any patches
  • fix inaccessible password_forgotten page; #1810390
  • make sort option reverse when selcting again (actually, it's a different id underneath in the form)
  • make create_account pre-select the last selected zone if validation fails
  • fix missing shipping options using PHP4; #1813353
  • add theme builder to easily create an empty theme
  • check for duplicate email addres durin create_account; #1813656
  • update customer_info table when updating/creating account; #1813654
  • fix empty password written to database when creating new account
  • reject forgotten password requests for guest accounts
  • removed individual patch enable/disable flags
  • add new patch to allow editing of customers if email also exists as guest account
  • added ZMReviews::getAverageRatingForProductId(..) method
  • added languageId support to ZMReviews methods

Release 0.8.3

  • swap meaning of isGuest() and isAnonymous(); the three account/customer states are: ANONYMOUS: lowest level GUEST: email address only; this is the level for checkout without registration REGISTERED: fully registered user
  • update phppdoc to use boolean rather than just bool
  • added ZMSacsMapper; similar to ZMUrlMapper, but related to security rather than page flow - manages which pages are SSL (and enforces this if configured) and validates authorization (anonymous, guest, registered)
  • added new setting 'isEnforceSSL'
  • remove code from ZMZcoObserver that actually should be in ZMEventFixes...
  • implement support for file upload (so far one file only)
  • rename 'isAnonymousCheckout' to 'isGuestCheckout'
  • more changes to make checkout without registering 'guest checkout'
  • fix wrongly preselected checkout address in address list
  • implement shipping address POST handling
  • add support to validate model objects rather than just maps (arrays); this will allow to facilitate model logic (populate) during validation
  • move state/zone validation into custom validation rule
  • use new ZMStateOrZoneIdRule instead of required rule for state
  • fix missing '/' in core compressor (this randomly breaks core.php; #1777420)
  • move music extra code into plugin
  • fix build to include sample plugin
  • implement logoff (not actually executed as zen-cart kicks in first...)
  • added new 'isLogoffGuestAfterOrder' setting
  • added event based check for shipping/billing addres for guest checkout
  • renamed ZMAjaxShoppingCartController::getItemsJSON() to ZMAjaxShoppingCartController::getContentsJSON()
  • added addProductJSON() and removeCartItemJSON() to ZMAjaxShoppingCartController
  • add (limited) addProduct(..), removeProduct(..) and updateProduct(..) methods to shopping cart
  • update Ajax demo page to add/remove/update products
  • converted all Ajax demos to use jQuery and json.js;
  • removed XML based Ajax controller from demo theme
  • changed ZMCountries::getZonesForCountryId(..) to return a list, not a map
  • reworked ajax_demo page to reflect all the changes
  • changed ZMProduct::getAttributes() to return the list of attributes rather than a ZMAttributes instance; this requires a change in core/html/default/products.php
  • added ZMProduct::hasAttributes() method
  • added Ajax product controller and updated ajax demo
  • changed ZMAjaxController::flattenObject(..) to accept nested arrays for method mappings; this allows to map methods for recursively processed arrays and objects
  • add attribute support to ZMShoppingCart::addProduct(..) except for uploads
  • add attribute support to ajax demo
  • added new setting 'isSanitizeAttributes' that controls whether to add default attribute values when adding to cart or not; this allows to add to cart even when just no attributes are provided in the request
  • added remove item to shopping cart
  • added isQtyMixed() method to ZMProduct
  • added getQty(..) and adjustQty(..) to ZMShoppingCart
  • if no address in address list, mark first checkout address as primary
  • add guest_history to allow guest users to check order status by providing email address and orderId
  • rename 'isTellAFriendGuestAllow' to 'isTellAFriendAnonymousAllow' to be in line with the new account types
  • removed obsolete function zm_clear_session()
  • added some more currency handling code
  • change Runtime::getCurrencyId to getCurrencyCode; needs change in boxes/currencies.php
  • change id to code on ZMCurrency
  • reimplemented zm_format_currency(..) to use the changed currency code
  • added tax related settings (not used yet)
  • added new ZenMagick events dispatch_done
  • add the event source of ZenMagick events to the array passed into the event handler method using 'source' as key; this is a reference and for functions fireing events the passed obect is $zm_runtime
  • add social bookmark sidebox to demo theme
  • make static pages (all lower case filenames) load properly in case of duplicate filenames; #1787388
  • fix recursion in ZMPluginView
  • update sample_plugin with form based admin page that allows to change values
  • add ZMRequest:getMethod()
  • make ZMRuntime inherit from ZMObject in order to use create(..) rather than new
  • reverted init sequence in that plugins are loaded *before* the theme is resolved; this gived plugins more power to influence the final theme
  • allow plugins to access database (new method getDB())
  • add ZMForwardView
  • implement new setting 'isSkipSingleProductCategory'; Note: this is not active yet, as zen-cart's header.php will do the redirect...
  • reworked the dynamic admin patch and code
  • rework installation admin to allow undo of single patch rather than undo all and redo the ones desired
  • set the first created address of an account as default address even if it is not marked as primary
  • add password validation rules for create account; #1793554
  • add fix for USEO2 plugin; #1793551
  • add simple plugin helper method to create a plugin config form: zm_simple_config_form(..)

Release 0.8.2

  • product_notifications.php should not use $zm_account
  • ZMProductSorter:sort(..) - check that the given list is an array
  • added ZMView::isValid(..)
  • add defines for 5 log level
  • implemented missing view check in ZMController; the view key for missing pages can be configured with 'missingPageId'; default is 'error'
  • resorted the boostrap order to allow bootstrap.php to use zenmagick defines
  • convert all access to shared images (zen-cart/images) to using ZMImageInfo
  • refactor all image related functions into three: zm_image(..), zm_image_uri(..) and zm_product_image_link(..)
  • add new zm_imagehandler2 plugin
  • fix invalid php in create_account_success
  • add missing welcome_email.txt (#1752483) and make welcome email look nicer
  • add 'storeOwner' setting
  • fix wrong title of welcome HTML email
  • make ZMCoreCompressor handle heredoc syntax correctly (#1752404)
  • added new SQL patch to set up config groups for general and plugin settings
  • make storefront use db persisted plugin status rather than loading all plugins every time
  • cache plugin instances per request
  • clean up ZMPlugin to make config and status handling simpler
  • make ZMPlugin extend ZMObject rather than ZMService
  • allow plugins to execute SQL patches
  • added CAPTCHA plugin
  • make email validation case insensitive (#1756658)
  • make zm_ajax_href use whatever protocol is used for the current request (effectively, this will make it switch to SSL for HTTPS requests and vice versa) (#1756689)
  • added Lightbox JS example to the demo theme (works with ImageHandler2 too!)
  • change zm_absolute_href again
  • added array check to ZMShippingProvider c'tor
  • allow zm_mk_rss_date to accept a date string or timestamp (long)
  • fix broken popups; this requires a little change to the popup_layout as ZMView::getViewFilename(..) got stripped of it's parameters
  • make address create dialog default to store country (same as create account)
  • add post request handling for address book
  • add post request handling for create account; this includes fixing #1760129
  • fix state/zoneId issues
  • some more phpdoc
  • added ZMZone model class
  • added convenience methods getAddressFormatId() and getAddressFormat() to ZMAddress
  • created new package net.radebatz.zenmagick.validation.rules.custom for custom rules like nickname validation
  • added nickname field to account_edit
  • added new validation rules for nickname to account edit and create account
  • allow validation rules with empty JavaScript
  • create $zm_account instance after unsuccsessful registration
  • enforce minimum password length of 6 chars
  • ZMOrderItem::getCalculatedPrice() needs to include tax (#1760124)
  • move state field below country for address and registration
  • use fieldset for password_forgotten view
  • make tell a friend use zm_secure_form(..)
  • make required JavaScript rule handle non existing form fields
  • use email_advisory text chunk where appropriate
  • added tell_a_friend POST handling
  • changed ZMReviews::getReviewCount(..) to accept productId rather than product instance
  • updates zm_seo2 plugin to Ultimate SEO 2.105
  • allow parameters to be passed into views when calling ZMController:getView(..)
  • add suport for enabling/disabling review approval
  • make ZMValidator::getRuleSet(..) work properly in PHP4 (references!)
  • added template for review notification
  • added review write POST handling
  • fix rating values for radiobuttons in product review form
  • make review text mandatory
  • reverted account_type changes in favour of identifying anonymous accounts by an empty password; this has the advantage of avoiding SQL and a safe way to identify existing registered customers
  • added setting 'isAnonymousCheckout' to enable/disable anonymous checkouts (plus any number of code implementing all that)
  • disable validation of billing address list selection during checkout
  • auto select shipping/billing address in list if only one address
  • implement product and newsletter subscription updates
  • do not use zen_redirect(..) any more as it will convert non SSL urls to SSL if current request is SSL - we want to control that with url mappings, though!
  • reworked url mappings and moved to core/settings as they are not really theme specific
  • removed Ultimate SEO2.x rewrite rules from the release .htaccess file; the htaccess_sample (rewrite rules only) is now included in the plugin
  • fix invalid directory permissions in ZMCoreCompressor
  • refactor ZMValidator to accept nested arrays instead of ZMRule instances; (requires update of all plugins that add/modify validation rules)

Release 0.8.1

  • added replacement method for ZMRequest::getParameter() called ZMRequest::getParameter(...)
  • added ZMConfigGroup and a few more methods to ZMConfig
  • added ZMRequest::isAdmin() to check for admin context
  • allow the page value of a view to be a function rather than a view filename; requires change to layout files
  • allow themes to override plugin view files
  • added ZMCrumbtrail::clear() method
  • renamed ZMPluginFilter ZMPluginHandler, renamed ZMPluginHandler::applyFilter(..) to ZMPluginHandler::filterResponse(..)
  • fixed build process for update packages
  • fixed loader isse that stopped theme classes being found; for example, custom MetaTags class, etc.
  • fix online demo store meta tags
  • added ZenMagick event 'init_done'; ZenMagick events all use 'onZM' as prefix, so the event resolves to a callback metod name of onZMInitDone(..)
  • added if-modified-since and etag header for cache hits
  • added support for plugin admin pages added dynamically to the menu system; see ZMPlugin::addMenuItem(...) for details
  • added admin support for faster header (less code but also less functionallity)
  • added code to allow plugins add links to the admin menu dynamically; this will allow plugins to have custom admin pages
  • fixed a few typos in RSS classes
  • added support to include plugins into core.php; plugins control this via ZMPlugin::getLoaderSupport()
  • changed handler generation so plugins implement ZMPlugin::createPluginHandler() if they require a handler; this allows the handler to be reused by internally caching it
  • add support for cart actions to zm_call_zc_page(..)
  • make ZMShoppingCart use a reference of zen-cart's cart object rather than taking a copy; removed ZMShoppingCart::refresh()
  • changed fopen call in lastRSS.php to @fopen to avoid ugly error stacks if behind a firewall...
  • level of loader support for plugins is now depending on the configured loader support flag for each plugin. The flag also controlls core.php inclusion. Valid flags are: NONE = no loader support; no core.php support PLUGIN = no additional loader support; plugin class will be added to core.php ALL = full loader support; all .php files will be included in core.php
  • added basic support to add pretty link rules for custom URLs
  • allow plugin admin pages to be generated as either simple contents or as part or a ZMPluginPage instance In other words, the function passed into ZMPlugin::addMenuIten(..) either generates simple HTML output, or no output at all but returns a ZMPluginPage instance containing the contents
  • extract Ultimate SEO 2.x code into separate plugin
  • Existing Ultimate SEO files may be removed using the install cleanup option; this needs to be done *before* installing the new zm_useo2 plugin
  • created new plugin for Ultimate SEO 3.x support
  • fixed broken attribute dropdowns on product page
  • changed attribute code to ignore unsupported/unknown attribyte types rather than playing dead
  • fixed #1739163: invalid attribute form field for text input fields
  • fixed #1740306: php warning when empty search result
  • fixed #1740312: advanced search - fatal php error
  • use ZM_ROOT where appropriate; changing this will still require to change the init_templates.php override files as ZM_ROOT is not yet defined at that point
  • disable POST handling when 'isEnableZenMagick' is false
  • do not run zen-cart fixes (zc_fixes.php) if not using themes ('isEnableZenMagick'); this will break POST handling for some zen-cart pages
  • allow category prev/next links to be secure if the page is secure
  • fixed #1741055: nonssl links in order history
  • added setting 'zmLogFilename', which, if set will be used to log ZenMagick log entries; default is null to use the default log file (usually the httpd error log)
  • also added 'isZMErrorHandler'; if set to true and 'zmLogFilename' is set, a custom error handler will be used to log **all** PHP messages in the custom logfile
  • fixed invalid variable name in whos_online.php
  • fixed missing order by SQL for new products (ZMProducts)
  • fixed a few cases where define(..) calls didn't quote the first parameter
  • fixed invalid variable name in zm_absolute_href(..)
  • fixed most PHP notice issues (that logfile thingy comes quite handy here..)
  • fix wrong privacy policy checkbox name in create_account.php
  • make enable/disable gender/company/dob/state options work in views (create, update and address) and also adjust validation accordingly
  • make update account work without dob
  • renamed the variable that contains the address list from $zm_addresses to $zm_addressList, as the name clashes with the ZMAddresses service instance; this requires to update address_book.php
  • changed the id of the maine table in address.php from address to newaddress; there are corresponding changes to the CSS; the name clashes with the id of the address form element
  • added list of selectable addresses for change shipping/biling address
  • fix in ZMSession where the country was stored in the session rather than the countryId
  • renamed ZMPageView::getTemplate() and ZMThemeInfo::getTemplateFor(..) to getLayout() and getLayoutFor(..), respectively
  • fixed #1748421 redirect after login
  • fixed #1748910 address book pages should not be cached
  • added support for min order quantity (request #1751599)

Release 0.8.0.1

  • add active plugins to loader path; that means effectively, plugins may override any *default* class or controller
  • fixed title for homepage, category, category_list, manufacturer and ezpages (ZMMetaTags)
  • made view accessible from controller
  • fixed a few leftover hardcoded response views from controllers
  • added mapping id to ZMView
  • moved ZMAjaxController::callZCPageController(..) as zm_call_zc_page into the misc package
  • moved ZMPageView a bit, removed obsolete ZMThemeView
  • added ZMPluginView to allow controller added by a plugin to serve custom content views from within the plugin folder
  • added setting to enable/disable adding the store name to the page title
  • fixed broken create account (email template was missin $zm_account)
  • fixed source_view view
  • added example of using ZenMagick from external PHP files

Release 0.8.0

  • added cookie_usage view
  • added code to allow ZenMagick to actually process POST requests
  • added ZMLoginController for POST handling of logins
  • added new setting 'postRequestEnabledList' to allow POST request handling for configured pages only
  • added new method isValidSession() to ZMRequest
  • add password and authorization to ZMAccount and actually populate them
  • added new global $zm_validator instance for central validation config (this will be used for server side validation, too)
  • added new all-in-one ZMValidator::insertJSValidation($id) method
  • added extra/valdation.php to default theme which now contains all validations
  • modified all views that use JS validation to use the new validation code
  • added new setting 'isAutoJSValidation' which is on by default; zm_form and zm_secure_form will automatically add JS validation code if it exists; this means all required is to set up validation rules and create the form using zm_form or zm_secure_form!
  • make ZenMagick code fail gracefully *if* all patches are reverted *and* the zenmagick folder gets removed (I know this still leaves a trail of unused files, but still better than what we have now)
  • added a meta tag: generator = ZenMagick [version] to the default_layout
  • fixed server side validation code (has not been used until now)
  • added new ZMSession class that acts as wrapper around $_SESSION in order to keep access to $_SESSION central and simple
  • default and demo theme version now follow the main ZenMagick version number
  • added ZMFieldMatchRule validation rule to validate new password and confirm password
  • simplified the ZMMinRule setup, as name and min length are passed as parameter already (since we only use the min value, the format needed to be changed to %2$s to access the second format parameter rather than just using %s; please see http://www.php.net/manual/en/function.sprintf.php for more details)
  • all regular access to $_GET and $_POST is now wrapped in zm_sanitize(..) calls
  • refactored zm_db_value_list() into ZMDao::bindValueList(..)
  • account subscriptions changed a bit to make the DAO more consistent - this required minor changes to a couple account views and controllers; basically ZMSubscriptions got dumped and all information moved into ZMAccount
  • removed companyName from ZMAccount
  • had to change email parameter handling - sorry! zen-cart values are now directly available under their respective names, for example $INTRO_ORDER_NUMBER; zc_args does not exist any more.
  • added code to handle forgotten password submits
  • fix: getCompanyName() in create_account view needs to be called on zm_address rather than zm_account
  • really fix dummy sidebox patch so no sidebox dummies are created for filenames including '.in.'
  • renamed ZMModel::populateFromRequest() to populate($req)
  • fixed some invalid settings
  • changed the default message type from 'error' to 'msg'
  • added forth inbuild message type 'success'
  • messages now support references (ie; field names) like zen-cart does
  • 'msg' and 'success' messages default to the same style in default and demo theme
  • added zm_field_messages(..) and corresponding CSS rules to display field specific error messages - the demo theme login view is changed to illustrate thhis
  • added code to ZMSession (and zm_redirect(..)) to save messages in the session if redirecting - this way it is transparent to the caller
  • added submit handling for change account password
  • fixed issue with ZMDateRule; format now defaults to UI_DATE_FORMAT if not set (null); this is related to the fact that i18n defines are set only *after* the validation rules are loaded and therefore UI_DATE_FORMAT is not yet available!
  • added product_notification email template
  • fixed DAO method bindValueList() for data types other than integer
  • added a module base class ZMPlugin ('course it has to be named differently!)
  • changed all code to use getDB() rather than $db_ directly
  • renamed ZMDao and the dao package to ZMService and services, respectively to accomodate the fact that ZMDao was used in a broader sense than just DAO
  • rewrite of the zco-notifier code to allow even easier subscriptions to zen-cart events (includes a new patch)
  • added a (admittelty very basic) plugin admin page
  • added ZMPluginFilter to allow plugins to modify the generated page contents before returning it to the client; NOTE: requires isEnableOB to be true!
  • fixed/added getAmount() method to ZMOrderTotal and updated phpdoc - getValue() does actually return the string, not the (float) amount!
  • renamed ZMOrderItem:getId() to ZMOrderItem:getProductId() as this is what it is; needs some changes to templates..
  • renamed all desctructor methods ___desctructor, thus disabling them as they are currently all empty; this might break existing code as older versions do call parent::__desctruct()
  • removed obsolete include of init.php in external.php
  • added ZMUrlMapper to make response views configurable (via ZMController::findView(...))
  • removed some .htaccess rules that do not seem to work too well with commercially hosted sites (missing images and CSS) ... I'll think about replacements once I am not so tired any more
  • added console permanently to admin (rather than having it sitting in etc); you can always delete the file in admin if you do not want it...
  • made 'isEnableOB' setting obsolete as we need that in order for plugins to be able to access the page content
  • removed ZMCachedThemeView as this does not work with plugin page filters
  • moved ZMView from the rp.uip to the rp package, ZMEmailView from rp.uip.views.email to rp.uip.views;
  • change ZMView::getPage() to ZMView::getName(); this requires changes to a couple theme files
  • added new check to page cache check to disable caching of pages that contain messages
  • ZMCurrencies does not rely on zen-carts global $currencies instance any more
  • renamed ZMThemeView to ZMPageView
  • make product comparison form use GET rather than POST
  • added contact_us POST handling; there is no support for the recipient dropdown; also, the email template will not work when using zen-cart request handling
  • fixed ZMImageInfo and zm_absolute_href (thanks, Matt)
  • went over all =& assignements to get rid of most PHP5 deprecated messages
  • fixed wrong lookup of additional images (thanks again, Matt)
  • fixed negative product price in dropdown for attribute controlled discounts (when setting the price prefix to '-') - and again, thanks Matt!

Release 0.7.1

  • ZMCategories/ZMCategory rewrite
  • moved zm_parse_rss_date(..) into net.radebatz.zenmagic.misc package
  • moved setContentType(..) from ZMAjaxController into ZMController
  • new products are now ordered by date_added
  • added new sidebox feeds.php that offers RSS feeds of reviews, new products and EZ page chapters (basically the toc)
  • fix wrong multi value parameter handling in SEO
  • fix default from/to date strings problem in advanced search and get rid of JS that clears the fields
  • (re-)added the comparable button for product listings
  • tested with PHP 5.2.1
  • tested with MySQL 5.0.37
  • tons of phpdoc
  • fix appended blank lines to .htaccess file by rewrite rule patch
  • fix broken dummy sidebox patch
  • added new patch for ZenMagick email support
  • added new ZMEmailView view :)
  • added zm_mail(..) that uses ZMEmailView to generate email contents
  • ZMRequest::getController() will now always return a controller and not null
  • disabled automatic patching while in the installation screen
  • updated the copyright year in all comments (thanks for Ant's replaceregexp!)
  • FWIW there is now an option to skip the strip phase generating core.php which makes reading the file easier (I was curious about the file size difference...)
  • added file changelog (added/modified/removed); this is based on the actual difference between release .zip files rather than CVS, so it should be actually useful
  • added setting to control which pages get SEO treatment
  • removed unused rewrite rules from .htaccess file
  • added new ZMZcoObserver as global observer of some zen-cart events where nothing else works
  • fixed wrong variable name in contact us controller
  • added welcome, checkout, password_forgotten and tell_a_friend email views
  • added template init override and extra functions in admin area for email handling
  • removed GV send settings 'gvSendMainMessage' and 'gvSendPersonalMessage'; NOTE: the gv_send_confirmation template changed as well
  • created text chunks for cvv_help and search_help popup text
  • moved l10n and i18n stuff into locale package
  • split model package into sub-packages
  • always load order status
  • added gv_send and order_status email views; NOTE: some code might change as the data is not all ready to use yet (need to pull it out of zen-cart code)
  • removed the store address from contact_us_success view
  • added getCategoryPath() method to ZMCategory

Release 0.7.0.1

  • fix file patches that append empty lines to zen-cart files, thus creating leading empty lines in HTML output
  • fix missing TOC in EZ pages
  • added missing CSS for EZ pages TOC in demo theme
  • fixed broken account notification view
  • fixed wrong account notification checkbox names
  • another fix for multi value request parameter in zm_href(..)
  • includes zmConsole.php

Release 0.7.0

  • added about page
  • added optional PHP console; good for debuging, but a possible security issue, so it's distributed in the etc directory and needs to be copied manually into the zen-cart admin folder
  • theme code refactoring
  • moved getCurrencyId(), getLanguageId() and getLanguageName() from ZMRequest to ZMRuntime
  • theme info will inherit default settings
  • added zm_phpinfo() function that strips some of the original formatting
  • removed unneccessary echo from eval(..) calls
  • renamed Runtime::getApplicationRoot() to getContext()
  • ZMLoader::getStatic() now guarantees that local.php is the first item if it exists
  • locale settings are now also inherited from the default theme
  • changed default templates to use ZMDateRule to validate dates - the JS validation is now also more strict; this also means UI_DATE_FORMAT_VALIDATION is obsolete :)
  • refactored generic date parsing code into zm_parse_date(..)
  • excluded account, write and edit pages from page cache - this is a temp. solutions until I can come up with some proper config for this
  • fix zm_is_empty for arrays was doing the oppositve of what is expected
  • added better request dispatching code to allow for multiple theme switching => all ZenMagick globals are instantiated before, MetaTags and Crumbtrail may be overwritten with theme versions; same stays true for controller => switching is only supported in extra code, everything else is not defined => the switch will be done after *all* extra code has been loaded
  • fixed categories code and underline current category in sidebox
  • performance: moved cache check into init.php, thus cutting out more code
  • fixed broken SQL patch
  • added canUndo() metod to ZMInstallatinPatch
  • added better file permission checks to core.php compressor
  • added language to key for page cache
  • use full names in patch messages
  • fix ZMProduct::getDefaultCategory()
  • fix features SQL for MySQL > 5.0.24
  • fix some dao SQL issues with MySQL > 5.0.24
  • fix category filter
  • more phpdoc along the way
  • changed JS validation code so validations skip empty fields; this means if a field is empty you won't get a message about invalid format
  • added zm_htmlencode(..) wrapper to some more fields in product_info view and product images (alt/title)
  • added .htaccess rules to support Ultimate SEO URLs
  • integrated Ultimate SEO mod (based on version 2.103) into ZenMagick; this can be used as an alternative to ZenMagick's pretty links; There is also a new patch to enable/disable SEO - additional benefit, as there are no version specific zen-cart files required! SEO installer SQL has been updated and tested with MySQL 5.0.27
  • added zen_href_link replacement that allows pretty links to work for redirects as well
  • added dependsOn() method to installation patches
  • added still missing product_reviews view
  • the setting 'isEnableThemeDefaults' now controlls all aspects of theme defaults; this includes views, boxes, classes and l10n/i18n
  • all default views now use zm_format_address(..) to format addresses
  • reworked locale (l10n/i18n) handling, so using define(..) isn't a problem; this also means to split the theme loading from the request handling (which is actually good!) to be able to do theme loading during the init phase - otherwise zen-cart will have used up all the good defines :) This slightly changes the syntax in l10n and i18n files and breaks older themes. Advantage is that theme values are stored as variables and only once the final theme is determined are converted into defines thus allowing proper overwriting of values during theme switching and for fallback to default theme settings THIS BREAKS OLDER THEME LOCALE CODE
  • fixed merge option in language tool work and added include default theme option
  • added .htaccess files to restrict access to ZenMagick installation files
  • extracted page caching strategy into separate function (default); THe strategy can be changed by configuring an alternative function by setting 'pageCacheStrategyCallback'; signature is boolean callback()
  • modified l10n.php and i18n.php in demo theme to illustrate the changes in locale handling;
  • most patches now know how to undo
  • changed patch so no sidebox dummies are created for filenames including '.in.'

Release 0.6.4:

  • fix: release 0.6.3 returns wrong version number (0.6.2)
  • fixed: (unused) SQL for language support for ez pages
  • JS validation fix for single radio button - thanks Ryan for the patch
  • small fix in local.in.php
  • fix broken pretty link urls
  • exclude account pages from page cache

Release 0.6.3:

  • Added down_for_maintenance view
  • fixed wrong variable name in SQL patch code
  • performance: split zm_setting into zm_setting and zm_set_setting (updated local.in.php)
  • performance: zm_ends_with
  • Fix: ZMCategories: proper null check using === and !===
  • performance: use output buffering creating the category list
  • performance: loader
  • Changed the signature of zm_backtrace to make it more useful (I think)
  • performance: enable standard output buffering if gzip compression not available or disabled
  • changed all controller to use findView(..) to find the returned view object
  • changed the default rss cache dir to be in line with the page cache settings
  • included PEAR:Cache_Lite to distribution as cache driver
  • performance: logging is now disabled in the default configuration
  • implemented page caching; at the moment pages are cached if the user is not logged in; caching and expiry times can be configured in local.php
  • added option to disable all patching rather than disabling all patches individually;
  • fix bug in installation screen when gzip compression enabled
  • added cache manager admin screen to be able to manually clear the page cache
  • get rid of admin_init.php
  • fix some problems resolving relative require filenames in admin and init.php
  • fix cut'paste error in ZMRss and wrong c;tor call in ZMRssItem
  • Configure lastRSS to strip CDATA
  • added extra/local.php to demo theme to illustrate theme switching

Release 0.6.2:

  • Added patch support for main index.php; this means ZenMagick does not overwrite existing files any more!
  • new admin menu item 'Installation'; this is either under tools if file permissions do not allow to add the ZenMagick menu, or under ZenMagick
  • return error view when ez page not found; same for product page and a few more
  • ZMSettings::get(..) now accepts a second parameter to set values; the return value is the old value or null
  • upaded local.in.php to reflect this change; using $_ZM_SETTINGS is not deprecated - this might eventually disappear altogether...
  • added getDefaultCategory() to ZMProduct; this will return either the master category or the first mapped category for the product
  • fixed invalid db code in ZMProducts.php
  • option to disable language support for ez-pages as zen-cart ignores the languages_id (disabled as default)
  • Fix double slash '//' in pretty URLs
  • add option to .htaccess file to make it work under *nix
  • added page_not_found view
  • fix missing chapter for pretty links
  • added new ZMAjaxController; controller may now return null as view if they generate content themselfs
  • phpdoc, again...
  • added foreign keys to the features.sql
  • features SQL can now be installed using the ZenMagick installation screen
  • added examples of how to disable automatic zen-cart patching to local.in.php
  • features SQL can now be installed using the ZenMagick installation page
  • view path for non default themes in ZMThemeView
  • added support to enable/disable the crumbtrail
  • Fixed broken fragment (eg: #bottom) for pretty links
  • Moved classes around quite a bit (again!)
  • Added support to enable/disable ez-pages links in header/footer and sidebox
  • Quite a number of small HTML/CSS changes
  • Added Ajax support to the request handling architecture;
  • Added country/zone Ajax controller
  • Added shopping cart Ajax controller (not complete)
  • new ajax_demo view in the demo theme that illustrates the use of the Ajax controller; added prototype and a subset of yui for that
  • Added PEAR:Services_JSON to distribution
  • Added new setting to control the method suffix for ajax methods (defaults to JSON)
  • Website update
  • when loading the theme extra code, load local.php as first file (if available)

Release 0.6.1:

  • First draft of shipping estimator
  • removed popup_ prefix from popup views
  • country dropdowns default now to store country
  • Fix edit GV send for non image buttons
  • Fixed GV Send form handling and page flow
  • Added name to result list sorter and filter
  • Fixed broken alpha filter
  • added a dark colour setup to the demo theme; great to start customising colours
  • had another go at phpdoc
  • zm_href and decendents now support multi value parameter
  • added sanity check to result list to always return a valid page
  • added code to auto generate dummy templates in zen-cart
  • started cleanup of undocumented functions
  • changed the init sequence to allow to load i18n stuff before zen-cart; init is now done before the zen-cart template init code
  • fixed a stupid date handling bug in the registration form
  • added experimental price range filter to demo theme
  • moved other.php from default to demo theme

Release 0.6.0:

  • Fixed missing file permission check for creating dummy sidebar boxes
  • Refactored result list, filter an sort classes
  • Added media manager and music related classes
  • Refactored result list handling to includes rather than functions
  • added getFullName() to ZMAccount
  • pretty links support using .htaccess files and URL rewriting (disabled)
  • new function zm_media_href(...)
  • new ZMDateRule validation rule (untested)
  • new demo theme; this will contain sample code/customizations NOTE: you will have to create a dummy zen-cart template directory in order to use the theme
  • new music product page - there you go
  • fixed lots of regressions; in particular broken validations, SQL errors and product listings
  • re-structured the core files (again, and perhaps still not the last time...)
  • partly stripped ZMModel as the new validation code makes this obsolete (the implementation code will stay around until I find time to rewrite the update stuff)
  • renamed rss and wordpress sideboxes to rss.in.php and wordpress.in.php, respectively. People using them should rename them in order to avoid overwriting them with the next update
  • Added specals view - not sure if the SQL is correct, though
  • Fixed bug when payments do not have confirmation fields
  • Excluding controller classes from being loaded on init - they (and possibly more) are loaded using the loader
  • Created my first image from scratch using Gimp :)
  • popup support; popups are located under: [theme]/content/views/popup and have their own layout and CSS
  • fixed invalid HTML in payments page plus missing checkbox for gv redemption
  • allow payment type == null on checkout confirmation page (when using gv, etc)
  • make JavaScript submitFunction(..) on payments page work as expected; if gv reedemption value >= total, payment type is not mandatory any more
  • Most classes now extend from ZMObject which is a generic base class
  • Class loading is done using ZMObject::create, thus allowing us to restrict generic class loading (exludes controller and model so far)
  • made the buttons look a bit nicer - still missing a bit in IE =/
  • added time_out view
  • make sorter work in advanced search
  • add default sorting for search results
  • search sidebox is now conditionally and will now show during advanced search or search results
  • added header/footer banner to default_layout and footer
  • added AlphaFilter to demo store to illustrate extending controller and custom filter
  • cleaned up the todo list :)

Release 0.5.0:

  • Converted most of the SQL generation to using bindVars(...)
  • Added a few more settings
  • minor fixes and layout changes
  • added a few more sideboxes
  • added reviews and tell_a_friend views and corresponding controller
  • added getTypeSetting($name) to ZMProduct
  • renamed search_header.php search.php
  • added notification boxes
  • reorganised and extended the ZenMagick admin screen(s); now there is a top level ZenMagick menu
  • removed empty login.php sidebox - zen-cart now comes with it's own version
  • removed theme view from default theme
  • make checkout payments page validate
  • admin auto patch option; this will re-patch a admin file to enable the ZenMagick menu after a zen-cart upgrade
  • merged default theme category code into core
  • fixed category navigation for IE
  • '%' is not correctly quoted when using zm_l10n(...)
  • removed text data from features.sql
  • removed zen_ prefix, added zm_ prefix; NOTE: this results in different table names; if you have modified any of the base date, you will have to reapply those changes.
  • removed theme controller path from classpath; theme controller are now only found when in the extra directory
  • fixed support for category page
  • ez and static page have now access to all global ZenMagick references
  • renamed ZMRequestController ZMController
  • Added support for attribute images
  • Added new rss sidebox plus supporting classes; uses lastRSS (included in ZenMagick distribution)
  • Added all review related views
  • Added first iteration of ZenMagick CatalogManager
  • JS based confirm dialog for admin delete operations
  • Added new validation framework (allows for both client and server side validation)
  • added error view to default theme
  • fixed some more validation errors
  • allow themes to include the default theme's extra code (default)
  • fix runtime reconnectDB method
  • added (still somewhat experimental) wordpress sidebox
  • added search results page
  • renamed ZenMagick specific database tables

Release 0.4.5

  • upgraded to zen-cart 1.3.6
  • add conveniece function zm_ezpage_link($id)
  • fixed wrong index validation bug in feature admin
  • fixed missing featured in feature admin when displaying error messages
  • added missing bit of SQL to features.sql
  • Added ZenMagick settings to zm_env() output
  • make 'default_layout' the default default layout for all themes
  • support for optional local.php file that may override default settings
  • added support to use ZenMagick from within external PHP web applications
  • feature admin was missing in release file :/
  • banner support
  • improved product image handling and support for additional images
  • fixed a bug in the feature admin tree view related to apostrophes in the category name
  • make HTML for (most) pages validate
  • added support for meta tags and titles
  • added echo parameter for zm_htmlurlencode/decode
  • added new zm_htmlencode
  • fixed registration error: missing country
  • removed zm_nice_page_name in favour of zm_title and $zm_meta (ZMMetaTags)
  • added zm_strip_html wrapper for zen_clean_html
  • fixed login error messages if login not found
  • added fix to be able to submit the login as post instead of get - this avoids having the password in the URL!
  • extensions to l10n, plus phpdoc
  • added ZMMetaTags for meta tag and title generation
  • added newWin(this) JS function
  • added zm_resolve_zc_class; this is mostly for internal use to load zen-cart classes on demand
  • added getCategories() to ZMCategories
  • added ZMSearch as wrapper around a search
  • added advanced_search view to default theme
  • Moved crumbtrail handling from ZMDefaultController to ZMRequestController
  • Added PHP support for define pages
  • added proper popup for large images
  • renamed view for actegory list to category_list.php; category.php is now for categories that do not have items only; new setting 'isUseCategoryPage'
  • fixed reference problem when categories would lose their children - sounds horrible, eh?
  • fixed bug retreiving featured products
  • website: * feature documentation * accessing the API from external web applications (PHP) * document disabling ZenMagick templates

Initial Release:

  • Fix state selection in create_account
  • Find/fix invalid '&lt;? ' PHP open tags
  • fieldset in create_account
  • Fix missing state field in create_account
  • split common.js and category.js
  • add popupWindow to common.js
  • Sort features by id
  • Fix manufactureres code (use join as some manufacturers do not have entries in TABLE_MANUFACTURERS_INFO)
  • changed features table layout; feature description is now limited and feature value of type 'text' to allow for longer values
  • Switch ZM_DB_PREFIX to 'zm_', enable features
  • Add zm_get_zen_includes() method to reliably get the zen-cart/inlcudes directory
  • Fix error when $messageStack->messages does not exist
  • Added ZMFeatures::getFeatureList(), getFeatureTypes() amd getFeatureTypeForId()
  • Restructured ZMFeatures
  • add auto_increment to zm_features primary key
  • New zen-cart admin extension to manage Features
  • zen-cart admin utility to browse the catalog using dtee
  • Fix ZMRequest:getCategoryPathArray() to always return an array
  • Added ZMEZPages and model/ZMEZPage
  • Add ezpages.php box to default theme
  • Added ez-page page view (incl. controller)
  • Added sitemap
  • Make redirect views work in store.php; this is still very ugly, though
  • Add Unsubscribe controller to redirect to accoun_newsletter page
  • Added views for conditions, privacy and shippinginfo
  • Won't setup GV FAQ, as it's easier to set up as EZ TOC pages...
  • Add coupon stuff
  • Added contact us view/controller
  • Add i18n support per theme; requires to remove zen_date_raw definition in zen-cart/includes/languages/english.php
  • The i18n change also requires init.ph to be includes earlier in index.php
  • small view improvements
  • added ez support in menu and footer
  • reworked .htaccess file for permalinks
  • add support for multiple feature values
  • Added product comparison to default theme
  • Allow PHP code in EZ-pages
  • Make defaulting to 'default' theme work
  • Allow for custom template code per page using a single template
  • Add zm_env
  • Include theme info into class loader
  • Make cPath stick in zmFeatures.php
  • support cPath in post requests
  • use textarea for feature values
  • ezpages box: support for sbchapter query parameter to overwrite the default
  • Support for editing features and feature values
  • New attribute hidden for features
  • Fix controller path
  • do not allow duplicates in new features list, etc
  • fix hidden feature regression (feature key is defined as feature name in features list)
  • introduce theme.css as a way for themes to add on top of the default site.css rather than taking a copie to add a few lines. Also, it's easy to just change the colours that way
  • Fix ZMRequest::getPageBase()