Version 11.4 of the Joomla Platform released Version 11.4 ("Brian Kernighan") of the Joomla Platform was tagged and released on 4 January 2012. It is the logical continuation of the 11.3 version published 24 November 2011. In addition to numerous bug fixes, it also brings new features, the main ones: >

  • MultiDB support
  • Implement Github Forks API

The full list of commits is available here and the api doc here

Project size

  • Classes: 270 (231 in platform 11.3)
  • Methods: 2000 (1946 in platform 11.3)
  • Lines: 25970 (24717 in platform 11.3)
  • Comments: 62155 (62154 in platform 11.3)
  • Blank lines: 11877 (11800 in platform 11.3)

Summary of code quality

  • Check style: 199 warnings (235 in platform 11.3)
  • Duplicate code: 26 warnings (26 in platform 11.3)
  • Programming Mess Detector (PMD): 1002 warnings (1006 in platform 11.3)
  • Test Coverage: 41% (41% in platform 11.3)

New feature

Issue fixed





The following pull requests made by community contributors were merged:

  1. [#653] Changing group_concat to something "mysql" independent (chdemko)
  2. [#587] Joomla CMS [#23882] JForm::getGroup() not properly generating nested group names(chdemko)


  3. [#697] Some small improvements for JDocument: (realityking)

    -Allow content without a charset to be output (useful for binary data) -Allow complete removal of the meta generator element. -Some small code style improvements

    These are parts from #683.

  4. [#701] Fixing issue with sniffer not detecting double quoted params properly (pasamio)

    The sniffer was not detecting double quoted strings properly and raising errors about classes without parameters.

  5. [#703] Restore the admin application check for toolbar. (elinw)

    This undoes a previous change (#566) which had backward compatibility issues.

  6. [#237] Allow package extension types to use scriptfiles (mbabker)

    This pull request makes changes to the package extension installer to allow for a scriptfile to be included on a package.

    This will allow for a package to have a single preflight method, for example to check for any dependencies, such as another extension's presence or a minimum Joomla! version.

    Additionally, a $results array has been created with each extension's name and $tmpInstaller->install result (which should be true given where it is compiled). This array is pushed forward to the postflight method, and can be used to display a list of the installed extensions, something many 3PD already do with their custom installation methods (see for an example).

    Lastly, the TODO concerning the extension_root has been resolved by setting it to JPATH_MANIFESTS/packages/packagename and this is the location the scriptfile is stored in.

  7. [#685] Useless replacement for some alias glyphs. (infograf768)


  8. [#698] Fix a typo in JTable. (realityking)

    My bad.

  9. [#696] Make Installer package class vars public (mbabker)

    Per discussion at, we need these class vars to be public otherwise PHP Fatal Errors are thrown preventing update/uninstall of Library and Package extension types.

  10. [#694] Fix grouping in JHtmlUser::groups (mbabker)

    While testing joomla/joomla-cms#29, we found that the grouping for the user group selection list was broken. As it is based on the one used in JHtmlAccess::usergroup, I compared the two and found an extra grouping field. Removing this field fixed this selection list.

  11. [#695] Add INFOURL to _updatecols (mbabker)

    Per the change with joomla/joomla-cms#65, we need to add INFOURL to the _updatecols array.

  12. [#679] Changed quoteName function. (gpongelli)

    Now quoteName can take an array of names to quote and each can have dot notation. Added alias support "AS" as second parameter, same type of first parameter, so if first parameter is a string second need to be a string, if first parameter is an array second need to be an array. Special mention to first parameter array: each array element will be quoted and can be aliased with second parameter array that must be same length and contain null value for those element that doesn't need alias, so for example

    $db->quoteName( array('a', 'b'), array('alias_a', 'alias_b') );

    using " as quote character, this call will return an array with

    Array ( [0] => '"a" AS "alias_a"' [1] => '"b" AS "alias_b"' )


    p> while this example

    $db->quoteName( array('a', 'b'), array(null, 'alias_b') );

    using " as quote character, this call will return an array with

    Array ( [0] => '"a"' [1] => '"b" AS "alias_b"' )


    p> More complex example

    $db->quoteName( array('a.c', 'b.d'), array(null, 'alias_b_d') );

    will return an array with

    Array ( [0] => '"a"."c"' [1] => '"b"."d" AS "alias_b_d"' )


    p> This pull request contain also changes to relative quoteName test to try array quote and alias parameter.

  13. [#676] Updates to fix updater system (pasamio)

    This pull request:

    • fixes CLIENT undefined index problem
    • remove an undefined index warning
    • removes the INFOURL addition until CMS has accepted the change
    • and also removes a commented debugging statement that somehow made it in.

    "CLIENT" undefined index warning

    In pull request 667 the concept of changing "CLIENT" to "CLIENT_ID" is introduced to remove an undefined index "CLIENT" problem. This is actually a side effect of CMS tracker 24338 [2,3] where the appropriate entry in the update_cols was mercilessly renamed from "CLIENT" To "CLIENT_ID" leading us to the predicament we presently find ourselves in.

    I suspect that the initial change is itself a reaction to CMS Issue # 24305 [4,5] which goes to show the law of unintended consequences is truly afoot.

    Undefined index warning

    An extra guard is added around the last_check_timestamp check in the update cache code that was added. There are situations when this value may not exist and could trigger a warning.

    Removal of INFOURL addition

    The removal of the "INFOURL" tag is two fold. First it's in the wrong place, it should live in the _update_cols of the updateadapter class. Secondly until the CMS accepts the DB schema change[6], it breaks loading extensions which made the changes in this pull request rather hard to test using the current Joomla! 2.5 beta. Given this change was merged into the platform in July and it is now December, it is like that the CMS is presently broken but people just don't realise (the collection type is unaffected).

    Refs: [1] [2] [3] [4] [5] [6]

  14. [#654] SQLAzure and SQLServer fixes (sseshachala)

    Two files have been modified

    1. sqlstvquery.php - line 79 - auto_increment_field replaced to autoIncrementField (Camel case) 2.sqlazure.php : line 12 - replaced require with JLoader::register('JDatabaseSQLSrv', dirname(FILE) . '/sqlsrv.php');

    No other changes. I hope this can get merged into the platform.

  15. [#692] Stop using deprecated JS functions. (realityking)
  16. [#693] Fix the highlighter behavior. (realityking)
  17. [#680] Joomla CMS [#27257] Fix a typo in the publish method of jtablenested.Originally identified i... (elinw)

    Fix a typo in the publish method of jtablenested.Originally identified in CMS

    tracker issue #27257

  18. [#678] Correct a bug in the url form filter. (elinw)

    Correct a bug in the url form filter.

  19. [#682] Make JTable::load() work with JError::$legacy set to false. (realityking)

    I need this to make the CMS installation work in the non-legacy mode. it's the last bit of deprecated code in the installation I have to deal with, so it'd be great if we could get this pulled :)

  20. [#670] Fix some small stuff (realityking)

    -A typo in JHtmlBehavior -A couple of PHPMD warnings -One use of JDatabase::isQuoted()

  21. [#671] Multilanguage alias improvement (infograf768)

    Great improvement for multilanguage, no legacy issue.

  22. [#669] Always use db instances declared by devs (fastslack)

    If you try to create a new asset or category using a different prefix, the JTableAsset and JTableCategories returns an error because it create a new instance instead of the created by user

  23. [#668] Joomla CMS [#27280] Invalid foreach in com_content route* (elinw)

    ContentHelperRoute::_findItem can toss an invalid foreach error (line 135) thanks to a null result from JMenu::getItems().

    This patch causes an empty array to be returned instead of null.

  24. [#661] Make more classes autoloadable. (realityking)

    Remove some unnecessary jimport() calls.

  25. [#666] Modified as per the suggestion by Chris. (sseshachala)

    Reference :

  26. [#664] Fixed the nameQuote for sqlserver and azure. (hooduku)

    The fix handles reserved words in sqlserver/azure if they are used.

  27. [#655] Joomla CMS [#27177] Joomla! automatically adds the From email address to the Replyt...(chdemko)


  28. [#663] Reduce the use of deprecated functions. (realityking)
  29. [#657] Joomla CMS [#27415] Missing platform change for update notification (dextercowley)

    I missed a platform change when this feature was added to the CMS. This is the change. It is already in the CMS version of this file. Thanks.

  30. [#662] get_table_constraints renamed to getTableConstraints to support backups ... (hooduku)

    get_table_constraints renamed to getTableConstraints to support backups ...

    Can we get this merged to joomla:staging? Please let me know if there are discrepancies.

  31. [#572] Code style: Sniff operator spacing (elkuku)

    This ensures that operators are surrounded by one space.

  32. [#623] Add url filtering, improve url field, update tests to reflect changes. (elinw)

    This adds a url filter to the existing filters in Jform. The filter requires that a url have a protocol. If a protocol is not present it uses http://. It also updates the tests to include tests of the url filtering option. This filter can optionally be used with the url field type or the url rule or both, but this is not required.

    As part of this change, the url field is built out and incorporates a new element, relative. By default (with the exception of some educated guessing based on the host and index.php) the url filter assumes that a url without a protocol is an external url that is only missing a protocol. If the relative element is used, the filter assumes that a url without a protocol is relative to the local root.

  33. [#656] Joomla CMS [#26632] Inconsistent operation of user field type (chdemko)


  34. [#659] Fix some PHPMD warnings. (realityking)

    Note there are some backward incompatible changes in JArchiveZip. Since we already made the internal variables private the impact shouldn't be high.

  35. [#658] Add ability for JDatabase::quoteName to auto split and quote dotted strings (eddieajau)

    Allows for the quoteName method to auto split and quote each part of a dotted string. For example:


    Will return 'a'.'foo'.

    Adds tests for quoteName and improves code coverage of JDatabase.

  36. [#652] MultiDB support (elinw)

    Update platform for multidb support

  37. [#651] Sudhi staging (elinw)

    This pull requests merges work from several branches to improve support for multiple databases. It also passes a checkstyle scan.

  38. [#641] Joomla CMS [#26893] add filterText method to JComponentHelper with new customList feature (radiant-tech)

    See for description of problem having Text Filtering confined to Articles.

    Incorporates feature requeste started here:

    Logic for filtering is explained in the test instructions of #26893. Custom black list allows SU to override the hard-corded default tagBlackList and attrBlackList of JFilterInput.

  39. [#650] Add missing JText (elinw)

    Add a missing JText.

  40. [#565] Joomla CMS [#27246] JFormFieldTimezone default value not set (radiant-tech)

    Server config value is set to wrong variable name. See CMS Bug Tracker #27246.

  41. [#649] Code styling fix - JGithubForks (ianmacl)

    Docblocks were formatted incorrectly.

  42. [#648] Implement Github Forks API, add missing tests. (ianmacl)

    This adds forks to the Github APIs handled by the platform and completes unit tests for these classes.

  43. [#647] Added tests for the JImage package (ianmacl)

    Completes coverage for JImage, JImageFilter, JImageFilterBrightness, JImageFilterContrast and JImageFilterEdgedetect.

  44. [#608] Add the highlighter behavior (realityking)

    This is based on Michaels pull request #371. I made some changes to make it more flexible and most importantly moved it to JHtmlBehavior.

  45. [#645] Remove calls to deprecated code. (realityking)
  46. [#646] Fix an issue caused by pull request #554. (realityking)

    We removed some jimports() without renaming the class so it can be picked up by the autoloader.

  47. [#629] Fix error in JDatabaseMySQLi::close (elinw)

    PHP handles MySQLi differently than it does MySQL specifically in a more object oriented way. For example, PHP 5 introduced a new way of handling destuctors in MySQLi ( This patch adjusts the MySQLi driver so that when (for whatever reason) the mysqli object ($this->connection) gets destructed before the JDatabaseMysqli object does the condition check in __destruct does works expected.

  48. [#643] Add missing scope modifiers for functions. (realityking)

    This should clean up a few (8) of the code style warnings.

  49. [#644] Fixed typo for deprecated tag (vietvh)
  50. [#642] Prevent some deprecation warning in JBrowser. (realityking)

    The deprecation log files are starting to look pretty good so they become actually helpful for 3rd party devs. One thing that still annoys me are the warnings from JBrowser, that appear even when non of the deprecated functionality is actually used. The attached commit should fix this.

  51. [#639] Remove ApplicationException in favor of more semantic exception usage. (realityking)

    Again picking the small but good parts from Louis's work ;)

  52. [#640] Fix file permissions. (realityking)

    The picks up some of the unrelated stuff from pull request #635.

  53. [#632] Deprecate JDate::toMySQL (chdemko)

    In favor of JDate::toSQL

  54. [#564] Code style: Mark protected member vars as deprecated (elkuku)

    Mark protected member vars as deprecated if they are prefixed with an underscore. Add proper pendant. Package: application

    I used: @deprecated use $XXX or declare as private Not sure as of which version to deprecate - please advise. It should also be verified if the var could be declared as private, including the underscore.

    This will fix 45 code style warnings.

  55. [#633] Use the autoloader to rename form/formfield.php and form/formrule.php (chdemko)
  56. [#533] JArchive work (realityking)

    -Add unit tests -Add isSupported() function to all adapters

  57. [#631] Fix JTableUsergroup. (realityking)

    Another issue discovered by the CMS system tests.

  58. [#605] strict static (signotorez)

    strict static should be called static

  59. [#630] the getInstance function was actually not returning the global Installer... (compojoom)
  60. [#622] Adding unit test for JLoader::setup method (ianmacl)
  61. [#570] Fix a problem with the close method in the MySQLi driver. (elinw)

    If no actual connection exists (even though the object exists) and you try to close the connection you get a warning. This adds a check to see if the connection is null before trying to close.

  62. [#628] Revert #570 (eddieajau)

    Reverts #570 which causes a regression in the CMS (caused by the fact the mysqli object is not a resource).

  63. [#554] Embrace the autoloader some more. (realityking)

    Some of the code is from Louis, I hope that's fine with him.

  64. [#626] Explicitly set useStorage param to 'true':'false' so that 'null' will no... (thinkeryvin)

    ...t get defaulted to 'true' by the tabs.js. This should fix issue where setting useCookie=>'false' still resulted in tabs.js using the cookie storage.

  65. [#627] Fix some issues in JTable subclasses. (realityking)

    These were discovered running the cms system tests.

  66. [#617] Don't load JRequest when it isn't used. (realityking)
  67. [#621] constant() generates E_WARNING if given constant isn't *defined* (WebMechanic)

    reverts some changes from 3e0bfb52

  68. [#619] More autoloader + jimport() stuff (realityking)
  69. [#589] Moved string.stringnormalize to string.normalize. (robschley)
  70. [#620] Add git as a valid url protocol. (elinw)

    This commit adds git as an accepted protocol when using the url rule for field validation.

  71. [#577] Refactor JDatabaseMySQLi + Unit Tests (mbabker)

    In a bit of a radical move, I've refactored JDatabaseMySQLi to extend JDatabaseMySQL. Since these drivers build queries in a very close manner, and each other MySQLi class extends the MySQL companion, this helps to eliminate duplicate code and allows the focus to be solely on driver differences (calling mysqli_ versus mysql_ functions primarily).

    In addition to this change, I've implemented a set of tests for JDatabaseMySQLi, similar in nature to JDatabaseMySQL's own tests. In the few tests that have been created, there are no apparent major issues from refactoring the mysqli driver in this way.

    Lastly, a bug in JDatabaseMySQL::getTableKeys was fixed in that it was incorrectly referencing $this->db->quoteName (db reference not needed here).

  72. [#613] Update JHtmlForm::token() test (mbabker)

    Update the test to mock the session due to a unit test failure locally, and use getFormToken in the test as well.

  73. [#614] JTable review and testing (mbabker)

    I've done some review on JTable and its classes and started to implement tests for them. Changes here include:

    • Missing jimport('joomla.database.table'); in a few of the files
    • Queries converted to JDatabaseQuery
    • CSV's for assets, categories, content, and extensions tables created/updated based on current CMS sample data
    • JTableNested tests updated to cope with changed dataset
    • Tests for JTableContent and JTableExtension implemented
    • All test skeletons regenerated to ensure synchronization with tested classes (I'll be working on more tests shortly, note that the @covers docblock in the tests comes from PHPUnit 3.6.4's phpunit --skeleton-test command
  74. [#618] Code style: Fix FileCommentsSniff (elkuku)

    This sniff produces an erroneous message like: @foo tag comment indented incorrectly; expected 4 spaces but found 4'

    Last time this one appeared was in #603 as commented by Rouven.

  75. [#603] Replace JFormFieldEditors with a more general solution. (realityking)

    While working on integrating the captcha patch into the current trunk I found this little jewel.

  76. [#604] Use less deprecated functions in the platform (realityking)

    This should make a start in getting rid off deprecated stuff. This handles the following three functions: JError:isError() JUtility::getHash() JUtility::getToken()

    The first one can be replaced with the instanceof operator, the other two just moved to a different class.

  77. [#615] Fixing docs to work with publican (ianmacl)

    Publican doesn't link the link format. This change fixes the issues so that the docs will build.

  78. [#607] Batch Processing work for CMS 2.5 (mbabker)

    To coincide with joomla/joomla-cms#29, this pull request merges in all library work for this feature improvement.

    Covered specifically in the libraries:

    JControllerForm: - batch() - Added logic to build an array of contexts to improve ACL permissions checks, converted JRequest calls to JInput

    JModelAdmin: - batch() - Handle receiving and forwarding contexts array to all batch functions - batchAccess() - Rewritten to check edit permission on the item being edited (no ACL checks previously) - batchCopy() - Converted JRequest to JInput, create permission check now looks at the category permissions where the item is being copied to - batchLanguage() - Rewritten to check edit permission on the item being edited (no ACL checks previously) - batchMove() - Converted JRequest to JInput, create permission check now looks at the category permissions where the item is being copied to, edit permission check uses contexts array to check item permissions

    JHtmlBatch: - user() - Added user widget to display a list of users

    JHtmlUser: - Added this class to display either a list of groups or users

    Tests added for JHtmlBatch::user() and JHtmlUser methods.

  79. [#611] Code style: Modify the FunctionCallSignatureSniff (elkuku)

    Modify the FunctionCallSignatureSniff to allow double quotes as the last/first content on a line in multi line function calls.

    This will remove two errors on #608 that "doesn't look that bad" ;)

    It will allow the following construct:

    php <?php $foo = bar(" baz "); Seems that those JS-guys like that style..

  80. [#595] Joomla CMS [#27046] Problems by usergroups with the same name. (chdemko)


  81. [#588] Rename filterinput.php and filteroutput.php files to suit autoloader. (chdemko)

    The new autoloader allows to rename these files

  82. [#596] Fix some more PHPMD warnings (realityking)

    and deprecate some stuff so they'll be fixed in the near future.

  83. [#602] Bug fix: Correcting error in language.php (chdemko)

    The load function does not return the real value, but always true.

  84. [#606] Docs: Correct JForm's getLabel docblock (elinw)

    Correct the docblock for the getLabel method.

  85. [#591] Joomla CMS [#27284] Fix a strict standards warning (elkuku)

    See: Jcode CMS bug tracker #27284

  86. [#601] Recorrect PHP version information (elkuku)

    A minor glitch in the PHP version information ;)

  87. [#600] Code style: Fix a superfluous tab character (elkuku)

    This will remove a tab character - not more not less...

    This is the "1 error" that joomla-jenkins shows on all pull requests.

  88. [#598] Fix broken unit tests. (realityking)

    Unfortunately pull request #583 broke the unit tests because I overlooked a line.

  89. [#594] Fix for erroneous pull request #584 (nikosdion)

    The code I had submitted to "JPath::check() throws Error 20 when running in a chroot jail" was wrong. This time I drank enough coffee before writing code change and it really works :)

  90. [#558] Joomla CMS [#25431] JUserHelper::getProfile does not return a profile (gnomeontherun)

    Fixes #343

    It now returns an array of the profile field data stored for a given user.

    See also

  91. [#593] Fix build.xml (mbabker)

    I may or may not have inadvertently broken the phpcs target in build.xml by missing a comma, so pointed out by @elkuku. Whoops.

  92. [#590] Docs - Added chapter on the JLog class (eddieajau)
  93. [#584] JPath::check() throws Error 20 when running in a chroot jail (nikosdion)

    When JPATH_ROOT is an empty string –i.e. we run inside a chroot jail– JPath::check() always raises error 20 (snooping out of bounds). By definition of the chroot jail, we can snoop out of bounds in this case. Therefore this check should always succeed. Ergo the proposed change.

  94. [#576] Updates to docs directory (mbabker)
    • Some grammar checks
    • Updated CHANGELOG
  95. [#583] Change the way core.js is loaded. (realityking)

    Since core.js requires MooTools anyways we don't need to be able to load it without MooTools.

  96. [#582] Update MooTools to version 1.4.2. (realityking)
  97. [#586] Added JWebGlobalMock. (robschley)

    Changed getMock*() methods to be publicly accessible.

  98. [#585] Add missing type hints to newer classes. (realityking)

    Add missing type hints to newer classes.

    Does it make sense to check older classes too or should I wait for 11.4 to be released?

  99. [#566] Eliminate check for admin application for using toolbar. (elinw)
  100. [#562] Rename the media package to image to benefit from the autoloader. (realityking)

    This this is new API probably a good idea to move it before it's used that much.

  101. [#581] CodeSniff on base libraries files (mbabker)

    The codesniffer doesn't check the files directly under /libraries. Running the codesniffer locally, I picked up a few errors there. This cleans them and changes the build.xml file to check these files during the phpcs task.

  102. [#580] Fix up variable scope check-style warnings (eddieajau)
  103. [#579] Fix up missing method scope declarations. (eddieajau)

    Fixes up new warnings generated by a new sniff.

  104. [#555] Unit test for JHtmlForm (ianmacl)
  105. [#556] Joomla! CMS [#27196] Unable to add a trashed Content Language again (mbabker)

    Fix from the CMS -

  106. [#575] Code style: Add MemberVarScope and MethodScope sniff (elkuku)

    This ensures that member vars and class methods have scope modifiers. The original sniff generates errors on violations. I have changed this to warnings.

    This will generate 317 new warnings.

  107. [#574] Code style: Sniff member var spacing (elkuku)

    This ensures the correct spacing of member vars.

  108. [#573] Code style: Sniff cast spacing (elkuku)

    This ensures that casts do not contain spaces and are followed by one space.

  109. [#571] Code style: Sniff concatenation (elkuku)

    This fixes a small error in the concat operator sniff as well as some violations that had been escaped - until now ;)

  110. [#569] Documentation - Variable types (mbabker)

    To better help developers, I've started reviewing the "undefined methods" inspection on PhpStorm and trying to update docblocks to more accurately reflect what each parameter type is and what is being returned. Most of these changes are based on what is commented in the docblock or based on the instance type that is being returned.

  111. [#578] Preparing manuals for posting - for use with Publican (ianmacl)

    This pull request alters the structure of the doc manuals for the platform so that they work with Publican and are easier to post online.

  112. [#568] This is to fix the bug reported on the tracker #26877 (jmarriott)

    Bug and fix submitted to the tracker by Hermod Opstvedt

  113. [#560] Remove fixes for secruity issues that have been fixed in PHP years ago. (realityking)

    PHP GLOBALS injection bug: PHP Zend_Hash_Del_Key_Or_Index bug:

  114. [#559] Adding documentation for the Github package. (ianmacl)

    A short write up on how to use the Github package.

  115. [#553] Output only one deprecation warning for JRequest. (realityking)

    Don't load JRequest if _JREQUEST_NO_CLEAN is set.

115 pull requests.

  1. realityking: 32
  2. mbabker: 13
  3. elinw: 13
  4. elkuku: 11
  5. chdemko: 9
  6. ianmacl: 8
  7. eddieajau: 5
  8. pasamio: 2
  9. robschley: 2
  10. nikosdion: 2
  11. radiant-tech: 2
  12. infograf768: 2
  13. sseshachala: 2
  14. hooduku: 2
  15. gpongelli: 1
  16. gnomeontherun: 1
  17. WebMechanic: 1
  18. jmarriott: 1
  19. compojoom: 1
  20. fastslack: 1
  21. vietvh: 1
  22. signotorez: 1
  23. dextercowley: 1
  24. thinkeryvin: 1

Merged by:

  1. eddieajau: 42
  2. LouisLandry: 28
  3. chdemko: 25
  4. robschley: 10
  5. ianmacl: 8
  6. pasamio: 2