Welcome to eZpedia!

The free eZ Publish encyclopedia that anyone can edit. eZpedia has accumulated 722  english articles since 2006. We encourage you to create an account and create or edit a page yourself. Some folks create an article in the people namespace with their full name as the article name with a brief description of who they are, their interests, goals and objectives.

Ask A Question

Do you have an eZ Publish question, do you need an eZ Publish answer? Simply login and ask your question in our discussion forum. We publicly write free documentation based on your submissions. Posting on eZpedia is a great way to get answers you need and contribute to our freely available community documentation for eZ Publish.

Chat with other eZ Publish Developers LIVE from around the World!

Ecosystem

Read about what is going on within the various eZ Publish related websites on internet.

Recent development activity

Track the development progress through the roadmap by reviewing recent Exponential Git activity from the github repository.

github.com/ezsystems/ezpublish-legacy commit log rss feed
Last updated: 2026-06-05T18:13:45Z
2026-06-05T18:13:45Z
Updated: Updated file listing md5 hashes for the 6.0.14 release upgrade check. Release prep.
2026-06-05T18:05:10Z
fix: SQLite/PostgreSQL compatibility — replace mysql/mongo-only DB branches with portable SQL

ROOT CAUSE
----------
MongoDB support was added to the codebase by inserting 'mongo' branches
alongside existing SQL paths. During that work several SQL paths were
accidentally gated behind databaseName() === 'mysql', meaning SQLite and
PostgreSQL received no data at all — returning null, empty arrays, or
skipping writes silently. One location used databaseName as a property
(always null) instead of calling it as a method.

All six files below were broken in ways that caused fatal errors or silent
data loss on SQLite (the configured database for this site).

CHANGES BY FILE
---------------

kernel/classes/ezpersistentobject.php
  BEFORE: if ( $db->databaseName == 'mysql' )
          [SQL path — all non-MySQL/non-Mongo DBs fell into: else { $rows = [] }]
  AFTER:  if ( $db->databaseName() !== 'mongo' )
  WHY:    $db->databaseName is a property access — it returns null on every
          adapter, so the condition was always false. fetchObject() and
          fetchObjectList() returned empty arrays for every single query on
          SQLite, breaking the entire ORM layer. Fixed by calling the method
          and inverting the condition so MySQL, SQLite, and PostgreSQL all
          use the same SQL path while MongoDB uses its own aggregate pipeline.

kernel/classes/ezrole.php
  BEFORE: if ( $db->databaseName == 'mysql' )   [property — always null]
          [no initialization of $retArray before the elseif/mongo block]
  AFTER:  $retArray = array();
          if ( $db->databaseName() !== 'mongo' )
  WHY:    fetchIDListByUser() never entered the mysql block on SQLite so
          $retArray was undefined when returned. roleIDList() returned null,
          which caused implode() to crash in eznodeviewfunctions.php (line 322).

kernel/classes/ezurlaliasml.php
  BEFORE: if ( $db->databaseName() == 'mysql' )  [only MySQL entered SQL path]
  AFTER:  if ( $db->databaseName() !== 'mongo' )
  WHY:    The URL alias translation function (translate()) built a multi-table
          JOIN query that works on any SQL database but was guarded by a mysql-
          only check. On SQLite, $urlAliasArray was never assigned, causing an
          'Undefined variable' warning and then $return was never set, so every
          URI returned false — making ALL content URLs resolve to nothing.

kernel/classes/ezcontentobjecttreenode.php
  BEFORE: if ( $db->databaseName() === 'mysql' )  [only MySQL fetched nodes]
  AFTER:  if ( $db->databaseName() !== 'mongo' )
  WHY:    fetch() is the central method for loading any content tree node.
          The SQL JOIN query it builds is standard ANSI SQL and works on SQLite,
          MySQL, and PostgreSQL equally. By gating it on 'mysql' only, SQLite
          returned null for every single node fetch — no content could ever load.
          This was the primary cause of the blank-site symptom reported by the
          user ('no content loads').

kernel/classes/datatypes/ezuser/ezuser.php
  1. generateGroupIdList() — replaced three $db->find() calls with
     $db->arrayQuery() using SQL IN(...) clauses. find() is a MongoDB-only
     method; calling it on eZSQLite3DB threw 'Call to undefined method'.
     User group membership could not be resolved for any user.

  2. limitList() — replaced $db->find('ezuser_role', [...]) with
     $db->arrayQuery() SQL. Same reason as above; this broke role limitation
     lookup (subtree/section restrictions) for all users on SQLite.

  3. eZUserSetting::fetch() null guard — added null-coalescing fallback so
     that if no ezuser_setting row exists for a user, isEnabled defaults to
     true instead of crashing with 'Call to a member function attribute()
     on null' (the original error that triggered this investigation).

kernel/classes/eznodeviewfunctions.php
  Added ?? [] null-coalescing fallback on three implode() calls that consume
  roleIDList(), limitValueList(), and fetchIDListByUserID(). Defensive guard:
  if any of those methods ever return null (e.g. during a partially-migrated
  state), implode() will receive an empty array rather than crashing with
  'argument #2 must be of type array, null given' (PHP 8+).

INVESTIGATION SUMMARY
---------------------
The errors appeared in sequence as each layer was unblocked:
  1. 'Call to member function attribute() on null' (ezuser.php:1097)
     -> ezpersistentobject fetchObject returned null (ORM broken)
  2. 'Call to undefined method eZSQLite3DB::find()' (ezuser.php:2926, 2791)
     -> MongoDB-only method called on SQLite adapter
  3. 'implode(): argument #2 must be array, null given' (eznodeviewfunctions:322)
     -> roleIDList() returned null due to ezrole.php property-access bug
  4. Error ocurred using URI: / (content/view/full/2)
     -> ezurlaliasml.php + ezcontentobjecttreenode.php mysql-only guards

A full audit of all 50+ files containing databaseName() checks was performed.
All other mysql/mongo branches were verified to have correct else/SQL fallbacks.
The six files above were the only ones with broken patterns affecting SQLite.
2026-06-05T15:33:23Z
Updated: Officially moving default installations from package version 6.0.10 to 6.0.14 (for new mongodb support).
2026-06-05T15:21:34Z
Merge pull request #62 from se7enxweb/mongodb_kernel_support_from_sevenx

Official MongoDB Database Kernel Support From 7x
2026-06-05T14:08:22Z
fix(admin/tpl): output persistent_data values regardless of type in browse.tpl

The {if is_string($PersistentData.item)} guard silently suppressed integer
values (e.g. ObjectID=1 passed from content/copy.php). Remove the guard
so numeric persistent_data values are correctly emitted as hidden form
fields, fixing the 'Copy' action which returned null object and aborted.
2026-06-05T14:08:06Z
fix(admin/tpl): init js_class_languages as '[]' not empty string in node full view

ClassMenu JS receives the language array variable as a JS value. An
empty string causes a parse error in the onclick handler; initialise
it as an empty JSON array literal so the menu renders correctly even
when no class languages are configured.
2026-06-05T14:04:30Z
fix(admin/js): replace deprecated jQuery .size() with .length in node_tabs.js

jQuery removed .size() in v3.x. Replace both occurrences with .length
to restore correct tab selection and cookie-based tab restore behaviour.

Recent discussions

Read what others are discussing

Recently updated articles

Read recently modified articles

ezpedia.org updated content rss feed
  1. eZ : Main page
  2. Solution : Read-only site
    • @5 | 2025/01/25 @ 17:17:56 : Graham Brookins : History - based on version 4, republishing in attempt to regain example settings display
  3. Solution : Reseting the admin password in eZ publish
    • @15 | 2024/10/25 @ 21:09:06 : Graham Brookins : History - based on version 14 added missing comma to example copy and paste code.
  4. Learning : Extensions
  5. Learning : Standard Events
  6. Learning : Standard Triggers
  7. Learning : A workflow
  8. Learning : Events
  9. Learning : Workflow
  10. Learning : Roles
  11. Learning : Policies
  12. Learning : User Groups
  13. Learning : Site Access
  14. Learning : Design Structure
  15. Learning : Default Design
  16. Learning : Access Control
  17. Learning : Designs
  18. Learning : Template Override System
  19. Learning : Pagelayout.tpl
  20. Learning : Custom System Templates