Bakery https://bakery.cakephp.org/ Everything CakePHP en-us Fri, 05 Apr 2024 00:00:00 +0000 https://bakery.cakephp.org/2024/04/05/cakephp_507.html https://bakery.cakephp.org/2024/04/05/cakephp_507.html <![CDATA[CakePHP 5.0.7]]> CakePHP 5.0.7

The CakePHP core team is happy to announce the immediate availability of CakePHP 5.0.7. This is a maintenance release for the 5.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 5.0.7. See the changelog for every commit.

  • Add logging to error rendering failures. When error rendering fails, CakePHP will log error messages.
  • Fix file handle leak in StubConsoleInput.
  • Reverted recent changes in connection aliasing. The test runner will automatically alias all live connections to test_ prefixed ones.
  • Improved enum support in FormHelper.
  • IntegrationTestTrait no longer adds security tokens to GET requests with data.
  • Improved response assertion method output. Failure messages will now include the response body.

Contributors to 5.0.7

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • KrzysiekNDS
  • Mark Scherer
  • Mark Story
  • othercorey
  • RoboSchmied

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 05 Apr 2024 00:00:00 +0000
https://bakery.cakephp.org/2024/03/08/cakephp_506.html https://bakery.cakephp.org/2024/03/08/cakephp_506.html <![CDATA[CakePHP 5.0.6]]> CakePHP 5.0.6

The CakePHP core team is happy to announce the immediate availability of CakePHP 5.0.6. This is a maintenance release for the 5.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 5.0.6. See the changelog for every commit.

  • Fix validation of ChronosTime instances to be considered valid by the time validation method.
  • Allow Collection::groupBy() to work with Enum values.
  • Improve display of console exceptions in production mode.
  • Fix Hash::insert() with {s} placeholders and attribute conditions on uneven datasets.
  • Fix potentially leaking file descriptor in StubConsoleInput.
  • Fixed formatting error of datetimes with microseconds.
  • Fixed parsing of datetimes of microseconds.

Contributors to 5.0.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • freefri
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 08 Mar 2024 00:00:00 +0000
https://bakery.cakephp.org/2024/03/01/cakephp_454.html https://bakery.cakephp.org/2024/03/01/cakephp_454.html <![CDATA[CakePHP 4.5.4]]> CakePHP 4.5.4

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.5.4. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.5.4. See the changelog for every commit.

  • Fix Hash::insert() and paths containing {s} and conditions, and data where all values after {s} are not arrays.

Contributors to 4.5.4

Thank you to all the contributors that helped make this release happen:

  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 01 Mar 2024 00:00:00 +0000
https://bakery.cakephp.org/2024/01/27/cakephp_505.html https://bakery.cakephp.org/2024/01/27/cakephp_505.html <![CDATA[CakePHP 5.0.5]]> CakePHP 5.0.5

The CakePHP core team is happy to announce the immediate availability of CakePHP 5.0.5. This is a maintenance release for the 5.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 5.0.5. See the changelog for every commit.

  • Fixed dirty state tracking for entities that use TranslateBehavior and use ResultSet methods to mutate records.
  • Improved marshalling nullable enum values from strings.
  • Shifted the logic for getting view variables to serialize into SerializedView::serializeKeys() so it is easier to override.
  • Improved session gc time when server side idle timeouts are disabled. PHP defaults are now used, and you can configure this with application configuration as well.
  • CollectionTrait::combine() is now compatible with enum keys.
  • Fixed an array to string warning in EventFiredWith constraints.
  • Improve API documentation.
  • Reduce potential for empty cloaking throrugh refactoring.
  • Fixed a regression with converting Date objects passed into datetime columns via the ORM into query parameters.
  • Fixed type error in IntegrationTestTrait when adding tokens to requests.

Contributors to 5.0.4

Thank you to all the contributors that helped make this release happen:

  • Adam Halfar
  • ADmad
  • dependabot[bot]
  • fabian-mcfly
  • Ishan Vyas
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 27 Jan 2024 00:00:00 +0000
https://bakery.cakephp.org/2024/01/19/cakephp_453.html https://bakery.cakephp.org/2024/01/19/cakephp_453.html <![CDATA[CakePHP 4.5.3]]> CakePHP 4.5.3

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.5.3. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.5.3. See the changelog for every commit.

  • Configuration based path keys are normalized to integer keys now.
  • Update requirements to be compatible with paragonie/csp-builder:^3.
  • Cookie assertion methods are now compatible with RedirectResponse.
  • Fixed dev error page rendering in PHP8.3
  • CI matrix now includes PHP8.3
  • Improve assertion failure message of EventFiredWith constraint.

Contributors to 4.5.3

Thank you to all the contributors that helped make this release happen:

  • Fabian Friedel
  • fabian-mcfly
  • Ishan Vyas
  • Mark Scherer
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 19 Jan 2024 00:00:00 +0000
https://bakery.cakephp.org/2023/12/27/cakephp_504.html https://bakery.cakephp.org/2023/12/27/cakephp_504.html <![CDATA[CakePHP 5.0.4]]> CakePHP 5.0.4

The CakePHP core team is happy to announce the immediate availability of CakePHP 5.0.4. This is a maintenance release for the 5.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 5.0.4. See the changelog for every commit.

  • Improve support for template paths being defined as an associative array.
  • Improved output of cache_clear commands.
  • Updated Sqlite mapping for binaryuuid to use UUID_TEXT.
  • The Exception.beforeRender event can now prevent default rendering from occurring by setting a result and stopping the event.
  • Fixed regression in SQLite schema reflection for older versions of SQLite.
  • Fixed off by one errors in code location for dd().
  • Updated dependency on paragonie/csp-builder to accept 3.0
  • The cookie assertions in IntegrationTestTrait now work with RedirectResponse values.
  • Fixed dev error page rendering in PHP8.3
  • Improved display of enum values in FormHelper.

Contributors to 5.0.4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Chris Nizzardini
  • fabian-mcfly
  • Jens Mischer
  • Jorge González
  • Kevin Pfeifer
  • Marc de Lima Lucio
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • othercorey
  • Robert Pustułka

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 27 Dec 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/12/14/cakephp_452.html https://bakery.cakephp.org/2023/12/14/cakephp_452.html <![CDATA[CakePHP 4.5.2]]> CakePHP 4.5.2

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.5.2. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.5.2. See the changelog for every commit.

  • Fix regression in plugin translation file loading order.
  • Marshalling Date values no longer sets a timezone.
  • Fix inconsistency between Error.beforeRender and Exception.beforeRender. You can now stop this event to prevent output being rendered, or set your own result to bypass the default renderer just like error handling.
  • Added more deprecation annotations for easier upgrading to 5.x.
  • Fix off by one errors in dd().

Contributors to 4.5.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Jens Mischer
  • Kevin Pfeifer
  • Marc de Lima Lucio
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • othercorey
  • Robert Pustułka

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 14 Dec 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/11/27/cakephp_503.html https://bakery.cakephp.org/2023/11/27/cakephp_503.html <![CDATA[CakePHP 5.0.3]]> CakePHP 5.0.3

The CakePHP core team is happy to announce the immediate availability of CakePHP 5.0.3. This is a maintenance release for the 5.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 5.0.3. See the changelog for every commit.

  • Update path to plugin_class_error.php.
  • Expanded enum support to include providing a label. Implementing Cake\Database\Type\EnumLabelInterface in your enum class will allow you to provide a user facing label. Labels are used by FormHelper when generating controls.
  • Improved validation support for enums.
  • Widened type of $format in TimeHelper::format().
  • Support for PHP 8.3
  • Fixed significant performance regression in intl date and datetime formatting. Serializing dates and datetimes now cache intl formatters restoring performance to 4.x levels.
  • Improved support for binaryuuid type across database platforms.
  • Improved readability of missing route pages by collapsing the route list by default.
  • Improve support for indexes on generated columns in SQLite.
  • Improved internal tooling for maintaining consistency in split packages.

Contributors to 5.0.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Kevin Pfeifer
  • kolorafa
  • Marcelo Rocha
  • Mark Scherer
  • Mark Story
  • Mauro Brandoni
  • ndm2
  • Oliver Nowak
  • othercorey
  • Umer Salman
  • wowDAS Markus Ramšak

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 27 Nov 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/11/11/cakephp_451.html https://bakery.cakephp.org/2023/11/11/cakephp_451.html <![CDATA[CakePHP 4.5.1]]> CakePHP 4.5.1

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.5.1. This is a maintenance release for the 4.4 branch that fixes several community reported issues and a minor security related fix.

Bugfixes

You can expect the following changes in 4.5.1. See the changelog for every commit.

  • ControllerFactory no longer raises errors on union typed parameters.
  • Collection::combine() raises an error when keys are null.
  • Namespaced core functions are now wrapped in function_exists calls resolving errors if the file containing these functions are imported more than once.
  • Added schema mapping type to sqlite for UUID_TEXT.
  • Reverted deprecated annotation on LocatorAwareTrait::$defaultTable property.

Contributors to 4.5.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Jorge González
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 11 Nov 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/10/28/cakephp_502.html https://bakery.cakephp.org/2023/10/28/cakephp_502.html <![CDATA[CakePHP 5.0.2]]> CakePHP 5.0.2

The CakePHP core team is happy to announce the immediate availability of CakePHP 5.0.2. This is a maintenance release for the 5.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 5.0.2. See the changelog for every commit.

  • Fixed links between API docs and book.
  • TranslateBehavior now allows using _translations.{locale}.field_name style naming for default locale.
  • LoggedQuery::getContext() now includes the query that was emitted.
  • Fixed recursion errors when entities have cyclic references and getErrors() or hasErrors() is called.
  • ControllerFactory no longer raises errors when it encounters a type it cannot cast into (like unions). Instead the framework relies on PHP to validate the parameter types.
  • Collection::combine() now raises an error should a path result in a null value for the key.
  • Relaxed constraint on psr/simple-cache, psr/container and psr/http-message.
  • Invalid enum values are no longer cast to null when an invalid string value is marshalled into the PHP value.
  • Improved compatibility between enum values and FormHelper.
  • Improved compatibility between DateTimeWidget and ChronosTime.
  • Improved SQLite mapping of uuid abstract type. It now maps to UUID_TEXT.
  • TimeType::getClassName() was added. This method was missed in 5.0.0

Contributors to 5.0.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Jèfferson Gonçalves
  • Jorge González
  • Kevin Pfeifer
  • Lars Ebert
  • Mark Scherer
  • Mark Story
  • Mark Watney
  • Michael Hoffmann
  • othercorey
  • salehhashemi1992
  • wowDAS Markus Ramšak

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 28 Oct 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/10/14/cakephp_450.html https://bakery.cakephp.org/2023/10/14/cakephp_450.html <![CDATA[CakePHP 4.5.0 Released]]> CakePHP 4.5.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.5.0. This is the first stable release of 4.5.0. 4.5.0 provides a number improvements to CakePHP. 4.5.0 introduces a large number of deprecation warnings aimed at assisting with future upgrades to CakePHP 5.0.

Upgrading to 4.5.0

You can use composer to upgrade to CakePHP 4.5.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:4.5.*"

Deprecation Warnings

4.5 introduces a few deprecations. All of these features will continue for the duration of 4.x but will be removed in 5.0. See the migration guide.

What’s new in 4.5.0?

The migration guide has a complete list of what’s new in 4.5.0. We recommend you give that page a read when upgrading. A few highlights from 4.5.0 are:

  • bin/cake cache clear_group <name> was added. This command gives a CLI interface to clearing a specific cache group.
  • ComponentRegistry is now automatically added to your application’s DI container.
  • Controller::addViewClasses() was added. This method lets you build a controller’s view classes programatically.
  • Database and ORM connections now support read and write connection roles. Connection roles let you scale an application up by using read-replicas. When defining connections, roles can be configured with read and write keys in the connection config that override the shared config.
  • New methods were added to queries to select the read or write connection role to be used.
  • ModelAwareTrait::fetchModel() was added. This method works similar to loadModel() but does not set the model as an attribute.
  • The development error page design has been improved. It now renders chained exceptions and makes navigating stack traces easier as each frame can be collapsed individually.
  • Console exception messages now include stack traces for chained exceptions.
  • EntityTrait::$_hasAllowsNull was added. This property allows you to incrementally opt-in to a breaking change present in 5.x for EntityTrait::has().
  • View::addHelper() was added. This method compliments addBehavior() and addComponent().

Contributors to 4.5.0

Thank you to all the contributors that helped make 4.5 happen:

  • ADmad
  • Alejandro Ibarra
  • Brian French
  • Chris Nizzardini
  • Jaro Varga
  • Jose Daian
  • Kevin Pfeifer
  • Lars Ebert
  • leon.schaub
  • Marcelo Rocha
  • Mark Scherer
  • Mark Story
  • Matthias Wirtz
  • othercorey
  • Roland Waldner
  • wowDAS Ing. Markus Ramšak

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 4.5.0 is a large release and would not have been possible without the community support and feedback.

What’s Next

With both 5.0 and 4.5 shipped the core team’s focus will be primarily on CakePHP 5.x. Future 4.x releases will be primarily community driven. Feature and bugfix releases for 4.x will continue until September 2025. Security fixes will continue for 4.x until September 2026.

The roadmap for 5.x is still under development. We’re interested in making the upgrade from 4.5.0 to 5.0 a smooth one, and would appreciate any feedback you have on upgrade difficulties. Please open an issue and get the discussion started.

Download a packaged release on github.

]]>
Sat, 14 Oct 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/09/29/cakephp_501.html https://bakery.cakephp.org/2023/09/29/cakephp_501.html <![CDATA[CakePHP 5.0.1]]> CakePHP 5.0.1

The CakePHP core team is happy to announce the immediate availability of CakePHP 5.0.1. This is a maintenance release for the 5.0 branch that fixes several community reported issues and a minor security related fix.

Bugfixes

You can expect the following changes in 5.0.1. See the changelog for every commit.

  • Allow FormProtection component to have its session id source customized in subclasses.
  • Fixed potential email address manipulation if unvalided address data was set into Cake\Mailer\Message. Thank you to Waldemar Bartikowski who reported the issue via our security mailing list.
  • Fixed errors arising from plugin helpers being loaded within other plugin helpers, when the parent helper is loaded without a plugin scope.
  • PaginatedResultSet is now JsonSerializable.
  • Replaced usage of include_once when Application loads plugin configuration.
  • Fixed broken links in API documentation links to MDN.
  • View::getConfig() is now public.
  • ORM\Marshaller::one() now uses newEmptyEntity() improving compatibility with subclass implementations.
  • Adding methods with getMockForModel() is deprecated because of changes in PHPUnit.
  • Fixed Cake\Http\Client cookie parsing with invalid values that lack both a value and = delimiter.
  • Collection\SortIterator is now compatible with Chronos types.
  • Fixed source line attribution in the dd() method.
  • Fixed defaults being mutated in DashedRoute and InflectedRoute after match() is called.

Contributors to 5.0.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Jorge González
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • andrii-pukhalevych
  • breno
  • othercorey
  • wowDAS Markus Ramšak

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 29 Sep 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/09/27/cakephp_4418.html https://bakery.cakephp.org/2023/09/27/cakephp_4418.html <![CDATA[CakePHP 4.4.18]]> CakePHP 4.4.18

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.18. This is a maintenance release for the 4.4 branch that fixes several community reported issues and a minor security related fix.

Bugfixes

You can expect the following changes in 4.4.18. See the changelog for every commit.

  • RedirectException now forwards headers to redirect responses.
  • Allow ConsoleOutput to accept stream resources. This solves ‘too many streams open’ problems when application code creates many instances of ConsoleIo.
  • Fixed potential email address manipulation if unvalided address data was set into Cake\Mailer\Message. Thank you to Waldemar Bartikowski who reported the issue via our security mailing list.
  • Fixed Cake\Http\Client cookie parsing with invalid values that lack both a value and = delimiter.

Contributors to 4.4.18

Thank you to all the contributors that helped make this release happen:

  • Brian French
  • Mark Story
  • andrii-pukhalevych
  • othercorey
  • Waldemar Bartikowski

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 27 Sep 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/09/09/cakephp_500.html https://bakery.cakephp.org/2023/09/09/cakephp_500.html <![CDATA[CakePHP 5.0.0 Released]]> CakePHP 5.0.0 Released

The CakePHP team is thrilled to announce the immediate availability of 5.0.0. This is release begins a new chapter for CakePHP as 5.0 is now stable. 5.0.0 has been in development for the past two years, adding many new features and performance improvements. It also contains breaking changes as features and behavior deprecated in 4.x have been removed.

Key Features

  • PHP 8.1 required.
  • Improved typehints across the framework. CakePHP now leverages union types to formalize the types of many parameters across the framework.
  • Upgraded to PHPUnit 10.x
  • Support for read and write database connection roles.
  • New enum type mapping support in the ORM enabling more expressive model layers with improved type checking.
  • Table finders with named parameters, providing more expressive query building APIs.
  • Added time-only Time` type and greatly improved Date and DateTime support via chronos 3.x.
  • Support for PSR17 HTTP factories was added.

To find out more about what is new and changed in 5.0 refer to the migration guide.

Upgrading to 5.0

5.0 contains a number of breaking changes. If you have an existing application, we’ll be releasing 4.5.0 in the upcoming weeks. This release will contain many of the features present in 5.0, and will also contain deprecations for many of the breaking changes in 5.0 that do not already have deprecations. Once 4.5.0 is released we recommend that you upgrade to that release first. Then, once you have addressed all of the deprecations in 4.5.0 you will have a much easier time upgrading to 5.0.0.

To help with your upgrade from 4.x to 5.x the core team has prepared both a migration guide covering the deprecated, removed and new features.

Additionally, the core team has also prepared an upgrade guide which provides a step-by-step guide and CLI tooling to help you upgrade your application.

Contributors to 5.0.0

CakePHP 5.0 is the result of two years of work and contributions from the following community members:

  • ADmad
  • Alejandro Ibarra
  • Andrii Pukhalevych
  • Brian French
  • chris cnizzardini
  • Chris Nizzardini
  • fabian-mcfly
  • Jaro Varga
  • J.Brabec
  • Jose Daian
  • Jozef Grencik
  • Kevin Pfeifer
  • leon.schaub
  • Marcelo Rocha
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Matthias Wirtz
  • ndm2
  • Oliver Nowak
  • othercorey
  • Roland Waldner
  • saeideng

Thank you for all you’ve done to make CakePHP 5.0.0 a reality.

]]>
Sat, 09 Sep 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/08/19/cakephp_4417.html https://bakery.cakephp.org/2023/08/19/cakephp_4417.html <![CDATA[CakePHP 4.4.17]]> CakePHP 4.4.17

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.17. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.17. See the changelog for every commit.

  • Fix deprecation notice because of Chronos 2.4.
  • Fixed a typo in BasePlugin.

Contributors to 4.4.17

Thank you to all the contributors that helped make this release happen:

  • Kevin Pfeifer
  • kolorafa
  • Mark Scherer
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 19 Aug 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/08/05/cakephp_4416.html https://bakery.cakephp.org/2023/08/05/cakephp_4416.html <![CDATA[CakePHP 4.4.16]]> CakePHP 4.4.16

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.16. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.16. See the changelog for every commit.

  • Improve API documentation.
  • Correct pagination URL generation for the current page from numbers() when using the modulus option.
  • ProgressHelper now initializes options with default values solving errors when output() is called before init() is.
  • Fixed failure to reflect schema for tables in MySQL 8+ that use functional indexes.

Contributors to 4.4.16

Thank you to all the contributors that helped make this release happen:

  • Edoardo Cavazza
  • Jozef Grencik
  • Mark Scherer
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 05 Aug 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/07/01/cakephp_4415.html https://bakery.cakephp.org/2023/07/01/cakephp_4415.html <![CDATA[CakePHP 4.4.15]]> CakePHP 4.4.15

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.15. This is a maintenance release for the 4.4 branch that fixes several community reported issues including a low risk security fix.

Bugfixes

You can expect the following changes in 4.4.15. See the changelog for every commit.

  • SMTP transport skips authentication header parsing if no credentials are passed.
  • Fixed unsafe usage of unserialize in debug output of SecurityComponent failure messages. Thanks to Andreas Kellas for reporting this issue via our security disclosure policy.

Contributors to 4.4.15

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • DeSerFix-bot
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 01 Jul 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/06/06/cakephp_500RC1.html https://bakery.cakephp.org/2023/06/06/cakephp_500RC1.html <![CDATA[CakePHP 5.0.0-RC1 Released]]> CakePHP 5.0.0-RC1 Released

The CakePHP core team is happy to announce the first release candidate for CakePHP 5.0.0. Since the beta2 release the core team has continued to refine, simplify, and prepare 5.0 for the upcoming future. Some of the highlights of this work include:

  • Removing more code that will be deprecated in 4.5.
  • Added Time extensions with translation integrations.
  • Adding Time support to the ORM. Going forward time type columns will be mapped to this type. Additionally, date type columns will be mapped to immutable Date objects.
  • Added support for typed finders. Typed finders allows you to call finders with named parameters and have those named parameters runtime typechecked. This allows for more expressive finders with no additional boilerplate for typechecking.
  • Upgrade to PHPUnit 10. This was a challenging upgrade for us, and it may be challenging for some applications. If you identify ways that CakePHP could make the combined upgrade easier please open an issue.
  • Improved layout of development error pages.
  • Continued work on the rector rules for 4.5 and 5.0

Finally, the scope for 5.x isn’t locked down so if you’d like to see a feature added please open an issue.

New Features

The migration guide has a complete list of what’s new in 5.0.0. We recommend you give that page a read when upgrading as it notes the various breaking changes present in 5.0.

How you Can Help

You can help deliver 5.0 by contributing in one of many ways:

  1. Check the documentation for mistakes, outdated, unclear or broken examples. We’ve been trying to update the documentation as we go, but there are likely examples or sections we’ve missed.
  2. Try it out! Give CakePHP 5.0 a test drive in a non-production application. We’d love to hear how converting a small application went and what was harder than it should have been.
  3. File issues for regressions in existing features, or suggest new features. Even if those features don’t make it into 5.0, we would appreciate community input on what should be part of 5.1 and 5.2

Contributors to 5.0.0-beta1

Thank you to all the contributors that have helped since the beta2 release:

  • ADmad
  • Kevin Pfeifer
  • Marcelo Rocha
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • mscherer
  • ndm2
  • othercorey
  • Roland Waldner

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Tue, 06 Jun 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/05/22/cakephp_4414.html https://bakery.cakephp.org/2023/05/22/cakephp_4414.html <![CDATA[CakePHP 4.4.14]]> CakePHP 4.4.14

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.14. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.14. See the changelog for every commit.

  • Implemented SSL XOAUTH2 support in SmtpTransport. This improves compatibility with Microsoft based servers.
  • Improve API documentation.
  • Fixed support for postgres schemas other than public in Fixture schema generation.
  • Validation::utf8() and by extension the Validator::utf8() method as well now fail on invalid UTF8 bytes even when the extended range is enabled.
  • Fix usage of ROOT in deprecationWarning(). This was causing failures in standalone package usage.

Contributors to 4.4.14

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Marc Würth
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 22 May 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/04/22/cakephp_4413.html https://bakery.cakephp.org/2023/04/22/cakephp_4413.html <![CDATA[CakePHP 4.4.13]]> CakePHP 4.4.13

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.13. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.13. See the changelog for every commit.

  • Fix DateTimeType::manyToPHP with int.
  • Handle numeric keys in cookies being parsed from the server request.
  • Catch all exceptions when generating sql for Query::__debugInfo().
  • Fix loading of vendor namespaced plugins.

Contributors to 4.4.13

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 22 Apr 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/04/08/cakephp_500beta2.html https://bakery.cakephp.org/2023/04/08/cakephp_500beta2.html <![CDATA[CakePHP 5.0.0-beta2 Released]]> CakePHP 5.0.0-beta2 Released

The CakePHP core team is happy to announce the second beta release of CakePHP 5.0.0. Since the beta1 release the core team has continued to refine and simplify the framework. Some of the highlights of this work include:

  • Removing more code that was deprecated in 4.x.
  • Adding namespaces to all the global functions that CakePHP provides. This enables application code to define their own global function names or use the global function shims provided by CakePHP.
  • Added support for PSR-17 HTTP factories interfaces.
  • Improved the runtime deprecation coverage to include all documentation only deprecations.
  • Begun work on the rector rules for 4.5 and 5.0
  • Added a Time only object to Chronos (will be added to CakePHP soon).

Finally, the scope for 5.x isn’t locked down so if you’d like to see a feature or breaking change made please open an issue.

New Features

The migration guide has a complete list of what’s new in 5.0.0. We recommend you give that page a read when upgrading as it notes the various breaking changes present in 5.0.

How you Can Help

You can help deliver 5.0 by contributing in one of many ways:

  1. Check the documentation for mistakes, outdated, unclear or broken examples. We’ve been trying to update the documentation as we go, but there are likely examples or sections we’ve missed.
  2. Try it out! Give CakePHP 5.0 a test drive in a non-production application. We’d love to hear how converting a small application went and what was harder than it should have been.
  3. File issues for regressions in existing features, or suggest new features. Even if those features don’t make it into 5.0, we would appreciate community input on what should be part of 5.1 and 5.2

Contributors to 5.0.0-beta1

Thank you to all the contributors that have helped since the beta1 release:

  • ADmad
  • Alejandro Ibarra
  • Andrii Pukhalevych
  • andrii-pukhalevych
  • Brad McNaughton
  • Brian French
  • Chris Hallgren
  • Edgaras Janušauskas
  • Erwane Breton
  • fabsn182
  • Jamison Bryant
  • Jaro Varga
  • J.Brabec
  • Jose Daian
  • Kevin Pfeifer
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Matthias Wirtz
  • Mikkel Bonde
  • Nicos Panayides
  • othercorey
  • saeideng

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 08 Apr 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/03/23/cakephp_4412_released.html https://bakery.cakephp.org/2023/03/23/cakephp_4412_released.html <![CDATA[CakePHP 4.4.12 Released]]> CakePHP 4.4.12 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.12. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.12. See the changelog for every commit.

  • Fix regression in missing_controller template where class was undefined.
  • Add opt-in exception wrapping for PDOError that preserves the queryString attribute used in error templates. This is a workaround for dynamic properties being deprecated in PHP 8.2.
  • Improve how validation rules work on array elements with numeric keys.
  • Fix mutation side-effects in TestEmailTransport caused by Mailer instances being delivered within a loop. These mutations would result in test assertions having access to incorrect information.
  • Fixed cookie expiration when the default server timezone was ahead of UTC.
  • Added additional composer package metadata for PSR interface implementations.
  • An exception will now be thrown if the session cannot be started due to headers being sent. Previously a hard to understand TypeError would be raised when attempting to write to a session that failed to start.
  • cake plugin load now detects and prevents duplicates.

Contributors to 4.4.12

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Andrii Pukhalevych
  • Brad McNaughton
  • Brian French
  • Chris Hallgren
  • Erwane Breton
  • Jamison Bryant
  • Kevin Pfeifer
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • mscherer
  • Nicos Panayides

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 23 Mar 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/02/10/cakephp_4411_released.html https://bakery.cakephp.org/2023/02/10/cakephp_4411_released.html <![CDATA[CakePHP 4.4.11 Released]]> CakePHP 4.4.11 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.11. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.11. See the changelog for every commit.

  • View can now iterates templates paths that were defined as an associative array.
  • The i18n extract command now checks for directory existence before trying to enumerate the files within directories provided as inputs.
  • Update SECURITY policy docs to include 3.x end-of-life status.
  • Improve API documentation.
  • Fix dynamic-property error in PHP8.2 when PDOError objects are logged.
  • Switch to using phive to install static analysis tools.
  • Set the request into the routing context before processing middleware. This ensures that links on error pages always have access to the current request.

Contributors to 4.4.11

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Edgaras Janušauskas
  • fabsn182
  • Kevin Pfeifer
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Mikkel Bonde
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 10 Feb 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/01/06/cakephp_4212_released.html https://bakery.cakephp.org/2023/01/06/cakephp_4212_released.html <![CDATA[CakePHP 4.2.12 Released]]> CakePHP 4.2.12 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.12. This release corrects a regression introduced when backporting the recent security fix from 4.4.10 to the 4.2 branch.

Bugfixes

You can expect the following changes in 4.4.12. See the changelog for every commit.

  • Fix regression in Query::offset() and Query::limit().

Download a packaged release on github.

]]>
Fri, 06 Jan 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/01/06/cakephp_4211_4311_4410_released.html https://bakery.cakephp.org/2023/01/06/cakephp_4211_4311_4410_released.html <![CDATA[CakePHP 4.2.11, 4.3.11, and 4.4.10 Released]]> CakePHP 4.2.11, 4.3.11, and 4.4.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.11, 4.3.11, and 4.4.10. These releases contain a security fix for the limit() and offset() methods of Cake\Database\Query. If passed unfiltered request data, these methods would allow for SQL injection. If your application does not use CakePHP’s Pagination wrappers and directly passes request data into one of these methods your application is vulnerable. We’d like to thank ‘Tanaka’ for reporting this issue.

Additional Bugfixes in 4.4.10

The 4.4.10 release contains the aforementioned security fix as well as the following fixes. See the changelog for every commit.

  • Update association definitions in ORM tests.
  • Update build images to Ubuntu 22.04.

Contributors to 4.4.10

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 06 Jan 2023 00:00:00 +0000
https://bakery.cakephp.org/2023/01/01/cakephp_3_end_of_life_3105_released.html https://bakery.cakephp.org/2023/01/01/cakephp_3_end_of_life_3105_released.html <![CDATA[CakePHP 3.x End of Support and 3.10.5 Released]]> CakePHP 3.x End of Support and 3.10.5 Released

As previously communicated the time has come for CakePHP 3.x support to end. It has been 36 months since the release of 4.0.0 on Dec 15 2019, and going forward the core team will not be maintaining the 3.x branch.

Going forward the CakePHP team will continue to support 4.x and develop 5.x. Once 5.0.0 is released, 4.x will receive bugfixes for 24 months, and security fixes for 36 months.

CakePHP 3.10.5 released

The 3.10.5 release contains a single bugfix:

  • Fix IntegrationTestTrait providing null as the request body.

Contributors to 3.10.5

  • Marc Würth

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sun, 01 Jan 2023 00:00:00 +0000
https://bakery.cakephp.org/2022/12/29/cakephp_449_released.html https://bakery.cakephp.org/2022/12/29/cakephp_449_released.html <![CDATA[CakePHP 4.4.9 Released]]> CakePHP 4.4.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.9. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.9. See the changelog for every commit.

  • Improve duplicate route detection in cake routes.
  • Make ShadowTranslate strategy for TranslateBehavior handle missing association records with translations consistently with EavStrategy.

Contributors to 4.4.9

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Mark Story
  • Matthias Wirtz
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 29 Dec 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/12/19/cakephp_500beta1_released.html https://bakery.cakephp.org/2022/12/19/cakephp_500beta1_released.html <![CDATA[CakePHP 5.0.0-beta1 Released]]> CakePHP 5.0.0-beta1 Released

The CakePHP core team is proud to announce the first beta release of CakePHP 5.0.0. This initial release contains most of the new features and breaking changes that 5.0 will contain. This release contains a minimal working application skeleton. It also features a new version of Chronos with several breaking changes. A focus of 5.0 has been to remove deprecated features and improve the adoption of native type-declarations where possible.

Our focus in the near future is to finish updating all of the CakePHP maintained plugins to be compatible with 5.0. We’ll also be putting more work into backporting deprecations into the next 4.x release (4.5.0) so that upgrading can be done incrementally before 5.x is released.

Finally, the scope for 5.x isn’t locked down so if you’d like to see a feature or breaking change made please open an issue.

New Features

The migration guide has a complete list of what’s new in 5.0.0. We recommend you give that page a read when upgrading as it notes the various breaking changes present in 5.0.

How you Can Help

You can help deliver 5.0 by contributing in one of many ways:

  1. Check the documentation for mistakes, outdated, unclear or broken examples. We’ve been trying to update everything but may have not caught everything.
  2. Try it out! Give CakePHP 5.0 a test drive in a non-production application. We’d love to hear how converting a small application went and what was harder than it should have been.
  3. File issues for regressions in existing features, or suggest new features. Even if those features don’t make it into 5.0, we would appreciate community input on what should be part of 5.1 and 5.2

Contributors to 5.0.0-beta1

Thank you to all the contributors that have helped since the alpha1 release:

  • ADmad
  • Chris Nizzardini
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • ndm2
  • othercorey
  • saeideng

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Mon, 19 Dec 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/12/01/cakephp_448_released.html https://bakery.cakephp.org/2022/12/01/cakephp_448_released.html <![CDATA[CakePHP 4.4.8 Released]]> CakePHP 4.4.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.8. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.8. See the changelog for every commit.

  • Aligned ServerRequest::scheme() and Uri::getScheme() on how they handle proxy headers.
  • Improve compatibility of old PaginatorInterface alias.
  • Fixed infinite loop when a table class was created without a name or table, and getAlias() is called on it.
  • Improve assertMailSentWith comparisons with array values.
  • Fixed sortDefault and directionDefault not working with multiple pagination.
  • Improved typehints and API docs.

Contributors to 4.4.8

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Marc Würth
  • Mark Story
  • Matthias Wirtz
  • othercorey
  • TerryKern

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 01 Dec 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/10/29/cakephp_447_released.html https://bakery.cakephp.org/2022/10/29/cakephp_447_released.html <![CDATA[CakePHP 4.4.7 Released]]> CakePHP 4.4.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.7. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.7. See the changelog for every commit.

  • Fixed errors arising from exporting objects with invalid __debugInfo() methods.
  • Improved API documentation.
  • Fixed missing dependency to cakephp/database.
  • Fixed regression in FormHelper::radio() and FormHelper::multiCheckbox().

Contributors to 4.4.7

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Felix Kempf
  • Mark Scherer
  • Mark Story
  • ndm2
  • Oliver Nowak
  • othercorey
  • Tyler Lendon

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 29 Oct 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/10/01/cakephp_446_released.html https://bakery.cakephp.org/2022/10/01/cakephp_446_released.html <![CDATA[CakePHP 4.4.6 Released]]> CakePHP 4.4.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.6. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.6. See the changelog for every commit.

  • Chained or nested exceptions are now rendered correctly in integration test cases, console and HTML exception rendering.
  • ConsoleInputArgument instances no longer consider each other equal based on their option values only.
  • Improve typing and psalm error supression.
  • FormData now accepts UploadedFileInterface as a file.
  • Fixed MySQL schema reflection for tables that use conditional indexes. The expression part of the index is now ignored.
  • Updated links to use https instead of http.
  • Improved CI configuration security.

Contributors to 4.4.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Alex
  • Arhell
  • Corey Taylor
  • Mark Story
  • Nicos Panayides

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 01 Oct 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/08/28/cakephp_445_released.html https://bakery.cakephp.org/2022/08/28/cakephp_445_released.html <![CDATA[CakePHP 4.4.5 Released]]> CakePHP 4.4.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.5. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.5. See the changelog for every commit.

  • Improved handling of authentication errors in Smtp email transport.
  • Re-enabled displaying arguments in stack frames on development error pages.
  • Improved API documentation.
  • Fixed diffForHumans() not translating text based on the current locale.
  • The ValidatableInterface is now deprecated.
  • Fixed mocking services in tests with mockService() for services that are provided by reflection based container delegates.

Contributors to 4.4.5

  • ADmad
  • celsowm
  • Chris Nizzardini
  • Iacovos Constantinou
  • Marcelo Rocha
  • Mark Scherer
  • Mark Story
  • othercorey

Thank you to all the contributors that helped make this release happen:

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 28 Aug 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/08/07/cakephp_444_released.html https://bakery.cakephp.org/2022/08/07/cakephp_444_released.html <![CDATA[CakePHP 4.4.4 Released]]> CakePHP 4.4.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.4. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.4. See the changelog for every commit.

  • Simplify tests for Database package. This helps with the development of 5.x.
  • Fix build errors from new versions of intl, MySQL, and openssl.
  • Improved README docs.
  • Fix regression in route parameter coercion intoduced in 4.4.3 with the value 0 being cast to an int.

Contributors to 4.4.4

  • ADmad
  • blieb
  • Edgaras Janušauskas
  • Mark Scherer
  • Mark Story
  • othercorey

Thank you to all the contributors that helped make this release happen:

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 07 Aug 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/07/26/cakephp_443_released.html https://bakery.cakephp.org/2022/07/26/cakephp_443_released.html <![CDATA[CakePHP 4.4.3 Released]]> CakePHP 4.4.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.3. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.3. See the changelog for every commit.

  • Fixed a potential method call on null in file assertion methods.
  • Improved compatibility with PHP 8.2.
  • TableLocator::get() no longer throws an error if a table is configured with options and then mocked.
  • Updated CI configuration to use windows 2022 image.
  • Fixed a regression in Folder::create() where umask was not correctly set.
  • Cache keys used with FileEngine are now URL encoded. This aligns the characters valid in cache keys with other engines. It could cause cache misses for applications that were previously using characters outside of the alpha-numeric ranges.
  • Removed redundant class type checks.
  • Fixed ResultSet indexes being mutated by exceptions thrown within a loop while xdebug is enabled.
  • TableLocator now handles getting tables by namespaced class name better.
  • Unused properties in Database\Query were deprecated.

Contributors to 4.4.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Apisathan
  • chris cnizzardini
  • Edgaras Janušauskas
  • Erwane Breton
  • Kevin Pfeifer
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 26 Jul 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/07/05/cakephp_442_released.html https://bakery.cakephp.org/2022/07/05/cakephp_442_released.html <![CDATA[CakePHP 4.4.2 Released]]> CakePHP 4.4.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.2. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.2. See the changelog for every commit.

  • Updated constraints on laminas packages.
  • Improved EntityTrait::_accessible type annotation.
  • Added the encrypt and trustServerCertificate options to SqlServerDriver.
  • When viewClasses() based extension driven content-negotiation fails a NotFoundException will now be raised.
  • Fixed ServerRequest::is('xml') from returning true on the default Accept header sent by Firefox.
  • Added deprecation for the Error.errorLogger configure option. This was missed during the development of the ErrorTrap sub-system.
  • Improved API documentation.

Contributors to 4.4.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Cristian Haunsen
  • Mark Story
  • Michael Hoffmann
  • Nicos Panayides
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 05 Jul 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/06/13/cakephp_441_released.html https://bakery.cakephp.org/2022/06/13/cakephp_441_released.html <![CDATA[CakePHP 4.4.1 Released]]> CakePHP 4.4.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.1. This is a maintenance release for the 4.4 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.4.1. See the changelog for every commit.

  • Fixed broken links in API documentation.
  • Reverted a deprecation in implementedEvents() as DebugKit was relying on it and we missed identifying this usage earlier.
  • Added scanCount to RedisEngine to give more control over how keys are cleared.
  • Improved deprecation warning for ResultSetInterface proxying.
  • Fixed updating belongsToMany association junction records that contain composite primary keys that involve a column that is mapped to a non-scalar value.
  • Fixed P1D date interval expressions when used as cache TTL values.

Contributors to 4.4.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Alex Mayer
  • Corey Taylor
  • Erwane
  • Mark Story
  • Nicos Panayides
  • ndm2
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 13 Jun 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/06/06/cakephp_440_released.html https://bakery.cakephp.org/2022/06/06/cakephp_440_released.html <![CDATA[CakePHP 4.4.0 Released]]> CakePHP 4.4.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.4.0. This is the first stable release of 4.4.0. 4.4.0 provides a number improvements to CakePHP.

Upgrading to 4.4.0

You can use composer to upgrade to CakePHP 4.4.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:4.4.*"

Deprecation Warnings

4.4 introduces a few deprecations. All of these features will continue for the duration of 4.x but will be removed in 5.0. See the migration guide.

What’s new in 4.4.0?

The migration guide has a complete list of what’s new in 4.4.0. We recommend you give that page a read when upgrading. A few highlights from 4.4.0 are:

  • A new Error and Exception handling framework that is easier to extend and requires less application code to operate.
  • The RedisEngine now supports fast deletes with deleteAsync().
  • bin/cake routes now highlights collisions in route templates.
  • Controller::viewClasses() was added. This method enables controllers to take control of what content-types they can respond as.
  • View classes can define the static method contentType() to participate in content-type negotiation.
  • Query::expr() was added as an alternative to Query::newExpr().
  • The QueryExpression::case() builder now supports inferring the type from expressions passed to then() and else() that implement \Cake\Database\TypedResultInterface.
  • BaseApplication::handle() now adds the $request into the service container all the time.
  • HttpsEnforcerMiddleware now has an hsts option that allows you to configure the Strict-Transport-Security header.
  • TreeBehavior now supports triggering ORM callbacks when deleting nodes.

Contributors to 4.4.0

Thank you to all the contributors that helped make 4.4 happen:

  • ADmad
  • Alejandro Ibarra
  • Chetan Varshney
  • Corey Taylor
  • Gerhard Lechner
  • itosho
  • Jorge González
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • naveen
  • saeideng

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 4.4.0 is a large release and would not have been possible without the community support and feedback.

What’s Next

With 4.4.0 shipped, the core team’s focus will be primarily on CakePHP 5.0. So far in the 5.x branch, the team has:

  • Bumped the required version of PHP to 8.1.0
  • Removed all the behavior that was deprecated in 4.x.
  • Improved typehinting by using features in PHP 8.1.
  • Updated interfaces with @method annotations.

The roadmap for 5.x is still under development, and if there is a feature you feel passionate about or a tedious behavior you’d like to see changed, please open an issue and get the discussion started.

Download a packaged release on github.

]]>
Mon, 06 Jun 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/06/02/cakephp_4310_released.html https://bakery.cakephp.org/2022/06/02/cakephp_4310_released.html <![CDATA[CakePHP 4.3.10 Released]]> CakePHP 4.3.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.3.10. This is a maintenance release for the 4.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.3.10. See the changelog for every commit.

  • Fixed patchEntity() failing when a table contains a field that matches the name and casing of the table alias.
  • Fixed Collection::__debugInfo() failing when a count could not be generated.

Contributors to 4.3.10

Thank you to all the contributors that helped make this release happen:

  • Kevin Pfeifer
  • Mark Story
  • naveen
  • othercorey
  • Robert Gasch
  • Sheldon Reiff

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 02 Jun 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/05/21/cakephp_3104_released.html https://bakery.cakephp.org/2022/05/21/cakephp_3104_released.html <![CDATA[CakePHP 3.10.4 Released]]> CakePHP 3.10.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.10.4. This is a maintenance and security release for the 3.10 branch that fixes a community reported issue, and patches a security vulnerability.

Security Fixes

The 3.10.4 release fixes an encoding issue with the verified tokens feature of CsrfProtectionMiddleware released in 3.10.3. In 3.10.3 verfied tokens were generated using random bytes and would often fail to match as the bytes would be incorrectly encoded when rendered in HTML.

Bugfixes

You can expect the following changes in 3.10.4. See the changelog for every commit.

  • Fixed incorrectly encoded CSRF tokens when using the verifyTokenSource option.

Contributors to 3.10.4

Thank you to all the contributors that helped make this release happen:

  • Marc Würth
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 21 May 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/05/14/cakephp_440RC2_released.html https://bakery.cakephp.org/2022/05/14/cakephp_440RC2_released.html <![CDATA[CakePHP 4.4.0-RC2 Released]]> CakePHP 4.4.0-RC2 Released

The CakePHP core team is proud to announce the second release candidate of CakePHP 4.4.0. The 4.4.0 release will introduce several new features and a handful of deprecations.

New Features

The migration guide has a complete list of what’s new in 4.4.0. We recommend you give that page a read when upgrading as it outlines the deprecations present in 4.4.

Changes Since 4.4.0-RC1

  • The current request is now automatically added to your application’s dependency injection container making it easier to have services that depend on the current request.
  • Fixture schema reflection now clears the table registry to prevent errors with applications that initialize tables in initialize() hooks.
  • PaginatorHelper::limitControl() now works with multiple pagination.
  • Additional features on Debugger were deprecated in favour of using ErrorTrap instead.
  • Pagination classes were moved under Cake\Datasources\Paging.
  • Renamed DefaultPaginator to NumericPaginator.
  • The experimental flag was removed from the dependency injection container. It is now considered a stable API.
  • Improved the logging configuration in ErrorTrap and ExceptionTrap.
  • Fixed missing use of bindingKey in BelongsToMany associations.
  • Improved handling of invalid cookie names.
  • Improved content-negotiation with file types that have multiple content-type options.
  • The FormContext adapter for FormHelper now supports non-default validation rule sets.
  • Added a ‘match all’ type to View so that fallback view classes can be implemented in the new content-negotiation feature.
  • Added deleteAsync() and clearBlocking() methods to the redis cache engine.
  • Added new methods to ErrorLoggerInterface with annotations. The new logError() and logException() methods will replace the logMessage() and log() methods respectively in 5.x. Before using the new error handling subsystem you should update any custom error loggers.
  • Improved API documentation.
  • Removed usage of string interpolation that is deprecated in PHP 8.2

How you Can Help

You can help by trying out the RC in your application. Please open issues for any new test failures or regressions the new version creates in your application.

Contributors to 4.4.0-RC2

Thank you to all the contributors that have helped with 4.4.0:

  • ADmad
  • Andrii Pukhalevych
  • Corey Taylor
  • Danial Khoshkhou
  • dependabot[bot]
  • Gerasimos
  • itosho
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • OJMichael
  • othercorey
  • Remy Bos

We would also like to thank Guarang Maheta for notifying us of a security issue in bakery.cakephp.org and helping us resolve it.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 14 May 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/05/13/cakephp_439_released.html https://bakery.cakephp.org/2022/05/13/cakephp_439_released.html <![CDATA[CakePHP 4.3.9 Released]]> CakePHP 4.3.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.3.9. This is a maintenance release for the 4.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.3.9. See the changelog for every commit.

  • Improved API documentation.
  • Removed redundant function calls in session handling.
  • Updated to phpstan 1.6

Contributors to 4.3.9

Thank you to all the contributors that helped make this release happen:

  • Mark Scherer
  • Mark Story
  • othercorey
  • Remy Bos

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 13 May 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/05/08/cakephp_3103_released.html https://bakery.cakephp.org/2022/05/08/cakephp_3103_released.html <![CDATA[CakePHP 3.10.3 Released]]> CakePHP 3.10.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.10.3. This is a maintenance and security release for the 3.10 branch that fixes a couple community reported issues, and patches a security vulnerability.

Security Fixes

The 3.10.3 release contains an opt in security fix for CsrfProtectionMiddleware. Prior to this release, if an application has a cross-site-scripting vulnerability, or an attacker has access to a victim’s browser CSRF tokens could be manipulated allowing CSRF bypass. This weakness stems from CSRF middleware accepting any matching pair of tokens. With the fix applied, only tokens generated by the host application will be accepted. This fix requires opt-in because it breaks compatibility with existing CSRF tokens that may be in user’s browsers/sessions. To enable the new style tokens add the following:

// in src/Application.php
$middlewareQueue->add(new CsrfProtectionMiddleware([
    'verifyTokenSource' => true
]));

Bugfixes

You can expect the following changes in 3.10.3. See the changelog for every commit.

  • Fixed a memory leak in TranslatorRegistry when loading translations from cache.

Contributors to 3.10.3

Thank you to all the contributors that helped make this release happen:

  • Mark Story
  • Val Bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 08 May 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/04/22/cakephp_438_released.html https://bakery.cakephp.org/2022/04/22/cakephp_438_released.html <![CDATA[CakePHP 4.3.8 Released]]> CakePHP 4.3.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.3.8. This is a maintenance release for the 4.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.3.8. See the changelog for every commit.

  • Improved examples in documentation blocks.
  • Fixed missing usage of bindingKey in associations generated by BelongsToMany.
  • Fixed a TypeError coming from CsrfProtectionMiddleware when cookie data contained invalid base64 encoded data.
  • Improved handling of numeric keys in cookie parsing.

Contributors to 4.3.8

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Andrii Pukhalevych
  • Corey Taylor
  • Danial Khoshkhou
  • Gerasimos
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 22 Apr 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/03/25/cakephp_437_released.html https://bakery.cakephp.org/2022/03/25/cakephp_437_released.html <![CDATA[CakePHP 4.3.7 Released]]> CakePHP 4.3.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.3.7. This is a maintenance release for the 4.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.3.7. See the changelog for every commit.

  • Fixed additional errors where FileEngine could raise exceptions by calling unlink incorrectly.
  • Fixed ‘table already configured’ errors in reflection based fixtures when a table loads and configures another table during its initialize() hook.
  • Fixed contain() emitting errors when an association querybuilder uses both explicit fields and autoFields() at the same time.
  • Fixed PaginatorHelper::limitControl() not working with multiple-pagination.

Contributors to 4.3.7

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Mark Story
  • Markus Ramšak
  • OJMichael
  • Val Bancer
  • ndm2
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 25 Mar 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/03/19/cakephp_440RC1_released.html https://bakery.cakephp.org/2022/03/19/cakephp_440RC1_released.html <![CDATA[CakePHP 4.4.0-RC1 Released]]> CakePHP 4.4.0-RC1 Released

The CakePHP core team is proud to announce the first release candidate of CakePHP 4.4.0. The 4.4.0 release will introduce several new features and a handful of deprecations.

New Features

The migration guide has a complete list of what’s new in 4.4.0. We recommend you give that page a read when upgrading as it outlines the deprecations present in 4.4.

New Feature Highlights

  • CakePHP 4.4.0 requires PHP 7.4+
  • bin/cake routes now highlights route collisions.
  • The SQLite driver now uses RETURNING * to update entities after saving with sqlite >=3.35+
  • Query::expr() was added as a shorter alias for Query::newExpr().
  • A new more extensible error handling subsystem has been added. The existing inheritance based system is now deprecated.
  • HttpsEnforcerMiddleware now has an hsts option that allows you to configure the Strict-Transport-Security header.
  • Controller::viewClasses() was added. This can be implemented by controllers that need to perform content-type negotiation. View classes will need to implement the static method contentType() to participate in content-type negotiation.

How you Can Help

You can help by trying out the RC in your application. Please open issues for any new test failures or regressions the new version creates in your application.

Contributors to 4.4.0-RC1

Thank you to all the contributors that have helped with 4.4.0:

  • ADmad
  • Alejandro Ibarra
  • Corey Taylor
  • Gerhard Lechner
  • Jorge González
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • Markus Ramšak
  • saeideng

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 19 Mar 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/03/04/cakephp_436_released.html https://bakery.cakephp.org/2022/03/04/cakephp_436_released.html <![CDATA[CakePHP 4.3.6 Released]]> CakePHP 4.3.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.3.6. This is a maintenance release for the 4.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.3.6. See the changelog for every commit.

  • Fixed typing errors when routes converted passed parameters into objects.
  • Improved API documentation.
  • Fixed a memory leak in TranslatorRegistry when many translations were loaded from cache.
  • Improved handling of empty array typed controller action parameters.
  • Fixed required options blocking --help output in console commands.
  • CacheEngine::deleteMultiple() now attempts to delete all keys instead of stopping at the first failure.
  • Fixed regression in belong to many associations that use a junction table and finder that applies contain() to the query.

Contributors to 4.3.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Mark Story
  • Val Bancer
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 04 Mar 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/02/04/cakephp_435_released.html https://bakery.cakephp.org/2022/02/04/cakephp_435_released.html <![CDATA[CakePHP 4.3.5 Released]]> CakePHP 4.3.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.3.5. This is a maintenance release for the 4.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.3.5. See the changelog for every commit.

  • FormHelper now correctly detects of entity collections.
  • Improved error messages for fixture insertion errors.
  • Widened the accepted range for psr/log.
  • FormHelper checkbox and radio control hiddenField options can now be set to ‘’.
  • Http\Client auth adapters can now be set without App.namespace being set.
  • Fixed errors detected by newer versions of static analyzers.

Contributors to 4.3.5

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Cees-Jan Kiewiet
  • Corey Taylor
  • Mark Story
  • Michael Hoffmann
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 04 Feb 2022 00:00:00 +0000
https://bakery.cakephp.org/2022/01/14/cakephp_434_released.html https://bakery.cakephp.org/2022/01/14/cakephp_434_released.html <![CDATA[CakePHP 4.3.4 Released]]> CakePHP 4.3.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.3.4. This is a maintenance release for the 4.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.3.4. See the changelog for every commit.

  • Improved exception logging. If rendering fails during the ‘safe’ fallback error page rendering, a log message is now recorded..
  • Added a omitted method for getting a list of tables without views from a connection.
  • Updated Schema\Collection::listTables() to omit views from the table listing. This will resolve problems with views and the new fixture system.
  • Improved MySQL table list query.
  • Improved route compiliation performance.

Team Changes

Since our last release post there have been a few changes in the CakePHP core team. First, we would like to welcome LordSimal who joins us from Leibnitz, Austria. LordSimal has been actively helping others in the community, improving the documentation and has contributed pull requests to both CakePHP core, and DebugKit. We would like to thank chinpei215 for his many years of involvement in CakePHP as he is leaving the team. During his tenure, chinpei215 identified and fixed several security issues and contributed greatly to i18n functionality in the framework.

Contributors to 4.3.4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Mark Story
  • othercorey
  • rmarsh1ua

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 14 Jan 2022 00:00:00 +0000
https://bakery.cakephp.org/2021/12/17/cakephp_433_released.html https://bakery.cakephp.org/2021/12/17/cakephp_433_released.html <![CDATA[CakePHP 4.3.3 Released]]> CakePHP 4.3.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.3.3. This is a maintenance release for the 4.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.3.3. See the changelog for every commit.

  • Improved error handling when OAuth signing encounters SSL errors.
  • Fixed regression in Router::reverse() and how it handles passed arguments.
  • Fixed inserting breadcrumbs at the end of the list with insertAfter().
  • Improved API docs.
  • Improved error mesages when PDO extensions are missing.

Contributors to 4.3.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Andrii Pukhalevych
  • Corey Taylor
  • Juan Pablo Ramirez
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 17 Dec 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/12/12/cakephp_3102_released.html https://bakery.cakephp.org/2021/12/12/cakephp_3102_released.html <![CDATA[CakePHP 3.10.2 Released]]> CakePHP 3.10.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.10.1. This is a maintenance release for the 3.10 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.10.2. See the changelog for every commit.

  • Improved API docs.
  • Fixed Router::reverse() not handling passed parameters defined with setPass() properly.
  • Fixed BreadCrumbHelper::insertAt() at the last index.

Contributors to 3.10.2

Thank you to all the contributors that helped make this release happen:

  • Kevin Pfeifer
  • Mark Story
  • othercorey
  • R.Strittmatter

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 12 Dec 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/11/26/cakephp_432_released.html https://bakery.cakephp.org/2021/11/26/cakephp_432_released.html <![CDATA[CakePHP 4.3.2 Released]]> CakePHP 4.3.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.3.2. This is a maintenance release for the 4.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.3.2. See the changelog for every commit.

  • Added array type coercion to controller actions. Lists of , separated values can now be unpacked into arrays.
  • Ensure that $defaultTable is set in controllers.
  • Relaxed version contraints on psr/container.
  • Updated cache keys generated by Table::get(). Previously keys were not compatible with file based caches. The side-effect of this fix is that cache keys will change.
  • Added _urldecode option to route to allow more control on how request URLs are decoded.
  • Fixed missing milliseconds in log messages.
  • Fixed Router::reverse() not handling parameters created with Route::setPass() properly.
  • Added support for 308 HTTP status code.
  • Removed _defaultConfig from PaginatorComponent to fix default configuration defined in sub-classes from being ignored.
  • Improved API documentation.

Contributors to 4.3.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Chris Hallgren
  • Corey Taylor
  • Ian den Hartog
  • Kevin Pfeifer
  • Marc Würth
  • Mark Scherer
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 26 Nov 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/11/06/cakephp_431_released.html https://bakery.cakephp.org/2021/11/06/cakephp_431_released.html <![CDATA[CakePHP 4.3.1 Released]]> CakePHP 4.3.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.3.1. This is a maintenance release for the 4.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.3.1. See the changelog for every commit.

  • Fixed incomplete cloning when Database\Query is cloned.
  • Fixed Query::modifier() not handling expression objects correctly.
  • Improved array typehints in API documentation blocks.
  • Fixed custom type mappings defined in Table classes not being used when inserting fixture rows with the new fixture system.
  • Improved deprecation messages for QueryExpression::case().
  • Fixed base path handling in HttpsEnforcerMiddleware.

Contributors to 4.3.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Mark Scherer
  • Mark Story
  • mirko-pagliai
  • ndm2
  • othercorey
  • Remi Collet

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 06 Nov 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/10/29/cakephp_3101_released.html https://bakery.cakephp.org/2021/10/29/cakephp_3101_released.html <![CDATA[CakePHP 3.10.1 Released]]> CakePHP 3.10.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.10.1. This is a maintenance release for the 3.10 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.10.1. See the changelog for every commit.

  • Fixed radio inputs generating duplicate id attribute values when values had trailing/leading -.
  • Fixtures now only reset sequences in SQLServer if required.
  • Fix DateType not clearing time for DateTimeImmutable.
  • Fixed cascading deletes generating incorrect SQL when bindingKey values are null.

Contributors to 3.10.1

Thank you to all the contributors that helped make this release happen:

  • Marc Würth
  • Mark Scherer
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 29 Oct 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/10/23/cakephp_430_released.html https://bakery.cakephp.org/2021/10/23/cakephp_430_released.html <![CDATA[CakePHP 4.3.0 Released]]> CakePHP 4.3.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.3.0. This is the first stable release of 4.3.0. 4.3.0 provides a number improvements to CakePHP.

Upgrading to 4.3.0

You can use composer to upgrade to CakePHP 4.3.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:4.3.*"

Deprecation Warnings

4.3 introduces a few deprecations. All of these features will continue for the duration of 4.x but will be removed in 5.0. See the migration guide.

What’s new in 4.3.0?

The migration guide has a complete list of what’s new in 4.3.0. We recommend you give that page a read when upgrading. A few highlights from 4.3.0 are:

  • A new fixture system that allows you to use your existing migrations or SQL dump files to define schema was added. Support for cake’s migrations and SQL dump files is included.
  • TestSuite\HttpMockTrait was added to make mocking HTTP client requests easier.
  • LocatorAwareTrait::fetchTable() was added to make the getTableLocator()->get() pattern more ergonomic.
  • Controller::middleware() was added. This method lets you define middleware specific to a controller, or the current controller action.
  • deprecationWarning() no longer emits duplicate warnings.
  • Logged SQL queries now use boolean literals making them easier to paste into a repl.
  • The cake console command was extracted into a new cakephp/repl package.
  • Form objects now support multiple validators and leverage a similar interface to the ORM to use those validators.
  • CspMiddleware can now transparently add nonce- based policies.
  • FormHelper will now set additional ARIA attributes automatically.
  • The ORM can now marshall date times from the user’s timezone into the applications timezone transparently.
  • CakePHP’s dependency on league/container was bumped to ^4.1.1.

Contributors to 4.3.0

Thank you to all the contributors that helped make 4.3 happen:

  • ADmad
  • andrii-pukhalevych
  • Breton Erwane
  • captain-redbeard
  • Chris Nizzardini
  • Erwane Breton
  • fabsn182
  • Jan Brabec
  • Juan Pablo Ramirez
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • ndm2
  • othercorey
  • Rafael Mardones
  • Rob Rikken
  • saeideng

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 4.3.0 is a large release and would not have been possible without the community support and feedback.

Download a packaged release on github.

]]>
Sat, 23 Oct 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/10/16/isunique_rule_changes.html https://bakery.cakephp.org/2021/10/16/isunique_rule_changes.html <![CDATA[IsUnique Rule Changes Explained]]> IsUnique Rule Changes Explained

If you have unique indexes on nullable columns, you’ve probably noticed some confusing changes to the IsUnique application rule in CakePHP 4.

In CakePHP 3, IsUnique has an option named allowMultipleNulls that defaults to true. This option controls whether NULL values are considered unique. If they are unique then the rule returns true when any field contains a NULL value.

When CakePHP 4 was released, the allowMultipleNulls option was removed due to a miscommuncation. This caused IsUnique to fail if a row matched the fields including NULL values.

However, this issue was caught and the option reintroduced in CakePHP 4.2 with a different implementation. Due to backwards compatible rules for releases, the default was set to false because CakePHP 4.0 did not include it.

Baking allowMultipleNulls in Application Rules

Bake 2.6 will automatically add the allowMultipleNulls option for any unique index that contains a nullable column. This will be set to true for all databases except SQL Server. This should be easier for users to understand the behavior and know where to change the option.

You should see unique rules generated something like this:

$rules->add($rules->isUnique(['field_1', 'field_2'], ['allowMultipleNulls' => true]), ['errorField' => 'field_1']);

There are always edge cases for rules like this. Some users might have nullable columns but maintain unique null values. Some users might have a solution for SQL Server to consider NULL unique. Our goal is to provide reasonable and reliable defaults.

Note

Bake 2.6 also includes support for baking unique rules with multiple fields.

CakePHP 5 Changes

We understand there is confusion caused by changing default behavior of options that are hidden, but we think this needs to be corrected the right way.

CakePHP 5 will default this behavior back to allowing multiple NULL values.

With the above changes to Bake, this should not be a signifcant change in behavior.

]]>
Sat, 16 Oct 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/10/16/cakephp_430RC4_released.html https://bakery.cakephp.org/2021/10/16/cakephp_430RC4_released.html <![CDATA[CakePHP 4.3.0-RC4 Released]]> CakePHP 4.3.0-RC4 Released

The CakePHP core team is proud to announce the first release candidate of CakePHP 4.3.0. The 4.3.0 release will introduce several new features and a handful of deprecations.

New Features

The migration guide has a complete list of what’s new in 4.3.0. We recommend you give that page a read when upgrading as it outlines the deprecations present in 4.3.

Changes from RC3

Since the release of 4.3.0-RC3 the following changes have been made:

  • A new fluent builder for CASE expressions was added to QueryExpression.
  • QueryExpression::addCase() is now deprecated.
  • Associations that load records with the subquery strategy, no longer include a LIMIT clause if there is no ORDER BY on the query.
  • CakePHP’s dependency on league/container was bumped to ^4.x this may cause type errors with ServiceProvider implementations.
  • The new fixture system was further refined, both in API and performance. These changes may cause incompatibilities with applications using previous release candidates.
  • Fixed the singular form of ‘lenses’ to ‘lens’.

How you Can Help

You can help by trying out the RC in your application. Please open issues for any new test failures or regressions the new version creates in your application.

Contributors to 4.3.0-RC4

Thank you to all the contributors that have helped with 4.3.0:

  • ADmad
  • Corey Taylor
  • Mark Scherer
  • Mark Story
  • ndm2

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 16 Oct 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/10/13/cakephp_4210_released.html https://bakery.cakephp.org/2021/10/13/cakephp_4210_released.html <![CDATA[CakePHP 4.2.10 Released]]> CakePHP 4.2.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.10. This is a maintenance release for the 4.2 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.2.10. See the changelog for every commit.

  • Fix a TypeError in CsrfProtectionMiddleware when invalid data was provided.
  • Fixed MailContains constraint from escaping patterns multiple times.
  • Improved API documentation.
  • Added workaround for breaking change in PHPUnit 9.5.10.
  • Fixed incorrect SQL being generated when a HasMany association has a null value, and the association has cascadeCallbacks.
  • Fix DateType not clearing time values for DateTimeImmutable. This scenario can arise when using the cakephp/orm package directly.
  • Limit clauses are ignored if no order exists when using a subquery strategy for HasMany associations.

Contributors to 4.2.10

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Julian Pollmann
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • Rolf Kaiser

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 13 Oct 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/10/06/cakephp_430RC3_released.html https://bakery.cakephp.org/2021/10/06/cakephp_430RC3_released.html <![CDATA[CakePHP 4.3.0-RC3 Released]]> CakePHP 4.3.0-RC3 Released

The CakePHP core team is proud to announce the first release candidate of CakePHP 4.3.0. The 4.3.0 release will introduce several new features and a handful of deprecations.

New Features

The migration guide has a complete list of what’s new in 4.3.0. We recommend you give that page a read when upgrading as it outlines the deprecations present in 4.3.

Changes from RC2

Since the release of 4.3.0-RC2 the following changes have been made:

  • TestCase::deprecated() now raises an assertion error if the callback doesn’t trigger any deprecations.
  • Improved API documentation and static analysis tool typing.
  • Improved error messages from incorrect Command classes.
  • Fixed behavior of cascading deletes when bindingKey values are null.
  • Improved stack references for deprecation warnings.
  • Deprecated ModelAwareTrait. Use the new LocatorAwareTrait features instead.
  • Added LocatorAwareTrait::fetchTable() as a simpler API to get ORM Table instances.
  • Added LocatorAwareTrait::$defaultTable. This property replaces $modelClass.
  • Passed parameters from routes can now be typed as float, bool and int. If an invalid value is used in a route, a 404 error will be raised.
  • Fixed BelongsToMany junction tables getting the incorrect entity class during association row replacement. Instead of getting entities from the association target table, you will receive entity records from the junction table.
  • Duplicate deprecation warnings are only emit once now. You can enable duplicated output by setting Error.allowDuplicateDeprecations to true.
  • cake plugin now adds to the bottom of the Application bootstrap instead of the top.

How you Can Help

You can help by trying out the RC in your application. Please open issues for any new test failures or regressions the new version creates in your application.

Contributors to 4.3.0-RC3

Thank you to all the contributors that have helped with 4.3.0:

  • ADmad
  • Corey Taylor
  • Mark Scherer
  • Mark Story
  • ndm2
  • othercorey
  • Rolf Kaiser
  • saeideng

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Wed, 06 Oct 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/10/02/cakephp_2_eol.html https://bakery.cakephp.org/2021/10/02/cakephp_2_eol.html <![CDATA[CakePHP 2.x End of Life]]> CakePHP 2.x End of Life

The CakePHP core team would like to remind users that CakePHP 2 reached End of Life on June 15, 2021. This was after 6 months of security related support and 18 months after the release of CakePHP 4.0.

We understand there will be projects that must remain on CakePHP 2, but unfortunately, the core team cannot maintain this version any longer.

CakePHP 3.x End of Life Extended

We would also like to remind users that End of Life date for CakePHP 3.x was extended to help support users who have made the transition out of 2.x.

  • 3.10 will continue to receive bug fixes until December 15, 2021.
  • 3.10 will continue to receive security fixes until December 15, 2022.

With CakePHP 4.3 just aroud the corner and work in CakePHP 5 started, we hope users are excited about the push for improvements and tastier Cake.

]]>
Sat, 02 Oct 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/09/26/cakephp_430RC2_released.html https://bakery.cakephp.org/2021/09/26/cakephp_430RC2_released.html <![CDATA[CakePHP 4.3.0-RC2 Released]]> CakePHP 4.3.0-RC2 Released

The CakePHP core team is proud to announce the first release candidate of CakePHP 4.3.0. The 4.3.0 release will introduce several new features and a handful of deprecations.

New Features

The migration guide has a complete list of what’s new in 4.3.0. We recommend you give that page a read when upgrading as it outlines the deprecations present in 4.3.

Changes from RC1

Since the release of 4.3.0-RC1 the following changes have been made:

  • View::addHelpers() was added and the $merge flag of setHelpers() was deprecated.
  • Association::setName() was deprecated.
  • A type error in CsrfProtectionMiddleware was fixed. This error could be triggered if cookie data was invalid.
  • MailContains only escapes patterns once noce.
  • Fixture cleanup performance was improved for SQLServer.
  • BaseLog::resolve() was renamed to BaseLog::interpolate().
  • TestCase::loadFixtures() is now deprecated.
  • The automatic nonce policy features of CspMiddleware now require opt-in configuration to enable. This improves backwards compatibility for applications with existing CSP policies.
  • Improved API documentation.
  • Improved extensibility of fixture strategies by always calling setup/teardown methods.

How you Can Help

You can help by trying out the RC in your application. Please open issues for any new test failures or regressions the new version creates in your application.

Contributors to 4.3.0-RC2

Thank you to all the contributors that have helped with 4.3.0:

  • ADmad
  • Corey Taylor
  • Juan Pablo Ramirez
  • Julian Pollmann
  • Kevin Pfeifer
  • Mark Scherer
  • Mark Story
  • othercorey

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 26 Sep 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/09/12/cakephp_430RC1_released.html https://bakery.cakephp.org/2021/09/12/cakephp_430RC1_released.html <![CDATA[CakePHP 4.3.0-RC1 Released]]> CakePHP 4.3.0-RC1 Released

The CakePHP core team is proud to announce the first release candidate of CakePHP 4.3.0. The 4.3.0 release will introduce several new features and a handful of deprecations.

New Features

The migration guide has a complete list of what’s new in 4.3.0. We recommend you give that page a read when upgrading as it outlines the deprecations present in 4.3.

New Feature Highlights

  • Controller::middleware() was added which allows you to define middleware for a single controller only.
  • Http\Client::addMockResponse() was added making integration tests easier to write without using complex to define mocks.
  • A JSON based logger was added.
  • FormHelper generates aria attributes improving out-of-the box accessibility.
  • A new fixture subsystem leverages your migrations or SQL dumps to generate test database schema was added.

How you Can Help

You can help by trying out the RC in your application. Please open issues for any new test failures or regressions the new version creates in your application.

Contributors to 4.3.0-RC1

Thank you to all the contributors that have helped with 4.3.0:

  • ADmad
  • Breton Erwane
  • Chris Nizzardini
  • Erwane Breton
  • J.Brabec
  • Jan Brabec
  • Juan Pablo Ramirez
  • Mark Scherer
  • Mark Story
  • Rob Rikken
  • andrii-pukhalevych
  • captain-redbeard
  • chris cnizzardini
  • fabsn182
  • jpramirez
  • ndm2
  • othercorey

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 12 Sep 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/09/10/cakephp_429_released.html https://bakery.cakephp.org/2021/09/10/cakephp_429_released.html <![CDATA[CakePHP 4.2.9 Released]]> CakePHP 4.2.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.9. This is a maintenance release for the 4.2 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.2.9. See the changelog for every commit.

  • Fixed radio inputs trimming off leading - which could result in duplicate id attributes.
  • Improved API documentation.
  • Fixed newline usage in MailTransport. In PHP8 mail() require headers to be separated with CRLF instead of PHP_EOL.
  • Fixture truncation in SQLServer now only regenerates sequences that were used.

Contributors to 4.2.9

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Lars Willighagen
  • Mark Story
  • othercorey
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 10 Sep 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/07/16/cakephp_428_released.html https://bakery.cakephp.org/2021/07/16/cakephp_428_released.html <![CDATA[CakePHP 4.2.8 Released]]> CakePHP 4.2.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.8. This is a maintenance release for the 4.2 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.2.8. See the changelog for every commit.

  • Paginator scopes now generate URLs correctly when passed parameters are involved.
  • The searched path list in a MissingTemplateException is now correct for elements in plugins.
  • Improved documentation for Query::applyOptions().

Contributors to 4.2.8

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Joel Montesinos
  • Mark Story
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 16 Jul 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/06/19/cakephp_3100_released.html https://bakery.cakephp.org/2021/06/19/cakephp_3100_released.html <![CDATA[CakePHP 3.10.0 Released]]> CakePHP 3.10.0 Released

The CakePHP core team is happy to announce the availability of CakePHP 3.10.0. This is release is a backwards compatible upgrade for 3.x and adds several new features and backports from the 4.x branch. These backports aim to ease the upgrade path from 3.x to 4.x.

Extending the 3.x Timeline

Previously 3.9 was the last planned feature release for 3.x and bug fix releases were planned to stop after June 15 2021. Because of continued interest and usage of 3.x we’ve decided to extend the 3.x maintenance timeline and release 3.10. The new timelines are:

  • 3.10 will continue to receive bug fixes until December 15, 2021.
  • 3.10 will continue to receive security fixes until December 15, 2022.

Updating to 3.10.0

You can use composer to upgrade to the beta version of CakePHP 3.10.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:^3.10.0"

What’s new in 3.10.0?

The shortlist of features included in 3.10 is as follows:

  • Improved API documentation.
  • Backported improvements to Validation::time() from 4.x.
  • EmailTrait::assertMailSentFrom() now accepts an array with an address & alias.

Contributors to 3.10.0

Thank you to all the contributors that helped make this release happen:

  • bancer
  • David Yell
  • gregs
  • Jorge
  • Mark Story
  • ndm2
  • othercorey
  • tanden
  • Tobse

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sat, 19 Jun 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/06/16/cakephp_427_released.html https://bakery.cakephp.org/2021/06/16/cakephp_427_released.html <![CDATA[CakePHP 4.2.7 Released]]> CakePHP 4.2.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.7. This is a maintenance release for the 4.2 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.2.7. See the changelog for every commit.

  • Improved error messages for form protection failures.
  • Fixed tuple comparisons dropping their parameter binding types which improves subquery generation and marshalling _ids with composite primary keys.
  • Improved API documentation.
  • I18n\Number no longer emits errors in PHP8 when invalid data is formatted.
  • Fixed OAuth1 signature comparison failures when consumer keys contain base64 encoded data.
  • Reduced output from debug() when objects implement __debugInfo(). Now only the data from __debugInfo() is exported instead of debug data and all properties which often led to duplicate output.
  • Fixed failing console output assertion when output contained a %s placeholder.

Contributors to 4.2.7

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Hache_raw
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann
  • Rytis Slatkevičius
  • fugaco
  • ndm2
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 16 Jun 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/05/30/cakephp_3910_released.html https://bakery.cakephp.org/2021/05/30/cakephp_3910_released.html <![CDATA[CakePHP 3.9.10 Released]]> CakePHP 3.9.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.10. This is a maintenance release for the 3.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.9.10. See the changelog for every commit.

  • Fixed ‘text file busy’ errors that occur with file caching and virtual machines.
  • Fixed type information being lost when translating tuple comparisons. The surrogate queries did not inherit type map information.
  • Fixed types not being used when marshalling _ids and composite keys.
  • Added missing encoding to OAuth1 client when the consumer_key is a base64 encoded string.

Contributors to 3.9.10

Thank you to all the contributors that helped make this release happen:

  • othercorey
  • Mark Story
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 30 May 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/05/05/cakephp_426_released.html https://bakery.cakephp.org/2021/05/05/cakephp_426_released.html <![CDATA[CakePHP 4.2.6 Released]]> CakePHP 4.2.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.6. This is a maintenance release for the 4.2 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.2.6. See the changelog for every commit.

  • Updated API documentation for FrozenDate.
  • Improved Security.salt warning message.
  • Improved exception message in Collection::groupBy() when no key is used.
  • cake plugin assets can now handle symlinks on windows.
  • Fixed variadic string argument resolution in ControllerFactory.
  • Fixed ‘text file busy’ errors that can occur when deleting files on virtual machines.
  • Fixed assertMailSentToAt(0) not working correctly.

Contributors to 4.2.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Karma Dice
  • Mark Scherer
  • Mark Story
  • gregs
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 05 May 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/04/23/cakephp_399_released.html https://bakery.cakephp.org/2021/04/23/cakephp_399_released.html <![CDATA[CakePHP 3.9.9 Released]]> CakePHP 3.9.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.9. This is a maintenance release for the 3.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.9.9. See the changelog for every commit.

  • The assertMailSentFrom() method can now compare array emails.
  • Improved API documentation.
  • Fix BufferedIterator not yielding full results when partially iterated.
  • Fix RouteBuilder::plugin() not forwarding the namePrefix option.

Contributors to 3.9.9

Thank you to all the contributors that helped make this release happen:

  • Corey Taylor
  • Jorge
  • Marc Würth
  • Mark Story
  • TerryKern
  • Tobse
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 23 Apr 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/04/02/cakephp_425_released.html https://bakery.cakephp.org/2021/04/02/cakephp_425_released.html <![CDATA[CakePHP 4.2.5 Released]]> CakePHP 4.2.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.5. This is a maintenance release for the 4.2 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.2.5. See the changelog for every commit.

  • Improved time format in response headers. Previously leading 0s were missing.
  • Improved API documentation.
  • Fixed RouteBuilder::plugin() not forwarding the _namePrefix option.
  • Improved accuracy of database query log timers.
  • Fixed BufferedIterator not returning all results after being partially iterated and then iterated a second time.
  • The standalone database package no longer emits a type error when App.namespace is undefined and the connection does not exist.

Contributors to 4.2.5

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Mark Scherer
  • Mark Story
  • othercorey
  • Saleh Souzanchi
  • Tobse

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 02 Apr 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/03/27/cakephp_3100RC1_released.html https://bakery.cakephp.org/2021/03/27/cakephp_3100RC1_released.html <![CDATA[CakePHP 3.10.0-RC1 Released]]> CakePHP 3.10.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.10.0-RC1. This is the first release candidate for 3.10.0. It contains several new features. If no major issues are reported a stable release will be packaged in a few weeks.

3.10 contains several features that have been backported from 4.x. The intent of these new features and backports is to ease upgrading applications from 3.x to 4.x.

Extending the 3.x Timeline

Previously 3.9 was the last planned feature release for 3.x and bug fix releases were planned to stop after June 15 2021. Because of continued interest and usage of 3.x we’ve decided to extend the 3.x maintenance timeline and release 3.10. The new timelines are:

  • 3.10 will continue to receive bug fixes until December 15 2021.
  • 3.10 will continue to receive security fixes until December 15 of 2022.

Updating to the RC

You can use composer to upgrade to the beta version of CakePHP 3.10.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.10.0-RC1"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the release candidate, we can help ensure a smoother release of 3.10.0 before the stable release.

What’s new in 3.10.0?

The shortlist of features included in 3.10 is as follows:

  • Improved API documentation.
  • Backported improvements to Validation::time() from 4.x.
  • EmailTrait::assertMailSentFrom() now accepts an array with an address & alias.

Contributors to 3.10.0-RC1

Thank you to all the contributors that helped make this release happen:

  • Corey Taylor
  • David Yell
  • Marc Würth
  • Mark Story
  • tanden
  • TerryKern
  • Val Bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sat, 27 Mar 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/03/09/cakephp_398_released.html https://bakery.cakephp.org/2021/03/09/cakephp_398_released.html <![CDATA[CakePHP 3.9.8 Released]]> CakePHP 3.9.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.8. This is a maintenance release for the 3.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.9.8. See the changelog for every commit.

  • The changes made to TableLocator::get() in 3.9.7 were reverted as issues were opened as plugins rely on shallow initialization loops.

Contributors to 3.9.8

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 09 Mar 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/03/06/cakephp_397_released.html https://bakery.cakephp.org/2021/03/06/cakephp_397_released.html <![CDATA[CakePHP 3.9.7 Released]]> CakePHP 3.9.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.7. This is a maintenance release for the 3.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.9.7. See the changelog for every commit.

  • bin/cake routes check no longer fails when redirect routes are used.
  • Improved API documentation and method annotations.
  • The variable replacement behavior was aligned between the sprintf and icu message formatters. This change was a backport from 4.x.
  • Aligned Entity::isEmpty() and Entity::hasValue() to treat '0' as a non-empty value. This aligns the behavior with documentation and original intent.
  • Fixed path handling in FileCache to prevent deleting an empty paths.
  • TableLocator::get() now raises an error when a table’s initialize() method would create an infinite loop.
  • Email::setReplyTo() now takes multiple addresses.

Contributors to 3.9.7

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Marc Würth
  • Mark Story
  • mtak3
  • ndm2
  • othercorey
  • Waldemar Bartikowski

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 06 Mar 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/02/27/cakephp_424_released.html https://bakery.cakephp.org/2021/02/27/cakephp_424_released.html <![CDATA[CakePHP 4.2.4 Released]]> CakePHP 4.2.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.4. This is a maintenance release for the 4.2 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.2.4. See the changelog for every commit.

  • Fix bin/cake routes check not handling redirect routes correctly.
  • Removed a connection flag from the SQLServer driver that is incompatible with pdo_sqlsrv 5.9+.
  • Improved API documentation.
  • Console TableHelper now accepts integers and floats as cell values.
  • Updated documentation for ServerRequest::is() to allow mixed.
  • Improved PHP8 compatibility for silenced errors.
  • Aligned Entity::isEmpty() and Entity::hasValue() to treat '0' as a non-empty value. This aligns the behavior with documentation and original intent.
  • DatabaseSession now uses the session table’s entity when creating/deleting records.
  • Fixed path handling in FileCache to prevent deleting an empty paths.

Contributors to 4.2.4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • AdmDevelopment
  • Alexander Volle
  • Mark Story
  • mirko-pagliai
  • mtak3
  • ndm2
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 27 Feb 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/01/24/cakephp_423_released.html https://bakery.cakephp.org/2021/01/24/cakephp_423_released.html <![CDATA[CakePHP 4.2.3 Released]]> CakePHP 4.2.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.3. This is a maintenance release for the 4.2 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.2.3. See the changelog for every commit.

  • Improve saving of translations when using the shadow table strategy.
  • Improved flash message retention. Messages are now merged with the existing messages making it compatible with multiple requests in the same test method.
  • Fix Session::read() to return the default value when a session cannot be started.
  • Improved API documentation.
  • Validation::custom() now accepts integer values.
  • The sprintf() translation formatter now works consistently with the intl based implementation when translating plural values. The count parameter is no longer the first placeholder value.
  • Mailer\Message now includes the textMessage and htmlMessage in serialized data.
  • Arguments for stacktraces are now included by default for development error pages.

Contributors to 4.2.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Cauan Cabral
  • Corey Taylor
  • Hache_raw
  • Joseph Shanak
  • Mark Scherer
  • Mark Story
  • o0h
  • othercorey
  • Thx3r
  • Waldemar Bartikowski

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 24 Jan 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/01/23/cakephp_396_released.html https://bakery.cakephp.org/2021/01/23/cakephp_396_released.html <![CDATA[CakePHP 3.9.6 Released]]> CakePHP 3.9.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.6. This is a maintenance release for the 3.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.9.6. See the changelog for every commit.

  • Enabled exception argument collection in ErrorHandlerMiddleware for PHP>7.4

Contributors to 3.9.6

Thank you to all the contributors that helped make this release happen:

  • Erwane Breton
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 23 Jan 2021 00:00:00 +0000
https://bakery.cakephp.org/2021/01/06/cakephp_422_released.html https://bakery.cakephp.org/2021/01/06/cakephp_422_released.html <![CDATA[CakePHP 4.2.2 Released]]> CakePHP 4.2.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.2. This is a maintenance release for the 4.2 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.2.2. See the changelog for every commit.

  • Integration tests now persist flash message more reliably when custom view classes are used, and when redirects are performed.
  • Changes made to FixtureManager were reverted fixing problems with fixture schema management and partial data loading.
  • API documentation was improved.
  • CSRF tokens created by CsrfProtectionMiddleware are now salted to mitigate BREACH vulnerabilities. The tokens are now longer, and are encoded with base64 instead of hexadecimal encoded.

Contributors to 4.2.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Mark Scherer
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 06 Jan 2021 00:00:00 +0000
https://bakery.cakephp.org/2020/12/28/cakephp_395_released.html https://bakery.cakephp.org/2020/12/28/cakephp_395_released.html <![CDATA[CakePHP 3.9.5 Released]]> CakePHP 3.9.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.5. This is a maintenance release for the 3.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.9.5. See the changelog for every commit.

  • Fixed missing parenthesis on subqueries in SQLServer.
  • Fixed incorrect bindings when ordering queries by expressions in SQLServer.
  • Fix Hash::mergeDiff() not handling scalar values during merging well.

Contributors to 3.9.5

Thank you to all the contributors that helped make this release happen:

  • Mark Story
  • ndm2
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 28 Dec 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/12/26/cakephp_421_released.html https://bakery.cakephp.org/2020/12/26/cakephp_421_released.html <![CDATA[CakePHP 4.2.1 Released]]> CakePHP 4.2.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.1. This is a maintenance release for the 4.2 branch that fixes several community reported issues. We’d like to thank Xhelal Likaj for reporting the BREACH weakness, and incomplete salt length checks via our security process.

Bugfixes

You can expect the following changes in 4.2.1. See the changelog for every commit.

  • Fix fixture file casing.
  • Improved API documentation for TimeHelper.
  • Added additional setup warnings for short Security.salt values. Ideally salt values are 32 bytes or longer.
  • Fix null values being passed to controller actions when resolving dependencies.
  • Fix BREACH weakness in SessionCsrfProtectionMiddleware.

Contributors to 4.2.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Mark Scherer
  • Mark Story
  • Remi Collet

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 26 Dec 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/12/20/cakephp_420_released.html https://bakery.cakephp.org/2020/12/20/cakephp_420_released.html <![CDATA[CakePHP 4.2.0 Released]]> CakePHP 4.2.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.2.0. This is the first stable release of 4.2.0. 4.2.0 provides a number improvements both large and small to CakePHP.

Upgrading to 4.2.0

You can use composer to upgrade to CakePHP 4.2.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:4.2.*"

Deprecation Warnings

4.2 introduces a few deprecations. All of these features will continue for the duration of 4.x but will be removed in 5.0. See the migration guide.

What’s new in 4.2.0?

The migration guide has a complete list of what’s new in 4.2.0. We recommend you give that page a read when upgrading. A few highlights from 4.2.0 are:

  • Full support for PHP8.
  • Experimental support for a dependency injection container was added. The DI container enables you to have application dependencies injected into controller constructors, controller actions and command constructors.
  • SQLServer driver now uses client-side buffers for results. This improves performance greatly.
  • Cake\Http\Middleware\SessionCsrfProtectionMiddleware was added. Instead of storing CSRF tokens in a cookie, this middleware stores tokens in the session. This makes CSRF tokens user scoped and time based with the session, offering enhanced security over cookie based CSRF tokens.
  • A new utility class Cake\Http\FlashMessage was added whose instance is available through ServerRequest::getFlash(). The class similar to the FlashComponent allows you to set flash messages from anywhere you have a request, making it useful in middleware.
  • Table::subquery() and Query::subquery() were added. These methods lets you create query objects that don’t have automatic aliasing.
  • Collations are now supported for string literals and IdentifierExpression.

Contributors to 4.2.0

Thank you to all tbe contributors that helped make 4.2 happen:

  • ADmad
  • Blaz
  • chris cnizzardini
  • Edgaras Janušauskas
  • Eugene Ritter
  • imo-tikuwa
  • Juan Basso
  • Mario Rothauer
  • Mark Scherer
  • Mark Story
  • ndm2
  • othercorey
  • Ricardo Turella
  • tanden
  • tikuwa

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 4.2.0 is a large release and would not have been possible without the community support and feedback.

Download a packaged release on github.

]]>
Sun, 20 Dec 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/12/15/cakephp_21024_released.html https://bakery.cakephp.org/2020/12/15/cakephp_21024_released.html <![CDATA[CakePHP 2.10.24 Released]]> CakePHP 2.10.24 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.24. This is the final maintenance release for 2.x. The 2.10 release will continue to receive security fixes until June 15 2021.

Bugfixes

You can expect the following changes in 2.10.24. See the changelog for every commit.

  • Fixed incorrect URL parsing when REQUEST_URI contains a string that is the same length as the App.fullBaseUrl.

Contributors to 2.10.24

Thank you to all the contributors that helped make this release happen:

  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 15 Dec 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/12/12/cakephp_417_released.html https://bakery.cakephp.org/2020/12/12/cakephp_417_released.html <![CDATA[CakePHP 4.1.7 Released]]> CakePHP 4.1.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.1.7. This is a maintenance release for the 4.1 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.1.7. See the changelog for every commit.

  • Improved API documentation
  • Added additional tests for flash message retention in tests.
  • Fixed SQL Server missing parenthesis on pagination subquery order clause.
  • Fixed SQL Server binding conflicts when ordering by expression objects.
  • Improved error messages when database queries are missing operators.
  • Fixed Hash::mergeDiff() not handling scalar values well.

Contributors to 4.1.7

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Ikko Ashimine
  • Mark Scherer
  • Mark Story
  • Markus Ramšak
  • ndm2
  • othercorey
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 12 Dec 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/12/07/cakephp_4010_released.html https://bakery.cakephp.org/2020/12/07/cakephp_4010_released.html <![CDATA[CakePHP 4.0.10 Released]]> CakePHP 4.0.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.10. This release contains security fixes and is a recommended upgrade for all applications still using 4.0.x.

The security fixes address a vulnerability in the CsrfProtectionMiddleware that allowed method override parameters to bypass CSRF checks for requests with no additional POST data. The fixes validate that the HTTP method override is a valid HTTP method name. We’d like to thank Xhelal Likaj for reporting this issue to us via our security process.

The versions impacted by this issue are >4.0.0, <=4.0.9 and >4.1.0, <=4.1.3. Releases after 4.1.3 are not vulnerable as they already validated the HTTP method names.

Bugfixes

You can expect the following changes in 4.0.10. See the changelog for every commit.

  • Fixed validation of HTTP methods defined in _method parameters.

Contributors to 4.0.9

Thank you to all the contributors that helped make this release happen:

  • Mark Story
  • Xhelal Likaj

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Mon, 07 Dec 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/11/29/cakephp_420RC1_released.html https://bakery.cakephp.org/2020/11/29/cakephp_420RC1_released.html <![CDATA[CakePHP 4.2.0-RC1 Released]]> CakePHP 4.2.0-RC1 Released

The CakePHP core team is proud to announce the first release candidate of CakePHP 4.2.0. The 4.2.0 release will introduce several new features and a handful of deprecations. The added features include formal support for PHP8, experimental support for a dependency injection container, a new session based CSRF middleware, improved APIs for database subqueries, and a new Flash Utility.

New Features

The migration guide has a complete list of what’s new in 4.2.0. We recommend you give that page a read when upgrading as it outlines the deprecations present in 4.2.

Changes Since 4.2.0-beta1

  • Http\Client::createFromUrl() was added.
  • Improved errors when INSERT queries cannot be compiled.
  • TableHelper::output() now has a text-right tag to right align cell content.
  • TestFixture::isManaged() was added to make whether a fixture manages schema more explicit.
  • UrlHelper now supports the assetUrlClassName option, which allows you to replace the class used to generate static asset URLs.
  • TableLocator::allowFallbackClass() was added. This method lets you disable automatic fallback table class in a locator.
  • Http\FlashMessage was added. This utility class enables flash messages to be manipulated from within middleware.
  • Http\ServerRequest::getFlash() was added to expose the new flash utility.
  • Fixing binding conflicts in SQLServer queries.
  • Added Application.buildContainer event. This event is triggered when the application container is built.
  • Integration test traits had the mockService() method added to enable straightforward mocking of services in tests.

How you Can Help

You can help by trying out the RC in your application. Please open issues for any new test failures or regressions the new version creates in your application.

Contributors to 4.2.0-RC1

Thank you to all the contributors that have helped with 4.2.0:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Eugene Ritter
  • Ikko Ashimine
  • imo-tikuwa
  • Juan Basso
  • Mark Scherer
  • Mark Story
  • ndm2
  • othercorey
  • saeideng
  • tikuwa

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 29 Nov 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/11/14/cakephp_394_released.html https://bakery.cakephp.org/2020/11/14/cakephp_394_released.html <![CDATA[CakePHP 3.9.4 Released]]> CakePHP 3.9.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.4. This is a maintenance release for the 3.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.9.4. See the changelog for every commit.

  • The pj() function now supports UTF-8 data better.
  • Fixed warning about SameSite index when upgrading from earlier versions of 3.x.
  • Improved API documentation.
  • Added upper PHP version constraint of <8.0. Because 3.x has several dependencies that are not compatible with PHP8, we also cannot easily support PHP8 without breaking compatibility.

Contributors to 3.9.4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Mark Story
  • Saleh Souzanchi
  • Tadahisa Motooka
  • terry.kern

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 14 Nov 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/11/07/cakephp_416_released.html https://bakery.cakephp.org/2020/11/07/cakephp_416_released.html <![CDATA[CakePHP 4.1.6 Released]]> CakePHP 4.1.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.1.6. This is a maintenance release for the 4.1 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.1.6. See the changelog for every commit.

  • The Validator::setStopOnFailure() method was added. This method helps improve ease of upgrading from 3.x. It allows the require* methods to stop field validation.
  • Mailer::setReplyTo() now accepts multiple email addresses. This change aligns Reply-To with other email fields that accept multiple recipients.
  • Warnings emitted by AuthComponent when using strict mode and a mocked request were fixed.
  • Fixed incorrect error messages for named routes that failed to match.
  • Fixed string condition parsing in having and where conditions when the string condition contains functions and spaces.
  • Improved API documentation.
  • OAuth 1.0 signatures no longer include request bodies if the request is not urlencoded data.
  • Support for UTF8 encodings was added to pj().
  • Entity marshalling now loosely compares objects. Previously strict comparisons were used causing all object attributes to considered dirty and updated.
  • Improved error messages when INSERT queries were missing a table name.
  • BodyParserMiddleware now correctly handles scalar value request bodies for JSON requests.
  • ServerCommand now honours the PHP environment variable when starting the HTTP server.

Contributors to 4.1.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • chris cnizzardini
  • Corey Taylor
  • Daniel Opitz
  • Juan Basso
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Matthias Wirtz
  • othercorey
  • Ricardo Turella
  • Richard.Strittmatter

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 07 Nov 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/11/01/cakephp_420beta1_released.html https://bakery.cakephp.org/2020/11/01/cakephp_420beta1_released.html <![CDATA[CakePHP 4.2.0-beta1 Released]]> CakePHP 4.2.0-beta1 Released

The CakePHP core team is proud to announce the first beta release of CakePHP 4.2.0. This beta introduces a small number of deprecations. It adds experimental support for a dependency injection container, a session based CSRF option, and improved support for subqueries.

New Features

The migration guide has a complete list of what’s new in 4.2.0. We recommend you give that page a read when upgrading as it outlines the deprecations present in 4.2.

How you Can Help

You can help by trying out the beta in your application. Please open issues for any new test failures or regressions the new version creates in your application.

Contributors to 4.2.0-beta1

Thank you to all the contributors that have helped with 4.1.0:

  • ADmad
  • Blaz
  • chris cnizzardini
  • Corey Taylor
  • Mario Rothauer
  • Mark Scherer
  • Mark Story
  • ndm2
  • othercorey
  • Ricardo Turella
  • tanden

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 01 Nov 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/10/05/cakephp_393_released.html https://bakery.cakephp.org/2020/10/05/cakephp_393_released.html <![CDATA[CakePHP 3.9.3 Released]]> CakePHP 3.9.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.3. This is a maintenance release for the 3.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.9.3. See the changelog for every commit.

  • Reduce the usage of deprecated features in Http package.
  • Fixed HasMany associations not applying conditions defined within a closure during an unlink operation.
  • Cookies can have their SameSite attribute defined in PHP 7.3+.
  • Improved API documentation.

Contributors to 3.9.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • itosho
  • Mark Story
  • Mischa ter Smitten

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 05 Oct 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/10/04/cakephp_415_released.html https://bakery.cakephp.org/2020/10/04/cakephp_415_released.html <![CDATA[CakePHP 4.1.5 Released]]> CakePHP 4.1.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.1.5. This is a maintenance release for the 4.1 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.1.5. See the changelog for every commit.

  • cake plugin load will now display an error when an invalid plugin name is used.
  • Improved compatibility with PHP8.
  • Test fixtures now truncate tables that have externally defined schema. Previously they would not be truncated or dropped and subsequent tests would fail.
  • MemcachedEngine will now raise an exception when persistent connections are used with different server lists.
  • AuthComponent no longer raises an error when the request has no action defined.
  • Improved cross browser compatibility of ‘Copy’ button in debug output.
  • Updated parameter names inside Collection in preparation foro PHP8.

Contributors to 4.1.5

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • bancer
  • Corey Taylor
  • itosho
  • Jonathan McAndrew
  • Mark Scherer
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 04 Oct 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/09/05/cakephp_414_released.html https://bakery.cakephp.org/2020/09/05/cakephp_414_released.html <![CDATA[CakePHP 4.1.4 Released]]> CakePHP 4.1.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.1.4. This is a maintenance release for the 4.1 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.1.4. See the changelog for every commit.

  • Route now normalizes HTTP method names. This prevents hard to diagnose route matching failures when a method was miscased.
  • The output of debug() now includes whitespace in the generated HTML. This improves the text output when contents are copy and pasted.
  • The HTML output of debug() now includes a ‘copy’ button to make copying the contents easier.
  • Parameter name mismatches between interfaces, and implementations were fixed in preparation for PHP8’s named parameters.
  • Invalid UUID values now emit warnings less often during marshalling.
  • TableRegistry::get() now generates aliases correctly when tables are fetched with their full qualified namespace name.

Contributors to 4.1.4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Mark Scherer
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 05 Sep 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/08/29/cakephp_392_released.html https://bakery.cakephp.org/2020/08/29/cakephp_392_released.html <![CDATA[CakePHP 3.9.2 Released]]> CakePHP 3.9.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.2. This is a maintenance release for the 3.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.9.2. See the changelog for every commit.

  • The Http\Client curl adapter now uses CURLOPT_NOBODY when making HEAD requests.
  • Fix output buffers not being closed when view templates or blocks are being rendered. This fixes tests being marked as risky in PHPUnit.
  • PaginatorHelper::first() and last() now correctly handle url options.

Contributors to 3.9.2

Thank you to all the contributors that helped make this release happen:

  • Marc Würth
  • Mark Story
  • ndm2
  • Nicky Gerritsen

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 29 Aug 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/08/15/cakephp_413_released.html https://bakery.cakephp.org/2020/08/15/cakephp_413_released.html <![CDATA[CakePHP 4.1.3 Released]]> CakePHP 4.1.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.1.3. This is a maintenance release for the 4.1 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.1.3. See the changelog for every commit.

  • The changes made to not reload plugin configuration was reverted as it caused regressions in community plugins.
  • XML entity loading code was de-duplicated and made compatible with PHP8.
  • The SqlServer driver now raises an exception when more than 2100 parameters are provided as that is the maximum that SQLServer supports.
  • The SqlServer driver will now retry connection creation up to 4 times on certain errors such as database paused. This increases compatibility with cloud hosted SQLServer instances.
  • View now closes all open output buffers when an element or view fails during rendering. This resolves open buffer warnings in test cases.
  • DateType now ensures that time components are wiped for PHP provided classes as well.

Contributors to 4.1.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Mark Scherer
  • Mark Story
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 15 Aug 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/08/08/cakephp_412_released.html https://bakery.cakephp.org/2020/08/08/cakephp_412_released.html <![CDATA[CakePHP 4.1.2 Released]]> CakePHP 4.1.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.1.2. This is a maintenance release for the 4.1 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.1.2. See the changelog for every commit.

  • Fixed usage of deprecated classes internally.
  • Fixed TypeError in PHP8.
  • Improved type checking in Validation::custom() and localizedTime().
  • Fixed potential collision with placeholders in Text::insert().
  • Enabled autoloading of models when modelClass is defined with a fully qualified namespace name.
  • Enable log formats to log milliseconds.
  • Fixed incorrect behavior when sending a HEAD request and the response contains a Content-Length header.
  • Whitespace inside strings output via debug() is now retained in the HTML output format.
  • Improve database logging to handle SELECT queries that return no rows.
  • Update external entity loading options to work with newer versions of libxml.
  • Table::getAlias() now handles abstract base classes better.

Contributors to 4.1.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Benjamin Gehrels
  • Corey Taylor
  • Edgaras Janušauskas
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • mcsknp
  • Nicky Gerritsen
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 08 Aug 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/07/26/cakephp_391_released.html https://bakery.cakephp.org/2020/07/26/cakephp_391_released.html <![CDATA[CakePHP 3.9.1 Released]]> CakePHP 3.9.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.1. This is a maintenance release for the 3.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.9.1. See the changelog for every commit.

  • Connection::transactional() will now rollback the transaction on a Throwable instance.
  • Fixed encoding issue in MO file parser.
  • Improved API documentation.
  • Added ssl_local_pk option to HttpClient.
  • Collection::shuffle() now includes elements with duplicate keys in the collection.
  • Added deprecation tag to NumberHelper::defaultCurrency(). Use getDefaultCurrency() and setDefaultCurrency() instead.

Contributors to 3.9.1

Thank you to all the contributors that helped make this release happen:

  • Corey Taylor
  • Edgaras Janušauskas
  • Mark Scherer
  • Mark Story
  • othercorey
  • Philo Hamel
  • Val Bancer
  • Vincent PLANCHER

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 26 Jul 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/07/18/cakephp_411_released.html https://bakery.cakephp.org/2020/07/18/cakephp_411_released.html <![CDATA[CakePHP 4.1.1 Released]]> CakePHP 4.1.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.1.1. This is a maintenance release for the 4.1 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.1.1. See the changelog for every commit.

  • FlashComponent::set() now handles Throwable in addition to Exception.
  • debug() now can output objects like SplFixedArray that have integer property names.
  • Validation::date() no longer accepts values that have , after the month value.
  • Assets in vendor prefixed plugins now are correctly timestampped by HtmlHelper.
  • Routing error pages no longer double encode HTML for route elements and options.
  • Fix incorrect aliasing for Cake\Database\Expression\ComparisonExpression that was causing a regression in application/plugin code.
  • Improved compatibility in getMockForModel().
  • The parsed results of DSN strings now cast timeout to an integer.
  • CsrfProtectionMiddleware not raises an exception when the request already contains a csrfToken attributes as this implies that CSRF has already been applied to the request and applying it twice is a configuration error.

Contributors to 4.1.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Cauan Cabral
  • Corey Taylor
  • Gerd Katzenbeisser
  • Mark Scherer
  • Mark Story
  • mitzzzjp
  • Peter Härder

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 18 Jul 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/07/04/cakephp_410_released.html https://bakery.cakephp.org/2020/07/04/cakephp_410_released.html <![CDATA[CakePHP 4.1.0 Released]]> CakePHP 4.1.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.1.0. This is the first stable release of 4.1.0. 4.1.0 provides a number improvements both large and small to CakePHP.

Upgrading to 4.1.0

You can use composer to upgrade to CakePHP 4.1.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:4.1.*"

Deprecation Warnings

4.1 introduces a few deprecations. All of these features will continue for the duration of 4.x but will be removed in 5.0. See the migration guide.

What’s new in 4.1.0?

The migration guide has a complete list of what’s new in 4.1.0. We recommend you give that page a read when upgrading. A few highlights from 4.1.0 are:

  • Support for Common Table Expressions (CTE) in the ORM.
  • Support for window functions in the ORM.
  • Query::orderAsc() and Query::orderDesc() now accept Closure’s as their field enabling you to use build complex order expressions with the provided QueryExpression object.
  • debug() and Debugger::printVar() now emit HTML in web contexts, and ANSI styled output in CLI contexts. Output of cyclic structures and repeated objects is much simpler. Cyclic objects are only dumped once and use reference ids to point back to the full value.
  • CsrfProtectionMiddleware can now create cookies with the samesite attribute set.
  • Log messages can now contain {foo} style placeholders. These placeholders will be replaced by values from the $context parameter if available.

Contributors to 4.1.0

Thank you to all the contributors that helped make 4.1 happen:

  • ADmad
  • andrii-pukhalevych
  • Cauan Cabral
  • chinpei215
  • Corey Taylor
  • Diego Sardina
  • diegosardina
  • Edgaras Janušauskas
  • Frank de Graaf
  • Jad Bitar
  • John Zwarthoed
  • Marc Würth
  • Mario Rothauer
  • Mark Scherer
  • Mark Story
  • Matthias Wirtz
  • McsKienNP
  • mcsknp
  • mtak3
  • ndm2
  • nojimag
  • Oliver Nowak
  • othercorey
  • saeideng
  • victoreassi
  • Vincent PLANCHER
  • Walther Lalk

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 4.1.0 is a large release and would not have been possible without the community support and feedback.

Download a packaged release on github.

]]>
Sat, 04 Jul 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/06/22/cakephp_409_released.html https://bakery.cakephp.org/2020/06/22/cakephp_409_released.html <![CDATA[CakePHP 4.0.9 Released]]> CakePHP 4.0.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.9. This is a maintenance release for the 4.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.0.9. See the changelog for every commit.

  • Added support for AUTH PLAIN to SmtpTransport.
  • Improved API docblocks and type annotations.
  • Removed usage of ReflectionParameter::getClass() as it is deprecated in PHP 8.
  • Improved performance of ServerRequest::is() and isAll().
  • Fixed warnings in SecurityComponent, FormProtector and CsrfProtectionMiddleware when handling invalid non-scalar data.
  • Fixed incorrect paths in missing layout error pages.

Contributors to 4.0.9

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Mark Scherer
  • Mark Story
  • andrii-pukhalevych

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 22 Jun 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/06/21/cakephp_410RC2_released.html https://bakery.cakephp.org/2020/06/21/cakephp_410RC2_released.html <![CDATA[CakePHP 4.1.0-RC2 Released]]> CakePHP 4.1.0-RC2 Released

The CakePHP core team is proud to announce the first release candidate of CakePHP 4.1.0. This beta introduces a handful of deprecations. It also adds window function support and common-table-expression support to the ORM. Furthermore, it features improved debug() output, and new ORM events for marshalling.

New Features

The migration guide has a complete list of what’s new in 4.1.0. We recommend you give that page a read when upgrading as it outlines the deprecations present in 4.1.

Changes Since 4.1.0-RC1

  • Table::saveMany() now triggers the Model.afterSaveCommit event.
  • Improved deprecation links.
  • Fix a regression in RC1 where associations with dependent but not associated records would cause deletions to fail.
  • Fixed inflection of CamelCase words.
  • Deprecated TableRegistry::get(). Use the TableLocatorAwareTrait instead.
  • Fix query LoggingStatement prematurely fetching records.
  • The whitelist and sortWhitelist options for PaginatorComponent have been deprecated. Use allowedParameters and sortableFields instead.
  • Fixed incorrect paths in missing layout exception pages.
  • CsrfProtectionMiddleware::whitelistCallback() has been deprecated. Use skipCheckCallback() instead.
  • Add support for console colors in Windows 10 and bash emulation.

How you Can Help

You can help by trying out the RC in your application. Please open issues for any new test failures or regressions the new version creates in your application.

Contributors to 4.1.0-RC2

Thank you to all the contributors that have helped with 4.1.0:

  • ADmad
  • Corey Taylor
  • Mark Scherer
  • Mark Story
  • Walther Lalk
  • ndm2

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 21 Jun 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/06/20/cakephp_390_released.html https://bakery.cakephp.org/2020/06/20/cakephp_390_released.html <![CDATA[CakePHP 3.9.0 Released]]> CakePHP 3.9.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.0. This is the first stable release of 3.9.0. 3.9.0 provides a number improvements both large and small to CakePHP.

This release is the last planned feature release for 3.x. Going forward the core team will be focusing 4.x releases going forward. As per our release timelines 3.9 will continue to receive bug fixes until June 15 2021.

Upgrading to 3.9.0

You can use composer to upgrade to CakePHP 3.9.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.9.*"

Deprecation Warnings

  • ConsoleIo::info(), success(), warning() and error() will no longer accept null values in the message parameter in 4.0.
  • Using a comma separated string for $fixtures in test cases is deprecated. Instead use an array, or implement the new getFixtures() method on your test case classes.
  • Validator::errors() was renamed to Validator::validate().
  • FormHelper::create() now emits deprecation warnings when the $context parameter is a boolean or string. These values trigger fatal errors in 4.0 and will need to be updated before upgrading.
  • The magic method signature for FunctionBuilder::cast([...]) is deprecated. Use FunctionBuilder::cast('field', 'type') instead.
  • Abandoned zendframework package has been replaced with laminas which provides backwards-compatible classes.

What’s new in 3.9.0?

The migration guide has a complete list of what’s new in 3.9.0. We recommend you give that page a read when upgrading. A few highlights from 3.9.0 are:

  • Command classes can implement the defaultName() method to overwrite the conventions based CLI name.
  • Query::orderAsc() and Query::orderDesc() now accept Closure’s as their field enabling you to use build complex order expressions with the provided QueryExpression object.
  • Cake\Datasource\SimplePaginator was added. This class makes paginating very large results more efficient. It skips running the potentially expensive count() query. If you only use ‘next’ and ‘previous’ navigation in your pagination controls this class can be a good solution.
  • Cake\Http\Client\Response::isSuccess() was backported from 4.0
  • Cake\Http\Middleware\CspMiddleware was backported from 4.0
  • BaseApplication::addOptionalPlugin() was added. This method handles loading plugins, and handling errors for plugins that may not exist because they are dev dependencies.
  • The i18n global functions now only return strings. The changes made to 4.0 to remove the null return value when no translation string is provide have been backported to 3.9.
  • Lenient parsing can be disabled for parseDateTime() and parseDate() using disableLenientParsing(). The default is enabled - the same as IntlDateFormatter.
  • Table::saveManyOrFail() method has been added that will throw PersistenceFailedException with the specific entity that failed in case of an error. The entities are saved within a transaction.
  • Table::deleteMany() and Table::deleteManyOrFail() methods have been added for removing many entities at once including callbacks. The entities are removed within a transaction.
  • Text::uuid() now uses random_int() with PHP 5.6 insted of mt_rand(). This adds a dependency on paragonie/random_compat which implements it for PHP 5.6.

Contributors to 3.9.0

Thank you to all the contributors that helped make 3.9 happen:

  • ADmad
  • Cauan Cabral
  • Corey Taylor
  • Edgaras Janušauskas
  • Erwane Breton
  • Florian Krämer
  • Frank de Graaf (Phally)
  • Jorge González
  • Mark Scherer
  • Mark Story
  • Robert Pustułka
  • Tibor
  • Val Bancer
  • Victor Eduardo de Assis
  • Zuluru
  • andrii-pukhalevych
  • bancer
  • gregs
  • mcsknp
  • ndm2
  • nojimage

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 3.9.0 is a large release and would not have been possible without the community support and feedback.

Download a packaged release on github.

]]>
Sat, 20 Jun 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/06/19/cakephp_3813_released.html https://bakery.cakephp.org/2020/06/19/cakephp_3813_released.html <![CDATA[CakePHP 3.8.13 Released]]> CakePHP 3.8.13 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.13. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.13. See the changelog for every commit.

  • Improve API documentation annotations.
  • Add AUTH PLAIN support to the SmtpTransport.
  • Fix warnings emitted by SecurityComponent and CsrfProtectionMiddleware when array data was provided in specific inputs.

Contributors to 3.8.13

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 19 Jun 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/06/06/cakephp_21022_released.html https://bakery.cakephp.org/2020/06/06/cakephp_21022_released.html <![CDATA[CakePHP 2.10.22 Released]]> CakePHP 2.10.22 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.22. This is a maintenance release for the 2.10 branch that fixes community reported issues.

Bugfixes

You can expect the following changes in 2.10.22. See the changelog for every commit.

  • Improve API documentation.
  • Fix UUID generation to not include host or IP based information. This aligns the implementation with the documented behavior of being a v4 UUID.
  • Improved performance of Request::is() and Request::isAll()

Contributors to 2.10.22

Thank you to all the contributors that helped make this release happen:

  • Mark Sch
  • Mark Story
  • Richard van den
  • Val Bancer
  • andrii-pukhalevych
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 06 Jun 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/05/31/cakephp_410RC1_released.html https://bakery.cakephp.org/2020/05/31/cakephp_410RC1_released.html <![CDATA[CakePHP 4.1.0-RC1 Released]]> CakePHP 4.1.0-RC1 Released

The CakePHP core team is proud to announce the first release candidate of CakePHP 4.1.0. This beta introduces a handful of deprecations. It also adds window function support and common-table-expression support to the ORM. Furthermore, it features improved debug() output, and new ORM events for marshalling.

New Features

The migration guide has a complete list of what’s new in 4.1.0. We recommend you give that page a read when upgrading as it outlines the deprecations present in 4.1.

Changes Since 4.1.0-beta1

  • Form\Form::set() was added to help incrementally update the data in a Form object.
  • The interface for CommonTableExpressions and windowing functions were improved.
  • TranslateBehavior now supports a locale option when finding records. This option lets you set the locale for a single find call.
  • Query::clearResult() was added to clear the internal result and count value.
  • Deprecation annotations now contain IDE clickable links.
  • Added missing annotations in the Validation package.
  • Datetime inputs created through FormHelper can have the step option unset.
  • Cache adapters that require extensions now raise clearer exceptions when the required extensions are missing.
  • Datasource\LocatorInterface was added to help easy other locator implementations.
  • SmtpAdapter now supports AUTH PLAIN.
  • PHP8 nightly builds were added to the CakePHP test matrix.
  • Delete operations with cascading callbacks now abort when an associated record fails to delete because of application rule failures.
  • Query::orderAsc() and Query::orderDesc() now support closures to build the order clause.
  • Session::read() now has a default parameter.
  • Session::readOrFail() was added.

How you Can Help

You can help by trying out the RC in your application. Please open issues for any new test failures or regressions the new version creates in your application.

Contributors to 4.1.0-RC1

Thank you to all the contributors that have helped with 4.1.0:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Frank de Graaf
  • Mark Scherer
  • Mark Story
  • Matthias Wirtz
  • andrii-pukhalevych
  • ndm2
  • othercorey

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 31 May 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/05/24/cakephp_390RC2_released.html https://bakery.cakephp.org/2020/05/24/cakephp_390RC2_released.html <![CDATA[CakePHP 3.9.0-RC2 Released]]> CakePHP 3.9.0-RC2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.0-RC2. This is the release candidate for 3.9.0, and it contains several new major features. If no major issues are reported a stable release will be packaged in a few weeks.

3.9 contains several new features that have been backported from 4.0 and 4.1. The intent of these new features and backports is to ease upgrading applications from 3.x to 4.x.

Updating to the RC

You can use composer to upgrade to the beta version of CakePHP 3.9.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.9.0-RC2"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the release candidate, we can help ensure a smoother release of 3.9.0 before the stable release.

What’s new in 3.9.0?

The migration guide has a complete list of what’s new in 3.9.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes Since 3.9.0-RC1

  • Added Cake\Orm\Query::clearResult(). This method makes it easier to re-use a query object to fetch results multiple times.
  • The __() family of functions no longer have null in their return type. Instead they always return a string. This behavior was backported from 4.0
  • Improved API documentation.

Contributors to 3.9.0-RC2

Thank you to all the contributors that helped make this release happen:

  • Corey Taylor
  • Frank de Graaf
  • Mark Story
  • Val Bancer
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sun, 24 May 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/05/23/cakephp_408_released.html https://bakery.cakephp.org/2020/05/23/cakephp_408_released.html <![CDATA[CakePHP 4.0.8 Released]]> CakePHP 4.0.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.8. This is a maintenance release for the 4.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.0.8. See the changelog for every commit.

  • Update API documentation and method typing.
  • Fixed marshalling datetime values of HH:mm.
  • Removed @throws annotations from IntegrationTestTrait methods.
  • Fixed handling of false values in FormHelper. Instead of '', 0 is used now.
  • Improved CSRF validation error messages.
  • Fixed application/www-form-urlencoded payloads in integration tests showing up as empty arrays.
  • XmlView no longer tries to get keys of non-array values.

Contributors to 4.0.8

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Frank de Graaf
  • Mark Scherer
  • Mark Story
  • diegosardina

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 23 May 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/05/17/cakephp_21021_released.html https://bakery.cakephp.org/2020/05/17/cakephp_21021_released.html <![CDATA[CakePHP 2.10.21 Released]]> CakePHP 2.10.21 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.21. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.10.21. See the changelog for every commit.

  • Improve compatibility with PHP7.4 by removing usage of deprecated string offset syntax.
  • Added support for TLS 1.3 to CakeSocket.
  • Fixed argument order for implode() call that would fail in PHP8.

Contributors to 2.10.21

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Jakub Onderka
  • Mark Sch
  • Mark Story
  • Markus Podar
  • Val Bancer
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 17 May 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/05/15/cakephp_410beta1_released.html https://bakery.cakephp.org/2020/05/15/cakephp_410beta1_released.html <![CDATA[CakePHP 4.1.0-beta1 Released]]> CakePHP 4.1.0-beta1 Released

The CakePHP core team is proud to announce the first beta release of CakePHP 4.1.0. This beta introduces a handful of deprecations. It also adds window function support and common-table-expression support to the ORM. Furthermore, it features improved debug() output, and new ORM events for marshalling.

New Features

The migration guide has a complete list of what’s new in 4.1.0. We recommend you give that page a read when upgrading as it outlines the deprecations present in 4.1.

How you Can Help

You can help by trying out the beta in your application. Please open issues for any new test failures or regressions the new version creates in your application.

Contributors to 4.1.0-beta1

Thank you to all the contributors that have helped with 4.1.0:

  • ADmad
  • Corey Taylor
  • Diego Sardina
  • Edgaras Janušauskas
  • Jad Bitar
  • John Zwarthoed
  • Marc Würth
  • Mario Rothauer
  • Mark Scherer
  • Mark Story
  • McsKienNP
  • Oliver Nowak
  • andrii-pukhalevych
  • chinpei215
  • mcsknp
  • mtak3
  • ndm2
  • nojimage
  • saeideng

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Fri, 15 May 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/05/08/cakephp_390RC1_released.html https://bakery.cakephp.org/2020/05/08/cakephp_390RC1_released.html <![CDATA[CakePHP 3.9.0-RC1 Released]]> CakePHP 3.9.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.9.0-RC1. This is the release candidate for 3.9.0, and it contains several new major features. If no major issues are reported a stable release will be packaged in a few weeks.

3.9 contains several new features that have been backported from 4.0 and 4.1. The intent of these new features and backports is to ease upgrading applications from 3.x to 4.x.

Updating to the RC

You can use composer to upgrade to the beta version of CakePHP 3.9.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.9.0-RC1"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the release candidate, we can help ensure a smoother release of 3.9.0 before the stable release.

What’s new in 3.9.0?

The migration guide has a complete list of what’s new in 3.9.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Contributors to 3.9.0-RC1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Erwane Breton
  • Florian Krämer
  • Jorge González
  • Mark Scherer
  • Mark Story
  • Robert Pustułka
  • Tibor
  • Val Bancer
  • Victor Eduardo de Assis
  • Zuluru
  • gregs
  • mcsknp
  • ndm2
  • nojimage

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Fri, 08 May 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/05/07/cakephp_3812_released.html https://bakery.cakephp.org/2020/05/07/cakephp_3812_released.html <![CDATA[CakePHP 3.8.12 Released]]> CakePHP 3.8.12 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.12. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.12. See the changelog for every commit.

  • Fixed casing of stored procedures used to reflect schema in SQLServer to work on case sensitive databases.
  • Improved compatibility aliases for PHPUnit.
  • Improved API docstrings.
  • Fixed error when Email messagaes were force wrapped and were exactly the maximum line length.

Contributors to 3.8.12

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Erwane Breton
  • Mark Scherer
  • Mark Story
  • Nicolas

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 07 May 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/05/01/cakephp_407_released.html https://bakery.cakephp.org/2020/05/01/cakephp_407_released.html <![CDATA[CakePHP 4.0.7 Released]]> CakePHP 4.0.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.7. This is a maintenance release for the 4.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.0.7. See the changelog for every commit.

  • Improved CSRF generation to fix upgrade errors introduced in 4.0.6
  • MailSentWith assertions now include the contents of the messages that did not pass the assertion.
  • Fixed Debugger::exportVar() now handles uninitialized typed properties from PHP 7.4
  • Improved API docstring types.
  • Improved rendering of multiline exception messages and messages with inline code formatting.
  • Improved defining ISO8601 validation rules.

Contributors to 4.0.7

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Edgaras Janušauskas
  • Erwane Breton
  • Johan Meiring
  • Mark Scherer
  • Mark Story
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 01 May 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/04/18/cakephp_406_released.html https://bakery.cakephp.org/2020/04/18/cakephp_406_released.html <![CDATA[CakePHP 4.0.6 Released]]> CakePHP 4.0.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.6. This is a maintenance release for the 4.0 branch that fixes several community reported issues and a low risk security issue in our CSRF protection middleware.

Bugfixes

You can expect the following changes in 4.0.6. See the changelog for every commit.

  • Nirmal Kirubakaran contacted us via the security mailing list and disclosed a vulnerability in our CSRF token generation. If an attacker were to use an XSS vulnerabiity or physical access to fixate a CSRF token they could then exploit additional CSRF attacks. In this release generated tokens contain an HMAC signed with Security.salt. This ensures the tokens were generated by the same application that receives them. CSRF tokens generated in previous versions will now be rejected by 4.0.6 as they do not contain the HMAC.
  • Improved session access in IntegrationTestTrait through the new getTestSession() method.
  • Fixed generation of pagination links on / URLs.
  • cake plugin unload and cake plugin load now handle vendor namespaced plugins.
  • Validation::inList() no longer emits a warning on a non-scalar values.
  • Schema reflection stored procedures in SQLServer now work in case sensitive configurations.
  • Email message wrapping no longer emits errors when lines are the same length as the wrap length.
  • App::path() now resolves locale files for plugins.

Contributors to 4.0.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Mark Scherer
  • Mark Story
  • Nicolas

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 18 Apr 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/04/05/cakephp_3811_released.html https://bakery.cakephp.org/2020/04/05/cakephp_3811_released.html <![CDATA[CakePHP 3.8.11 Released]]> CakePHP 3.8.11 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.11. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.11. See the changelog for every commit.

  • Added deprecation notice about ResponseEmitter to Response::send().
  • Fixed a division by 0 warning when file cache gc probability is set to 0.
  • Updated deprecation warning supression for test suites in PHP 7.4.
  • Allow usage of unassigned HTTP status codes between 100 and 599.

Contributors to 3.8.11

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Mark Story
  • Rachman Chavik

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 05 Apr 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/03/28/cakephp_405_released.html https://bakery.cakephp.org/2020/03/28/cakephp_405_released.html <![CDATA[CakePHP 4.0.5 Released]]> CakePHP 4.0.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.5. This is a maintenance release for the 4.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.0.5. See the changelog for every commit.

  • SMTP delivery failure exceptions now include the error text received from the destination server.
  • Improved API documentation.
  • Table::saveMany() now correctly rollbacks a transaction when an entity other than the first fails to save because of application rules or database failure.
  • ConsoleIntegrationTestTrait now uses mocked _out and _err objects if they have been set.
  • ConsoleInput::read() now handles false values from fgets() and readline.
  • CounterCacheBehavior now handles null association values better when custom finders are used.
  • Http\Response now allows usage of unassigned HTTP status codes between 100 and 599.
  • Binary data in SQL query logs is now encoded as hexadecimal to improve readability of query logs.

Contributors to 4.0.5

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Jad Bitar
  • Mark Scherer
  • Mark Story
  • Victor Eduardo de Assis
  • nook24

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 28 Mar 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/02/21/cakephp_404_released.html https://bakery.cakephp.org/2020/02/21/cakephp_404_released.html <![CDATA[CakePHP 4.0.4 Released]]> CakePHP 4.0.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.4. This is a maintenance release for the 4.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.0.4. See the changelog for every commit.

  • Http\Response::$_contentType was removed as it was often wrong and out of sync with the getHeader('Content-Type') value.
  • NumberHelper::precision() had the $options parameter added so it can better wrap Number::precision().
  • Add timestamptimezone mapping to FormHelper and DateTimeWidget.
  • IntegrationTestCaseTrait once again raises exceptions when disableErrorHandlerMiddleware() is used.
  • datetime-local values are rendered with milliseconds by DateTimeWidget only when step size is less than 1.
  • Improved API documentation.
  • Improved missing template exception messages. They now list out the full path of every attempted file.
  • CounterCacheBehavior no longer attempts to update values when the foreign key is null.
  • Loading optional associations with leftJoinWith() and contain() no longer raises an exception about missing association data.
  • TextHelper::autoParagraph() now accepts null.
  • HtmlHelper::para() now accepts null.
  • Validation::decimal() now handles Polish formatted numbers correctly.
  • HasMany associations now set invalid messages and errors on the parent entity when non-atomic saves fail.
  • Improved missing database exception message.
  • Logged fatal errors now include the file and line position.

Contributors to 4.0.4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Justin Slamka
  • Mark Scherer
  • Mark Story
  • Michal
  • Rachman Chavik
  • Remi Collet
  • Victor Eduardo de Assis

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 21 Feb 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/02/21/cakephp_3810_released.html https://bakery.cakephp.org/2020/02/21/cakephp_3810_released.html <![CDATA[CakePHP 3.8.10 Released]]> CakePHP 3.8.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.10. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.10. See the changelog for every commit.

  • TestCase\EmailTrait::assertMailSentWith() now knows how to assert view builder properties.
  • NumberHelper::precision() had the $options parameter added so it can better wrap Number::precision().
  • Http\Response::withStatus() no longer overwrites the content-type header with the contents of the _contentType property.
  • Http\Response::$_contenType was removed as it was often wrong and out of sync with the getHeader('Content-Type') value.
  • Updated API documentation and type annotations.
  • Validation::decimal() now handles Polish formatted numbers correctly.
  • Logged fatal errors now include the file and line position.

Contributors to 3.8.10

Thank you to all the contributors that helped make this release happen:

  • Johan Meiring
  • Mark Story
  • Michal
  • Rachman Chavik
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 21 Feb 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/01/25/cakephp_403_released.html https://bakery.cakephp.org/2020/01/25/cakephp_403_released.html <![CDATA[CakePHP 4.0.3 Released]]> CakePHP 4.0.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.3. This is a maintenance release for the 4.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.0.3. See the changelog for every commit.

  • Fixed password hashing being skipped when password field was null. This prevents a potential timing sidechannel should an application store users with null passwords.
  • i18n extract now skips writing files if no strings have changed.
  • If identifier quoting is disabled, queries will no longer have column aliases quoted. This helps improve performance of the ORM. Postgres still quotes aliases to prevent alias casing issues.
  • FormProtectionComponent no longer fails validation when PSR7 file upload objects are used.
  • Year widgets created with FormHelper now accept DateTime instances as their value.
  • Improved error message copying from exception pages.

Contributors to 4.0.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Ian den Hartog
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 25 Jan 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/01/24/cakephp_389_released.html https://bakery.cakephp.org/2020/01/24/cakephp_389_released.html <![CDATA[CakePHP 3.8.9 Released]]> CakePHP 3.8.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.9. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.9. See the changelog for every commit.

  • Error/Notice messages now have the correct context and code snippets when DebugKit is enabled.
  • When a joined association uses formatResults the parent entity is no longer marked dirty if the result formatter modifieds the association entity.
  • Fixed contain() on BelongsToMany association restricting fields with fields option.
  • Fix element cache key generation when elements were in subdirectories.
  • Improved API documentation.
  • i18n extract now skips writing files if no strings have changed.
  • Fixed password hashing being skipped when password field was null. This prevents a potential timing sidechannel should an application store users with null passwords.
  • Fixed a notice error UrlHelper::assetUrl() when $path is null.

Contributors to 3.8.9

Thank you to all the contributors that helped make this release happen:

  • Edgaras Janušauskas
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • gregs
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 24 Jan 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/01/16/cakephp_21020_released.html https://bakery.cakephp.org/2020/01/16/cakephp_21020_released.html <![CDATA[CakePHP 2.10.20 Released]]> CakePHP 2.10.20 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.20. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.10.20. See the changelog for every commit.

  • The creation of ControllerTestDispatcher objects has been moved into a separate method allowing it to be overriden in application code.
  • Requests with empty JSON objects no longer result in request->data being null.
  • ShellHelpers located in plugins can now be loaded from outside the plugin by using plugin dot notation.
  • Headers already sent warnings related to sessions when tests are run by phpunit.phar have been fixed.
  • session_set_save_handler() is no longer called when there is an active session.
  • CakeTestSuiteCommand::run() exit logic now matches phpunit’s behavior, and calls doRun() with false.

Contributors to 2.10.20

Thank you to all the contributors that helped make this release happen:

  • Corey Taylor
  • Edgaras Janušauskas
  • Gareth Ellis
  • Gerson Felipe Schwinn
  • Mark Sch
  • Mark Story
  • Mark van Driel
  • Milan van As
  • Pascal Woerde
  • Val Bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 16 Jan 2020 00:00:00 +0000
https://bakery.cakephp.org/2020/01/11/cakephp_402_released.html https://bakery.cakephp.org/2020/01/11/cakephp_402_released.html <![CDATA[CakePHP 4.0.2 Released]]> CakePHP 4.0.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.2. This is a maintenance release for the 4.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.0.2. See the changelog for every commit.

  • An exception is now raised in development mode if the generated alias name for a table + column would exceed the maximum identifier length for your database platform.
  • FormProtectionComponent now checks unlockedFields correctly.
  • The deprecation warning in RequestHandlerComponent for parsing request bodies was removed. Conditionally triggering it had too many edge cases and was confusing users.
  • Improved formatting of API documentation examples.
  • The ORM more efficiently traverses and transforms query objects improving performance for all ORM operations.
  • Associations that use formatResults and change the associated entities no longer result in records being marked as dirty when records are read.
  • Cache and Log now handle numeric engine names correctly.
  • Errors and warnings emitted while DebugKit is active now reference the correct file and line.
  • Dependencies on abandoned zendframework packages are now referencing the Laminas project.
  • Using contain() with a field list on a BelongsToMany association now works correctly.
  • Session cookies now have SameSite=Lax instead of strict to better emulate how session cookies worked in the past.
  • View element caching now works when elements are in subdirectories.
  • PaginatorHelper::first() and last() now apply the url option when the title parameter is a string.

Contributors to 4.0.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Mark Scherer
  • Mark Story
  • gregs
  • o0h
  • othercorey
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 11 Jan 2020 00:00:00 +0000
https://bakery.cakephp.org/2019/12/29/cakephp_401_released.html https://bakery.cakephp.org/2019/12/29/cakephp_401_released.html <![CDATA[CakePHP 4.0.1 Released]]> CakePHP 4.0.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.1. This is a maintenance release for the 4.0 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 4.0.1. See the changelog for every commit.

  • The upgrade tool has a smaller install footprint and should have fewer conflicts with application code now.
  • Removed the typehint on Event data payload, as it can be any type.
  • Removed the empty string default value for console options. This fixes Argument::hasOption() always returning true for optional options.
  • CSRF tokens are now set on redirect and basic diactoros response objects.
  • URL generation no longer emits a type warning when route elements have a regex pattern and parameters are integers.
  • Loading joinable associations with contain() now emit errors when foreign keys are not selected. This may cause existing queries to start emitting errors, but those queries were previously silently failing to load associated data as requested.
  • SQLServer fixtures now handle the restrict foreign key action now.
  • The datetime abstract type once again uses the DATETIME column type in SQLServer. Using DATETIME2 created microsecond overflow issues for some users.
  • TestCase::loadRoutes() was added to ease writing unit tests for classes like mailers which often need routes loaded.
  • ConsoleIo::createFile() no longer returns false when the created file has 0 bytes.
  • When generating URLs, routes with controller and action placeholders no longer strip these these keys when they are undefined. Instead routes missing the controller and action keys will fail to match.
  • Optional routing placeholders now work consistently for both braced placeholders and colon placeholders.
  • FunctionsBuilder once again allows mixed types for the $expression parameter as many expressions accept objects that implement __toString().
  • ErrorLogger no longer fails to log messages for errors which no file or line.
  • Improved API doc blocks.

Contributors to 4.0.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Kaliel
  • Mark Scherer
  • Mark Story
  • Matthias Wirtz

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 29 Dec 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/12/28/cakephp_388_released.html https://bakery.cakephp.org/2019/12/28/cakephp_388_released.html <![CDATA[CakePHP 3.8.8 Released]]> CakePHP 3.8.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.8. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.8. See the changelog for every commit.

  • Improved API documentation.
  • Text::slug() can now preserve spaces.
  • FunctionsBuilder::datePart() now passes on its type parameters.
  • A potential session fixation issue was fixed. To be vulnerable your application must also have a cross-site-scripting vulnerability or have strict sessions disabled.
  • SQLServerSchema dialect now handles the restrict mode of foreign keys correctly.
  • Matching routes with integer values is now more typesound.
  • Shims were added to TestCase to enable getMock() and getMockBuilder() to not emit deprecations in PHP7.4
  • A regression in how FormHelper::dateTime() handles empty values was fixed.
  • When generating URLs, routes with controller and action placeholders no longer strip these these keys when they are undefined. Instead routes missing the controller and action keys will fail to match.
  • Optional routing placeholders now work consistently for both braced placeholders and colon placeholders.

Contributors to 3.8.8

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Jeremy Harris
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • o0h

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 28 Dec 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/12/15/cakephp_400_released.html https://bakery.cakephp.org/2019/12/15/cakephp_400_released.html <![CDATA[CakePHP 4.0.0 Released]]> CakePHP 4.0.0 Released

The CakePHP team is thrilled to announce the immediate availability of 4.0.0. This is release begins a new chapter for CakePHP as 4.0 is now API stable. With this release, Cake 3.x moves into maintenance mode while 2.x moves into security release mode.

Key Features

  • PHP 7.2 required.
  • Streamlined APIs with all deprecated methods and behavior removed.
  • Additional typehints across the framework giving you errors faster.
  • Improved error messages across the framework.
  • A refreshed application skeleton design.
  • New database types for fixed length strings (CHAR), datetime with microseconds, and datetime with timezone types.
  • Table now features OrFail methods that raise exceptions on failure making error handling more explicit and straightforward.
  • Middleware for CSP headers, Form tampering prevention, and HTTPS enforcement.
  • Cake\Routing\Asset to make generating asset URLs simple from anywhere in your application code.
  • FormHelper now generates HTML5 validation errors.
  • FormHelper now generates HTML5 datetime input elements.

Upgrading to 4.0

While 4.0 contains a number of breaking changes we have prepared an exhaustive migration guide covering all the deprecated, removed, and new features.

Additionally, we have put together an upgrade guide which gives a step-by-step guide and CLI tool to help you upgrade your application. These documents and companion tool will only improve as we collect more feedback from people upgrading.

Contributors to 4.0.0

CakePHP 4.0 would not have been possible without the hard work and contributions from the following folks:

  • ADmad
  • Albert Cansado Solà
  • Chetan Varshney
  • Corey Taylor
  • Edgaras Janušauskas
  • Erwane Breton
  • Florian Krämer
  • Ian den Hartog
  • Iandenh
  • Ilie Pandia
  • Jason Horvath
  • Jeremy Harris
  • Jorge González
  • José Lorenzo Rodríguez
  • Ján Súkeník
  • Karma Dice
  • Marc Würth
  • Marcelo Rocha
  • Mark Scherer
  • Mark Story
  • Matthew Brown
  • Michael Hoffmann
  • Robert Pustułka
  • Tomas Saghy
  • Val Bancer
  • Yevgeny Tomenko
  • Zuluru
  • andrii-pukhalevych
  • bancer
  • dan
  • gregs
  • kawaguchi masaki
  • mirko-pagliai
  • ndm2
  • nojimage
  • o0h
  • othercorey
  • saeideng
  • sohelrana820
  • val

Thank you for all you’ve done to make CakePHP 4 a reality.

]]>
Sun, 15 Dec 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/12/07/cakephp_387_released.html https://bakery.cakephp.org/2019/12/07/cakephp_387_released.html <![CDATA[CakePHP 3.8.7 Released]]> CakePHP 3.8.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.7. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.7. See the changelog for every commit.

  • Generated route names are now correct for routes using braced placeholders.
  • Email::getHeaderCharset() now uses the email charset as a fallback if the header charset is undefined.
  • IntegrationTestTrait::assertRedirectEquals() was added to make it simpler to assert redirect values without additional Router transformations.
  • Improved documenation blocks and type annotations.
  • Email attachments now encode the filenames in Content-Disposition headers if the filenames contain non-ascii values.
  • Http\Client now accepts a protocolVersion option in its constructor. This option lets you control the HTTP version used. This change makes it simpler to make HTTP2 requests.
  • Improved error message when ConsoleIntegrationTestTrait runs out of replies to interactive questions.
  • Http\Client can now send request bodies in GET requests.
  • Added PHP7.4 to our test matrix.

Contributors to 3.8.7

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Mark Scherer
  • Mark Story
  • Martin Matthaei
  • gregs
  • othercorey

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 07 Dec 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/12/01/cakephp_400RC2_released.html https://bakery.cakephp.org/2019/12/01/cakephp_400RC2_released.html <![CDATA[CakePHP 4.0.0-RC2 Released]]> CakePHP 4.0.0-RC2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.0-RC2. This is the second and hopefully final release candidate for 4.0.0, and contains all the major features that are planned for 4.0.0. If no major issues are reported a stable release will be packaged in two weeks.

Updating to the RC

You can use composer to upgrade to the beta version of CakePHP 4.0.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:4.0.0-RC2"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the release candidate, we can help ensure a smoother release of 4.0.0 before the stable release.

What’s new in 4.0.0?

The migration guide has a complete list of what’s new in 4.0.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes since 4.0.0-RC1

  • Validation::compareFields() now works with null values.
  • Email attachments now URL encode filenames with non-ascii characters.
  • Added assertRedirectEquals() to allow assertions without the base path being added.
  • Removed Http\Server::setRunner(), as the runner can be provided as a constructor argument now.
  • Improved error messages from QueryExpressions when null is used with an incompatible operator.
  • Added deprecation warnings for Validator::allowEmpty() and Validator::notEmpty().
  • The safe option was removed from HtmlHelper::script() and scriptBlock(). This option is not needed in an HTML5 context.
  • HtmlHelper::docType() is now deprecated.
  • The console package was more thoroughly tested in isolation and several problems were fixed.
  • FormProtectionComponent now works with applications in sub-directories.
  • Validator::errors() was deprecated and is replaced by validate().

Contributors to 4.0.0-RC2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Chetan Varshney
  • Corey Taylor
  • Edgaras Janušauskas
  • Mark Scherer
  • Mark Story
  • Martin Matthaei
  • gregs
  • othercorey
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sun, 01 Dec 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/11/15/cakephp_400RC1_released.html https://bakery.cakephp.org/2019/11/15/cakephp_400RC1_released.html <![CDATA[CakePHP 4.0.0-RC1 Released]]> CakePHP 4.0.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 4.0.0-RC1. This is the first release candidate for 4.0.0, and contains all the major features that are planned for 4.0.0. If no major issues are reported a stable release will be packaged in a few weeks.

Updating to the RC

You can use composer to upgrade to the beta version of CakePHP 4.0.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:4.0.0-RC1"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the release candidate, we can help ensure a smoother release of 4.0.0 before the stable release.

What’s new in 4.0.0?

The migration guide has a complete list of what’s new in 4.0.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes since 4.0.0-beta4

  • A new compact route _path format has been added to Router::url(). This new format accepts the same Controller::action format that route definition can use.
  • The http and console libraries have had standalone packages created.
  • Development error pages now preserve inline code highlighting and newlines in exception messages.
  • SecurityComponent is now deprecated, and replaced by the FormProtectionComponent.
  • The ConsoleErrorHandler was moved to the Error package.
  • Validation::time() now accepts microseconds.
  • SameSite cookie support was added for PHP>7.3.0
  • New database types for char, datetimefractional and timestampfractional were added. The new datetime types allow representation of time values including microseconds.
  • InstanceConfigTrait::getConfigOrFail() was added.
  • New isLinkedTo and isNotLinkedTo rules were added to ORM\RulesChecker.
  • Date and FrozenDate objects now use the default timezone instead of UTC. This fixes problems where ‘today’ would not always be today depending on your distance from UTC.
  • Controller action dispatching was refactored to make adding a DI container in the future easier.
  • Routing prefixes are now PascalCased instead of under_scored. This removes some inflection and normalizes the representation of prefixes.

Contributors to 4.0.0-RC1

We’d like to welcome othercorey to the core team. They have been contributed a number of documentation improvements and driven multiple improvements around how CakePHP handles microseconds across both CakePHP and Chronos.

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Jorge González
  • Karma Dice
  • Mark Scherer
  • Mark Story
  • dan
  • itosho
  • ndm2
  • othercorey
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Fri, 15 Nov 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/11/07/cakephp_386_released.html https://bakery.cakephp.org/2019/11/07/cakephp_386_released.html <![CDATA[CakePHP 3.8.6 Released]]> CakePHP 3.8.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.6. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.6. See the changelog for every commit.

  • Microseconds are no longer dropped when creating Time and FrozenTime instances from other datetime objects.
  • Improved API documentation and deprecated tags.
  • Time::__debugInfo() has been aligned with the implementation in chronos.
  • Http\Client now reads cookies from the correct subdomain when handling cross subdomain redirects.
  • Dates before 1600 are now accepted by Validation::dateTime().
  • FormHelper::dateTime() now correctly handles empty options that are incompletely defined arrays.
  • Validation::compareFields() now works with null.

Contributors to 3.8.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Iftekhar Ahmed Eather
  • Mark Scherer
  • Mark Story
  • detinkin
  • itosho

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 07 Nov 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/10/09/cakephp_400beta4_released.html https://bakery.cakephp.org/2019/10/09/cakephp_400beta4_released.html <![CDATA[CakePHP 4.0.0-beta4 Released]]> CakePHP 4.0.0-beta4 Released

The CakePHP core team is proud to announce the fourth beta release of CakePHP 4.0.0. Since the previous beta we’ve completed several tasks:

  • The requireSsl features of SecurityComponent are available as middleware in the HttpsEnforcerMiddleware.
  • Migrations has been updated to use Commands instead of Shells.
  • 4.x has adopted the PSR-12 formatting standard.
  • A new Asset class has been added to the routing package, making it easier to generate static asset URLs across your application.
  • The internal request stack in Router has been removed. With requestAction() removed this feature provided little value.
  • Email attachments now support UploadedFileInterface objects.

New Features

The migration guide has a complete list of what’s new in 4.0.0. We recommend you give that page a read when upgrading as it notes the various breaking changes present in 4.0.

How you Can Help

You can help deliver 4.0 by contributing in one of many ways:

  1. Check the documentation for mistakes, outdated, unclear or broken examples. We’ve been trying to update everything but may have not caught everything.
  2. Try it out! Give CakePHP 4.0 a test drive in a non-production application. We’d love to hear how converting a small application went and what was harder than it should have been.
  3. File issues for regressions in existing features, or suggest new features. While we’re not likely to greatly expand the scope of 4.0, we would like input on what should be a part of 4.1 and 4.2.
  4. Let us know about unclear error messages or silent failures in CakePHP.

Contributors to 4.0.0-beta4

Thank you to all the contributors that have helped since the beta2 release:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Erwane Breton
  • Iftekhar Ahmed Eather
  • Jason Horvath
  • Littley Lv
  • Mark Scherer
  • Mark Story
  • Rachman Chavik
  • Val Bancer
  • andrii-pukhalevych
  • bancer
  • detinkin
  • kawaguchi masaki
  • mirko-pagliai
  • saeideng

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Wed, 09 Oct 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/10/06/cakephp_385_released.html https://bakery.cakephp.org/2019/10/06/cakephp_385_released.html <![CDATA[CakePHP 3.8.5 Released]]> CakePHP 3.8.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.5. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.5. See the changelog for every commit.

  • Router::reverse() now removes the CSRF token and isAjax from generated URLs.
  • Improved failure messages for header and cookie assertion methods.
  • Removed an additional \r\n from multipart HTTP client request bodies which caused them to be rejected by some servers.
  • Removed quotes around multipart message boundary markers. These quotes are not necessary and could cause servers with non-compliant HTTP parsers to reject the request.
  • Number::toPercentage() now uses the locale data when placing the % marker.
  • MysqlSchema now generates schema correctly for decimal and float columns that have a length but no precision.
  • Fixed schema reflection for double unsigned type in MySQL.
  • Fixed schema reflection for varbinary(max) type in SqlServer.
  • File and line information is now included in log messages from ErrorHandlerMiddleware.

Contributors to 3.8.5

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Edgaras Janušauskas
  • Littley Lv
  • Mark Scherer
  • Mark Story
  • Rachman Chavik
  • bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 06 Oct 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/09/13/cakephp_384_released.html https://bakery.cakephp.org/2019/09/13/cakephp_384_released.html <![CDATA[CakePHP 3.8.4 Released]]> CakePHP 3.8.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.4. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.4. See the changelog for every commit.

  • RedisEngine now uses the nx parameter to atomically set keys and expiration times.
  • Dependent association deletions now correctly remove alias prefixes from unary and identifier expressions used in the conditions.
  • Improved API documentation.
  • SQLite schema reflection now preserves decimal column precision and length.
  • CakePHP is now using github-actions to manage stale issues.

Contributors to 3.8.4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Alex
  • Ethan Pooley
  • Mark Scherer
  • Mark Story
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 13 Sep 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/09/06/cakephp_400beta3_released.html https://bakery.cakephp.org/2019/09/06/cakephp_400beta3_released.html <![CDATA[CakePHP 4.0.0-beta3 Released]]> CakePHP 4.0.0-beta3 Released

The CakePHP core team is proud to announce the third beta release of CakePHP 4.0.0. Since the previous beta we’ve completed a few milestones:

  • Another pass with psalm and improved type handling throughout the database and ORM packages. Type mappers handle empty values and nulls more consistently. We’ve also done refactoring in the
  • Mailer package which has resulted in Cake\Mailer\Email becoming a backwards compatible proxy for other classes.
  • Uploaded files are now accessed using the PSR7 interface by default. A compatibility flag has also been added to preserve the 3.x behavior.
  • Work on the cakephp4 rector configuration has been started.

New Features

The migration guide has a complete list of what’s new in 4.0.0. We recommend you give that page a read when upgrading as it notes the various breaking changes present in 4.0.

How you Can Help

You can help deliver 4.0 by contributing in one of many ways:

  1. Check the documentation for mistakes, outdated, unclear or broken examples. We’ve been trying to update everything but may have not caught everything.
  2. Try it out! Give CakePHP 4.0 a test drive in a non-production application. We’d love to hear how converting a small application went and what was harder than it should have been.
  3. File issues for regressions in existing features, or suggest new features. While we’re not likely to greatly expand the scope of 4.0, we would like input on what should be a part of 4.1 and 4.2.
  4. Let us know about unclear error messages or silent failures in CakePHP.

Contributors to 4.0.0-beta3

Thank you to all the contributors that have helped since the beta2 release:

  • ADmad
  • Alex
  • Edgaras Janušauskas
  • Ethan Pooley
  • Jorge González
  • Mark Scherer
  • Mark Story
  • Val Bancer
  • ndm2

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Fri, 06 Sep 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/08/30/cakephp_383_released.html https://bakery.cakephp.org/2019/08/30/cakephp_383_released.html <![CDATA[CakePHP 3.8.3 Released]]> CakePHP 3.8.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.3. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.3. See the changelog for every commit.

  • Added IntegrationTestTrait::setUnlockedFields() to make working with SecurityComponent in tests simpler.
  • Improved forwards compatible annotation for EntityInterface::setDirty().
  • Made return value of TestEmailTransport::send() match the real implementations.
  • Fixed double escaping in pagination meta tags.
  • Improved API documentation.
  • Subqueries passed to FunctionExpression objects are now wrapped in parentheses.
  • Cake\Network\Socket can now connect to unix sockets.
  • Console error codes are now constrained to be between 1 and 244.

Contributors to 3.8.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Edgaras Janušauskas
  • Jorge González
  • Mark Scherer
  • Mark Story
  • Mauri Kujala
  • Robert Pustułka
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 30 Aug 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/08/15/cakephp_400beta2_released.html https://bakery.cakephp.org/2019/08/15/cakephp_400beta2_released.html <![CDATA[CakePHP 4.0.0-beta2 Released]]> CakePHP 4.0.0-beta2 Released

The CakePHP core team is proud to announce the second beta release of CakePHP 4.0.0. Since the previous beta we’ve finished upgrading migrations to 4.x, cleaned up how booleans and nulls are handled by the database layer, improved generated javascript snippets, made the development error pages better, finished migrating all core shells to commands and merged all bugfixes for 3.x in.

The majority of breaking changes for 4.0 are complete. For the next beta release we’ll be focusing on improving stability, improving error messages and plugins and continuing to add quality of life improvements.

New Features

The migration guide has a complete list of what’s new in 4.0.0. We recommend you give that page a read when upgrading as it notes the various breaking changes present in 4.0.

How you Can Help

You can help deliver 4.0 by contributing in one of many ways:

  1. Check the documentation for mistakes, outdated, unclear or broken examples. We’ve been trying to update everything but may have not caught everything.
  2. Try it out! Give CakePHP 4.0 a test drive in a non-production application. We’d love to hear how converting a small application went and what was harder than it should have been.
  3. File issues for regressions in existing features, or suggest new features. While we’re not likely to greatly expand the scope of 4.0, we would like input on what should be a part of 4.1 and 4.2.
  4. Let us know about unclear error messages or silent failures in CakePHP.

Contributors to 4.0.0-beta2

Thank you to all the contributors that have helped since the beta1 release:

  • ADmad
  • Albert Cansado Solà
  • Anne van de Venis
  • Bogdan SOOS
  • Brandon Kelly
  • Edgaras Janušauskas
  • Hideki Kinjyo
  • Mark Scherer
  • Mark Story
  • Mauri Kujala
  • Robert Pustułka
  • Walther Lalk
  • andrii-pukhalevych
  • bancer
  • gregs
  • mirko-pagliai
  • ndm2
  • saeideng

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Thu, 15 Aug 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/08/08/cakephp_382_released.html https://bakery.cakephp.org/2019/08/08/cakephp_382_released.html <![CDATA[CakePHP 3.8.2 Released]]> CakePHP 3.8.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.2. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.2. See the changelog for every commit.

  • Added simplexml to requirements of cakephp/utility.
  • i18n extract now supports the -p option like other core shells.
  • Improved API documentation.
  • Fixed incorrect association and _locale property assignment when using matching() with TranslateBehavior.
  • The default value for the $when parameter of Validation::notEmptyDateTime() was corrected.
  • RedisEngine now calls expire() instead of setTimeout().
  • FormHelper now correctly generates Javascript snippets to clear custom HTML validation messages.
  • Fixed an overflow error if RequestHandlerComponent was loaded multiple times with different configuration.

Contributors to 3.8.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Bogdan SOOS
  • Brandon Kelly
  • Edgaras Janušauskas
  • Hideki Kinjyo
  • Mark Scherer
  • Mark Story
  • andrii-pukhalevych
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 08 Aug 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/07/24/cakephp_21019_released.html https://bakery.cakephp.org/2019/07/24/cakephp_21019_released.html <![CDATA[CakePHP 2.10.19 Released]]> CakePHP 2.10.19 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.19. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.10.19. See the changelog for every commit.

  • Added missing App::uses() call to CakeEventManager.
  • CakeTestRunner now passes the $exit parameter to doRun(). This improves compatibility with PHPUnit 5.2.x

Contributors to 2.10.19

Thank you to all the contributors that helped make this release happen:

  • Koji Tanaka
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 24 Jul 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/07/12/cakephp_381_released.html https://bakery.cakephp.org/2019/07/12/cakephp_381_released.html <![CDATA[CakePHP 3.8.1 Released]]> CakePHP 3.8.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.1. This is a maintenance release for the 3.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.8.1. See the changelog for every commit.

  • Improved error messages when ConsoleIntegrationTestTrait is missing replies for interactive questions.
  • Fixed how Http\Client\Adapter\CurlAdapter selects HTTP protocol versions.
  • Added getVisible() to the annotations in EntityInterface.
  • Fixed Table::loadInto() not loading translations.
  • Switched to using SCAN instead of KEYS to clear redis caches.

Contributors to 3.8.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Anne
  • Anne van de Venis
  • Marc Würth
  • Mark Story
  • Robert Pustułka
  • Walther Lalk
  • gregs

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 12 Jul 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/06/29/cakephp_400beta1_released.html https://bakery.cakephp.org/2019/06/29/cakephp_400beta1_released.html <![CDATA[CakePHP 4.0.0-beta1 Released]]> CakePHP 4.0.0-beta1 Released

The CakePHP core team is proud to announce the first beta release of CakePHP 4.0.0. Since the previous alpha we’ve been hard at work converting the various Shell classes into Commands, and adapting to the most recent changes in psalm. If your application or plugins extend shell classes in CakePHP you will need to update your code.

The majority of breaking changes for 4.0 are complete. For the next beta release we’ll be focusing on improving stability, updating the remaining CakePHP managed plugins and continuing to improve error messages.

New Features

The migration guide has a complete list of what’s new in 4.0.0. We recommend you give that page a read when upgrading as it notes the various breaking changes present in 4.0.

How you Can Help

You can help deliver 4.0 by contributing in one of many ways:

  1. Check the documentation for mistakes, outdated, unclear or broken examples. We’ve been trying to update everything but may have not caught everything.
  2. Try it out! Give CakePHP 4.0 a test drive in a non-production application. We’d love to hear how converting a small application went and what was harder than it should have been.
  3. File issues for regressions in existing features, or suggest new features. While we’re not likely to greatly expand the scope of 4.0, we would like input on what should be a part of 4.1 and 4.2.
  4. Let us know about unclear error messages or silent failures in CakePHP.

Contributors to 4.0.0-beta1

Thank you to all the contributors that have helped since the alpha1 release:

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 29 Jun 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/06/26/cakephp_380_released.html https://bakery.cakephp.org/2019/06/26/cakephp_380_released.html <![CDATA[CakePHP 3.8.0 Released]]> CakePHP 3.8.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.0. This is the first stable release of 3.8.0. 3.8.0 provides a number improvements both large and small to CakePHP.

This release is the last planned feature release for 3.x. Going forward the core team will be focusing on supporting 3.8 and completing 4.0.0. We may do a 3.9 release, if there is significant community interest once 4.0 has been released.

Upgrading to 3.8.0

You can use composer to upgrade to CakePHP 3.8.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.8.*"

Deprecation Warnings

3.8.0 adds two new runtime deprecations. The most noticible deprecation will be in Validator. The parameter order for the new allowEmpty* methods added in 3.7 has been normalized to match the order used in the notEmpty* methods. While annoying we thought it was best to add warnings now and have consistent methods for 4.0 rather than have to carry deprecation warnings through several 4.x releases.

Because fixing eprecation warnings in a large application can be a non-trivial task you will likely want to disable deprecation warnings allowing you to make incremental progress in fixing them. To disable deprecation warnings set Error.errorLevel to E_ALL ^ E_USER_DEPRECATED in config/app.php.

The migration guide has more details on the deprecation in 3.8 and their replacements. Deprecated features will continue to exist and behave as they always have until 4.0.0

What’s new in 3.8.0?

The migration guide has a complete list of what’s new in 3.8.0. We recommend you give that page a read when upgrading. A few highlights from 3.8.0 are:

  • CollectionTrait now uses the newCollection method to create clones. This allows sub-classes to have collection methods create instances of themselves instead of using Collection.
  • Command::executeCommand() was added. This method makes it simple to call another command from the current one.
  • Validator::notEmptyString(), notEmptyArray(), notEmptyFile(), notEmptyDate(), notEmptyTime(), and notEmptyDateTime() were added. They act as compliments to the allowEmpty* methods added in 3.7.
  • Validation::mimeType() now compares checks mime-types in a case insensitive manner.
  • Validation::dateTime() now supports the iso8601 format.
  • Radio buttons can now customize the generated label by using the label key inside a complex option definition. This key will be used instead of the label key defined at the top level options.

Contributors to 3.8.0

Thank you to all the contributors that helped make 3.8 happen:

  • ADmad
  • Andrej Griniuk
  • Cedric Alfonsi
  • Edgaras Janušauskas
  • Jeremy Harris
  • Jorge González
  • Lars Ebert
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Nicolas
  • Robert Pustułka
  • Simone Alers
  • andrii-pukhalevych
  • chinpei215
  • madbbb

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 3.8.0 is a large release and would not have been possible without the community support and feedback.

Download a packaged release on github.

]]>
Wed, 26 Jun 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/06/19/cakephp_379_released.html https://bakery.cakephp.org/2019/06/19/cakephp_379_released.html <![CDATA[CakePHP 3.7.9 Released]]> CakePHP 3.7.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.9. This is a maintenance release for the 3.7 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.7.9. See the changelog for every commit.

  • Fixed Type::buildAll() not returning custom type objects added with Type::set().
  • Improved API documentation examples.
  • Validation::isInteger() no longer accepts boolean values as 1/0.
  • Validation methods that operate on strings (minLength, maxLength, minLengthBytes, maxLengthBytes) now reject non-scalar values.
  • requestAction() now looks for 'return' in a type-safe way.

Contributors to 3.7.9

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • George Constantinou
  • Mark Story
  • othercorey
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 19 Jun 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/06/12/cakephp_380RC3_released.html https://bakery.cakephp.org/2019/06/12/cakephp_380RC3_released.html <![CDATA[CakePHP 3.8.0-RC3 Released]]> CakePHP 3.8.0-RC3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.0-RC3. This is the release candidate for 3.8.0, and it contains several new major features.

3.8 is the last planned minor release of CakePHP 3.x before 4.0 is released. Once 4.0 is released, 2.x will only receive security fixes, and 3.x will only continue to receive bug & security fix releases. If there is significant community interest there may be a 3.9 release, but there are no plans at this point in time.

Updating to the RC

You can use composer to upgrade to the beta version of CakePHP 3.8.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.8.0-RC3"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the release candidate, we can help ensure a smoother release of 3.8.0 before the stable release.

What’s new in 3.8.0?

The migration guide has a complete list of what’s new in 3.8.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes since 3.8.0-RC2

  • FormContext::error() now returns array keys for errors.
  • Improved API documentation.
  • Improved error messages when associations are missing and association properties are accessed.
  • Iterating PluginCollection during application hook methods no longer skips hooks anymore.
  • Cleaned up ConsoleOutput constructor.
  • EntityContext can now read validation errors from nested validators.
  • Mimetype validation now compares values in a case-insensitive way.
  • EntityTrait::getVisibleProperties() is now deprecated. Use getVisible() instead.

Contributors to 3.8.0-RC3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Andrej Griniuk
  • Corey Taylor
  • Mark Scherer
  • Mark Story
  • Robert Pustułka
  • othercorey
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Wed, 12 Jun 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/05/31/cakephp_400alpha2_released.html https://bakery.cakephp.org/2019/05/31/cakephp_400alpha2_released.html <![CDATA[CakePHP 4.0.0-alpha2 Released]]> CakePHP 4.0.0-alpha2 Released

The CakePHP core team is proud to announce the second alpha release of CakePHP 4.0.0. Since the previous alpha we’ve been hard at work finishing off the improvements to typehinting and decreasing the number of skipped warnings from both psalm and phpstan. This may result in some breaking changes in your application or plugins, but in the long term we feel these changes will make CakePHP better.

The application skeleton and bake have been refreshed with a new coat of paint. We’ve opted to not continue using foundation for the basic CSS, and adopted milligram instead. The smaller footprint of milligram makes it easier for you to remove or extend if you’d prefer.

New Features

The migration guide has a complete list of what’s new in 4.0.0. We recommend you give that page a read when upgrading as it notes the various breaking changes present in 4.0.

How you Can Help

You can help deliver 4.0 by contributing in one of many ways:

  1. Check the documentation for mistakes, outdated, unclear or broken examples. We’ve been trying to update everything but may have not caught everything.
  2. Try it out! Give CakePHP 4.0 a test drive in a non-production application. We’d love to hear how converting a small application went and what was harder than it should have been.
  3. File issues for regressions in existing features, or suggest new features. While we’re not likely to greatly expand the scope of 4.0, we would like input on what should be a part of 4.1 and 4.2.
  4. Let us know about unclear error messages or silent failures in CakePHP.

Contributors to 4.0.0-alpha2

Thank you to all the contributors that have helped since the alpha1 release:

  • ADmad
  • Corey Taylor
  • Edgaras Janušauskas
  • Ian den Hartog
  • Jeremy Harris
  • José Lorenzo Rodríguez
  • Marc Wilhelm
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann
  • Robert Pustułka
  • TekkCraft
  • andrii-pukhalevych
  • mirko-pagliai
  • saeideng
  • stickler-ci
  • 時流

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Fri, 31 May 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/05/29/cakephp_378_released.html https://bakery.cakephp.org/2019/05/29/cakephp_378_released.html <![CDATA[CakePHP 3.7.8 Released]]> CakePHP 3.7.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.8. This is a maintenance release for the 3.7 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.7.8. See the changelog for every commit.

  • The application/json content type no longer has a charset parameter. It is not valid and newer versions of Chrome emit warnings when it is present.
  • Improved API documentation.
  • char(36) columns are now generated correctly in postgres.
  • Fixed plural form rules for Turkish.
  • Cache key generation for translators now works when changing locales mid-process.
  • IntegrationTestCase now handles absolute URLs correctly.
  • FormContext::error() now returns keys on error messages.
  • Controller::afterFilter() now has access to response objects returned by controller actions. Previously it would see an older version of the response.
  • Improved error messages when associations are missing.
  • Iterating PluginCollection in nested loops no longer stops iterating early.

Contributors to 3.7.8

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Jeremy Harris
  • José Lorenzo Rodríguez
  • Marc Wilhelm
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Robert Pustułka
  • TekkCraft
  • 時流

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 29 May 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/05/18/cakephp_380RC2_released.html https://bakery.cakephp.org/2019/05/18/cakephp_380RC2_released.html <![CDATA[CakePHP 3.8.0-RC2 Released]]> CakePHP 3.8.0-RC2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.0-RC2. This is the release candidate for 3.8.0, and it contains several new major features. If no major issues are reported a stable release will be packaged in a few weeks.

3.8 is the last planned minor release of CakePHP 3.x before 4.0 is released. Once 4.0 is released, 2.x will only receive security fixes, and 3.x will only continue to receive bug & security fix releases. If there is significant community interest there may be a 3.9 release, but there are no plans at this point in time.

Updating to the RC

You can use composer to upgrade to the beta version of CakePHP 3.8.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.8.0-RC2"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the release candidate, we can help ensure a smoother release of 3.8.0 before the stable release.

What’s new in 3.8.0?

The migration guide has a complete list of what’s new in 3.8.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes since 3.8.0-RC1

  • Plural rules for Turkish were corrected.
  • Changing the locale partway during a process no longer results in incorrect values being generated.
  • Improved deprecation warnings.
  • Improved API documentation.
  • CsrfMiddleware now supports disabling CSRF checks on a per-request basis by setting a whitelistCallback.
  • Fixed absolute URL handling in IntegrationTestCase.
  • Controller afterFilter callbacks now has access to the response returned by the controller action.
  • assertExitSuccess() and assertExitError() were added to ConsoleIntegrationTestTrait.

Contributors to 3.8.0-RC2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Corey Taylor
  • Mark Scherer
  • Mark Story
  • andrii-pukhalevych
  • 時流

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sat, 18 May 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/05/13/cakephp_21018_released.html https://bakery.cakephp.org/2019/05/13/cakephp_21018_released.html <![CDATA[CakePHP 2.10.18 Released]]> CakePHP 2.10.18 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.18. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.10.18. See the changelog for every commit.

  • Fixed shutdown errors in PHP 7.2 during tests when file caching is used.
  • Skipped tests in PHP 7.3 that were previously skipped.
  • Improved API documentation.

Contributors to 2.10.18

Thank you to all the contributors that helped make this release happen:

  • Koji Tanaka
  • Mark Sch
  • Mark Story
  • bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 13 May 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/04/29/cakephp_380RC1_released.html https://bakery.cakephp.org/2019/04/29/cakephp_380RC1_released.html <![CDATA[CakePHP 3.8.0-RC1 Released]]> CakePHP 3.8.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.8.0-RC1. This is the release candidate for 3.8.0, and it contains several new major features. If no major issues are reported a stable release will be packaged in a few weeks.

3.8 is the last planned minor release of CakePHP 3.x before 4.0 is released. Once 4.0 is released, 2.x will only receive security fixes, and 3.x will only continue to receive bug & security fix releases. If there is significant community interest there may be a 3.9 release, but there are no plans at this point in time.

Updating to the RC

You can use composer to upgrade to the beta version of CakePHP 3.8.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.8.0-RC1"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the release candidate, we can help ensure a smoother release of 3.8.0 before the stable release.

What’s new in 3.8.0?

The migration guide has a complete list of what’s new in 3.8.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes since 3.8.0-beta1

  • CollectionTrait now uses the newCollection() method to create new instances. This allows implementing classes to ensure that instances of the current class are created when new collections are required.
  • ModelAwareTrait::loadModel() now allows fully qualified namespaces as a parameter.
  • The console table helper now correctly calculates the width of formatted cells.
  • Improved API doc blocks.
  • Commands will now auto-load the model named in their modelClass property.
  • Bundled CA certs were updated to 2019-01-23 release from curl.
  • Add getName() to View. This method was suggested in a deprecation warning but did not exist.
  • Cake\Http\Response::withModified() is now compatible with DateTimeImmutable objects.
  • Improved API documentation.
  • Fixed accidental return type change in Cache::deleteMany().
  • FileEngine no longer emits warnings when cache files are written to during shutdown when the previous write is for the same key.
  • CommandRunner now gracefully handles StopException now.
  • Fixed side-effect in SmtpTransport destructor.
  • Requirements for the cache package were fixed.
  • Don’t emit a charset parameter on the json content type. Chrome has started emitting warnings when this parameter is present as it isn’t compliant with the spec.
  • Add Command::executeCommand() This method enables commands to dispatch each other without needing to use the CommandRunner.
  • Add Response::withCookieCollection().
  • Generate column SQL for CHAR(36) in postgres schema correctly.

Contributors to 3.8.0-RC1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Edgaras Janušauskas
  • Jeremy Harris
  • José Lorenzo Rodríguez
  • Kyle Burton
  • Marc Wilhelm
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Simone Alers
  • TekkCraft
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Mon, 29 Apr 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/04/23/cakephp_377_3615_3518_released.html https://bakery.cakephp.org/2019/04/23/cakephp_377_3615_3518_released.html <![CDATA[CakePHP 3.7.7, 3.6.15 and 3.5.18 released]]> CakePHP 3.7.7, 3.6.15 and 3.5.18 released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.7, 3.6.15 and 3.5.18. These releases contain a security related fix for CVE-2019-11458. The vulnerability affects applications that open serialized content from user input. When doing so the SmtpTransport can be used to overwrite any file the webserver has write access to. We’d like to thank Edgaras Janušauskas for notifying us of this issue and confirming the fix.

Bugfixes

In addition to the security fix, you can expect the following changes in 3.7.7 See the changelog for every commit.

  • Add getName() to View. This method was suggested in a deprecation warning but did not exist.
  • Cake\Http\Response::withModified() is now compatible with DateTimeImmutable objects.
  • Improved API documentation.
  • Fixed accidental return type change in Cache::deleteMany().
  • FileEngine no longer emits warnings when cache files are written to during shutdown when the previous write is for the same key.
  • CommandRunner now gracefully handles StopException now.
  • Fixed side-effect in SmtpTransport destructor.

Contributors to 3.7.7

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Edgaras Janušauskas
  • Mark Scherer
  • Mark Story
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 23 Apr 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/04/13/cakephp_21017_released.html https://bakery.cakephp.org/2019/04/13/cakephp_21017_released.html <![CDATA[CakePHP 2.10.17 Released]]> CakePHP 2.10.17 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.17. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.10.17. See the changelog for every commit.

  • The generation of HABTM conditions was extracted into a protected method.
  • Additional test cases for FormHelper’s inputDefaults were added.
  • Improved API docs.

Contributors to 2.10.17

Thank you to all the contributors that helped make this release happen:

  • Dario Savella
  • Gareth Ellis
  • Kazuki Higashiguchi
  • Mark Sch
  • Mark Story
  • bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 13 Apr 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/04/11/cakephp_400alpha1_released.html https://bakery.cakephp.org/2019/04/11/cakephp_400alpha1_released.html <![CDATA[CakePHP 4.0.0-alpha1 Released]]> CakePHP 4.0.0-alpha1 Released

The CakePHP core team is proud to announce the first alpha release of CakePHP 4.0.0. We’ve been working on this release for several months now feel it is ready for broader feedback from the community.

There are a few high-level goals for the 4.0.0 release that this alpha release delivers upon:

  1. Remove all features and functionality deprecated in 3.x and marked for removal in 4.x
  2. Raise the minimum PHP version to 7.1.0. PHP 5 and PHP 7.0 are now end-of-life and we wanted to target a supported version of PHP. We are considering raising the minimum required PHP version to 7.2 and would like your feedback.
  3. Greatly improve the usage of typehinting internally to allow internals to be simplified due to less need to type check arguments.
  4. Improve error messages across the framework.

New Features

While 4.0 focuses on removing deprecated functionality we’ve also found the time to add some great new features:

  • The ORM can now automatically handle timezone conversions between your application server timezone and database timezone if they differ.
  • CakePHP now supports the PSR-15: HTTP Server Request Handlers specification.
  • Cake\Http\Client now follows PSR-18: HTTP Client specifications.
  • FormHelper now generates HTML5 validation messages and datetime inputs.

The migration guide has a complete list of what’s new in 4.0.0. We recommend you give that page a read when upgrading as it notes the various breaking changes present in 4.0.

How you Can Help

You can help deliver 4.0 by contributing in one of many ways:

  1. Check the documentation for mistakes, outdated, unclear or broken examples. We’ve been trying to update everything but may have not caught everthing.
  2. Try it out! Give CakePHP 4.0 a test drive in a non-production application. We’d love to hear how converting a small application went and what was harder than it should have been.
  3. File issues for regreessions in existing features, or suggest new features. While we’re not likely to greatly expand the scope of 4.0, we would like input on what should be a part of 4.1 and 4.2.
  4. Let us know about unclear error messages or silent failures in CakePHP.

Contributors to 4.0.0-alpha1

Thank you to all the contributors that helped get 4.0 to this point:

  • ADmad
  • Edgaras Janušauskas
  • Florian Krämer
  • Ian den Hartog
  • Iandenh
  • Ilie
  • Ilie Pandia
  • Jeremy Harris
  • José Lorenzo Rodríguez
  • Kyle Burton
  • Marc Wilhelm
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Matthew Brown
  • Michael Hoffmann
  • Simone Alers
  • Tomas Saghy
  • saeideng
  • sohelrana820

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Thu, 11 Apr 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/04/09/cakephp_376_released.html https://bakery.cakephp.org/2019/04/09/cakephp_376_released.html <![CDATA[CakePHP 3.7.6 Released]]> CakePHP 3.7.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.6. This is a maintenance release for the 3.7 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.7.6. See the changelog for every commit.

  • Improved the error message displayed when a route filter fails to apply.
  • Improved API documentation.
  • Blackhole callbacks for SecurityComponent can now return responses as they could in CakePHP 3.6.
  • The console TableHelper now calculates cell widths correctly when cells contain formatted content.
  • Fixed a persistence failure when HasMany associations had string keys.
  • Updated the CA bundle to curl 2019-01-23.
  • Fixed requirements on standalone Cache package.

Contributors to 3.7.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Edgaras Janušauskas
  • Kyle Burton
  • Marc Wilhelm
  • Marc Würth
  • Mark Scherer
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 09 Apr 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/03/30/cakephp_380beta1_released.html https://bakery.cakephp.org/2019/03/30/cakephp_380beta1_released.html <![CDATA[CakePHP 3.8.0-beta1 Released]]> CakePHP 3.8.0-beta1 Released

The CakePHP team is happy to announce the release of 3.8.0-beta1. This is preview release for what will become 3.8.0. The 3.8 release series is a backwards compatible release with the rest of 3.x, it introduces new features and one additional deprecation.

In the 3.7.0 release announcement I mentioned that we were not planning on doing a 3.8 release. Based on your feedback about the new allowEmpty APIs introduced in 3.7 we are doing an additional release to add the missing notEmpty* methods and to correct a parameter ordering mistake in the allowEmpty* methods.

Updating to the beta

You can use composer to upgrade to the beta version of CakePHP 3.8.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.8.0-beta1"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the beta, we can help ensure a smoother release of 3.8.0 before the stable release.

What’s new in 3.8.0?

The migration guide has a complete list of what’s new in 3.8.0. We recommend you give that page a read when upgrading.

Contributors to 3.8.0-beta1

Thank you to all the contributors that helped make 3.8 happen:

  • ADmad
  • Edgaras Janušauskas
  • Jeremy Harris
  • Jorge González
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Robert Pustułka
  • andrii-pukhalevych

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 30 Mar 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/03/13/cakephp_375_released.html https://bakery.cakephp.org/2019/03/13/cakephp_375_released.html <![CDATA[CakePHP 3.7.5 Released]]> CakePHP 3.7.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.5. This is a maintenance release for the 3.7 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.7.5. See the changelog for every commit.

  • Added FlashComponent::getSession() protected method to make application extensions easier to build.
  • Entity::hasErrors() now only returns true when an error array is not empty.
  • The date, time, and datetime allowEmpty* methods on Validator now allow [] as an empty value.
  • Improved API documentation.
  • Database\Expression\Comparison now clones its children recursively.
  • Http\ResponseEmitter now calls session_write_close() in fast-cgi servers. This helps ensure that the session has been persisted.
  • Greatly improved performance of cake i18n extract.

Contributors to 3.7.5

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Cauan Cabral
  • David Yell
  • Edgaras Janušauskas
  • Mark Scherer
  • Mark Story
  • Michal
  • Robert Pustułka
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 13 Mar 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/02/28/cakephp_21016_released.html https://bakery.cakephp.org/2019/02/28/cakephp_21016_released.html <![CDATA[CakePHP 2.10.16 Released]]> CakePHP 2.10.16 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.16. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.10.16. See the changelog for every commit.

  • CakeTime::format(), nice() and i18nFormat() now convert timezones more correctly when both the source and destination timezone are not the default server timezone.
  • RedisCache no longer attempts to close the connection if the connection has not been initialized.
  • ShellDispatcher now uses the CONFIG constant if it is defined.

Contributors to 2.10.16

Thank you to all the contributors that helped make this release happen:

  • Benjamin Stout
  • Mark Sch
  • Mark Story
  • Val Bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 28 Feb 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/02/09/cakephp_374_released.html https://bakery.cakephp.org/2019/02/09/cakephp_374_released.html <![CDATA[CakePHP 3.7.4 Released]]> CakePHP 3.7.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.4. This is a maintenance release for the 3.7 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.7.4. See the changelog for every commit.

  • Requests made in IntergrationTestCase can now overwrite PHP_SELF.
  • Improved API documentation and IDE typehinting.
  • Saving entities with non-scalar primary key values now works as expected.
  • Errors when persistence has failed now include more information on which validation rules caused the failure.
  • The optional dependencies for cakephp/core are now more clearly communicated.

Contributors to 3.7.4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • gregs
  • mosaxiv

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 09 Feb 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/01/25/cakephp_21015_released.html https://bakery.cakephp.org/2019/01/25/cakephp_21015_released.html <![CDATA[CakePHP 2.10.15 Released]]> CakePHP 2.10.15 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.15. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.10.15. See the changelog for every commit.

  • Improved API documentation and typehints.
  • Fixed session configuration issues in CLI environments for PHP7.2+

Contributors to 2.10.15

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Joseph Zidell
  • Koji Tanaka
  • Mark Story
  • andrew.keiper
  • bancer
  • kicaj
  • mark_story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 25 Jan 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/01/21/cakephp_373_released.html https://bakery.cakephp.org/2019/01/21/cakephp_373_released.html <![CDATA[CakePHP 3.7.3 Released]]> CakePHP 3.7.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.3. This is a maintenance release for the 3.7 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.7.3. See the changelog for every commit.

  • Improved API documentation and typehint annotations.
  • Update deprecation notice version numbers.
  • Fixed documentation for Collection::stopWhen().
  • BaseErrorHandler now includes previous exception traces in log messages.

Contributors to 3.7.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Adam Harley
  • Ceeram
  • Iacovos Constantinou
  • Jonathan McAndrew
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Tamási Benjamin
  • Timur Asaliev

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 21 Jan 2019 00:00:00 +0000
https://bakery.cakephp.org/2019/01/03/cakephp_372_released.html https://bakery.cakephp.org/2019/01/03/cakephp_372_released.html <![CDATA[CakePHP 3.7.2 Released]]> CakePHP 3.7.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.2. This is a maintenance release for the 3.7 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.7.2. See the changelog for every commit.

  • Commands added in an Application or plugin console() hook method can now use spaces in the command name.
  • Improved typehints in API documentation.
  • IntegrationTestTrait now forwards files defined in configRequest().
  • Error pages for parsed extensions are once again rendering correctly.
  • A redundant expiry time check in FileEngine was removed.
  • RequestHandlerComponent once again handles explicit htm and html extensions correctly.
  • UrlHelper::assetUrl() now supports a fullBase option enabling CDN assets to be linked more easily.
  • The database package now requires cakephp/log as logging is used to emit transactional warnings.
  • EmailTrait and ConsoleIntegrationTestTrait now uses before and after annotations to apply its setup/teardown logic.

Contributors to 3.7.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Chris Hallgren
  • Jeremy Harris
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann
  • Robert Pustułka
  • ndm2
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 03 Jan 2019 00:00:00 +0000
https://bakery.cakephp.org/2018/12/19/cakephp_21014_released.html https://bakery.cakephp.org/2018/12/19/cakephp_21014_released.html <![CDATA[CakePHP 2.10.14 Released]]> CakePHP 2.10.14 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.14. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.10.14. See the changelog for every commit.

  • Replace hard coded test directory paths with constants.
  • Add model id to all interal exists() method calls. This makes the usage compatible with the shim plugin.
  • Tests are all passing with PHP 7.3
  • Improved API documentation.
  • ENUM columns will use strings for all values instead of conditionally using an integer.
  • Fixed errors when using cake schema with ENUM columns.

Contributors to 2.10.14

Thank you to all the contributors that helped make this release happen:

  • Joseph Zidell
  • Koji Tanaka
  • Mark Story
  • Martin Stücklschwaiger
  • Val Bancer
  • Yaser Naderi
  • bancer
  • mark_story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 19 Dec 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/12/17/cakephp_371_released.html https://bakery.cakephp.org/2018/12/17/cakephp_371_released.html <![CDATA[CakePHP 3.7.1 Released]]> CakePHP 3.7.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.1. This is a maintenance release for the 3.7 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.7.1. See the changelog for every commit.

  • Fixed incorrect error messages when cells cannot find their template.
  • Fixed a regression in assertCookieNotSet().
  • Added missing @deprecated annotations on methods on Email.
  • Improve typehints on array properties.
  • Loosened type checking in integer and decimal type classes. Both these types now allow whitespace, and commas to accept more number formats.
  • IntegrationTestTrait now uses annotations for its setup/teardown logic. This removes the need for awkward method aliasing when using the trait.
  • Console\Arguments::getArgument() no longer raises a notice error on missing arguments.
  • Console\ConsoleIo::createFile() will now recursively create directories if necessary. This improves compatibility with Shell::createFile().

Contributors to 3.7.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Florian Krämer
  • Jeremy Harris
  • Mark Scherer
  • Mark Story
  • Tomas Saghy
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 17 Dec 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/12/08/cakephp_370_released.html https://bakery.cakephp.org/2018/12/08/cakephp_370_released.html <![CDATA[CakePHP 3.7.0 Released]]> CakePHP 3.7.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.0. This is the first stable release of 3.7.0. 3.7.0 provides a number improvements both large and small to CakePHP.

This release is the last planned feature release for 3.x. Going forward the core team will be focusing on supporting 3.7 and completing 4.0.0.

Upgrading to 3.7.0

You can use composer to upgrade to CakePHP 3.7.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.7.*"

Deprecation Warnings

3.7.0 adds additional runtime deprecations for features that were missed during 3.6. The new deprecation warnings conclude deprecations in 3.x. By resolving deprecation warnings in your application now you will have a simpler upgrade experience when 4.0.0 is ready.

Because fixing all the deprecation warnings in a large application can be a non-trivial task you will likely want to disable deprecation warnings allowing you to make incremental progress in fixing them. To disable deprecation warnings set Error.errorLevel to E_ALL ^ E_USER_DEPRECATED in config/app.php.

The migration guide has the full list of deprecated methods and their replacements. Deprecated features will continue to exist and behave as they always have until 4.0.0

What’s new in 3.7.0?

The migration guide has a complete list of what’s new in 3.7.0. We recommend you give that page a read when upgrading. A few highlights from 3.7.0 are:

  • The ArrayEngine which can help improve test suite performance and reliability.
  • Cake\Http\Client will now use curl if it is available providing better performance and proxy features.
  • ErrorHandlerMiddleware will now include previous exceptions in logging.
  • New transport factory classes to help simplify Email.
  • Cake\Validation\Validator now provides type-safe allow-empty methods.
  • FormHelper can now set HTML5 custom validation messages.
  • New assertions on IntegrationTestCase to make working with flash messages simpler.

Contributors to 3.7.0

Thank you to all the contributors that helped make 3.7 happen:

  • ADmad
  • AlPri78
  • Benjamin Pick
  • Brian Porter
  • Ceeram
  • Daniel Opitz
  • Daniel Platt
  • David Yell
  • Dmitrii Romanov
  • Dustin Haggard
  • Edgaras
  • Edgaras Janušauskas
  • Erwane Breton
  • Eugene Ritter
  • Fernando Herrero
  • Gergely Tamás
  • Henrik Gemal
  • Ian den Hartog
  • Iandenh
  • Jeremy Harris
  • Jorge González
  • Jose Diaz-Gonzalez
  • Joshua Lückers
  • José Lorenzo Rodríguez
  • Kazuki_Kamizuru
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Mikkel Bonde
  • Mohamed Elbahja
  • Philipp Nikolajev
  • chinpei215
  • inoas
  • lganee
  • mirko-pagliai
  • ndm2
  • saeideng

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 3.7.0 is a large release and would not have been possible without the community support and feedback.

Download a packaged release on github.

]]>
Sat, 08 Dec 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/12/06/cakephp_3614_released.html https://bakery.cakephp.org/2018/12/06/cakephp_3614_released.html <![CDATA[CakePHP 3.6.14 Released]]> CakePHP 3.6.14 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.14. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.6.14. See the changelog for every commit.

  • Improved API documentation.
  • PaginatorHelper no longer always includes the direction query string argument when sorting by an associative array with the default direction.
  • LocaleSelectorMiddleware now support fallback languages allowing Accept header values of es-ES to match the generic es locale.
  • NullEngine::write() now conforms to the documented return type.
  • Fixed incorrect association properties being set when loading joined associations with a subset of fields that excludes all fields on the root entity.

Contributors to 3.6.14

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Cauan Cabral
  • Edgaras
  • George Constantinou
  • Hideki Kinjyo
  • Ian den Hartog
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann
  • Val Bancer
  • gregs

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 06 Dec 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/11/25/cakephp_370RC3_released.html https://bakery.cakephp.org/2018/11/25/cakephp_370RC3_released.html <![CDATA[CakePHP 3.7.0-RC3 Released]]> CakePHP 3.7.0-RC3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.0-RC3. This is the release candidate for 3.7.0, and it contains several new major features. If no major issues are reported a stable release will be packaged in a few weeks.

3.7 is the last planned minor release of CakePHP 3.x before 4.0 is released. Once 4.0 is released, 2.x will only receive security fixes, and 3.x will only continue to receive bug & security fix releases. If there is significant community interest there may be a 3.8 release, but there are no plans at this point in time.

Updating to the RC

You can use composer to upgrade to the beta version of CakePHP 3.7.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.7.0-RC3"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the release candidate, we can help ensure a smoother release of 3.7.0 before the stable release.

What’s new in 3.7.0?

The migration guide has a complete list of what’s new in 3.7.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes since 3.7.0-RC2

  • Validator::allowEmpty() is now deprecated. While simple to use this method would allow incorrectly typed ‘empty’ data in. In its place four new methods have been added that are more explicit about the accepted empty data.
  • Improved API documentation.
  • Chained exceptions now include stack traces in log files for the inner exceptions.
  • ArrayCache was added as an engine for Cache. This allows you to store cache data only until the end of the current process.
  • Improve display paths in console environments.
  • NullEngine::write() method will now return true, this in effect will comply with parent abstract method’s return type declaration.

Contributors to 3.7.0-RC3

  • ADmad
  • Ceeram
  • Edgaras
  • George Constantinou
  • Ian den Hartog
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • chinpei215
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sun, 25 Nov 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/11/16/cakephp_370RC2_released.html https://bakery.cakephp.org/2018/11/16/cakephp_370RC2_released.html <![CDATA[CakePHP 3.7.0-RC2 Released]]> CakePHP 3.7.0-RC2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.0-RC2. This is the release candidate for 3.7.0, and it contains several new major features. If no major issues are reported a stable release will be packaged in a few weeks.

3.7 is the last planned minor release of CakePHP 3.x before 4.0 is released. Once 4.0 is released, 2.x will only receive security fixes, and 3.x will only continue to receive bug & security fix releases. If there is significant community interest there may be a 3.8 release, but there are no plans at this point in time.

Updating to the RC

You can use composer to upgrade to the beta version of CakePHP 3.7.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.7.0-RC2"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the release candidate, we can help ensure a smoother release of 3.7.0 before the stable release.

What’s new in 3.7.0?

The migration guide has a complete list of what’s new in 3.7.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes since 3.7.0-RC1

  • Plugin::unload() is now deprecated. This mirrors the deprecation for Plugin::load().
  • New TestCase methods (removePlugin(), removePlugins() and clearPlugins()) have been added to remove plugins at runtime.
  • LocaleSelectorMiddleware will now automatically select a fallback locale like es if a request for es-ES is made and your application does not define an es-ES locale.
  • MoParser now supports messages without contexts matching the behavior of PoParser.
  • Backwards incompatible changes in ConsoleIntegrationTrait were reverted.
  • Cake\ORM\Query::disableHydration() was added.
  • Cake\View\ViewBuilder::disableAutoLayout() was added.
  • Cake\View\View::disableAutoLayout() was added.
  • Cake\Database\Query::disableBufferedResults() was added.
  • Cake\Database\Driver::disableAutoQuoting() was added.
  • Cake\Database\Query::disableAutoFields() was added.
  • Cake\Datasource\Connection::disableQueryLogging() was added.
  • Cake\Datasource\Connection::disableSavePoints() was added.
  • Pagination no longer includes the direction key in generated URLs when multiple sort columns are used.
  • Cake\TestSuite\TestCase::getMockForModel() now accepts null for its $methods parameter.

Contributors to 3.7.0-RC2

  • ADmad
  • David Yell
  • Edgaras Janušauskas
  • Ian den Hartog
  • Jeremy Harris
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann
  • Val Bancer
  • gregs
  • mirko-pagliai
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Fri, 16 Nov 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/11/04/cakephp_3613_released.html https://bakery.cakephp.org/2018/11/04/cakephp_3613_released.html <![CDATA[CakePHP 3.6.13 Released]]> CakePHP 3.6.13 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.13. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.6.13. See the changelog for every commit.

  • PHP 7.3 was added to the build matrix with all tests passing.
  • Extensions are no longer silently ignored when specific extensions are enabled. Instead a NotFoundException wll be raised.
  • Join table entities now have their source source property.
  • Improved detection of binary column lengths in SQLServer schema reflection.
  • Multiple checkbox input sets without inputs can now be rendered correctly.
  • Session handlers are not modified if the session is already active.
  • The i18n shell now uses the locale paths defined by the application.
  • The bundled CA file has been updated to 2018-10-17 build from mozilla.
  • ConsoleIo::createFile() now behaves correctly with UNC file paths.
  • MoParser now supports messages without contexts matching the behavior of PoParser.

Contributors to 3.6.13

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • David Yell
  • Dmitriy Romanov
  • Edgaras Janušauskas
  • Ian den Hartog
  • Mark Scherer
  • Mark Story
  • nojimage

We’d like to welcome garas to the CakePHP core team. Hailing from Lithuania, garas has been helpful with fixing bugs in 3.x and reviewing/writing pull requests for 3.7.

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 04 Nov 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/10/27/cakephp_21013_released.html https://bakery.cakephp.org/2018/10/27/cakephp_21013_released.html <![CDATA[CakePHP 2.10.13 Released]]> CakePHP 2.10.13 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.13. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.13. See the changelog for every commit.

  • Updated API documentation.
  • Improve compatibility with PHP 7.3
  • MySQL driver now handles CURRENT_TIMESTAMP as a default value better.
  • Better handling of default values with casts in Postgres driver.
  • Fixed UNC path handling in Shell::createFile().

Contributors to 2.10.13

Thank you to all the contributors that helped make this release happen:

  • Humberto Pereira
  • Joe
  • Joseph Zidell
  • Mark Story
  • Val Bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 27 Oct 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/10/24/cakephp_370RC1_released.html https://bakery.cakephp.org/2018/10/24/cakephp_370RC1_released.html <![CDATA[CakePHP 3.7.0-RC1 Released]]> CakePHP 3.7.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.0-RC1. This is the release candidate for 3.7.0, and it contains several new major features. If no major issues are reported a stable release will be packaged in a few weeks.

3.7 is the last planned minor release of CakePHP 3.x before 4.0 is released. Once 4.0 is released, 2.x will only receive security fixes, and 3.x will only continue to receive bug & security fix releases. If there is significant community interest there may be a 3.8 release, but there are no plans at this point in time.

Updating to the RC

You can use composer to upgrade to the beta version of CakePHP 3.7.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.7.0-RC1"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the release candidate, we can help ensure a smoother release of 3.7.0 before the stable release.

What’s new in 3.7.0?

The migration guide has a complete list of what’s new in 3.7.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes since 3.7.0-beta1

  • Improved binary column reflection for SqlServer.
  • Session handlers are no longer changed if the session is active.
  • Tests are passing against PHP 7.3
  • The bundled CA file has been updated to 2018-10-17 from Mozilla.
  • ConsoleIo::createFile() now behaves correctly with UNC file paths.
  • Exception logging now includes each exception in a chained exception.

Contributors to 3.7.0-RC1

  • ADmad
  • Ceeram
  • Dmitriy Romanov
  • Edgaras
  • Edgaras Janušauskas
  • Ian den Hartog
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Wed, 24 Oct 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/10/10/cakephp_370beta1_released.html https://bakery.cakephp.org/2018/10/10/cakephp_370beta1_released.html <![CDATA[CakePHP 3.7.0-beta1 Released]]> CakePHP 3.7.0-beta1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.7.0-beta1. This is the first beta release for 3.7.0, and it contains several new major features.

Updating to the beta

You can use composer to upgrade to the beta version of CakePHP 3.7.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.7.0-beta1"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the beta, we can help ensure a smoother release of 3.7.0 before the stable release.

What’s new in 3.7.0?

The migration guide has a complete list of what’s new in 3.7.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Contributors to 3.7.0-beta1

  • ADmad
  • AlPri78
  • Benjamin Pick
  • Brian Porter
  • Daniel Opitz
  • Daniel Platt
  • David Yell
  • Dmitrii Romanov
  • Dustin Haggard
  • Edgaras
  • Edgaras Janušauskas
  • Erwane Breton
  • Eugene Ritter
  • Fernando Herrero
  • Henrik Gemal
  • Ian den Hartog
  • Iandenh
  • Jeremy Harris
  • Jose Diaz-Gonzalez
  • Joshua Lückers
  • José Lorenzo Rodríguez
  • Kazuki_Kamizuru
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Mikkel Bonde
  • Mohamed Elbahja
  • Philipp Nikolajev
  • inoas
  • lganee
  • ndm2
  • nojimage
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Wed, 10 Oct 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/10/01/cakephp_3612_released.html https://bakery.cakephp.org/2018/10/01/cakephp_3612_released.html <![CDATA[CakePHP 3.6.12 Released]]> CakePHP 3.6.12 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.12. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.6.11. See the changelog for every commit.

  • Invalid encrypted cookie values no longer cause exceptions to be raised. Instead they are treated as empty values.
  • ServerRequestFactory uses the configured webroot directory instead of hardcoded value now.
  • Routing scopes that define an action now work correctly.
  • Improved API documentation.
  • EntityRoute now correctly handles _ in placeholder names, and handles {brace} style placeholders.
  • Schema generation for MySQL binary types has been improved. Arbitrary sized columns are now handled correctly.
  • Undefined controller properties now emit warnings when accessed. This prevents ‘invalid method call on false’ type errors.
  • Response now checks disabled_functions before trying to set request timeout to 0.
  • Re-rendering an email message no longer rotates the message-id.

Contributors to 3.6.12

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Dennis Hemeier
  • Dmitrii Romanov
  • Edgaras Janušauskas
  • Hideki Kinjyo
  • Ian den Hartog
  • Jeremy Harris
  • Jose Diaz-Gonzalez
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 01 Oct 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/09/03/cakephp_21012_released.html https://bakery.cakephp.org/2018/09/03/cakephp_21012_released.html <![CDATA[CakePHP 2.10.12 Released]]> CakePHP 2.10.12 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.12. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.12. See the changelog for every commit.

  • Fixed PHP_CodeCoverage missing errors.
  • Fixed undefined index errors in DboSource.
  • Fixed unbound association errors in TranslateBehavior.
  • Improved error messages when email addresses are empty or invalid.
  • Improved API documentation.
  • CakeTestCase forcibly frees memory now.

Contributors to 2.10.12

Thank you to all the contributors that helped make this release happen:

  • AlexAlexandru
  • Jan Ptacek
  • Mark Story
  • Val Bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 03 Sep 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/09/02/cakephp_3611_released.html https://bakery.cakephp.org/2018/09/02/cakephp_3611_released.html <![CDATA[CakePHP 3.6.11 Released]]> CakePHP 3.6.11 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.11. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.6.10. See the changelog for every commit.

  • Use ConsoleIo constants internally more consistently.
  • Updated the bundled cacert.pem file to the 2018-06-20 release from mozilla.
  • Fixed a potential timing side-channel vector in Digest Authentication that could be used to enumerate usernames. Thank you to Edgaras Janušauskas for raising this issue through our responsible disclosure process.
  • Improved API documentation.
  • Binary column reflection now returns column length in SQLite and MySQL for custom sized binary fields.
  • Scoped middleware now only applies the unique set of middleware.

Contributors to 3.6.11

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Curtis Gibby
  • Dmitriy Romanov
  • Edgaras
  • Edgaras Janušauskas
  • Hideki Kinjyo
  • Ian den Hartog
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Sohel Rana
  • inoas
  • itosho
  • ndm2
  • saeideng
  • sohelrana820

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 02 Sep 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/08/04/cakephp_3610_released.html https://bakery.cakephp.org/2018/08/04/cakephp_3610_released.html <![CDATA[CakePHP 3.6.10 Released]]> CakePHP 3.6.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.10. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.6.9. See the changelog for every commit.

  • File validation methods now work with PSR7 UploadedFileInterface objects more consistently.
  • Improved API documentation.

Contributors to 3.6.10

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Mark Scherer
  • Mark Story
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 04 Aug 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/07/25/cakephp_369_released.html https://bakery.cakephp.org/2018/07/25/cakephp_369_released.html <![CDATA[CakePHP 3.6.9 Released]]> CakePHP 3.6.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.9. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.6.9. See the changelog for every commit.

  • Fixed a regression in Entity class name inflection.
  • Fixed constructing a ServerRequest with / as a string parameter.

Contributors to 3.6.9

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 25 Jul 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/07/23/cakephp_368_released.html https://bakery.cakephp.org/2018/07/23/cakephp_368_released.html <![CDATA[CakePHP 3.6.8 Released]]> CakePHP 3.6.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.8. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.6.8. See the changelog for every commit.

  • Improved entity class name inflection for multi-word table classes.
  • Enabled session.use_strict_mode by default.
  • Improved API documentation for i18n functions.
  • Improved deprecation docstrings.
  • Router::url() now ensures that App.base is applied to URLs generated in CLI contexts.

Contributors to 3.6.8

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • AlPri78
  • Denys Yaroshenko
  • Flavius
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Tomas Saghy
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 23 Jul 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/07/08/cakephp_367_released.html https://bakery.cakephp.org/2018/07/08/cakephp_367_released.html <![CDATA[CakePHP 3.6.7 Released]]> CakePHP 3.6.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.7. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.6.7. See the changelog for every commit.

  • Improved deprecation messages.
  • HttpClient now ignores invalid cookie expiration dates.
  • HttpClient now drops invalid/empty Set-Cookie header values.
  • Data read from cakephp-plugins.php is reloaded as neccessary in test suites. Fixing unknown plugin errors.
  • Email::setAttachments() no longer emits an error when data key is used without a mimetype.
  • Redirect routes no longer apply the application subdirectory twice.
  • Multiple checkbox form widgets now use checkboxWrapper instead of radioWrapper for their wrapping template.
  • Debugger::printVar() now forces its content to be ltr, improving readability in rtl documents.
  • Routing key sub-pattern checks in reverser routing now use unicode regular expressions.
  • An exception is now raised when libicu is missing a requested timezone.
  • Console subcommand help now displays the subcommand description when no subcommand parser has been defined.
  • Missing Plugin error pages now recommend the use of addPlugin().

Contributors to 3.6.7

Thank you to all the contributors that helped make this release happen:

  • Albert Scherman
  • Dmitriy Romanov
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • chinpei215
  • saeideng
  • vladimir.reznichenko

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 08 Jul 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/07/01/cakephp_21011_released.html https://bakery.cakephp.org/2018/07/01/cakephp_21011_released.html <![CDATA[CakePHP 2.10.11 Released]]> CakePHP 2.10.11 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.11. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.11. See the changelog for every commit.

  • Fix PHP7.2 compatibility issue in DboSource.
  • Improved API documenation.
  • Fix incorrectly cased method call.

Contributors to 2.10.11

Thank you to all the contributors that helped make this release happen:

  • Mark Sch
  • Mark Story
  • Trent Renshaw
  • Val Bancer
  • Wouter
  • aoki ken

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 01 Jul 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/06/24/cakephp_366_released.html https://bakery.cakephp.org/2018/06/24/cakephp_366_released.html <![CDATA[CakePHP 3.6.6 Released]]> CakePHP 3.6.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.6. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.6.6. See the changelog for every commit.

  • IntegrationTestCase now string casts all request data. This better emulates how HTTP POST data is handled.
  • Improved API documentation.
  • Routes using {var} now correctly calculate their static path segments making route parsing work correctly.
  • Http\Client no longer lowercases cookie names when creating identifiers.
  • Database\Query::fetchAll('obj') now returns all rows instead of just one.
  • Table::saveMany() now restores entity state when saving fails due to database deadlocks or other operational errors.
  • Improved compatibility between old and new plugin loading systems.
  • BaseApplication::addPlugin() now creates a dynamic plugin class instead of throwing an error.
  • RouteBuilder::loadPlugin() no longer results in duplicate plugin routes being loaded.
  • TranslateBehavior now inherits the table locator used by the parent model.
  • EntityTrait::setDirty() now defaults the second parameter to true.
  • EntityTrait::setErrors() no longer uses array_merge() internally. This fixes issues when adding errors for multi-row fields.

Contributors to 3.6.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Edgaras Janušauskas
  • Jeremy Harris
  • Mark Scherer
  • Mark Story
  • Martijn de Hoog
  • Robert Pustułka
  • Tomas Saghy
  • Walther Lalk
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 24 Jun 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/06/18/CakeFest_2018_cancellation_announcement.html https://bakery.cakephp.org/2018/06/18/CakeFest_2018_cancellation_announcement.html <![CDATA[More about the CakeFest 2018 Nashville cancellation]]> More about the CakeFest 2018 Nashville cancellation

This past weekend was the original date for CakeFest 2018 Nashville, we wanted to address our community about the sudden (and unexpected) cancellation of CakeFest 2018 - Nashville.

CakeFest is organized for developers, managers and newcomers - we welcome anyone with an interest in PHP and PHP frameworks, not only those interested in CakePHP. With many years behind its belt, CakeFest has been come to be known for a casual, safe and knowledgeable space where attendees can share, ask questions and learn. We’ve generally always been on the smaller side, with numbers around 100-150 attendees - and while other conference’s peak numbers at 500, we’ve celebrated the cosy, casual feel that CakeFest brings. Offering our speakers a welcoming crowd, and our attendees a casual environment to reach out and get to know both speakers, attendees and the CakePHP Core team alike.

CakeFest is a not-for-profit event, and it’s funded through a variety of methods - our biggest contributor is CakeDC, who provides both monetary resources as well as other resources, such as developer time (getting our site updated, ensuring all ticket glitches are taken care of and handling on-the-day streaming and technical support), my time (which is used to organize the hotel, venue, swag, speakers, schedules, ticket issues, community engagement and event promotion) as well as our videographer and all of his equipment (Thanks Larry a.k.a @phpnut!). We also use all of our ticket sale funds and anything raised via sponsors towards the venue and catering costs - this however is never enough due to two factors We keep ticket prices as low as possible for attendees, we know that travelling is expensive and we try to be cognizant of this. We wish we could have these tickets at an even cheaper rate but due to the next point as well as number of attendees, this isn’t always possible The current economic climate has seen a lot of companies cut back heavily on their sponsorship budgets, especially for niche conferences such as CakeFest. We appeal to our community to assist us in this regard.

CakeFest has traditionally switched locations every year - either in Europe or in the United States. This year, we were set for Nashville.

A few have approached CakePHP and asked us why it wasn’t in Europe this year - as a community we decided a few years back that every 3rd CakeFest would be in Europe due to the lower attendance generally observed at our European conferences. This lead up to 2018 being hosted in the United States - and Nashville was selected. Having come off of a successful 2017 conference hosted in New York City - the team was excited. Nashville is an exciting place - it’s not an international hub and does not have any direct flights for international travellers, but as a travelling conference we thought it would be a fun, new and exciting locale for our community.

CakeFest, being an international conference, pulling attendees from all of the world (quite literally) has many cards stacked against it - BUT it has been well attended and well supported. From our voted-in speakers to our core team who dedicate hours and hours toward the framework and community support, CakeFest is a representation of the support and energy surrounding the framework.

And that brings us to the next point - this cancellation is a disappointment to everyone, however, Larry felt it was better to cancel the event this year rather than risk hosting our annual conference at a level sub-par to what has become expected to our community. Due to personal reasons, he was unable to commit the time needed for the planning and organisation of the conference.

We are proud to say that even after a very difficult personal time, Larry is committed to the framework and community - and while CakeFest is cancelled for this year, we will back in 2019. We’d also like to let you know that this bump in the road does not change our resolve to continue building and growing the cakephp community

2019 is already in our view, and we are going to put the location up to vote! We’d now like to hear your feedback on these 4 options - Let us know where you’d most like to attend CakeFest 2019:

  • Japan,
  • Atlanta GA, USA
  • France
  • Germany

If you are keen to get involved with CakeFest - sponsorship, ticket holder, community supporter - then reach out to us.

]]>
Mon, 18 Jun 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/06/09/cakephp_365_released.html https://bakery.cakephp.org/2018/06/09/cakephp_365_released.html <![CDATA[CakePHP 3.6.5 Released]]> CakePHP 3.6.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.5. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.6.5. See the changelog for every commit.

  • Improved deprecation warning text.
  • Plugin::load() now uses concrete plugin classes if a plugin has adopted new style plugins.
  • The mimetype for .bmp was added to Response.
  • Plugin::routes() had a deprecation warning added. This method is no longer necessary when using an Application class.
  • Missing deprecation warnings were added to Response.
  • IntegrationTestCase once again accepts array URLs when generating requests.
  • Email messages no correctly word-wrap multi-byte characters.
  • Http\Client restores the error handler after a socket error.
  • AppShell is now included in the list of auto-discovered shells.
  • ConsoleIntegrationTestCase now catches StopException and sets the test case exitCode property accordingly.
  • Cell::__debugInfo() no longer emits a notice error.
  • Pagination metadata now includes the start & end record numbers.
  • The Model.afterSaveCommit event always recieves an ArrayObject for $options now.

Contributors to 3.6.5

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Edgaras
  • Glen Sawyer
  • Hideki Kinjyo
  • Jeremy Harris
  • Joep Roebroek
  • Mark Scherer
  • Mark Story
  • Neon1024
  • Walther Lalk
  • saeideng
  • seto
  • smap9

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 09 Jun 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/05/20/cakephp_364_3517_3414_released.html https://bakery.cakephp.org/2018/05/20/cakephp_364_3517_3414_released.html <![CDATA[CakePHP 3.6.4, 3.5.17, 3.4.14 Released]]> CakePHP 3.6.4, 3.5.17, 3.4.14 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.4. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

We are also releasing 3.5.17 and 3.4.14 at this time. These releases contain security related fixes that address a cross-site-scripting (XSS) vulnerability in the development only ‘missing route’ and ‘duplicate named route’ error pages. Thank you to Nacer for notifying us of this issue via our responsible disclosure process. We recommend that all users of 3.4 and 3.5 update to these releases.

Bugfixes in 3.6.4

You can expect the following changes in 3.6.4. See the changelog for every commit.

  • Fixed logging of fatal errors in console environments.
  • Fixed empty OR sub-conditions creating invalid SQL.
  • ServerRequest::getAttributes() now includes the here attribute.
  • bin/cake routes will now display route defaults sorted.

Contributors to 3.6.4

Thank you to all the contributors that helped make this release happen:

  • AD7six
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 20 May 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/05/13/cakephp_363_released.html https://bakery.cakephp.org/2018/05/13/cakephp_363_released.html <![CDATA[CakePHP 3.6.3 Released]]> CakePHP 3.6.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.3. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.6.3. See the changelog for every commit.

  • Improved deprecation messages in ServerRequest, Response and ViewBuilder.
  • Improved API documentation.
  • h() no longer modifies non-string scalar values.
  • Passing a string as the 2nd parameter to h() is now deprecated.
  • The Model.afterSaveCommit event is now fired for entities created via findOrCreate()
  • The console environment now uses the Application class to load routes. This fixes ensures routes are loaded for class based applications.
  • Fixed missing attribute emulation for ServerRequest::$here.
  • Security::rijndael() now emits deprecation warnings.
  • Automatic identifier quoting can now handle column names with spaces better.
  • Corrected a parsing mistake with string route targets.
  • Integration test cases now set $_SERVER['PHP_SELF'] to / solving cryptic base path issues if more than one action was called per test method.

Contributors to 3.6.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Brian French
  • Dominik Schmelz
  • Jeremy Harris
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Neon1024
  • Tomas Saghy
  • Vladimir Reznichenko
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 13 May 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/05/11/cakephp_21010_released.html https://bakery.cakephp.org/2018/05/11/cakephp_21010_released.html <![CDATA[CakePHP 2.10.10 Released]]> CakePHP 2.10.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.10. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.10. See the changelog for every commit.

  • Added luxembourgish language.
  • Added support for DboSource::expression() objects in model virtual fields.

Contributors to 2.10.10

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Mark Story
  • Philippe Gibert

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 11 May 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/04/27/cakephp_362_released.html https://bakery.cakephp.org/2018/04/27/cakephp_362_released.html <![CDATA[CakePHP 3.6.2 & 3.5.16 Released]]> CakePHP 3.6.2 & 3.5.16 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.2. This is a maintenance release for the 3.6 branch that fixes several community reported issues. The 3.5.16 release contains only one change to address the potential timing side channel in CSRF tokens.

Bugfixes

You can expect the following changes in 3.6.2. See the changelog for every commit.

  • Fixed a potential side channel timing issue in CSRF token validation. Tokens are now checked with constant time equality operations. Thank you to Felix Wiedemann and Nils Rokita for notifying us of this issue.
  • Improved deprecation warnings for request->here.
  • Cake\Form\Form::validator() only emits deprecation warnings now if it is implemented by a subclass.
  • Additional deprecation warnings that were missed in previous releases were added to Cake\Mailer\Email, Cake\Database\Type, and Cake\View\ViewBuilder.
  • HtmlHelper::para() now correctly handles escape => false as an option.
  • Cake\Http\Client no longer treats values starting with @ as file paths. This feature has been deprecated since 3.1 and frequently causes issues for other users.
  • Typehints added to TranslateBehavior were removed as they caused strict errors with userspace sub-classes.
  • Improved error reporting when XML content cannot be parsed.

Contributors to 3.6.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Flavius
  • Ilie Pandia
  • José Lorenzo Rodríguez
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 27 Apr 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/04/19/cakephp_361_released.html https://bakery.cakephp.org/2018/04/19/cakephp_361_released.html <![CDATA[CakePHP 3.6.1 Released]]> CakePHP 3.6.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.1. This is a maintenance release for the 3.6 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.6.1. See the changelog for every commit.

  • Improve deprecation warning message for controller properties.
  • Deprecation warning messages now include how to disable them.
  • Redirect loops created by AuthComponent for applications in subdirectories has been fixed.
  • SecurityComponent no longer rejects requests for applications in subdirectories.
  • Image URLs can now be data URIs.
  • Improved API documentation.
  • Added ServerRequest::getPath() as a better alternative for the deprecated url property.
  • Updated requirements in the sub-split packages.

Contributors to 3.6.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Albert Cansado Solà
  • José Lorenzo Rodríguez
  • Koji Tanaka
  • Mark Story
  • Schlaefer
  • inoas
  • saeideng
  • tsmsogn
  • ypnos-web

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 19 Apr 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/04/14/cakephp_360_released.html https://bakery.cakephp.org/2018/04/14/cakephp_360_released.html <![CDATA[CakePHP 3.6.0 Released]]> CakePHP 3.6.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.0. This is the first stable release of 3.6.0. 3.6.0 provides a number improvements both large and small to CakePHP.

In following with our previously announced roadmap work will now begin on 4.0. This work will take place in the 4.x branch, while the master branch contains 3.6.x.

Upgrading to 3.6.0

You can use composer to upgrade to CakePHP 3.6.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.6.*"

Deprecation Warnings

3.6.0 adds runtime deprecations for all previously deprecated functions and behaviors. These deprecation warnings represent most of the breaking changes that will come in 4.0.0. By resolving deprecation warnings in your application now you will have a simpler upgrade experience when 4.0.0 is ready.

Because fixing all the deprecation warnings in a large application can be a non-trivial task you will likely want to disable deprecation warnings allowing you to make incremental progress in fixing them. To disable deprecation warnings set Error.errorLevel to E_ALL ^ E_USER_DEPRECATED in config/app.php.

The migration guide has the full list of deprecated methods and their replacements. Deprecated features will continue to exist and behave as they always have until 4.0.0

What’s new in 3.6.0?

The migration guide has a complete list of what’s new in 3.6.0. We recommend you give that page a read when upgrading.

  • New Middleware - New middleware was added to parse encoded request bodies,
  • Improved Console Environment - ‘Command’ classes have been added providing a simpler and more flexible abstractions to build CLI applications
  • Improved Plugins - Plugins can now declare a plugin object that defines how a plugin integrates into the application. This makes installing plugins simpler and provides plugin authors better integration hooks.
  • Binary UUID support - For engines that support them binary UUIDs are available.
  • Entity Routing - A new routing class makes it simpler to generate routes that require multiple entity properties by accepting an entire entity as a route parameter.
  • Compact Routes - Route targets can now be defined with a compact string format. E.g. Bookmarks::view.
  • Cached Routes - Your application’s routes can now be cached improving startup time for applications with a large number of routes.

Contributors to 3.6.0

Thank you to all the contributors that helped make this release happen:

  • AD7six
  • ADmad
  • Andrej Griniuk
  • Anton Nguyen
  • Ceeram
  • Code-Working
  • Dustin Haggard
  • Elias De Vos
  • Eugene Ritter
  • Florian Krämer
  • Gabriel Caruso
  • Gene Ritter
  • Hideki Kinjyo
  • Jeremy Harris
  • Johannes Jordan
  • Jorge González
  • Jose Diaz-Gonzalez
  • Joshua Lückers
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Mathew Foscarini
  • Michael Hoffmann
  • Raúl Arellano
  • Robert Pustułka
  • Ronald Chaplin
  • antograssiot
  • chinpei215
  • inoas
  • mosaxiv
  • ndm2
  • saeideng

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 3.6.0 is a large release and would not have been possible without the community support and feedback.

Download a packaged release on github.

]]>
Sat, 14 Apr 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/04/14/cakephp_3515_released.html https://bakery.cakephp.org/2018/04/14/cakephp_3515_released.html <![CDATA[CakePHP 3.5.15 Released]]> CakePHP 3.5.15 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.15. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.15. See the changelog for every commit.

  • Improved API documentation.
  • RequestHandlerComponent no longer expands recursive inline XML entities when processing request data.
  • PO file context messages can now be multi-line strings.
  • File::name() now handles unicode filenames.
  • Improved errors when route classes are missing.
  • ExistsIn rule now works as documented when used with saveMany().
  • Postgres schema reflection now handles null default values with casting.
  • Swapping the session engine now changes the handler in PHP.

Contributors to 3.5.15

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Florian Krämer
  • Ivan Vorsin
  • Joep Roebroek
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Sohel Rana
  • Wouter van Os
  • saeideng
  • sohelrana820

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 14 Apr 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/04/01/cakephp_360rc2_released.html https://bakery.cakephp.org/2018/04/01/cakephp_360rc2_released.html <![CDATA[CakePHP 3.6.0-RC2 Released]]> CakePHP 3.6.0-RC2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.0-RC2. This is the release candidate for 3.6.0, and if no major issues are found in the next couple of weeks will become a stable release.

Updating to the beta

You can use composer to upgrade to the beta version of CakePHP 3.6.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.6.0-RC2"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the beta, we can help ensure a smoother release of 3.6.0 before the stable release.

What’s new in 3.6.0?

The migration guide has a complete list of what’s new in 3.6.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes Since 3.6.0-RC1

  • Cake\Database\Type\DateTimeType::setTimezone() was added enabling automatic timezone conversion of values before being inserted into the database.
  • Improved support for UTF8 filenames in Cake\Filesystem\File.
  • Added BodyParserMiddleware to replace content-type parsing features of RequestHandlerComponent with middleware.
  • Added Collection::append(), prepend(), appendItem(), prependItem().
  • PaginatorHelper resets the page parameter to 1 each time the sort field is changed.
  • Event no longer raises errors for properties defined in subclasses.

Contributors to 3.6.0-RC2

Thank you to all the contributors that helped make this release happen:

  • AD7six
  • ADmad
  • Eugene Ritter
  • Florian Krämer
  • Mark Scherer
  • Mark Story
  • Sohel Rana
  • saeideng
  • sohelrana820

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sun, 01 Apr 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/03/24/cakephp_360rc1_released.html https://bakery.cakephp.org/2018/03/24/cakephp_360rc1_released.html <![CDATA[CakePHP 3.6.0-RC1 Released]]> CakePHP 3.6.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.0-RC1. This is the release candidate for 3.6.0, and if no major issues are found in the next couple of weeks will become a stable release.

Updating to the beta

You can use composer to upgrade to the beta version of CakePHP 3.6.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.6.0-RC1"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the beta, we can help ensure a smoother release of 3.6.0 before the stable release.

What’s new in 3.6.0?

The migration guide has a complete list of what’s new in 3.6.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes Since 3.6.0-beta3

  • PHPStan level 3 checks have been enabled.
  • Collection::count() and countKeys() have been added.
  • Updated the bundled root certificate file.
  • Additional test cases for Text.
  • ConsoleOptionParser::enableSubCommandSort() was added.
  • All tests are passing on Windows once again. Appveyor was accidentally disabled for a month or so.
  • MemcachedEngine now handles Memcached::getMulti() failing.
  • TimestampBehavior now handles creating values for non-datetime columns, as it did in previous versions. This behavior is also deprecated.
  • Form subclasses now correctly call validator().
  • RequestHandlerComponent no longer overwrites view preferences when it shouldn’t.
  • RequestHandlerComponen no longer parses XML with recursive inline entities.
  • PO message context can now be on multiple lines.
  • Integration tests that use security tokens and query strings behave correctly once again.

Contributors to 3.6.0-RC1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Iandenh
  • Jeremy Harris
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Matthew Brown
  • Ronald Chaplin
  • Wouter van Os
  • saeideng
  • sohelrana820

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sat, 24 Mar 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/03/24/cakephp_2109_released.html https://bakery.cakephp.org/2018/03/24/cakephp_2109_released.html <![CDATA[CakePHP 2.10.9 Released]]> CakePHP 2.10.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.9. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.9. See the changelog for every commit.

  • Improved API documentation.
  • CakeTestCase::getMockForModel() now correctly handles secondary connections.
  • Removing an undefined validation rule no longer triggers an error.

Contributors to 2.10.9

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Kazuki Higashiguchi
  • Koji Tanaka
  • Mark Sch
  • Mark Story
  • Wouter

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 24 Mar 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/03/19/cakephp_3514_released.html https://bakery.cakephp.org/2018/03/19/cakephp_3514_released.html <![CDATA[CakePHP 3.5.14 Released]]> CakePHP 3.5.14 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.14. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.14. See the changelog for every commit.

  • Included root certificate authority was updated to march 2018 build from mozilla.
  • Improved API documentation and test coverage.
  • Fixed internal usage of deprecated Cake\Database\Schema\Table class name.
  • Fixed errors when Memcached::getMulti() returns false.

Contributors to 3.5.14

Thank you to all the contributors that helped make this release happen:

  • Iandenh
  • Mark Scherer
  • Mark Story
  • Matthew Brown
  • saeid
  • saeideng
  • sohelrana820

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 19 Mar 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/03/17/cakephp_360beta3_released.html https://bakery.cakephp.org/2018/03/17/cakephp_360beta3_released.html <![CDATA[CakePHP 3.6.0-beta3 Released]]> CakePHP 3.6.0-beta3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.0-beta3. This is a beta release for 3.6.0, and it contains several new major features.

Updating to the beta

You can use composer to upgrade to the beta version of CakePHP 3.6.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.6.0-beta3"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the beta, we can help ensure a smoother release of 3.6.0 before the stable release.

What’s new in 3.6.0?

The migration guide has a complete list of what’s new in 3.6.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes Since 3.6.0-beta2

  • Added Query::whereInList() and Query::whereNotInList() to enable more explict IN condition creation.
  • TranslateBehavior::locale() was deprecated and replaced by setLocale() and getLocale().
  • Query::getContain() was added and the get mode of contain() was deprecated.
  • Fix recursive plugin bootstrapping.
  • Fix Plugin::load() not including bootstrap files in testsuite setup.

Contributors to 3.6.0-beta3

Thank you to all the contributors that helped make this release happen:

  • Mark Scherer
  • Mark Story
  • chinpei215
  • ndm2
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sat, 17 Mar 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/03/11/cakephp_360beta2_released.html https://bakery.cakephp.org/2018/03/11/cakephp_360beta2_released.html <![CDATA[CakePHP 3.6.0-beta2 Released]]> CakePHP 3.6.0-beta2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.0-beta2. This is a beta release for 3.6.0, and it contains several new major features.

Updating to the beta

You can use composer to upgrade to the beta version of CakePHP 3.6.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.6.0-beta2"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the beta, we can help ensure a smoother release of 3.6.0 before the stable release.

What’s new in 3.6.0?

The migration guide has a complete list of what’s new in 3.6.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes Since 3.6.0-beta1

  • Cake\Console\CommandFactory was added to allow applications to customize how command classes are built.
  • Cake\Database\Type\BatchCastingInterface was added. This interface allows type classes to optimize casting operations by operating on all columns in bulk. This interface can be used in custom types now, and will be used in core types in 4.x.
  • RoutingMiddleware can now cache application route collections providing significant improvements to application boot times.
  • Cake\ORM\Query::selectAllExcept() was added.
  • cake plugin unload and cake plugin load have been updated to modify the Application class.
  • Validator::add() now uses the rule name as the method if no method is provided.
  • TimestampBehavior no longer emits errors when columns are missing.
  • Plugin shells/commands are no longer auto-discovered by the Application. Instead plugin commands are discovered/added by the respective plugin class.
  • Console helpers can now live in App\Command\Helper.

Contributors to 3.6.0-beta2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Eugene Ritter
  • Gene Ritter
  • Jorge González
  • José Lorenzo Rodríguez
  • Mark Story
  • Robert Pustułka

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sun, 11 Mar 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/03/04/cakephp_360beta1_released.html https://bakery.cakephp.org/2018/03/04/cakephp_360beta1_released.html <![CDATA[CakePHP 3.6.0-beta1 Released]]> CakePHP 3.6.0-beta1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.6.0-beta1. This is the first beta release for 3.6.0, and it contains several new major features.

Updating to the beta

You can use composer to upgrade to the beta version of CakePHP 3.6.0:

php composer.phar require --update-with-dependencies "cakephp/cakephp:3.6.0-beta1"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the beta, we can help ensure a smoother release of 3.6.0 before the stable release.

What’s new in 3.6.0?

The migration guide has a complete list of what’s new in 3.6.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Contributors to 3.6.0-beta1

Thank you to all the contributors that helped make this release happen:

  • AD7six
  • ADmad
  • Andrej Griniuk
  • Anton Nguyen
  • Ceeram
  • Code-Working
  • Dustin Haggard
  • Elias De Vos
  • Florian Krämer
  • Gabriel Caruso
  • Hideki Kinjyo
  • Johannes Jordan
  • Jose Diaz-Gonzalez
  • Joshua Lückers
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Mathew Foscarini
  • Michael Hoffmann
  • Raúl Arellano
  • Robert Pustułka
  • antograssiot
  • chinpei215
  • inoas
  • mosaxiv
  • saeid

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sun, 04 Mar 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/03/03/cakephp_3513_released.html https://bakery.cakephp.org/2018/03/03/cakephp_3513_released.html <![CDATA[CakePHP 3.5.13 Released]]> CakePHP 3.5.13 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.13. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.13. See the [changelog](https://github.com/cakephp/cakephp/compare/3.5.12…3.5.13) for every commit.

  • Form now allows schema classes to be customized via the _schemaClass property.
  • A notice error in the missing template error page was fixed.
  • Tables with no primary key can no longer be updated by the ORM. Instead of a dangerous update operation an exception will be raised.
  • Entity virtual fields are now included in debug output.
  • PaginatorComponent no longer prefixes sort fields. This makes defining sortWhitelist easier.
  • Improved API documentation.
  • Session configuration in integration test cases should not emit errors in PHP7.2 with database sessions.
  • FormHelper now accepts multiple => false to disable multi-select generation.

Contributors to 3.5.13

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Bryan Crowe
  • Cauan Cabral
  • David Yell
  • Jose Diaz-Gonzalez
  • Keoma
  • Mark Scherer
  • Mark Story
  • saeideng
  • sak39

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 03 Mar 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/02/24/cakephp_2108_released.html https://bakery.cakephp.org/2018/02/24/cakephp_2108_released.html <![CDATA[CakePHP 2.10.8 Released]]> CakePHP 2.10.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.8. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.8. See the changelog for every commit.

  • Queries using COUNT(DISTINCT field) are now quoted correctly on SQLServer.
  • Mcrypt is now an optional dependency of CakePHP. You can use the Security.useOpenSsl confiugration flag to force encrypt()/decrypt() to use ext/openssl now. This improves compatibility with PHP 7.2
  • Updated PHPUnit version constraint to match messaging in test shell.
  • When query execution returns false and doesn’t raise an exception, the correct _result property is now updated.

Contributors to 2.10.8

Thank you to all the contributors that helped make this release happen:

  • David Yell
  • Mark Sch
  • Mark Story
  • Val Bancer
  • chinpei215

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 24 Feb 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/02/10/cakephp_3512_released.html https://bakery.cakephp.org/2018/02/10/cakephp_3512_released.html <![CDATA[CakePHP 3.5.12 Released]]> CakePHP 3.5.12 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.12. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.12. See the changelog for every commit.

  • Router::url() now works correctly when the _ssl and _full options are combined.
  • View no longer fails to add an extension subdirectory when the current controller’s name is the same lenght as the extension name.
  • cake plugin symlink now offers an overwrite option.
  • Folder::isRegisteredStreamWrapper() now handles custom stream names.
  • Queries using leftJoinWith() and auto-fields no longer creates invalid SQL.
  • cake server now allows the ini file used by the server process to be defined via the ini_path option.
  • The bundled CA file was updated to the latest version from mozilla.
  • FormHelper::control() now passes the required attribute into the datetime widget correctly.
  • ObjectRegistry::normalizeArray() no longer corrupts the array structure when called multiple times on the same data.

Contributors to 3.5.12

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Daren Sipes
  • Eugene Ritter
  • Jose Diaz-Gonzalez
  • Mark Scherer
  • Mark Story
  • ericadeefox
  • mtak3

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 10 Feb 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/01/21/cakephp_3511_released.html https://bakery.cakephp.org/2018/01/21/cakephp_3511_released.html <![CDATA[CakePHP 3.5.11 Released]]> CakePHP 3.5.11 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.11. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.11. See the changelog for every commit.

  • Paginator::options('url') now allows prefixes to be disabled by setting them to false.
  • Route parsing results now include _name. This makes it easier to integrate named routes in pagination, and other places where you want to build a URL based on the current request’s URL.
  • Nested namespaces are displayed correctly on development error pages.
  • Improved API documentation.
  • Cache keys used for groups are now hashed. This prevents keys overflowing Redis and Memcache key lengths. This will cause previously cached entries to be invalid as group keys have changed.
  • TreeBehavior no longer triggers notices after setConfig('scope', null).
  • The default database session configuration no longer triggers errors in PHP7.2.0+

Contributors to 3.5.11

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Edgaras Janušauskas
  • Elias De Vos
  • Hideki Kinjyo
  • Jeremy Harris
  • Mark Scherer
  • Mark Story
  • fortkle
  • saeideng

We’d like to welcome @saeideng to the core team. Saeideng has been a consistent contributor over the past few months and we’re happy to have them on the team as we complete CakePHP 3.6. and start work on 4.x. As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 21 Jan 2018 00:00:00 +0000
https://bakery.cakephp.org/2018/01/21/cakephp_2107_released.html https://bakery.cakephp.org/2018/01/21/cakephp_2107_released.html <![CDATA[CakePHP 2.10.7 Released]]> CakePHP 2.10.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.7. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.7. See the changelog for every commit.

  • The CakePHP 2.x test suite now passes against PHP7.2. This should help unblock upgrades to PHP 7.2 for those wanting to make that upgrade.
  • A regression introduced in the web test runner outputting broken pages in PHPUnit 3.x was fixed.
  • ControllerTestCase can now mock aliased components.
  • Cache keys used for groups are now hashed. This prevents keys overflowing Redis and Memcache key lengths. This will cause previously cached entries to be invalid as group keys have changed.

Contributors to 2.10.7

Thank you to all the contributors that helped make this release happen:

  • Koji Tanaka
  • Mark Story
  • Val Bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 21 Jan 2018 00:00:00 +0000
https://bakery.cakephp.org/2017/12/28/cakephp_3510_released.html https://bakery.cakephp.org/2017/12/28/cakephp_3510_released.html <![CDATA[CakePHP 3.5.10 Released]]> CakePHP 3.5.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.10. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.10. See the changelog for every commit.

  • Fixed a regression in 3.5.9 where PHPUnit compatibility aliases caused errors in PHP 5.6.
  • Text::truncate() no longer counts the contents of <script> and <style> tags towards the truncated length.
  • Non-interactive shell commands no longer default to overwriting files if they exist.

Contributors to 3.5.10

Thank you to all the contributors that helped make this release happen:

  • LifeOrYou
  • Mark Scherer
  • Mark Story
  • nojimage

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 28 Dec 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/12/26/cakephp_359_released.html https://bakery.cakephp.org/2017/12/26/cakephp_359_released.html <![CDATA[CakePHP 3.5.9 Released]]> CakePHP 3.5.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.9. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.9. See the changelog for every commit.

  • Updated API documentation.
  • SQLServer driver allows port to be defined now.
  • Improved __debugInfo() output of EventManager.
  • Improved performance of route connection.
  • Improved typehinting adherance in Session implementations.

Contributors to 3.5.9

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Mark Scherer
  • Mark Story
  • Rachman Chavik
  • chinpei215
  • inoas

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 26 Dec 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/12/18/cakephp_2106_released.html https://bakery.cakephp.org/2017/12/18/cakephp_2106_released.html <![CDATA[CakePHP 2.10.6 Released]]> CakePHP 2.10.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.6. This is a maintenance release for the 2.10 branch that fixes several community reported issues. This release contains a security fix for Controller::postConditions() and we recommend you upgrade quickly if you rely on this function. We’d like to thank ‘ooooooo_q’ for notifying us of this issue through our responsible disclosure process and working with us on a fix.

Bugfixes & New Features

You can expect the following changes in 2.10.6. See the changelog for every commit.

  • Improved API documentation.
  • Improved web test runner compatibility with new versions of PHPUnit.
  • CakeSession now supports a timeout mode that is forwards compatible with CakePHP 3.x. This will help improve session compatibility for applications that are straddling both versions.
  • The order option to find() once again supports string expressions.
  • CakeRequest::referer(true) correctly handles protocol relative URLs embedded in the path.
  • Controller::postConditions() now raises exceptions when characters outside of A-Za-z0-9_- are found in the model or field names.

Contributors to 2.10.6

Thank you to all the contributors that helped make this release happen:

  • Koji Tanaka
  • Mark Sch
  • Mark Story
  • Mischa ter Smitten
  • Val Bancer
  • chinpei215
  • db-bogdan

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 18 Dec 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/12/11/cakephp_358_released.html https://bakery.cakephp.org/2017/12/11/cakephp_358_released.html <![CDATA[CakePHP 3.5.8 Released]]> CakePHP 3.5.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.8. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.8. See the changelog for every commit.

  • Added Mailer::setTransferEncoding() to allow the transfer encoding to be controlled.
  • Added to 203 and 204 allowed status code in Cake\Http\Client\Response::isOk().
  • Fixed regression around PHP7 error handling & logging.

Contributors to 3.5.8

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Kazuki_Kamizuru
  • LifeOrYou
  • Mark Scherer
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 11 Dec 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/12/08/potential-information-disclosure-in-application-skeleton.html https://bakery.cakephp.org/2017/12/08/potential-information-disclosure-in-application-skeleton.html <![CDATA[Potential for Information Disclosure in Application Skeleton]]> Potential for Information Disclosure in Application Skeleton

The default application skeleton contained a beforeRender() method on the AppController that could potentially lead to unwanted information disclosure in your application. The unsafe default code was present between 3.1.0 and 3.5.0 of the application skeleton.

Risks

The default beforeRender hook would automatically serialize all view variables into JSON/XML if the _serialize view variable was not defined by the controller action. Controller methods that define the _serialize variable would behave correctly and only expose the named variables.

This behavior is triggered by the AppController and ErrorController loading RequestHandlerComponent, which configures the View class to be used based on the client’s Accept header. Then code in AppController::beforeRender() would enable all view variables to be serialized if no variables were explicitly listed.

The default controllers generated by bake set the _serialize view variable. This helps limit the impact, but could still lead to unwanted information exposure if entity classes are not correctly configured.

How to fix

You can fix the potential for information disclosure by modifying your application code. Unfortunately we cannot resolve this problem for you through a patch release of CakePHP or its appplication skeleton.

If you don’t have ErrorController in your src/Controller directory (CakePHP <= 3.3)

If you are using CakePHP 3.3.0 or greater and do not have an ErrorController in your application, you should download an ErrorController and put it into your src/Controller directory.

If you don’t use JSON/XML response based on client requests

  • Remove $this->loadComponent('RequestHandler') from the initialize() method of your AppController and ErrorController.
  • Remove $this->set('_serialize', true); from the beforeRender() of your AppController.

If you use JSON/XML response based on client requests

  • Remove $this->set('_serialize', true); from the beforeRender() of your AppController.
  • Remove $this->set('_serialize', [ (variable names) ]) from all controller actions, that should not return JSON/XML.
  • Add $this->set('_serialize', [ (variable names) ]) explicitly to some actions of your controllers, which you want to return JSON/XML.

While we have no reports of information disclosure in the wild, this issue was found by Kurita Takashi and we felt this was important to disclose.

]]>
Fri, 08 Dec 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/12/05/cakephp_357_released.html https://bakery.cakephp.org/2017/12/05/cakephp_357_released.html <![CDATA[CakePHP 3.5.7 Released]]> CakePHP 3.5.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.7. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.7. See the changelog for every commit.

  • Improved internal usage of PHPUnit assertions.
  • Improved API documentation.
  • Fixed warnings from phpstan level 3.
  • Fixed inconsistent hash algorithm usage in Digest Authentication.
  • Database\Type::map() now clears built objects when types are re-mapped.
  • CakePHP catches Throwable in several places improving PHP7 support.
  • Fixed schema reflection with MariaDB’s current_timestamp() default value.
  • Routes now match when _method is an array which could happen when named routes supported multiple HTTP methods.
  • FormHelper::button() now supports the confirm option.
  • Response::body() will no longer invoke string callables.
  • ServerRequest::referer(true) no longer returns protocol relative URLs that are embedded in the path.
  • po files that contained the same message string as both a singular and a plural form now correctly work with __().

Contributors to 3.5.7

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Dariusz Ruminski
  • David Yell
  • Florian Krämer
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Raúl Arellano
  • chinpei215
  • mosaxiv
  • saeid
  • timalive

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 05 Dec 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/11/22/mozilla_sos_audit_published.html https://bakery.cakephp.org/2017/11/22/mozilla_sos_audit_published.html <![CDATA[Mozilla Secure Open Source security review published]]> Mozilla Secure Open Source security review published

Earlier this year we were contacted by Mozilla and notified that our application to the Mozilla Secure Open Source program was accepted and that we would be receiving a review through the SOS program.

The SOS program provides security auditing, remediation, and verification for key open source software projects, and is funded by Mozilla’s Open Source Support fund.

The CakePHP audit was performed by NCC Group. The CakePHP team was actively participated and was available to the NCC team throughout the audit and remediation.

The audit uncovered 1 High, 5 Medium, 9 Low, and 5 Informational issues. Where possible these issues have been fixed as of 3.5.6. The recommended changes to random number generation and form tampering prevention tokens will be released in 3.6.0 as their fixes could potentially disrupt applications.

We’d like to thank both Mozilla for funding the audit and NCC Group for their time and expertise. The full audit report and fix and validation log are available.

]]>
Wed, 22 Nov 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/11/20/cakephp_2105_released.html https://bakery.cakephp.org/2017/11/20/cakephp_2105_released.html <![CDATA[CakePHP 2.10.5 Released]]> CakePHP 2.10.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.5. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.5. See the changelog for every commit.

  • Fix fallback domain lookups not working in Validation::email().
  • Improved API documentation.

Contributors to 2.10.5

Thank you to all the contributors that helped make this release happen:

  • Joseph Zidell
  • Marc Würth
  • Mark Story
  • Milan van As
  • Yaser Naderi
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 20 Nov 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/11/17/cakephp_356_released.html https://bakery.cakephp.org/2017/11/17/cakephp_356_released.html <![CDATA[CakePHP 3.5.6 Released]]> CakePHP 3.5.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.6. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.6. See the changelog for every commit.

  • Iterating subclasses of ArrayIterator that include CollectionTrait retains the original class fixing use of methods defined on the subclass.
  • Response::__debugInfo() includes the response body now.
  • Http\Client creates response objects in a separate method making response creation easier to extend.
  • SQL expressions no longer include double parenthesis when nesting expressions.
  • View subdirectories are no longer doubled when RequestHandlerComponent and view classes using subDir property are used together.
  • Middleware can now be registered in RouteBuilder using a string classname.
  • Protocol relative string URLs are now properly HTML encoded by UrlHelper.

Contributors to 3.5.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Dariusz Ruminski
  • Dmitrii Romanov
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann
  • Raúl Arellano
  • Walther Lalk
  • saeid
  • timalive

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 17 Nov 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/11/01/cakephp_355_released.html https://bakery.cakephp.org/2017/11/01/cakephp_355_released.html <![CDATA[CakePHP 3.5.5 Released]]> CakePHP 3.5.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.5. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.5. See the changelog for every commit.

  • SQLServer no longer reports double column lengths for NVARCHAR and NCHAR columns.
  • IntegrationTestSuite::enableCsrfToken() no longer emits errors when the POST body is a string.
  • Response::getType() has been added as a replacement for Response::type().
  • Network\Socket now supports explicit use of TLS1.1 and 1.2. Support for SSL2 is deprecated and will be removed in 4.0.0.
  • IntegrationTestCase::assertResponseCode() now allows custom messages to be set.
  • Cake\Http\Client\FormData::addFile() now adds parts as documented.
  • Router::$initialized is deprecated. As we migrate to routes being loaded via middleware this property will no longer be in use.
  • TableSchema now provides more succinct debug information.

Contributors to 3.5.5

We’d like to welcome ravage84 to the CakePHP core team. Marc is a long time contributor to both the documentation and code. We look forward to more involvement from Marc as we work on 3.6.0 and beyond.

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Chris Valliere
  • Dmitrii Romanov
  • Edgaras Janušauskas
  • Mark Scherer
  • Mark Story
  • Robert Pustułka
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 01 Nov 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/10/18/cakephp_2104_released.html https://bakery.cakephp.org/2017/10/18/cakephp_2104_released.html <![CDATA[CakePHP 2.10.4 Released]]> CakePHP 2.10.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.4. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.4. See the changelog for every commit.

  • Email pattern used in CakeEmail now accepts _ in domain names.
  • Improved API doc blocks.
  • SQLServer driver now accepts limit values that are numeric strings.
  • Sessions can now leverage use_trans_sid if necessary.
  • Hash::sort() can now sort sparse arrays.
  • JCB credit card pattern has been corrected.
  • CookieComponent::delete() can now remove deeply nested keys.

Contributors to 2.10.4

Thank you to all the contributors that helped make this release happen:

  • Clemens Weiß
  • Ionut-Mihai Burlacu
  • Koji Tanaka
  • LustyRain
  • Mark Story
  • chinpei215
  • kolorafa

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 18 Oct 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/10/15/cakephp_354_released.html https://bakery.cakephp.org/2017/10/15/cakephp_354_released.html <![CDATA[CakePHP 3.5.4 Released]]> CakePHP 3.5.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.4. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.4. See the changelog for every commit.

  • Logging email payloads now succeeds even when the transport returns string data.
  • Element cache settings are now cached in memory saving repeat cached elements in the same request.
  • All tests are now passing against PHP 7.2.0-RC1
  • Database FloatType now correctly parses locale data that use . as the thousands separator.
  • Text::slug() correctly cleans strings when the preserve option is used.
  • Credit card pattern for JCB card types now accepts all current JCB card types.
  • CakePHP uses chained exceptions where possible now, allowing root causes of failures to be exposed by the error handler in future releases.
  • Validation::url() now accepts 4 byte unicode characters.
  • SQLServer column length values are always integers now.
  • UrlHelper no longer uses error suppression when adding file timestamps.
  • TreeBehavior node deletion now correctly handles multiple trees in the same table. Previously all trees would have nodes deleted from them.

Contributors to 3.5.4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Albert Cansado Solà
  • Anton Nguyen
  • DiogoRMax
  • Hideki Kinjyo
  • Jon McAndrew
  • Koji Tanaka
  • Mark Scherer
  • Mark Story
  • Marko Kallio
  • Robert Pustułka
  • Young Padawan
  • chinpei215
  • makallio85

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 15 Oct 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/09/26/cakephp_353_released.html https://bakery.cakephp.org/2017/09/26/cakephp_353_released.html <![CDATA[CakePHP 3.5.3 Released]]> CakePHP 3.5.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.3. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.3. See the changelog for every commit.

  • Http\Client now supports protocol relative Location headers.
  • Improved API documentation for the Query Builder.
  • Shell help messages when commands are missing are no longer displayed in red.
  • Dependent deletions in HasMany/HasOne associations now prefixes conditions with the table alias.
  • Directories created by FileCache are more atomic.
  • The default locale is now correctly set when the current locale is changed.
  • CommandRunner now sorts command listings alphabetically.
  • Cookie objects with array values is now sent JSON encoded. This restores backwards compatibility with CookieComponent.
  • Validation::url() now accepts URLs that have fragments containing query data.
  • Router::redirect() now allows the routeClass to be defined.
  • Email address validation now accepts domain names with _ in them.
  • Additional constants for join types have been added.

Contributors to 3.5.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Jeremy Harris
  • José Lorenzo Rodríguez
  • Littley Lv
  • Livia Scapin
  • Mark Scherer
  • Mark Story
  • Patrick Conroy
  • Pierre Martin
  • Rachman Chavik
  • Robert Pustułka
  • Steffen Brand

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 26 Sep 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/09/17/cakephp_2103_released.html https://bakery.cakephp.org/2017/09/17/cakephp_2103_released.html <![CDATA[CakePHP 2.10.3 Released]]> CakePHP 2.10.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.3. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.3. See the changelog for every commit.

  • Fix flash message stacking in SessionComponent fixing regressions introduced in earlier releases.
  • Improved API documentation.

Contributors to 2.10.3

Thank you to all the contributors that helped make this release happen:

  • Jeremy Harris
  • LustyRain
  • Mark Story

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 17 Sep 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/09/11/cakephp_352_released.html https://bakery.cakephp.org/2017/09/11/cakephp_352_released.html <![CDATA[CakePHP 3.5.2 Released]]> CakePHP 3.5.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.2. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.2. See the changelog for every commit.

  • Improved API documentation.
  • Http\Client no longer fails to parse cookies with non-standard properties.
  • CookieComponent configuration is more backwards compatible with previous versions.
  • PO file parsing now handles po files that have the same message id defined as both a singular and a plural when the singular message is defined after the plural one.
  • Helper::addClass() no longer emits warnings when class attributes are arrays.
  • View setter methods now return $this instead of void.
  • RedisEngine increment/decrement now work with infinite timeout keys again.
  • HtmlHelper::link() now supports the fullBase option.
  • Text::uuid() will now use random_int if that function is defined.
  • Debugger::highlight() is no longer off by one line.
  • Cookies added via Http\Client::addCookie() now require a path and domain.

Contributors to 3.5.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Florian Krämer
  • Huw Jones
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Robert Pustułka
  • batopa
  • inoas
  • ndm2
  • supermanner

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 11 Sep 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/08/29/cakephp_2102_released.html https://bakery.cakephp.org/2017/08/29/cakephp_2102_released.html <![CDATA[CakePHP 2.10.2 Released]]> CakePHP 2.10.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.2. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.2. See the changelog for every commit.

  • Improved performance of test suites by not truncating tables that were just created.
  • Web test runner now works with PHPUnit > 4.
  • The hiddenField option on radio buttons now works as documented.
  • SQLServer driver now emits exceptions when the persistent option is used. This option does not work properly with SQLServer.
  • SessionHelper now handles stacked flash messages created by FlashComponent.

Contributors to 2.10.2

Thank you to all the contributors that helped make this release happen:

  • Jeremy Harris
  • Luis Cano
  • Mark Story
  • Mike Fellows
  • Val Bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 29 Aug 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/08/28/cakephp_351_released.html https://bakery.cakephp.org/2017/08/28/cakephp_351_released.html <![CDATA[CakePHP 3.5.1 Released]]> CakePHP 3.5.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.1. This is a maintenance release for the 3.5 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.5.1. See the changelog for every commit.

  • Warnings are now logged when active connections are destroyed with pending transactions.
  • Hash::remove() correctly handles 0 in path strings now.
  • Improved API documentation.
  • Query::notMatching() now works with BelongsToMany associations that use composite primary keys.
  • DSN string parsing was restored for SqlLocalDB.
  • Fixed compatibility issues between Collection and Traversable.
  • Response headers set in view templates using the immutable methods are now output correctly.
  • Request::clientIp() now reads IPs from the end of the IP chain when trustProxy is enabled.
  • Xml::build() now default the parseHuge option to false. Previously it was documented as defaulting to false, but was defaulted to true. Disabling this option by default prevents arbitrarily large XML documents from consuming too much memory.
  • Hash comparisons in Authentication classes now use constant time comparison functions.
  • FormAuthenticate hashes passwords even when the user is not found as documented. This helps to protect against timing attacks.
  • The non-PSR7 Dispatcher can send cookies once again.
  • AssetDispatcher no longer serves files starting with ..
  • The bundled root certificates have been updated to the latest bundle from mozilla. This removes a few untrusted certificate authorities like StartSSL.
  • Form::setErrors() was added.
  • ConsoleIntegrationTestCase has new methods added for ensuring stdout/stderr are empty.
  • HtmlHelper now HTML encodes string URLs for css/javascript/images in case user data is supplied to them.

Contributors to 3.5.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Ceeram
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Tadahisa MOTOOKA
  • chinpei215
  • inoas

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 28 Aug 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/08/18/cakephp_350_released.html https://bakery.cakephp.org/2017/08/18/cakephp_350_released.html <![CDATA[CakePHP 3.5.0 Released]]> CakePHP 3.5.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.0. This is the first stable release of 3.5.0. 3.5.0 provides a number improvements both large and small to CakePHP. It also deprecates several features that will be removed in 4.0.0.

In following with our previously announced roadmap work will now begin on 3.6. This work will take place in the 3.next branch, while the master branch now contains 3.5.x.

Upgrading to 3.5.0

You can use composer to upgrade to CakePHP 3.5.0:

php composer.phar require "cakephp/cakephp:3.5.0"

Deprecations

3.5.0 deprecates a number of methods as we continue to transition away from combined get/set methods in favour of separate get/set methods. The migration guide has the full list of deprecated methods and their replacements. Deprecated features will continue to exist and behave as they always have until 4.0.0

What’s new in 3.5.0?

The migration guide has a complete list of what’s new in 3.5.0. We recommend you give that page a read when upgrading.

  • Scoped Middleware - Middleware can now be conditionally applied to routes in specific URL scopes. This allows you to build specific stacks of middleware for different parts of your application without having to write URL checking code in your middleware.
  • New Middleware - New middleware was added to apply CSRF tokens, and encrypted cookies.
  • Improved Console Environment - A new console dispatcher has been added, integrating the Application class into the CLI environment. Integration testing helpers have been added making testing console commands simpler.
  • Helpful Console Errors - Missing options & subcommands now make suggestions of valid options instead of just erroring out.
  • Cache Engine Fallbacks - Cache engines can now be configured with a fallback key that defines a cache configuration to fall back to if the engine is misconfigured (or unavailable).
  • Cookie Objects - New Cookie & CookieCollection classes have been added. These classes allow you to work with cookies in an object-orientated way.
  • dotenv Support added to Application Skeleton - The application skeleton now features a ‘dotenv’ integration making it easier to use environment variables to configure your application.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 3.5.0 is a large release and would not have been possible without the community support and feedback.

Download a packaged release on github.

]]>
Fri, 18 Aug 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/08/16/cakephp_3413_released.html https://bakery.cakephp.org/2017/08/16/cakephp_3413_released.html <![CDATA[CakePHP 3.4.13 Released]]> CakePHP 3.4.13 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.13. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.13. See the changelog for every commit.

  • Empty MO files are no longer ignored by I18n message collections.
  • Missing Controller error messages were improved when routing parameters were not correctly inflected.
  • Improved compatibility with PHP7.2.
  • The hiddenField option for radio buttons now works as documented.
  • Nested fields and multi-record forms using the ArrayContext are easier to define as default values and schema options fallback root level entities.
  • Cake\Datasouce\EntityTrait::setDirty() now returns $this as documented.
  • Improved database URI parsing making it possible to use usernames/passwords with # in them.
  • Improved compatibility with Memcached 3.x by removing check for use_sasl ini setting.
  • Improved API documentation.
  • Sqlserver connections now raise an error when the persistent flag is used. This option never worked correctly, and should not be used.
  • Connections no longer unset their driver on destruction fixing use after free issues.

Contributors to 3.4.13

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Bernat Arlandis
  • Bryan Crowe
  • David Yell
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann
  • Mike Fellows
  • antograssiot
  • chinpei215
  • inoas
  • lilHermit
  • saeideng

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 16 Aug 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/08/11/cakephp_350RC2_released.html https://bakery.cakephp.org/2017/08/11/cakephp_350RC2_released.html <![CDATA[CakePHP 3.5.0-RC2 Released]]> CakePHP 3.5.0-RC2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.0-RC2. This is a release candidate for 3.5.0. 3.5.0 provides a number improvements both large and small to CakePHP. It also deprecates several features that will be removed in 4.0.0.

Upgrading to this Version

You can use composer to upgrade to the RC version of CakePHP 3.5.0:

php composer.phar require "cakephp/cakephp:3.5.0-RC2"

Changes since 3.5.0-RC1

The following changes have been made to 3.5 since 3.5.0-RC1.

  • Cake\Collection\Collection::avg() and median() were added.
  • Cake\Http\Client now raises a 504 HttpException when a timeout occurs.
  • Improved deprecation comments in API doc blocks.
  • Cake\Http\Client response bodies can be read with the PSR7 interface once again.
  • Cake\Http\Client no longer emits an empty cookie header when there are no cookies.
  • Improved SQLServer 2008 pagination shims to work when results are ordered by a computed field.
  • Cake\Auth\DefaultPasswordHasher now includes the hashCost option as a factor into whether or not a password needs to be rehashed.
  • IntegrationTestCase now correctly generates form-tampering prevention tokens for requests with query string arguments in the URL string.
  • Empty translation messages now return the key for messages with no context.
  • Cake\Validation\Validator::scalar() was added.
  • Cake\TestSuite\TestCase::loadFixtures() now loads all fixtures if no arguments are provided.
  • CommandRunner now outputs a command list if no arguments are provided.
  • Unknown subcommands, options and arguments now output more helpful error messages with suggestions of what you may have wanted to do.
  • Empty MO files are no longer ignored by I18n message collections.
  • Missing Controller error messages were improved when routing parameters were not correctly inflected.
  • RoutingMiddleware now preserves keys in the params attribute defined earlier in the request.
  • Improved compatibility with PHP7.2.
  • Cake\Core\InstanceConfigTrait::getConfig() now has a default value parameter.
  • Cake\Datasouce\EntityTrait::setDirty() now returns $this as documented.
  • The hiddenField option for radio buttons now works as documented.

The migration guide has a complete list of what’s new in 3.5.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Contributors to 3.5.0-RC2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Bernat Arlandis
  • Ian den Hartog
  • Jeremy Harris
  • Joris Vaesen
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann
  • Mike Fellows
  • Yves P
  • antograssiot
  • chinpei215
  • inoas
  • saeid

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Fri, 11 Aug 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/08/07/cakephp_2101_released.html https://bakery.cakephp.org/2017/08/07/cakephp_2101_released.html <![CDATA[CakePHP 2.10.1 Released]]> CakePHP 2.10.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.1. This is a maintenance release for the 2.10 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.10.1. See the changelog for every commit.

  • Added backwards compatibility shim for getMock() on CakeTestCase. This makes upgrading to newer versions of PHPUnit easier.
  • Model::deleteAll() once again uses recursive=0 by default. This reverts a change done in 2.10.0 that attempted to improve performance of deleteAll().
  • CakeEmail once again attachs files that define the data key, but no mimetype.

Contributors to 2.10.1

Thank you to all the contributors that helped make this release happen:

  • Mark Story
  • Val Bancer
  • bclay

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 07 Aug 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/08/01/cakephp_3412_released.html https://bakery.cakephp.org/2017/08/01/cakephp_3412_released.html <![CDATA[CakePHP 3.4.12 Released]]> CakePHP 3.4.12 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.12. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.12. See the changelog for every commit.

  • Shell::out() and similar methods once again handle array inputs.
  • Cake\Http\Client now raises a 504 HttpException when a timeout occurs.
  • Improved deprecation comments in API doc blocks.
  • Cake\Http\Client response bodies can be read with the PSR7 interface once again.
  • Improved SQLServer 2008 pagination shims to work when results are ordered by a computed field.
  • DefaultPasswordHasher now includes the hashCost option as a factor into whether or not a password needs to be rehashed.
  • IntegrationTestCase now correctly generates form-tampering prevention tokens for requests with query string arguments in the URL string.
  • Empty translation messages now return the key for messages with no context.

Contributors to 3.4.12

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Bernat Arlandis
  • David Yell
  • Jeremy Harris
  • Joris Vaesen
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Mike Fellows
  • Owen Gerrard
  • antograssiot
  • saeid

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 01 Aug 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/07/26/cakephp_350RC1_released.html https://bakery.cakephp.org/2017/07/26/cakephp_350RC1_released.html <![CDATA[CakePHP 3.5.0-RC1 Released]]> CakePHP 3.5.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.5.0-RC1. This is a release candidate for 3.5.0. 3.5.0 provides a number improvements both large and small to CakePHP. It also deprecates several features that will be removed in 4.0.0.

Upgrading to this Version

You can use composer to upgrade to the RC version of CakePHP 3.5.0:

php composer.phar require "cakephp/cakephp:3.5.0-RC1"

What’s new in 3.5.0?

The migration guide has a complete list of what’s new in 3.5.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Contributors to 3.5.0-RC1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Albert Cansado Solà
  • Bryan Crowe
  • Chris Hickingbottom
  • David Yell
  • Erwane Breton
  • Florian Krämer
  • Ian den Hartog
  • Iftekhar Eather
  • Jeremy Harris
  • Jorge González
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann
  • Owen Gerrard
  • Rachman Chavik
  • Robert Pustułka
  • Thomas von Hassel
  • Val Bancer
  • Viraj Khatavkar
  • antograssiot
  • chinpei215
  • dwilbanks
  • h-moriya
  • inoas
  • lilHermit
  • ndm2

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Wed, 26 Jul 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/07/22/cakephp_2100_released.html https://bakery.cakephp.org/2017/07/22/cakephp_2100_released.html <![CDATA[CakePHP 2.10.0 Released]]> CakePHP 2.10.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.0. 2.10.0 is a backwards compatible feature release for the 2.x series. As previously announced 2.10 is the last feature release for 2.x. Going forward, 2.x will only receive bug fixes and security patches.

What’s new in 2.10.0

The migration guide has a complete list of what’s new in 2.10.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Changes from 2.10.0-RC1

You can expect the following changes in 2.10.0. See the changelog for every commit.

  • Schema reflection now handles CURRENT_TIMESTAMP() as a default value from MariaDB.
  • Pagination with TranslateBehavior and NOT expressions now works as expected.
  • The default application includes composer scripts like the application skeleton in 3.x does.
  • Test stability under MySQL 5.7 has been improved.
  • Shell commands now display an error when unknown options are used. This feature was backported from 3.x.

Contributors to 2.10.0

Thank you to all the contributors that helped make this release happen:

  • Koji Tanaka
  • Kurre Ståhlberg
  • Mark Story
  • Val Bancer

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 22 Jul 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/07/18/cakephp_3411_released.html https://bakery.cakephp.org/2017/07/18/cakephp_3411_released.html <![CDATA[CakePHP 3.4.11 Released]]> CakePHP 3.4.11 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.11. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.11. See the changelog for every commit.

  • FormHelper will now use the default value for undefined indexes in entity fields with array values.
  • Fix marshalling time data when locale parsing is enabled and the time format looks like a float.
  • Fixed a regression in ConsoleIo::overwrite() introduced in 3.4.10
  • Plural messages with ‘’ as their value now fallback to the singular message id. This makes plural messages consistent with other translations.

Contributors to 3.4.11

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • David Yell
  • Ian den Hartog
  • Iandenh
  • José Lorenzo Rodríguez
  • Mark Story
  • Niklas Rother
  • Robert Pustułka
  • kicaj

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 18 Jul 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/07/09/cakephp_3410_released.html https://bakery.cakephp.org/2017/07/09/cakephp_3410_released.html <![CDATA[CakePHP 3.4.10 Released]]> CakePHP 3.4.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.10. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.10. See the changelog for every commit.

  • Sessions now work with trans_sid enabled.
  • Inspecting queries with Xdebug no longer causes lastInsertId() to return the incorrect results.
  • Validation error messages when Email addresses are invalid are more helpful now.
  • FormHelper can now read values from entity properties that implement ArrayAccess.
  • ConsoleIo::overwrite() can now overwrite long content with shorter content correctly.
  • Several compatibility issues with PHP 7.2 were fixed.
  • Digest Authentication can now compare the digest hash even when the field is hidden in the entity.
  • Associations contained in beforeFind events are now retained on cloned queries.
  • MO file parsing correctly handles Plural-Forms: nplurals=1; plural=0;.
  • Http\Client now handles redirects instead of the Stream adapter handling them. This resolves an issue where cookies sent in intermediary responses were not being forwarded in subsequent requests.
  • The validation package no longer has a hard dependency on cakephp/i18n.

Contributors to 3.4.10

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Cees-Jan Kiewiet
  • Clemens Weiß
  • Daniel Opitz
  • José Lorenzo Rodríguez
  • Mark Story
  • Michael Hoffmann
  • Mike Fellows
  • Robert Pustułka
  • nojimage

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 09 Jul 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/06/26/cakephp_2100RC1_released.html https://bakery.cakephp.org/2017/06/26/cakephp_2100RC1_released.html <![CDATA[CakePHP 2.10.0-RC1 Released]]> CakePHP 2.10.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.10.0-RC1. This is a release candidate for 2.10.0, which is the final 2.x feature release. We recommend anyone who would like to see a feature added/backported to 2.x do so soon. Once 2.10 becomes stable we will not be merging any new features, as 2.x will enter long term support.

Long Term Support

As the final feature release for 2.x, we plan on supporting 2.x with:

  • Bug fixes for 12 months after the release of 4.0.0.
  • Security fixes for 18 months after the release of 4.0.0.

After that point, 2.x will become un-maintained and receive no further updates.

New Features

2.10 adds several new community contributed features to 2.x. You can see the full list of features in the book.

Contributors to 2.10.0

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Ashley Pinner
  • Cory Thompson
  • Eric Jiang
  • Gareth Ellis
  • Henrik Gemal
  • Ikuo Degawa
  • Javier Melero
  • Joe
  • Lucas Ferreira
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Michael van Tricht
  • Mischa ter Smitten
  • Rodrigo Pérez
  • Rozehnal, Pavel
  • Sebastien Barre
  • Shunsuke Takahashi
  • Sébastien Barré
  • Val Bancer
  • chinpei215
  • xhs345

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 26 Jun 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/06/25/cakephp_349_released.html https://bakery.cakephp.org/2017/06/25/cakephp_349_released.html <![CDATA[CakePHP 3.4.9 Released]]> CakePHP 3.4.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.9. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.9. See the changelog for every commit.

  • RedisEngine now uses multiple delete operations when clearing keys. This resolves a compatibility issue with redis cluster.
  • Plugin fixtures in sub-directories can now be used as documented.
  • Query::contain() on HasMany associations with a finder option now works as expected.
  • IntegrationTestCase now simulates the correct environment variables enabling getRequestTarget() to work as expected.
  • Debugger::excerpt() can now be used on the last line in a file.
  • An incompatibility introduced in PHPUnit 5.7.21 and CakePHP’s forwards compatibility shims has been resolved.

Contributors to 3.4.9

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Bryan Crowe
  • Jeremy Harris
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Story
  • Michael Hoffmann
  • h-moriya
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 25 Jun 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/06/23/welcoming-phinx-to-the-cakephp-family.html https://bakery.cakephp.org/2017/06/23/welcoming-phinx-to-the-cakephp-family.html <![CDATA[Welcoming Phinx to the CakePHP family!]]> Welcoming Phinx to the CakePHP family!

We are very excited to announce that Phinx has joined the CakePHP team. The Github project has already been moved to the CakePHP organisation. The project itself will stay MIT-licensed but be gradually transformed into a Cake Software Foundation project. Other great news is that the current way to install and update Phinx remains unchanged.

As you are aware, CakePHP has been using Phinx since 3.0.0 for database migrations. The CakePHP Core team welcomes the opportunity to look after and maintain the project and will now start making changes to bring the code in line with the CakePHP (our) coding standards. As well as cleaning up issues and PR’s soon. We will be following up with our plans for the code and setting roadmaps in the coming weeks.

We welcome Phinx to the CakePHP family and hope to see Rob Morgan, Richard Quadling, Woody Gilk around!

]]>
Fri, 23 Jun 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/06/23/upcoming-cakephp-roadmap.html https://bakery.cakephp.org/2017/06/23/upcoming-cakephp-roadmap.html <![CDATA[Upcoming CakePHP Roadmap & Releases]]> Upcoming CakePHP Roadmap & Releases

With Cakefest complete, I’d like to share the meat of my talk concerning the roadmap and release schedule for CakePHP.

3.5 and 3.6

We’re currently working towards 3.5, which will ship this summer. It contains a number of improvements to the middleware layer, and introduces more deprecations for combined methods with complex parameter types. 3.6 is the next logical release. Like all 3.x releases, 3.6 will be backwards compatible. 3.6 will introduce a number of new features, and additional deprecations. It will be notably different from other 3.x releases, as it will convert all documented deprecations into runtime errors.

By having runtime errors you’ll be able to more easily locate the places your application and its dependencies are using deprecated features of CakePHP. These deprecation warnings will be easy to turn on and off through the error level allowing you to upgrade to 3.6 early and incrementally fix the deprecation warnings your application has.

4.0.0

The next major version of CakePHP will be 4.0. 4.0 will be the first release in 4 years to contain breaking changes. Unlike the upgrade from 2.x to 3.x we want this to be a dramatically simpler upgrade. The breaking changes will be focused on:

  • Removing methods/features that were deprecated in 3.x. All features that emit runtime warnings in 3.6 will be removed in 4.0
  • Interfaces will be updated to contain the methods that currently exist in documentation only. Because there is no way to add methods to interfaces in a backwards compatible way, we’re using 4.0.0 as an opportunity to update interfaces.

4.0 will also move the minimum required PHP version to 7.1.0. This will enable us to leverage strict typing internally allowing you to benefit from a safer and easier to use CakePHP. All currently documented types will be converted into strict typehints where possible. This is one of the driving factors for the numerous deprecations being done in 3.5 and 3.6.

In addition to the breaking changes being made, we’d also like to use 4.0 as an opportunity to refine and improve our error messages with the goals of providing a better development experience. As users of Rust and Elm we see what can be done with error messages and want to bring the quality of error messages available in those tools to PHP.

Lastly, an explicit goal is to make the upgrade easy. If your application runs in the latest 3.6 without any deprecation errors, then it should run in 4.0.0 with minimal effort. Because of the additional typehinting, and interface changes there may be minor modifications needed in an application that is upgrading. We recognize that the 2.x upgrade was unpleasant and don’t want a repeat of that experience.

In an ideal world, we’d like to release 3.6 and 4.0 very close to each other. Our current timelines put the first betas for these releases in late 2017 and early 2018.

Long Term Support for 3.x

Our current plans would make the 3.x to 4.0 upgrade relatively easy. Because of this we don’t currently see many reasons to continue doing 3.x feature releases. This would make 3.6 the last 3.x with the possibility of 3.7 happening. If there is enough community interest in it. Furthermore, we plan on doing supporting 3.x with:

  • Bug fixes for 18 months after 4.0.0.
  • Security fixes for 36 months after 4.0.0 is released.

Our hope is that these time frames give you and your teams ample time to plan and execute an upgrade.

Long Term Support for 2.x

2.x has enjoyed a long life. Given the rate of issues being opened, and pull requests being created for 2.x, 2.10 will be the last 2.x release. We recognize that there are still a number of applications running on 2.x so we plan on supporting 2.x with:

  • Bug fixes for 12 months after the release of 4.0.0.
  • Security fixes for 18 months after the release of 4.0.0.

After that point, 2.x will become unmaintained and receive no further updates.

As always these timelines and milestone scope are not finalized, and we’d like to get your feedback and involvement in this process.

]]>
Fri, 23 Jun 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/06/19/cakephp_348_released.html https://bakery.cakephp.org/2017/06/19/cakephp_348_released.html <![CDATA[CakePHP 3.4.8 Released]]> CakePHP 3.4.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.8. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.8. See the changelog for every commit.

  • Improved composer keywords for sub-split packages.
  • BelongsToMany::link() now persist multiple operations correctly.
  • Improved API documentation.
  • PO file parsing correctly parses messages when the same message key is defined with a context and without contexts. This changes the internal data representation of translated messages, you should take care to clear your i18n cache data when upgrading.
  • ValidationRule no longer raises an unpack error when parameters are an associative array.
  • RouteBuilder::prefix() now supports a path option which allows you to customize the path segment used for prefix routing scopes.
  • Logging will now log the JSON encoded version of entities. Furthermore, JsonSerializable instances that are logged will not encode Unicode data.
  • Paginated queries that use matching() calls inside other matching() calls no longer emit invalid SQL.
  • Autolinking better handles URLs generated by AngularJS.
  • Mailer correctly proxies the getX methods on Email.
  • Database\Query::clause() now raises exceptions when reading unknown clauses.
  • RedisEngine::add() now uses setTimeout() to set the TTL, instead of writing the key twice.
  • RedisEngine::increment() and decrement() now set the engine’s TTL on counters. This makes redis counters have consistent behavior with Memcached counters.
  • ISO8601 datetimes that use the ‘Z’ timezone are parsed correctly now.
  • ProgressHelper::init(), draw() and increment() now return $this.
  • MySQL schema reflection no longer forces primary key columns to be be auto-incrementing when autoIncrement was explicitly disabled.
  • FormHelper::radio() now handles disabled attribute generation when radio options are defined with the complex form, and only a subset of radio options have been disabled.
  • TableHelper::output() no longer requires all rows to have the same keys.

Contributors to 3.4.8

Thank you to all the contributors that helped make this release happen:

  • Albert Cansado Solà
  • Bryan Crowe
  • Florian Brede
  • Ian den Hartog
  • Jan Zdunek
  • Jeremy Harris
  • José Lorenzo Rodríguez
  • Julian Carrivick
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Mehdi Fathi
  • Michael Hoffmann
  • Mirko Pagliai
  • Rachman Chavik
  • Sevvlor
  • Yasuo Harada
  • inoas

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 19 Jun 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/05/25/cakephp_299_released.html https://bakery.cakephp.org/2017/05/25/cakephp_299_released.html <![CDATA[CakePHP 2.9.9 Released]]> CakePHP 2.9.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.9.9. This is a maintenance release for the 2.9 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.9.9. See the changelog for every commit.

  • Basic Authentication now reads the Authorization header if present. This improves compatibility with FastCGI.
  • Improved API documentation.

Contributors to 2.9.9

Thank you to all the contributors that helped make this release happen:

  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Nicola Beghin

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 25 May 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/05/19/cakephp_347_released.html https://bakery.cakephp.org/2017/05/19/cakephp_347_released.html <![CDATA[CakePHP 3.4.7 Released]]> CakePHP 3.4.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.7. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.7. See the changelog for every commit.

  • Improved API documentation for deprecated methods.
  • Translations now return the key name when a message has both a context, and a blank translated value.
  • Nested request body parameters no longer trigger errors in the Oauth1 client authentication adapter.
  • IntegrationTestCase::enableRetainFlashMessages() was added. By using this method you can assert flash messages using assertSession().
  • Validation::hexColor() was added.
  • Pagination queries with nested matching() calls no longer emit invalid SQL.

Contributors to 3.4.7

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • David Yell
  • Ian den Hartog
  • Jeremy Harris
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann
  • chinpei215
  • mehdi fathi

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 19 May 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/05/02/cakephp_346_released.html https://bakery.cakephp.org/2017/05/02/cakephp_346_released.html <![CDATA[CakePHP 3.4.6 Released]]> CakePHP 3.4.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.6. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.6. See the changelog for every commit.

  • The CSRF and Security token fields now have autocomplete=off. This resolves a problem with the back button in new versions of Safari.
  • The SQLServer driver now supports more connection options.
  • Improved API documentation.
  • FixtureManager always uses connection aliases now. This prevents accidentally using the live connection when the test connection has not been defined.
  • Translation packages can initialize from cache files created in 3.3 without errors now.
  • Fix the conjugation of conditions by and*() and or*(). Previously and*() methods appended conditions, while or*() methods prepended them.

Contributors to 3.4.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Joep Roebroek
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Michael Hoffmann
  • Sohel Rana
  • Stephan Meyer
  • Travis Rowland
  • lilHermit
  • mehdi fathi
  • ndm2
  • saeid

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 02 May 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/04/21/cakephp_298_released.html https://bakery.cakephp.org/2017/04/21/cakephp_298_released.html <![CDATA[CakePHP 2.9.8 Released]]> CakePHP 2.9.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.9.8. This is a maintenance release for the 2.9 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 2.9.8. See the changelog for every commit.

  • Support for TLS 1.2 was added to CakeSocket. Using newer TLS versions requires PHP5.6 or greater.
  • The CSRF and Security token fields now have autocomplete=off. This resolves a problem with the back button in new versions of Safari.
  • ControllerTestCase::testAction() now works as expected when App.base is set.
  • Validation::notEmpty() accepts -0.0 as it does on 3.x.

Contributors to 2.9.8

Thank you to all the contributors that helped make this release happen:

  • Livia Scapin
  • Marc Würth
  • Marcin Stramek
  • Mark Story
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 21 Apr 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/04/06/cakephp_345_3316_released.html https://bakery.cakephp.org/2017/04/06/cakephp_345_3316_released.html <![CDATA[CakePHP 3.4.5 & 3.3.16 Released]]> CakePHP 3.4.5 & 3.3.16 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.5 and 3.3.16. 3.4.5 is a maintenance release for the 3.4 branch that fixes several community reported issues. 3.3.16 contains a fix that resolves an issue created by one of the packages CakePHP relies on.

Bugfixes

You can expect the following changes in 3.4.5. See the changelog for every commit.

  • Pagination sort links for multiple result sets now generate correctly for the non-default model.
  • Improved error messages for CSRF tokens and missing controllers.
  • Fixed a fatal error in Http\Client\Request caused by Diactoros 1.4.0, which contains an incompatiblily CakePHP’s use case.

Contributors to 3.4.5

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Bryan Crowe
  • Florian Krämer
  • Marco Ferragina
  • Mark Scherer
  • Mark Story
  • Robert Pustułka

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 06 Apr 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/04/01/cakephp_297_released.html https://bakery.cakephp.org/2017/04/01/cakephp_297_released.html <![CDATA[CakePHP 2.9.7 Released]]> CakePHP 2.9.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.9.7. This is a maintenance release for the 2.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.9.7. See the changelog for every commit.

  • Router::reverseToArray() was added. This new method allows you to get the URL parameters from a request that would let you generate the request’s URL again with Router::url().
  • CakeSchema no longer adds an additional id column to tables when reflecting schema of tables with non-conventional primary keys, and not using the defined model classes.
  • The error class used by FormHelper::input() can be customized with the errorClass option.
  • Hash::filter() no longer removes values of 0.0.
  • AuthComponent::logout() now removes the active user data used by stateless authenticators.
  • Latvian and Hungarian locale names were corrected.

Contributors to 2.9.7

Thank you to all the contributors that helped make this release happen:

  • Henrik Gemal
  • Koji Tanaka
  • Mark Story
  • Mark van Driel
  • Sébastien Barré
  • Val Bancer

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 01 Apr 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/03/28/cakephp_344_released.html https://bakery.cakephp.org/2017/03/28/cakephp_344_released.html <![CDATA[CakePHP 3.4.4 Released]]> CakePHP 3.4.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.4. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.4. See the changelog for every commit.

  • Hash::filter() no longer removes 0.0.
  • Error messages now include file and line numbers more often.
  • Logging now handles string scopes more consistently.
  • The ORM no longer emits errors when an association’s alias does not match the linked table’s alias. This allows you to leverage the targetTable option in associations to make association names that do not need to match the linked table.
  • HtmlHelper::scriptStart() not longer emits CDATA blocks by default anymore. This makes scriptStart() consistent with script().
  • TranslateBehavior::translationField() returns standard table alias for default locale.
  • Improved API documentation.
  • Allow getting configured datetime class for Type class.

Contributors to 3.4.4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • José Lorenzo Rodríguez
  • Koji Tanaka
  • Mark Scherer
  • Mark Story
  • Robert Pustułka
  • Roberto Maldonado
  • Sevvlor
  • chinpei215
  • inoas
  • saeid
  • saeideng
  • ypnos-web

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 28 Mar 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/03/09/cakephp_343_released.html https://bakery.cakephp.org/2017/03/09/cakephp_343_released.html <![CDATA[CakePHP 3.4.3 Released]]> CakePHP 3.4.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.3. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.3. See the changelog for every commit.

  • Query::rowCountAndClose() was added enabling you to get a rowcount and close a statement in a single method. This is intended to be used with delete and update queries.
  • ServerRequest now correctly handles $_FILES when the keys are out of order.
  • Newlines in the confirm messages created by FormHelper are now preserved.
  • The $showHtml argument of dd() is now used.
  • CLI commands can now return integers to indicate errors.
  • Response::withStringBody() was added making it easier to create responses with simple string bodies.
  • The lib-ICU version requirement was removed. It was causing installation issues for many users on windows.
  • The elipsis in PaginatorHelper::numbers() always replaces more than one page now. Previously it would sometimes replace only a single page.
  • cake routes generate now parses boolean arguments.
  • Incorrect attributes in the XML help for CLI commands have been fixed.
  • HtmlHelper::meta() now accepts the block option in the custom meta tag array data.
  • In a nested transaction when a rollback is followed by a commit, an exception is now raised as the entire transaction must be aborted when save points are not being used. The previous behavior could result in operations following the first rollback to succeed as they ran in a standalone transaction.
  • Error handling now always includes the file name and line number.
  • Entity::setVirtual() and Entity::setHidden() now merge non-associative array arguments when called multiple times with the merge parameter.
  • TranslateBehavior’s allowEmptyTranslations option no longer creates orphaned records when translated text is empty.
  • Text::highlight() now has a limit option.
  • TableSchema::removeColumn() was added.

Contributors to 3.4.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Brady Pacha
  • David Yell
  • Dmitrii Romanov
  • Edgaras Janušauskas
  • José Lorenzo Rodríguez
  • Koji Tanaka
  • Manuel1948
  • Mark Scherer
  • Mark Story
  • Mathew Foscarini
  • Michael Hoffmann
  • antograssiot
  • chinpei215
  • inoas
  • macnie
  • saeid

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 09 Mar 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/02/28/cakephp_296_released.html https://bakery.cakephp.org/2017/02/28/cakephp_296_released.html <![CDATA[CakePHP 2.9.6 Released]]> CakePHP 2.9.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.9.6. This is a maintenance release for the 2.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.9.6. See the changelog for every commit.

  • Improved API documentation.
  • Added Validation::minLengthByte() and Validation::maxLengthBytes()
  • Allow false/true to be read as keys in Hash::get().
  • Exit early when SMTP connections are disconnected on the remote side. This prevents the SmtpTransport from waiting until the read timeout is reached.
  • Fix FormHelper to work better with numeric optgroup labels.

Contributors to 2.9.6

Thank you to all the contributors that helped make this release happen:

  • José Lorenzo Rodríguez
  • Livia Scapin
  • Mark Sch
  • Mark Story
  • Mischa ter Smitten
  • Mponos George
  • chinpei215
  • kanonji

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 28 Feb 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/02/22/cakephp_342_released.html https://bakery.cakephp.org/2017/02/22/cakephp_342_released.html <![CDATA[CakePHP 3.4.2 Released]]> CakePHP 3.4.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.2. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.2. See the changelog for every commit.

  • Improved API documentation.
  • The association option has been restored to the Model.beforeMarshal event.
  • Fixed missing compatibility aliases to allow compatibility with both PHPUnit 5.7 and PHPUnit 6.
  • Fixed a memory leak in the ORM EagerLoader.
  • Restored Event::$result the magic methods were not fully backwards compatible.
  • Improved EntityTrait::__debugInfo() to show fields that are not accessible.
  • ServerRequest::getQuery(null) now returns the complete query data.
  • Sessions now have an id in CLI environments.
  • Controller actions with passed parameters no longer emit errors when route keys are converted into passed parameters.

Contributors to 3.4.2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • David Yell
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Mathew Foscarini
  • Michael Hoffmann
  • antograssiot
  • chinpei215
  • saeideng
  • sohelrana820

We’d like to welcome cleptric to the CakePHP core team. Cleptric hails from Germany and has been a consistent contributor over the past few months and we’re happy to have them on the team as we build upon the successes of CakePHP 3.x. As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 22 Feb 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/02/17/cakephp_341_released.html https://bakery.cakephp.org/2017/02/17/cakephp_341_released.html <![CDATA[CakePHP 3.4.1 Released]]> CakePHP 3.4.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.1. This is a maintenance release for the 3.4 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.4.1. See the changelog for every commit.

  • CounterCacheBehavior had an ignoreCounterCache option added, allowing you to disable counter updates on save.
  • Table::saveOrFail() and Table::deleteOrFail() were added. These methods allow you to perform save/delete operations that raise exceptions on failure instead of returning false.
  • Support for PHPUnit 6 was added. Currently only composer based installation of PHPUnit 6 is supported.
  • Helper::getView() was added.
  • Urlencoded URLs are once again matched correctly.
  • InflectedRoute routes using HTTP method conditions work again.
  • Association duplicate alias detection is more relaxed and accepts sub-classes.
  • Mailer\Email no longer waits until the socket timeout when an SMTP server disconnects early.
  • BelongsToMany::foreignKey() no longer incorrectly returns $this when modifying the key.
  • Strings that contain only whitespace are now correctly output by debug().

Contributors to 3.4.1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Eric Büttner
  • Florian Krämer
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Michael
  • Michael Hoffmann
  • Oxicode
  • Paolo Cuffiani
  • Robert Pustułka
  • Walther Lalk
  • antograssiot
  • chinpei215
  • inoas

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 17 Feb 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/02/12/cakephp_340_released.html https://bakery.cakephp.org/2017/02/12/cakephp_340_released.html <![CDATA[CakePHP 3.4.0 Released]]> CakePHP 3.4.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.0. This is a stable release for the 3.4 release branch. 3.4.0 provides a number of improvements to CakePHP. It also deprecates several features that will be removed in 4.0.0.

CakePHP 3.1.0 End of Life

With the release of 3.4.0, CakePHP 3.1.x becomes end of life and will no longer receive security updates. 3.2 will continue to enjoy security fixes until the release of 3.5.0.

Upgrading to 3.4.0

You can use composer to upgrade to the new version of CakePHP, and receive bug fix release as they are created, run the following:

php composer.phar require "cakephp/cakephp:3.4.*"

Deprecations

3.4.0 deprecates a number of methods as we transition away from combined get/set methods in favour of separate get/set methods. The migration guide has the full list of deprecated methods and their replacements. Deprecated features will continue to exist and behave as they always have until 4.0.0

What’s new in 3.4.0?

The migration guide has a complete list of what’s new in 3.4.0. We recommend you give that page a read when upgrading.

  • The CakePHP Request & Response objects now implement the complete set of PSR-7 interface methods. This allows you to use one set of methods every where in your application and leverage libraries that work on PSR-7 compliant objects.
  • Routes now support a _host option allowing you to match URLs on specific domains.
  • Collection::chunkWithKeys() allows you to split a collection into chunks and preserve the keys for those chunks.
  • Email messages can have their priority set.
  • FormHelper can now read default data out of the query string making GET forms simple to build.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 3.4.0 is a large release and would not have been possible without the community support and feedback.

Download a packaged release on github.

]]>
Sun, 12 Feb 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/02/12/cakephp_3315_released.html https://bakery.cakephp.org/2017/02/12/cakephp_3315_released.html <![CDATA[CakePHP 3.3.15 Released]]> CakePHP 3.3.15 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.15. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

This will be the last bugfix release for 3.3, as 3.4.0 is to be released later today. After this release, 3.3 will only receive security fixes.

Bugfixes & New Features

You can expect the following changes in 3.3.15. See the changelog for every commit.

  • Improved API documentation types.
  • QueryLogger no longer strips $ and \ when re-creating SQL queries.
  • Custom attributes can be passed down to checkboxes and radio buttons now.
  • Added labelOptions for multi-checkbox/radio widgets, enabling these widgets to have additional attributes defined on the label elements through the labelOptions key.
  • Whitespace before text inside HTML tags no longer causes assertHtml() to fail.

Contributors to 3.3.15

Thank you to all the contributors that helped make this release happen:

  • Bryan Crowe
  • Edgaras Janušauskas
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • lilHermit

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 12 Feb 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/02/05/cakephp_3314_released.html https://bakery.cakephp.org/2017/02/05/cakephp_3314_released.html <![CDATA[CakePHP 3.3.14 Released]]> CakePHP 3.3.14 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.14. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.3.14. See the changelog for every commit.

  • ValueBinder::placeholder() now works as documented when anonymous placeholders are used.
  • Caching result sets on PHP 7.1.1 works again. There was an incompatibility due to a change in how SplFixedArray was unserialized.
  • Validation::notBlank() now works with float 0.
  • Collection::transpose() with different number of columns and rows now works as expected.
  • The ‘toggle vendor stack frames’ links on error pages now work.
  • Session destruction now works properly using the cache engine and memcached.
  • Email log headers and body are separated by a new line.

Contributors to 3.3.14

Thank you to all the contributors that helped make this release happen:

  • Cory Thompson
  • Edgaras Janušauskas
  • Joep Roebroek
  • Johan Meiring
  • José Lorenzo Rodríguez
  • Mark Story
  • Mathew Foscarini
  • Rodrigo moyle
  • antograssiot

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 05 Feb 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/02/04/cakephp_340RC4_released.html https://bakery.cakephp.org/2017/02/04/cakephp_340RC4_released.html <![CDATA[CakePHP 3.4.0-RC4 Released]]> CakePHP 3.4.0-RC4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.0-RC4. This is a release candidate for 3.4.0. 3.4.0 provides a number improvements both large and small to CakePHP. It also deprecates several features that will be removed in 4.0.0.

Upgrading to this version

You can use composer to upgrade to the RC version of CakePHP 3.4.0:

php composer.phar require "cakephp/cakephp:3.4.0-RC4"

What’s new in 3.4.0?

The migration guide has a complete list of what’s new in 3.4.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Bugfixes and Minor Features

This release fixes a few issues identified in the 3.4.0-RC3, as well as the recent bugfixes from master. This release contains the following changes:

  • Email::setPriority() was added. This method lets you set the X-Priority header in email messages.
  • EntityTrait had the following methods added: getVirtual(), setVirtual(), getHidden(), setHidden(), setAccess(), isAccessible(), isDirty(), setDirty(), setErrors(), setError(), getErrors(), and getError(). These methods provide separate get/set methods for the combined get/set methods on EntityInterface.
  • HasMany::link() now uses a single transaction to link all records.
  • FormHelper::input() no longer emits the nestedInput option as an attribute.
  • Improved API documentation examples.
  • ValueBinder::placeholder() now works as documented when anonymous placeholders are used.
  • TestCase::assertHtml() now accepts whitespace before a closing tag.
  • The translation helper functions e.g. __() now correctly string cast explict null parameters.
  • Caching result sets on PHP 7.1.1 works again. There was an incompatibility due to a change in how SplFixedArray was unserialized.
  • CakePHP internals no longer use config() where possible.
  • Validation::notBlank() now works with float 0.
  • Collection::transpose() with different number of columns and rows now works as expected.
  • Session destruction now works properly using the cache engine and memcached.

If there are no major issues reported, we will release 3.4.0 in the following week.

Contributors to 3.4.0-RC4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Ceeram
  • Cory Thompson
  • Edgaras Janušauskas
  • Florian Krämer
  • Gareth Ellis
  • Joep Roebroek
  • Johan Meiring
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Mathew Foscarini
  • Rodrigo moyle
  • Ross Chater
  • Walther Lalk
  • antograssiot
  • chinpei215
  • lilHermit

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 04 Feb 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/01/28/cakephp_3313_released.html https://bakery.cakephp.org/2017/01/28/cakephp_3313_released.html <![CDATA[CakePHP 3.3.13 Released]]> CakePHP 3.3.13 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.13. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes & New Features

You can expect the following changes in 3.3.13. See the changelog for every commit.

  • When sending a Client request through a proxy, the URI is now in an absolute form.
  • Query::update() now raises an error when an invalid parameter is passed.
  • Mailers are now reset when sending an email raises an exception.
  • Improved error messages when associations are missing primary keys.
  • Validator::multipleOptions no longer ignores the caseInsensitive option.
  • HasMany::link() now updates all records in a single transaction.
  • The nestedInput option in FormHelper::input() no longer appears as an attribute.
  • TestCase::assertHtml() accepts whitespace before a closing tag.
  • Improved API documentation.
  • Added support for the parseHuge option in Xml::build().

Contributors to 3.3.13

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Bernat Arlandis
  • Ceeram
  • Cory Thompson
  • Dmitrii Romanov
  • Gareth Ellis
  • Henrik Gemal
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Story
  • Ross Chater
  • Yves P
  • lilHermit
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sat, 28 Jan 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/01/23/cakephp_295_released.html https://bakery.cakephp.org/2017/01/23/cakephp_295_released.html <![CDATA[CakePHP 2.9.5 Released]]> CakePHP 2.9.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.9.5. This is a maintenance release for the 2.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.9.5. See the changelog for every commit.

  • Fix query string parsing on requestAction(). This fixes a long standing issue that resulted in query strings being doubled in requestAction() URLs.
  • FlashHelper::render() can now render default messages created by SessionComponent.
  • Add support for the parseHuge option in Xml::build().
  • Error messages if PHP’s mail() function fails are now accurate.
  • Added support for the ‘ru-ru’ locale.
  • Built-in server now accepts query string parameters for the base path.

Contributors to 2.9.5

Thank you to all the contributors that helped make this release happen:

  • Bernat Arlandis
  • Henrik Gemal
  • José Lorenzo Rodríguez
  • Mark Story
  • Markus Bauer
  • chinpei215

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 23 Jan 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/01/22/cakephp_340RC3_released.html https://bakery.cakephp.org/2017/01/22/cakephp_340RC3_released.html <![CDATA[CakePHP 3.4.0-RC3 Released]]> CakePHP 3.4.0-RC3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.0-RC3. This is a release candidate for 3.4.0. 3.4.0 provides a number improvements both large and small to CakePHP. It also deprecates several features that will be removed in 4.0.0.

Upgrading to this version

You can use composer to upgrade to the RC version of CakePHP 3.4.0:

php composer.phar require "cakephp/cakephp:3.4.0-RC3"

What’s new in 3.4.0?

The migration guide has a complete list of what’s new in 3.4.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Bugfixes and Minor Features

This release fixes a few issues identified in the 3.4.0-RC2, as well as the recent bugfixes from master. This release contains the following changes:

  • Improve return types compatiblity with PHPStorm in doc blocks.
  • Routes with _host options now use that option when generating URLs.
  • Aura.Intl version was raised to 3.0
  • Fix missing uploaded files in Request objects.
  • Fix strict errors raised when Cake\Database\Schema\Table is used as a typehint.
  • Query::update() raises an error when an invalid parameter is passed.
  • Mailers are now reset when sending an email raises an exception.
  • Improved error messages when associations are missing primary keys.
  • Validator::multipleOptions no longer ignores the caseInsensitive option.

If there are no major issues reported, we will release 3.4.0 stable next week.

Contributors to 3.4.0-RC3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Bernat Arlandis
  • Cory Thompson
  • Henrik Gemal
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Ross Chater

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 22 Jan 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/01/17/cakephp_340RC2_released.html https://bakery.cakephp.org/2017/01/17/cakephp_340RC2_released.html <![CDATA[CakePHP 3.4.0-RC2 Released]]> CakePHP 3.4.0-RC2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.0-RC2. This is a release candidate for 3.4.0. 3.4.0 provides a number improvements both large and small to CakePHP. It also deprecates several features that will be removed in 4.0.0.

Upgrading to this version

You can use composer to upgrade to the RC version of CakePHP 3.4.0:

php composer.phar require "cakephp/cakephp:3.4.0-RC2"

What’s new in 3.4.0?

The migration guide has a complete list of what’s new in 3.4.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Bugfixes and Minor Features

This release fixes a few issues identified in the 3.4.0-RC1, as well as the recent bugfixes from master. This release contains the following changes:

  • Router::prefix() now supports a path option for customizing a prefix scope’s URL path.
  • Postgres dialect now correctly handles nullable datetime columns.
  • SqlServer dialect now correctly handles nullable datetime columns.
  • Http\Client correctly generates request URIs when behind an HTTP proxy.
  • Improved API documentation.
  • Xml::build() now supports the parseHuge option to enable very large XML payloads to be loaded.
  • A regression causing CLI subcommands to not inherit the parent shell’s options and arguments was fixed.

If there are no major issues reported, we will release 3.4.0 stable next week.

Contributors to 3.4.0-RC2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • AJ Quick
  • Dmitrii Romanov
  • Joris Vaesen
  • Jose Diaz-Gonzalez
  • José Lorenzo Rodríguez
  • Mark Story
  • Ross Chater
  • Yves P
  • antograssiot
  • ndm2

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Tue, 17 Jan 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/01/14/cakephp_340RC1_released.html https://bakery.cakephp.org/2017/01/14/cakephp_340RC1_released.html <![CDATA[CakePHP 3.4.0-RC1 Released]]> CakePHP 3.4.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.0-RC1. This is a release candidate for 3.4.0. 3.4.0 provides a number improvements both large and small to CakePHP. It also deprecates several features that will be removed in 4.0.0.

Upgrading to this Version

You can use composer to upgrade to the RC version of CakePHP 3.4.0:

php composer.phar require "cakephp/cakephp:3.4.0-RC1"

What’s new in 3.4.0?

The migration guide has a complete list of what’s new in 3.4.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Bugfixes and Minor Features

This release fixes a few issues identified in the 3.4.0-beta4, as well as the recent bugfixes from master as documented in the 3.3.12 release notes. In addition to those changes 3.4.0-RC1 contains:

  • InstanceConfigTrait::config() has been deprecated. Instead you should used setConfig() and getConfig() methods.
  • Routes can now use the _host option to restrict which hosts routes will match on.
  • Router::parse(), RouteCollection::parse() and Route::parse() have all been deprecated. Instead you should use the parseRequest() method which has access to the entire request allowing more flexible routing to be created.
  • Subcommands will inherit their description from the parent shell if they don’t have a description explicitly set.
  • HtmlHelper no longer emits <![CDATA blocks by default. If you use an XHTML document type, you may need to enable <![CDATA again using the safe option.
  • Collection::every() now returns true for empty collections. This rectifies a mistake made in 3.2.
  • TranslateBehavior::translateField() was added.

If there are no major issues reported, we will release 3.4.0 stable next week.

Contributors to 3.4.0-RC1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Michael Underwood
  • Robert Pustułka
  • antograssiot

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 14 Jan 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/01/13/cakephp_3312_released.html https://bakery.cakephp.org/2017/01/13/cakephp_3312_released.html <![CDATA[CakePHP 3.3.12 Released]]> CakePHP 3.3.12 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.12. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.12. See the changelog for every commit.

  • HasMany Associations and a replace save strategy and conditions work more often now as table aliases are stripped from generated conditions.
  • TextHelper::autoLinkUrls() now links more URLs correctly.
  • Postgres schema reflection now extracts precision and scale from NUMERIC and DECIMAL columns.
  • Headers set with setHeader() now overwrite those in $_SERVER when requests are transformed into CakePHP requests.
  • Table output in CLI tools now correctly handles empty strings when calculating widths.
  • Hash::maxDimensions() correctly calculates dimensions when the first element is false.
  • A plural message was used with __() an array would be returned which is never right.
  • When an unknown context is used the __x() method fails.
  • Datetime validation no longer emits errors when non-datetime objects are passed in.

New Features

The 3.3.12 introduces a few new features:

  • CLI commands can now accept an argument multiple times by setting the multiple option on an argument.
  • The ignoreDirty option was added to CounterCacheBehavior which enables ignoring counter cache fields from being updated.
  • Add dd() as quick alternative for debug(); die();.

Contributors to 3.3.12

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Christian Winther
  • DaVinciEngineer
  • José Lorenzo Rodríguez
  • Koen Brouwer
  • Mark Scherer
  • Mark Story
  • Mathew Foscarini
  • Michael Hoffmann
  • Michael Underwood
  • Robert Pustułka
  • Yves P
  • ndm2
  • yutmr

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 13 Jan 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/01/07/cakephp_340beta4_released.html https://bakery.cakephp.org/2017/01/07/cakephp_340beta4_released.html <![CDATA[CakePHP 3.4.0-beta4 Released]]> CakePHP 3.4.0-beta4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.0-beta4. This is a beta release for 3.4.0, and it contains bugfixes found by the community.

Updating to 3.4.0-beta4

You can use composer to upgrade to the beta version of CakePHP 3.4.0:

php composer.phar require "cakephp/cakephp:3.4.0-beta4"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the beta, we can help ensure a smoother release of 3.4.0 before the stable release.

Bug Fixes

  • Reading request bodies no longer returns null.
  • Querystring parameters set in the url option of a request are now propagated to the requesy query data.
  • Table output in CLI tools now correctly handles empty strings when calculating widths.

Additions & Deprecations

  • Add dd() as quick alternative for debug(); die();.
  • CLI commands can now accept an argument multiple times by setting the multiple option on an argument.
  • Routing scopes can now define the routeClass and extensions options.
  • A number of methods in the Email class have been deprecated in favour of separate get/set methods.

A full list of the changes in 3.4.0 can be found in the 3.4.0 migration guide

Contributors to 3.4.0-beta4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • DaVinciEngineer
  • Koen Brouwer
  • Mark Scherer
  • Mark Story
  • Mathew Foscarini
  • Ondrej Mirtes
  • Yves P
  • antograssiot
  • yutmr

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sat, 07 Jan 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/01/03/cakephp_psr7_middleware_authentication.html https://bakery.cakephp.org/2017/01/03/cakephp_psr7_middleware_authentication.html <![CDATA[CakePHP PSR7 Middleware Authentication Released]]> CakePHP PSR7 Middleware Authentication Released

The CakePHP team has recently been working hard at improving the authentication and authorization systems. There are a few reasons for this, firstly, both have been historically married through the AuthComponent. Secondly, the component is a monolithic class that is tightly coupled to the controller layer of an application – this can potentially make authorization hard to reuse in other layers.

CakePHP 3 has taken several steps forward to ensuring that the framework keeps up to the latest standards. It also, at the same time, is very important to the team that the framework ensures backwards compatibility and soft migration paths. One of the key requirements of an improved authentication system for CakePHP was to retain some of this backwards compatibility.

The improved implementation

https://github.com/cakephp/authentication

Hours of dedication were expended to finish this release of the improved authentication system for the CakePHP 3 framework based on PSR7 compliant middleware. For the core team, it was decided that this is the place where authentication should happen.

Ideally, the request object should carry all information you need to identify a user. While generally, best practice is to identify a user or agent early in the stack. The improvement has meant that the authentication has been completely refactored and moved into a new namespace, as well as the code‘s folder structure being reorganised. But the biggest change was the better separation of logic.

The new implementation separates authenticators and identifiers. An Authenticator looks for the credentials in the request and passes them to a collection of identifiers that use the credentials to identify an identity against a variety of sources. For example, you can check the credentials against a user’s table using the CakePHP ORM and LDAP at the same time. The configuration stays almost the same as it was before. The largest change is that you have to split configuration for the authenticators and identifiers. Another significant change is that authentication is connected to your application as middleware, and not in the controller.

New features

Besides keeping the existing authenticators: HTTP Digest, HTTP Basic and Form there is now Token and Session authenticators as well. Token is a high level implementation that allows you to use a token from the request query parameters or a HTTP header. Extending this to provide JWT based authentication should be trivial.

Current status and roadmap

The current status of the plugin is that, while not production ready, it is usable.”. What we would like you, the community, to do is to provide us ideas for improvements, additions and report bugs you find. While we have a good base of unit tests, there may be scenarios and use cases that are not yet accounted for.

The roadmap for the plugin is to release 1.0.0 along with the official release of CakePHP 3.4. The plugin itself is right now in alpha and will make its path to a final release depending on your feedback. The long term plan is that the plugin will be integrated into the framework itself.

Where is the code? How do I install it?

Check the official repository of the plugin and install it via composer as usual.

composer require cakephp/authentication

Pay attention to the version constraints! Until CakePHP 3.4 is released it will require the 3.next branch!

composer:require cakephp/cakephp:"dev-3.next as 3.4"

The readme.md of the project contains some basic information on how to get started with the new implementation and provides information on how to migrate from the AuthComponent as well.

]]>
Tue, 03 Jan 2017 00:00:00 +0000
https://bakery.cakephp.org/2017/01/01/cakephp_340beta3_released.html https://bakery.cakephp.org/2017/01/01/cakephp_340beta3_released.html <![CDATA[CakePHP 3.4.0-beta3 Released]]> CakePHP 3.4.0-beta3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.0-beta3. This is a beta release for 3.4.0, and it contains bugfixes found by the community.

Updating to 3.4.0-beta3

You can use composer to upgrade to the beta version of CakePHP 3.4.0:

php composer.phar require "cakephp/cakephp:3.4.0-beta3"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the beta, we can help ensure a smoother release of 3.4.0 before the stable release.

Bug Fixes

  • HasMany Associations and a replace save strategy and conditions work more often now as table aliases are stripped from generated conditions.
  • MailerTrait::getMailer() is now protected. This prevents getMailer from being used as an action when permissive routes are enabled.
  • CellTrait::cell() is now protected. This prevents cell from being used as an action where permissive routes are enabled.
  • TextHelper::autoLinkUrls() now links more URLs correctly.
  • Postgres schema reflection now extracts precision and scale from NUMERIC and DECIMAL columns.
  • Cookies created via Response::cookie() are now emitted correctly.

Additions & Deprecations

  • FormHelper::input() is now deprecated, and replaced with FormHelper::control() the old name was opaque and confusing to new users.
  • Response::getCookies() was added.

A full list of the changes in 3.4.0 can be found in the 3.4.0 migration guide

Contributors to 3.4.0-beta3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • José Lorenzo Rodríguez
  • Mark Story
  • Yves P
  • antograssiot
  • chinpei215
  • ndm2

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sun, 01 Jan 2017 00:00:00 +0000
https://bakery.cakephp.org/2016/12/31/cakephp_340beta2_released.html https://bakery.cakephp.org/2016/12/31/cakephp_340beta2_released.html <![CDATA[CakePHP 3.4.0-beta2 Released]]> CakePHP 3.4.0-beta2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.0-beta2. This is a beta release for 3.4.0, and it contains bugfixes found by the community.

Updating to 3.4.0-beta2

You can use composer to upgrade to the beta version of CakePHP 3.4.0:

php composer.phar require "cakephp/cakephp:3.4.0-beta2"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the beta, we can help ensure a smoother release of 3.4.0 before the stable release.

Bug Fixes

  • Fixed incorrect type warnings for Request/Response.
  • Fixed modified response not being retained by Controller::redirect().
  • Fixed incorrect deprecation documentation comments in Cake\Http\ServerRequest.

A full list of the changes in 3.4.0 can be found in the 3.4.0 migration guide

Contributors to 3.4.0-beta2

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Mark Story
  • antograssiot

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Sat, 31 Dec 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/12/30/cakephp_340beta1_released.html https://bakery.cakephp.org/2016/12/30/cakephp_340beta1_released.html <![CDATA[CakePHP 3.4.0-beta1 Released]]> CakePHP 3.4.0-beta1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.4.0-beta1. This is the first beta release for 3.4.0, and it contains several new major features.

Updating to the beta

You can use composer to upgrade to the beta version of CakePHP 3.4.0:

php composer.phar require "cakephp/cakephp:3.4.0-beta1"

We would greatly appreciate it if you temporarily upgraded your application, and ran your tests. By opening issues for any regressions in the beta, we can help ensure a smoother release of 3.4.0 before the stable release.

Notable changes in 3.4.0

Cake\Network\Response has been updated to implement the required PSR-7 interfaces and deprecates a number of methods that overlap with the interface methods. It also adds immutable versions of all the helper methods that Response has offered in the past. Because the core response object now implements the PSR-7 interface, Cake\Http\ResponseTransformer has been deprecated and is no longer used.

Cake\Http\ServerRequest has had its remaining public properties deprecated. All of the public properties on the request should now be accessed via methods:

$base = $this->request->base;
// Should now be
$base = $this->request->getAttribute('base');

In order to offer simpler interfaces that are more predictable, have simpler return types and better facilitate IDE auto-completion, several classes have had their combined get/set methods deprecated. The combined methods have been replaced with getX, setX style methods. The classes that have been updated in 3.4.0 thus far are:

  • CakeConsoleConsoleOptionParser
  • CakeDatabaseConnection
  • CakeDatabaseDriver
  • CakeDatabaseExpressionFunctionExpression
  • CakeDatabaseExpressionQueryExpression
  • CakeDatabaseExpressionValuesExpression
  • CakeDatabaseQuery
  • CakeDatabaseSchemaCachedCollection
  • CakeDatabaseSchemaTableSchema
  • CakeDatabaseTypeMap
  • CakeORMEagerLoadable
  • CakeORMQuery
  • CakeORMTable
  • CakeValidationValidator
  • CakeViewStringTemplateTrait
  • CakeViewViewBuilder

In addition each of the association classes now offer a fluent interface for defining the various association options. These methods improve IDE autocompletion and make mistakes easier to find:

$this->belongsTo('Comments', [
    'foreignKey' => 'article_id',
    'finder' => 'active',
    'startegy' => 'subquery' // Contains a typo that can be hard to spot
]);

// Now becomes
$this->belongsTo('Comments')
    ->setForiegnKey('article_id')
    ->setFinder('active')
    ->setStrategy('subquery');

A full list of the changes in 3.4.0 can be found in the 3.4.0 migration guide

Contributors to 3.4.0-beta1

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Andrej Griniuk
  • André Teixeira
  • Florian Krämer
  • Jonas Hartmann
  • Joris Vaesen
  • José Lorenzo Rodríguez
  • Juan Basso
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Mathew Foscarini
  • Ondrej Mirtes
  • antograssiot
  • chinpei215
  • glafarge
  • inoas
  • jirka
  • ndm2
  • offline

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

]]>
Fri, 30 Dec 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/12/27/cakephp_3311_released.html https://bakery.cakephp.org/2016/12/27/cakephp_3311_released.html <![CDATA[CakePHP 3.3.11 Released]]> CakePHP 3.3.11 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.11. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.11. See the changelog for every commit.

  • Xml::fromArray() now serialized '0' correctly.
  • Http\Client\Response::getStatusCode() now returns integers, instead of strings.
  • RequestHandler::$ajaxLayout is now deprecated. Previously undocumented, this property will be removed in 4.0.0

New Features

The 3.3.11 introduces a few new features:

  • Improved API documentation.
  • Validation::(min|max)LengthBytes() were added. These methods let you check the number of bytes in a value where as (min|max)Length() let you check the number of characters.
  • The Form library is now offered as a standalone package.

Contributors to 3.3.11

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Bryan Crowe
  • Ceeram
  • Koji Tanaka
  • Marc Würth
  • Mark Scherer
  • Mark Story
  • Mirko Pagliai
  • Mischa ter Smitten
  • gregs

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Tue, 27 Dec 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/12/23/cakephp_294_released.html https://bakery.cakephp.org/2016/12/23/cakephp_294_released.html <![CDATA[CakePHP 2.9.4 Released]]> CakePHP 2.9.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.9.4. This is a maintenance release for the 2.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.9.4. See the changelog for every commit.

  • The hu-HU and lv-LV locales were added.
  • Errors are no longer emitted when operating on corrupted cookie data.
  • Fix redirectUrl issue when loginRedirect is empty.
  • Fix missing HTML encoding when error messages contain HTML. This can happen when user data is used as an offset in an array in an unchecked way. Thanks to Teppei Fukuda for reporting this issue via the responsible security disclosure process.
  • TreeBehavior no longer invokes its own methods indirectly via the Model proxy method.
  • Xml::fromArray() now correctly serializes '0'.

PHP 7.1 Support

CakePHP 2.9.4 has all tests are passing in PHP7.1. PHP 7.1 is now an officially supported version for 2.x.

Contributors to 2.9.4

Thank you to all the contributors that helped make this release happen:

  • Henrik Gemal
  • Mark Story
  • chinpei215
  • domingues

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 23 Dec 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/12/11/cakephp_3310_released.html https://bakery.cakephp.org/2016/12/11/cakephp_3310_released.html <![CDATA[CakePHP 3.3.10 Released]]> CakePHP 3.3.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.10. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.10. See the changelog for every commit.

  • Literal % in string template variables no longer cause errors.
  • Query Logging now correctly replaces placeholders for IN clauses.
  • BreadcrumbsHelper::render() now returns '' when there are no crumbs. This makes its return type consistent in all cases.
  • MissingHelper errors raised when rendering an error page, no longer cause a blank page response.
  • PaginatorComponent now caps the limit option to the maxLimit option if both are specified.
  • All SQL dialects now correctly generate default values for DATETIME and TIMESTAMP columns for values other than CURRENT_TIMESTAMP.
  • Debugger now HTML encodes error message contents. Previously, applications running in debug mode could be vulnerable to reflected cross-site-scripting (XSS) in some scenarios. Thank you to Teppei Fukuda for reporting this issue via the security disclosure process.

New Features

The 3.3.10 introduces a few new features:

  • FlashComponent now supports a duplicate option. When disabled, this option will prevent duplicate messages from being set.
  • IntegrationTestCase::assertResponseRegExp() and IntegrationTestCase::assertResponseNotRegExp() were added.
  • MissingElementException provides more context now.

Contributors to 3.3.10

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Alex Bogdanov
  • Cees-Jan Kiewiet
  • JayPHP
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Mirko Pagliai
  • Yasuaki Hamano
  • gregs

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 11 Dec 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/11/27/cakephp_293_released.html https://bakery.cakephp.org/2016/11/27/cakephp_293_released.html <![CDATA[CakePHP 2.9.3 Released]]> CakePHP 2.9.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.9.3. This is a maintenance release for the 2.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.9.3. See the changelog for every commit.

  • The constructor of AclNode now lets you pass in an alias when instances are created via ClassRegistry::init().
  • A regression introduced in 2.9.1 where bootstrap files would not be correctly processed preventing bake from creating new applications.
  • PagesController no longer allows .. in paths allowing other view templates to be loaded potentially causing application errors.

New Features

The 2.9.3 introduces a few new features:

  • Shell commands now accept the --webroot CLI parameters allowing you to customize the path to your application’s webroot directory if necessary.
  • Cache::engine() was backported from 3.x
  • DboSource now supports hook methods for customizing how the method cache works.

Contributors to 2.9.3

Thank you to all the contributors that helped make this release happen:

  • Marc Würth
  • Mark Sch
  • Mark Story
  • Mischa ter Smitten
  • Val Bancer
  • chinpei215

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 27 Nov 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/11/21/cakephp_339_released.html https://bakery.cakephp.org/2016/11/21/cakephp_339_released.html <![CDATA[CakePHP 3.3.9 Released]]> CakePHP 3.3.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.9. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.9. See the changelog for every commit.

  • An invalid option was removed from JsonView.
  • ShellDispatcher now logs fewer warnings about duplicate shells when debug logging is enabled.
  • The exception message raised when an ORM update fails due to missing primary key values has been improved.
  • Xml::toArray() no longer errors on tag names that match application class names.
  • Console errors no longer include duplicate tags when invalid options are used.
  • Improved API documentation for return & parameter types.
  • Router no longer parses extensions in a greedy way.
  • Route key elements can now be a single character.

New Features

The 3.3.9 introduces a few new features:

  • BreadCrumbsHelper was added. This helper offers and improved API over the existing breadcrumb features offered by HtmlHelper.
  • Cake\Network\Response now features a __debugInfo() method.

Contributors to 3.3.9

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • David Yell
  • Guillaume “Elektordi” Genty
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Mathew Foscarini
  • Walther Lalk
  • Yves P
  • chinpei215
  • luke83

As always, we would like to thank all the contributors that opened issues, created pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 21 Nov 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/11/07/cakephp_292_released.html https://bakery.cakephp.org/2016/11/07/cakephp_292_released.html <![CDATA[CakePHP 2.9.2 Released]]> CakePHP 2.9.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.9.2. This is a maintenance release for the 2.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.9.2. See the changelog for every commit.

  • Improved API documentation.
  • '' is now an accessible key via Hash, and Session data.
  • You can now enable callbacks on components used by components by setting the enabled option to true.
  • Fix HttpSocket emitting errors when nameless cookies are encountered.

Contributors to 2.9.2

Thank you to all the contributors that helped make this release happen:

  • Alex
  • dereuromark
  • Mark Story
  • TekkCraft
  • Val Bancer

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 07 Nov 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/11/06/cakephp_338_released.html https://bakery.cakephp.org/2016/11/06/cakephp_338_released.html <![CDATA[CakePHP 3.3.8 Released]]> CakePHP 3.3.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.8. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.8. See the changelog for every commit.

  • You can now enable callbacks on components used by components by setting the enabled option to true.
  • formatResults callbacks attached to BelongsToMany Associations now fire as they should.
  • ResponseEmitter no longer calls a missing method on Log.
  • TranslateBehavior no longer creates translation records for the default locale. This was a regression introduced in 3.3.7.
  • Fixed column SQL generation nullable column with default values.
  • Options passed to Table::validateUnique() are now passed to the generated rule object.
  • Improved API documentation.

Contributors to 3.3.8

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Ceeram
  • Hugh Downer
  • Jeremy Harris
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Story
  • Mathew Foscarini
  • dereuromark

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 06 Nov 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/10/28/cakephp_337_released.html https://bakery.cakephp.org/2016/10/28/cakephp_337_released.html <![CDATA[CakePHP 3.3.7 Released]]> CakePHP 3.3.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.7. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.7. See the changelog for every commit.

  • Http\Client no longer sets the Content-Type header on all requests. Instead if there is no request data, no Content-Type header is sent.
  • New Entities that contain only translated records now persist correctly.
  • JsonView no longer hard fails on INF and NAN values. Instead these values are replaced with ‘0’.
  • '' is now an accepted key in both Session and Hash::get() operations.

New Features

  • Time objects can now have their JSON encode format set to Time::UNIX_TIMESTAMP_FORMAT.
  • FormHelper::create() now supports the ‘enctype’ and ‘method’ options.
  • Routing now supports multi-extensions like ‘.csv.gz’.
  • Composer scripts were added to make running tests and linting easier.

Contributors to 3.3.7

Thank you to all the contributors that helped make this release happen:

  • Andrew LeCody
  • Johan Meiring
  • Walther Lalk
  • inoas
  • Mark Story
  • Andrej Griniuk
  • lilHermit
  • José Lorenzo
  • thinkingmedia

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 28 Oct 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/10/14/cakephp_336_released.html https://bakery.cakephp.org/2016/10/14/cakephp_336_released.html <![CDATA[CakePHP 3.3.6 Released]]> CakePHP 3.3.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.6. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.6. See the changelog for every commit.

  • The ORM will now correctly handle complex types like datetimes in where conditions for associations that are joined with joinWith(), innerJoinWith(), matching() and notMatching().
  • View Cells now include the template and action name when generating cache keys. This fixes incorrect cached content from being displayed.
  • When autoFields are disabled 1:1 associated records will now be hydrated as an empty object.
  • The associations generated by BelongsToMany associations now preserve the loading strategy defined in the root association.
  • A double URL encoding issue on cookie values emitted by the PSR7 HTTP stack. This resulted in encrypted cookies not being readable.
  • TestCase::getMockForModel() now correctly sets plugin model aliases.
  • RoutingMiddleware sets the request method based on the _method request data parameter.
  • SqlServer handles default values with N prefixes now.

New Features

  • Improved API documentation.
  • The ajaxLogin of AuthComponent is now deprecated.
  • PaginatorHelper supports escape => false in more methods.
  • PaginatorHelper::generateUrl() was added.
  • HtmlHelper::meta() can now create canonical, next and prev tags.

Contributors to 3.3.6

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Gareth Ellis
  • Hari K T
  • Johan Meiring
  • Jorge Alberto Cricelli
  • José Lorenzo Rodríguez
  • Marc Wilhelm
  • Marc Ypes
  • Mark Story
  • Robert Pustułka
  • Walther Lalk
  • chinpei215
  • cjquinn
  • dereuromark
  • inoas
  • phongkt
  • saeid
  • thinkingmedia

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 14 Oct 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/10/10/cakephp_291_released.html https://bakery.cakephp.org/2016/10/10/cakephp_291_released.html <![CDATA[CakePHP 2.9.1 Released]]> CakePHP 2.9.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.9.1. This is a maintenance release for the 2.9 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.9.1. See the changelog for every commit.

  • Regressions in FormHelper & SecurityComponent token generation were fixed.
  • A number of plugins and applications were relying on CakePHP to autoload Object which it now does again.
  • Length detection for ENUM columns was fixed.
  • Schema generation now omits table names that would result in invalid property names.
  • The default flash template had incorrect content removed.
  • Model::query() now defaults the $cache argument to Model::$cacheQueries.

Contributors to 2.9.1

Thank you to all the contributors that helped make this release happen:

  • Andrej Griniuk
  • David Maicher
  • José Lorenzo Rodríguez
  • Mark Sch
  • Mark Story
  • Mischa ter Smitten

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 10 Oct 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/09/29/cakephp_335_released.html https://bakery.cakephp.org/2016/09/29/cakephp_335_released.html <![CDATA[CakePHP 3.3.5 Released]]> CakePHP 3.3.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.5. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.5. See the changelog for every commit.

  • Using debug() or var_dump() in a controller no longer results in truncated content in the PSR7 stack.
  • Session cookies can now be rotated at the same time as other cookies are set in the PSR7 stack.
  • Response now supports all standards defined HTTP status codes.
  • requestAction() works again when you are using the PSR7 stack.

New Features

  • UrlHelper::buildUrl() now supports the escape option to create unescaped URLs. This useful when you need to build links inside other helpers.
  • A new ResponseEmitter was added. The new response emitter fixes a number of issues related to sessions and truncated content.
  • Fixture classes can be defined using a fully-qualified namespace name.
  • RequestHandlerComponent had the enableBeforeRedirect configuration option added. Disabling this flag will disable RequestHandler from converting AJAX redirects into requestAction calls.
  • RequestHandlerComponent::beforeRedirect() is now deprecated.

Contributors to 3.3.5

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • José Lorenzo Rodríguez
  • Marc Würth
  • Mark Story
  • Yasuo Harada
  • mscherer

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Thu, 29 Sep 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/09/24/cakephp_334_released.html https://bakery.cakephp.org/2016/09/24/cakephp_334_released.html <![CDATA[CakePHP 3.3.4 Released]]> CakePHP 3.3.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.4. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.4. See the changelog for every commit.

  • __xn, __dx and __dxn support variadic arguments now.
  • An incompatibility in Response::body(callable) & PSR7 stack was fixed.
  • Improved API docs resolving warnings in PHPStorm and other IDEs
  • Checkbox inputs now support the escape option.
  • Translations that result in ‘’ no longer throws an exception.
  • EventManager::__debugInfo() is more accurate.
  • Fix notMatching() without query builder callback triggering an error.
  • Clean primary entity after Model.afterSaveCommit is triggered. Previously primary entity was being cleaned too early and callbacks for Model.afterSaveCommit were useless if one wanted to acccess original state.
  • The ErrorHandlerMiddleware now logs errors as ErrorHandler would.
  • Requests with an invalid HTTP protocol version no longer fatally error. Instead they return a 400 HTTP status code.
  • Redirect Routes now work as expected for applications in subdirectories using the PSR7 HTTP stack.
  • DispatchFilters now receive events when exceptions are rendered again.
  • Session regeration now works as expected with the database adapter, and PHP7+
  • Very large decimal values can now be used in database operations withouth losing precision now.

New Features

  • RouteBuilder::nameExists() was added. This method allows you to check the existence of named routes.
  • Collection:cartesianProduct() was added.
  • View::element() now supports plugin = false as an option to disable automatic plugin element rendering.
  • imageSize, imageHeight and imageWidth methods were added to Validation. These methods let you validate uploaded image file sizes without requiring additional extensions.
  • Improved API docs.

Contributors to 3.3.4

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Alexandros Solanos
  • Bryan Crowe
  • Cees-Jan Kiewiet
  • David Yell
  • Florian Krämer
  • Jad Bitar
  • Jose Diaz-Gonzalez
  • José Lorenzo Rodríguez
  • Mark Story
  • Mirko Pagliai
  • mscherer
  • Pedro Tanaka
  • Thinking Media
  • chinpei215
  • hashmode
  • ndm2

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation. We’d also like to welcome thinkingmedia to the CakePHP core team.

Download a packaged release on github.

]]>
Sat, 24 Sep 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/09/18/cakephp_290_289_released.html https://bakery.cakephp.org/2016/09/18/cakephp_290_289_released.html <![CDATA[CakePHP 2.9.0 and 2.8.9 Released]]> CakePHP 2.9.0 and 2.8.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.9.0 and 2.8.9. 2.8.9 is the last scheduled bugfix release for 2.8. Going forward, 2.8 will only receive security fixes. 2.9.0 is a backwards compatible feature release for the 2.x series, adding several community contributed improvements.

Deprecations

  • The Object class has been deprecated due to upcoming PHP7 collisions. It has been renamed to CakeObject to avoid collisions with new PHP reserved words.

New Features

  • AuthComponent::user() now makes the user data available when using stateless authentication adapters.
  • DboSource::flushQueryCache() was added to allow more fine-grained control of query result caching when enabled.
  • The log messages created by ErrorHandler can now be more easily customized in subclasses.
  • Additional mime-types for ‘jsonapi’, and ‘psd’ were added.
  • Time & Datetime inputs no longer set a maxlength attribute when rendered as ‘text’ input types.

Bugfixes in 2.8.9

You can expect the following changes in 2.8.9. See the changelog for every commit.

  • Minor DocBlock improvements.
  • A change to CakeFixtureManager intended to optimize test suite runtimes was reverted. This change caused compatibility issues with existing applications.

Contributors to 2.8.9 & 2.9.0

Since the release of 2.9.0-RC1 there have been no changes or issues reported for 2.9.0.

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 18 Sep 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/09/14/cakephp_288_released.html https://bakery.cakephp.org/2016/09/14/cakephp_288_released.html <![CDATA[CakePHP 2.8.8 Released]]> CakePHP 2.8.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.8.8. This is a maintenance release for the 2.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.8.8. See the changelog for every commit.

  • CakeTestCase::getMockForModel() no longer fails when when models interact with their data source in the constructor.
  • A regression in FormHelper related to security tokens and applications in sub-directories was fixed.

Contributors to 2.8.8

Thank you to all the contributors that helped make this release happen:

  • José Lorenzo Rodríguez
  • Mark Story

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Wed, 14 Sep 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/09/09/cakephp_287_released.html https://bakery.cakephp.org/2016/09/09/cakephp_287_released.html <![CDATA[CakePHP 2.8.7 Released]]> CakePHP 2.8.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.8.7. This is a maintenance release for the 2.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.8.7. See the changelog for every commit.

  • CakeRequest::header() can now read the Authorization header when it is set by fast-cgi.
  • TestShell now supports the --coverage-text option.
  • Folder::inPath() now only accepts absolute paths. It previously had ambiguous behavior when relative paths were used.
  • Mysql::insertMulti() now performs better, as all rows are inserted in one query.
  • FormHelper now generates security tokens correctly when AppHelper::url() injects parameters into generated URLs.

New Features

  • FormHelper::submit() now supports the confirm option.
  • Hash::sort() now supports sorting by the current locale.
  • CakeFixtureManager will only truncate tables if tables are not being dropped between test methods.

Contributors to 2.8.7

Thank you to all the contributors that helped make this release happen:

  • Kenya Yamaguchi
  • Marc Würth
  • Mark van Driel
  • Sebastien Barre
  • Val Bancer
  • mark_story
  • mscherer
  • ndm2
  • nojimage

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 09 Sep 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/09/05/cakephp_290rc1_released.html https://bakery.cakephp.org/2016/09/05/cakephp_290rc1_released.html <![CDATA[CakePHP 2.9.0-RC1 Released]]> CakePHP 2.9.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.9.0-RC1. This release is the first release candidate for the 2.9 branch which adds several new features to the 2.x series. We would appreciate any feedback you might have on the new features before their API definitions become stable.

Deprecations

  • The Object class has been deprecated due to upcoming PHP7 collisions. It has been renamed to CakeObject to avoid collisions with new PHP reserved words.

New Features

  • AuthComponent::user() now makes the user data available when using stateless authentication adapters.
  • DboSource::flushQueryCache() was added to allow more fine-grained control of query result caching when enabled.
  • The log messages created by ErrorHandler can now be more easily customized in subclasses.
  • Additional mime-types for ‘jsonapi’, and ‘psd’ were added.
  • Time & Datetime inputs no longer set a maxlength attribute when rendered as ‘text’ input types.

Contributors to 2.9.0-RC1

Thank you to all the contributors that helped make this release happen:

  • Gareth Ellis
  • Jorge González
  • José Lorenzo Rodríguez
  • Kenya Yamaguchi
  • Marc Würth
  • Mark Story
  • Mark van Driel
  • Sebastien Barre
  • chinpei215
  • mark_story
  • mscherer
  • ndm2
  • nojimage
  • schrolli

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Mon, 05 Sep 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/09/02/cakephp_333_released.html https://bakery.cakephp.org/2016/09/02/cakephp_333_released.html <![CDATA[CakePHP 3.3.3 Released]]> CakePHP 3.3.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.3. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.3. See the changelog for every commit.

  • HasMany::unlink() no longer emits errors when an empty list is provided.
  • The global event manager now tracks events when the local event manager does not have tracking enabled.
  • Selecting SQL computed fields in contained associations no longer emits warnings in PHP7
  • Redirect routes work correctly once again. Previously the beforeDispatch event was not stopped causing errors.
  • Folder::inPath() now only accepts absolute paths. It previously had ambiguous behavior when relative paths were used.
  • TestCase::getMockForModel() now ensures that generated mocks have the correct table name.
  • EntityTrait::clean() now resets the original value states. This means that you will no longer have access to original values after a successful save.
  • Marshalling no longer marks unchanged null values as dirty.
  • Numeric column names are now correctly quoted when identifier quoting is enabled.

New Features

  • Improved API docs in the ORM and Database packages.
  • Cake\TestSuite\EmailAssertTrait was added. This trait makes it easier to to write tests for Mailer classes.
  • Hash::sort() now supports sorting by the current locale.
  • FormHelper::create() now supports the templateVars option.

Contributors to 3.3.3

Thank you to all the contributors that helped make this release happen:

  • ADmad
  • Alexandros Solanos
  • Benjamin Tamási
  • Jad Bitar
  • Jeremy Harris
  • José Lorenzo Rodríguez
  • Mark Scherer
  • Mark Story
  • Nick Busey
  • Thinking Media
  • mscherer
  • ndm2

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 02 Sep 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/08/21/cakephp_332_released.html https://bakery.cakephp.org/2016/08/21/cakephp_332_released.html <![CDATA[CakePHP 3.3.2 Released]]> CakePHP 3.3.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.2. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.2. See the changelog for every commit.

  • Session cookies are now only sent by the PSR7 stack when the session is active.
  • Content-Type headers emitted from the PSR7 stack now include the charset.

Contributors to 3.3.2

Thank you to all the contributors that helped make this release happen:

  • Mark Story

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Sun, 21 Aug 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/08/19/cakephp_331_released.html https://bakery.cakephp.org/2016/08/19/cakephp_331_released.html <![CDATA[CakePHP 3.3.1 Released]]> CakePHP 3.3.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.1. This is a maintenance release for the 3.3 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.3.1. See the changelog for every commit.

  • AssetFilter now interacts properly with PSR7 based applications.
  • Cookie decryption when using the PSR7 stack now works properly.
  • Regressions around marshalling associated data have been fixed.
  • All associations now marshall correctly when TranslateBehavior is enabled.
  • BelongsToMany _joinData records with complex properties now hydrate correctly again when loaded with find().
  • Request::is() no longer caches results. This fixes an issue where parameterized detectors would return cached results when parameters are different.
  • CakeEmail::deliver() correctly uses default as the default transport configuration instead of ‘fast’.
  • MiddlewareStack::insertAt() behaves correctly when adding non-Closure based middleware.
  • Dispatcher filters are not doubly invoked when an application uses the PSR7 HTTP stack and dispatcher filters.
  • CrossSchemaTableExpression and automatic cross database join prefixing has been removed. This was a new feature in 3.3.0 that caused regressions for a number of folks. Removing the problematic feature feels like a better solution over trying to patch issues as they come up.
  • Session cookie rotation works correctly, when setting custom cookies, and using the PSR7 HTTP stack.

Minor Enhancements

  • Cake\ORM\SaveOptionsBuilder was added. This class provides a builder interface for building option sets for save operations. By using a fluent interface you can reduce the number of errors made.
  • Exceptions are now raised when duplicate named routes are connected.

Contributors to 3.3.1

Thank you to all the contributors that helped make this release happen:

  • Florian Krämer
  • Jad Bitar
  • José Lorenzo Rodríguez
  • Juan Basso
  • Mark Sch
  • Mark Story
  • Mirko Pagliai
  • Walther Lalk
  • antograssiot
  • saeideng

As always, we would like to thank all the contributors that opened issues, opened pull requests or updated the documentation.

Download a packaged release on github.

]]>
Fri, 19 Aug 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/08/12/cakephp_330_released.html https://bakery.cakephp.org/2016/08/12/cakephp_330_released.html <![CDATA[CakePHP 3.3.0 Released]]>

CakePHP 3.3.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.0. This is a stable release for the 3.3 release branch. 3.3.0 provides a number improvements both large and small to CakePHP. It also deprecates several features that will be removed in 4.0.0.

Upgrading to 3.3.0

You can use composer to upgrade to the new version of CakePHP:

php composer.phar require "cakephp/cakephp:~3.3"

Deprecations

  • Router::mapResources() is deprecated. Use routing scopes and $routes->resources() instead.
  • Router::redirect() is deprecated. Use routing scopes and $routes->redirect() instead.
  • Router::parseNamedParams() is deprecated. Named parameter backwards compatibility will be removed in 4.0.0
  • Cake\Http\Response has had the following methods deprecated because they overlap with PSR7 interface methods:
    • statusCode() use getStatusCode() instead.
    • encoding() use getEncoding() instead.
    • header() use getHeaderLine() instead.
    • cookie() use getCookie() instead.
    • version() use getProtocolVersion() instead.
  • Dispatcher Filters are now deprecated. Use the new HTTP middleware features.
  • RequestActionTrait has been deprecated. Refactor your code to use view cells instead.
  • Cake\\Utility\\Crypto\\Mcrypt engine has been deprecated as the mcrypt extension is deprecated in PHP 7.1. Use the openssl driver instead.

What’s new in 3.3.0?

The migration guide has a complete list of what’s new in 3.3.0, and what has been deprecated. We recommend you give that page a read when upgrading. A short list of the new features in 3.3.0 is:

  • PSR7 Middleware support has been added. This is an opt-in feature that allows you to leverage the increasing number of PSR7 middleware libraries from the broader PHP community in your CakePHP application.
  • A new streamlined workflow for TranslateBehavior that makes creating forms for multiple translation values easier than before.
  • Cake\Network\Http\Client has been moved to Cake\Http\Client. Its request and response objects now implement the PSR7 interfaces.
  • Additional support has been added for mapping complex data types. This makes it easier to work with geo-spatial types, and data that cannot be represented by strings in SQL queries.
  • A new JsonType was added. This new type lets you use the native JSON types available in MySQL and Postgres. In other database providers the json type will map to TEXT columns.
  • When entities are converted into JSON, the associated objects are no longer converted to an array first using toArray(). Instead, the jsonSerialize() method will be invoked on all associated entities. This gives you more flexibility and control on which properties are exposed in JSON representations of your entities.
  • You can now easily paginate multiple queries in a single controller action/view template.
  • To help you better manage cached data from the CLI environment, a shell command has been added that exposes methods for clearing cached data.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. 3.3.0 is a large release and would not have been possible without the community support and feedback.

Download a packaged release on github.

]]>
Fri, 12 Aug 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/08/12/cakephp_3214_released.html https://bakery.cakephp.org/2016/08/12/cakephp_3214_released.html <![CDATA[CakePHP 3.2.14 Released]]> CakePHP 3.2.14 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.14. This is a maintenance release for the 3.2 branch that fixes several community reported issues.

This is the last scheduled bugfix for 3.2. In the future, 3.2 will only receive security fixes until 3.4.0 is released. In order to continue receiving regular bugfixes, we recommend that you upgrade to 3.3.0.

Bugfixes

You can expect the following changes in 3.2.14. See the changelog for every commit.

  • The ORM\Table::buildValidator() hook method was added. Now all events that are fired from the table classes have matching hook methods. (@marksotry)
  • An interface has been created for Database\Type subclasses. (@davidyell)
  • Fatal errors are now reported more accurately in CLI scripts when using PHP7. (@jippi)
  • BelongsToMany::unlink() now returns true when it succeeds. This increases consistency with other methods. (@markstory)
  • Validator::equals() now works as you would expect. (@markstory)
  • CakePHP now relies on ~1.0 of chronos, which is now stable. (@markstory)
  • API documentation has been cleaned up of excess whitespace (@ravage84)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Fri, 12 Aug 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/08/05/cakephp_330rc_released.html https://bakery.cakephp.org/2016/08/05/cakephp_330rc_released.html <![CDATA[CakePHP 3.3.0-RC1 Released]]> CakePHP 3.3.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.0-RC1. This is a release candidate for 3.3.0. 3.3.0 provides a number improvements both large and small to CakePHP. It also deprecates several features that will be removed in 4.0.0.

Upgrading to this Version

You can use composer to upgrade to the RC version of CakePHP 3.3.0:

php composer.phar require "cakephp/cakephp:3.3.0-RC1"

What’s new in 3.3.0?

The migration guide has a complete list of what’s new in 3.3.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Bugfixes and Minor Features

This release fixes a few issues identified in the 3.3.0-beta3, as well as the recent bugfixes from master as documented in the 3.2.13 release notes. In addition to those changes 3.3.0-RC1 contains:

  • Cake\Database\TypeInterface was added. This interface formalizes an implied interface for database type classes. (@davidyell)
  • Middleware objects can be added by their string class name now. (@ADmad)
  • The Mcrypt backend for Security has been deprecated. (@antograssiot)
  • Content-Type headers are now transformed correctly between PSR7 and CakePHP request layers. (@dakota)
  • PHP7 now reports CLI errors with the original file/line number. (@Jippi)

If there are no major issues reported, we will release 3.3.0 stable next week.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Fri, 05 Aug 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/08/02/cakephp_286_released.html https://bakery.cakephp.org/2016/08/02/cakephp_286_released.html <![CDATA[CakePHP 2.8.6 Released]]> CakePHP 2.8.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.8.6. This is a maintenance release for the 2.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.8.6. See the changelog for every commit.

  • CakeEmail::deliver() now lets subclasses use the static method. (@kolorafa)
  • Welcome page now correctly displays PDO related errors. (@chinpei215)
  • Query timing metrics are reset on BEGIN/COMMIT/ROLLBACK statements, giving more accurate query timing data. (@Mensler)
  • AuthComponent no longer stores redirect URLs for JSON requests. (@gestudio)
  • Empty strings are removed from the secured field list in FormHelper. (@nojimage)
  • Icelandic locale (is-is) support was added. (@alex2690)
  • Stateless authentication adapters now store their user data on all requests, not just those that require authorization. (@biesbjerg)
  • Plugin associations defined with the short name as a key now behave consistently with other declaration modes. (@psaintjust)
  • Shutdown events are now triggered by the default error handling controllers. (@biesbjerg)
  • CakeResponse::header() now treats null values now works like setting ‘’ as a value. (@markstory)
  • Model::delete() no longer performs joins when simple conditions are used. (@mvdriel)
  • CakeSchema can now change column lengths to the database vendor’s defaults. (@andrej-griniuk)
  • A memory leak in the SmtpTransport has been fixed. (@Linnk)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Tue, 02 Aug 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/08/01/cakephp_3213_released.html https://bakery.cakephp.org/2016/08/01/cakephp_3213_released.html <![CDATA[CakePHP 3.2.13 Released]]> CakePHP 3.2.13 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.13. This is a maintenance release for the 3.2 branch that fixes several community reported issues and adds a few minor features.

Bugfixes

You can expect the following changes in 3.2.13. See the changelog for changes.

  • The Content-Type header works better in controller integration tests. (@dakota)
  • TreeBehavior no longer allows a node to be its own parent. (@markstory)
  • You can now write integration tests for methods that use secured forms with query string arguments in the URL. (@dakota)
  • FormHelper::error() now allows message translation by rule name, in addition to by error message string. (@oyas)
  • Table::validateUnique() no longer raises an exception when non-scalar values are received. (@markstory)
  • BelongsToMany::replaceLinks() no longer returns true when linked records fail to save because of application rules. (@markstory)
  • An exception will be raised when a Model.afterSave event handler aborts the transaction. (@lorenzo)
  • An optimization made to the DateTimeType has been reverted as it caused issues with user-land plugins. (@markstory)
  • Text::stripLinks() now recursively removes HTML. This method is now deprecated as stripping HTML with regular expressions is almost never truly safe. (@markstory)
  • Using associations that do not exist will now fail with an exception when marshalling data. (@markstory)
  • Cell::__toString() now displays more useful fatal errors in PHP7. (@thinkingmedia)
  • The console TableHelper now correctly handles double-width characters. (@slywalker)

Minor Enhancements

  • Text::truncateByWidth() was added. This method makes it easier to truncate text by its visual width instead of its character length. (@chinpei215)
  • The notExists() and exists() methods were added to QueryExpression. (@skie)
  • A warning is now logged by Cake\Network\Response when headers have already been sent. (@markstory)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Mon, 01 Aug 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/07/26/cakephp_330_beta3_released.html https://bakery.cakephp.org/2016/07/26/cakephp_330_beta3_released.html <![CDATA[CakePHP 3.3.0-beta3 Released]]> CakePHP 3.3.0-beta3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.0-beta3. This is a beta release for the 3.3 release branch. 3.3 provides a number improvements both large and small. It also deprecates several features that will be removed in 4.0.0. We would appreciate any feedback you might have on the new features before their API definitions become stable. In particular for the new PSR7 related features, as we see PSR7 as playing a big part in CakePHP’s future.

Upgrading to this Beta

You can use composer to upgrade to the new beta version of CakePHP 3.3.0:

php composer.phar require "cakephp/cakephp:3.3.0-beta3"

What’s new in 3.3.0?

The migration guide has a complete list of what’s new in 3.3.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Breaking Changes Since beta2

  • Cake\Http\MiddlewareStack is now Cake\Http\MiddlewareQueue. The new name better reflects the implementation (@ADmad)
  • The allowPartialNulls option in the ExistsIn rule has been renamed to allowNullableNulls. (@ionas)

Bugfixes and Minor Features

This release fixes a few issues identified in the 3.3.0-beta, as well as bugfixes from master.

  • The default ErrorController now always loads the RequestHandlerComponent. (@ADmad)
  • Router methods consistently use static now, making user-land extensions easier. (@skie)
  • BelongsToMany::replaceLinks() now returns false when persisting an entity fails due to application rules. (@markstory)
  • Throwing an exception from a Table’s afterSave now aborts the transaction correctly. (@lorenzo)
  • Text::stripLinks() now recursively strips HTML links. This method is also now deprecated. (@markstory)
  • A new exception class for HTTP status code 451 was added. (@Graziel)
  • ExistsIn now has better errors for missing associations. (@burzum)

Unless there are major issues with the 3.3.0-beta3 release, we will have a release candidate and stable release packaged in the 2-3 weeks. The documentation for 3.3.0 is now available in the book.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Tue, 26 Jul 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/07/16/cakephp_330_beta2_released.html https://bakery.cakephp.org/2016/07/16/cakephp_330_beta2_released.html <![CDATA[CakePHP 3.3.0-beta2 Released]]> CakePHP 3.3.0-beta2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.0-beta2. This is a beta release for the 3.3 release branch. 3.3 provides a number improvements both large and small. It also deprecates several features that will be removed in 4.0.0. We would appreciate any feedback you might have on the new features before their API definitions become stable. In particular for the new PSR7 related features, as we see PSR7 as playing a big part in CakePHP’s future.

Upgrading to this Beta

You can use composer to upgrade to the new beta version of CakePHP 3.3.0:

php composer.phar require "cakephp/cakephp:3.3.0-beta2"

What’s new in 3.3.0?

The migration guide has a complete list of what’s new in 3.3.0, and what has been deprecated. We recommend you give that page a read when upgrading.

Bugfixes and Minor Features

This release fixes a few issues identified in the 3.3.0-beta, as well as bugfixes from master.

  • Text::truncateWidth() was added. This method lets you truncate text by a visual width. This is useful when working with languages that have double width characters like Japanese. (@chinpei215)
  • IntegrationTestCase can now correctly stub out the Content-Type header. (@dakota)
  • Allow integration testing of secure post requests with a query string. (@dakota)
  • requestAction() has been deprecated. Use view cells instead.
  • TreeBehavior now disallows nodes from being their own parents. (@markstory)
  • Dispatch Filters are now integrated in the new PSR7 middleware stack for backwards compatibility. (@markstory)
  • Http\Client sends the correct content-type when array data is sent. (@markstory)
  • No exceptions are raised when empty file inputs are uploaded. (@ADmad)
  • FormHelper::error() now allows message translation by rule name, in addition to by error message string. (@oyas)
  • Table::validateUnique() no longer raises an exception when non-scalar values are received. (@markstory)

Unless there are major issues with the 3.3.0-beta release, we will have a release candidate and stable release packaged in the 4-5 weeks. The documentation for 3.3.0 is now available in the book.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 16 Jul 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/07/09/cakephp_330_beta_released.html https://bakery.cakephp.org/2016/07/09/cakephp_330_beta_released.html <![CDATA[CakePHP 3.3.0-beta Released]]>

CakePHP 3.3.0-beta Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.3.0-beta. This is a beta release for the 3.3 release branch. 3.3 provides a number improvements both large and small. It also deprecates several features that will be removed in 4.0.0. We would appreciate any feedback you might have on the new features before their API definitions become stable. In particular for the new PSR7 related features, as we see PSR7 as playing a big part in CakePHP’s future.

Upgrading to the Beta

You can use composer to upgrade to the beta version of CakePHP 3.3.0:

php composer.phar require "cakephp/cakephp:3.3.0-beta"

Behavior Changes

In minor releases, we release changes that are API compatible, but represent minor variances in behavior that may effect your application:

  • The default JSON encode format for Date and DateTime instances is now ISO-8601. This means that the timezone value contains a :. For example 2015-11-06T00:00:00+03:00
  • Controller::referer() now consistently omits the application base path when generating application local URLs. Previously string URLs would have the base path prepended to them, while array URLs would not.

Multiple Pagination Support Added

You can now paginate multiple queries in a single controller action/view template. By using the scope option you can use scoped query string parameters in pagination:

// In a controller action
$articles = $this->paginate($this->Articles, ['scope' => 'article']);
$tags = $this->paginate($this->Tags, ['scope' => 'tag']);
$this->set(compact('articles', 'tags'));

In your views, you can define the model being paginated to use scoped query string parameters:

// Create links for the paginated articles.
$this->Paginator->options(['defaultModel' => 'Articles']);

// Create links for the paginated tags.
$this->Paginator->options(['defaultModel' => 'Tags']);

PSR7 Middleware Added

In tandem with the deprecation of Dispatcher Filters, support for PSR7 middleware has been added. Middleware is major piece of the new HTTP stack, and is an opt-in component of CakePHP 3.3.0. By using the new HTTP stack, you can take advantage of features like:

  • Using middleware from plugins, and libraries outside of CakePHP.
  • Leverage the same response object methods in both the responses you get from Http\Client and the responses your application generates.
  • Be able to augment the response objects emitted by error handling and asset delivery.

See the middleware documentation for more information on how to use the new HTTP stack.

Http Client is now PSR7 Compatible

Cake\Network\Http\Client has been moved to Cake\Http\Client. Its request and response objects now implement the PSR7 interfaces.

ORM Improvements

  • Additional support has been added for mapping complex data types. This makes it easier to work with geo-spatial types, and data that cannot be represented by strings in SQL queries.
  • A new JsonType was added. This new type lets you use the native JSON types available in MySQL and Postgres. In other database providers the json type will map to TEXT columns.
  • Association::unique() was added. This method proxies the target table’s unique() method, but ensures that association conditions are applied.
  • isUnique rules now apply association conditions.
  • When entities are converted into JSON, the associated objects are no longer converted to an array first using toArray(). Instead, the jsonSerialize() method will be invoked on all associated entities. This gives you more flexibility and control on which properties are exposed in JSON representations of your entities.
  • Table::newEntity() and Table::patchEntity() will now raise an exception when an unknown association is in the ‘associated’ key.
  • RulesChecker::validCount() was added. This new method allows to apply rules to the number of associated records an entity has.
  • The partialNullsPass option was added to the existsIn rule. This option allows rules to pass when some columns are null.

Cache Shell Added

To help you better manage cached data from the CLI environment, a shell command has been added that exposes methods for clearing cached data:

// Clear one cache config
bin/cake cache clear <configname>

// Clear all cache configs
bin/cake cache clear_all

Other Changes

There are many other great new things in 3.3.0. Refer to the migration guide for all the greatness 3.3.0 brings.

Deprecations

3.3.0 will deprecate a number of features. Refer to the deprecated features for more details. Deprecated features will not be removed until 4.0.0.

Unless there are major issues with the 3.3.0-beta release, we will have a release candidate and stable release packaged in the 4-5 weeks. The documentation for 3.3.0 is now available in the book.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 09 Jul 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/07/08/cakephp_3212_released.html https://bakery.cakephp.org/2016/07/08/cakephp_3212_released.html <![CDATA[CakePHP 3.2.12 Released]]> CakePHP 3.2.12 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.12. This is a maintenance release for the 3.2 branch that fixes several community reported issues and adds a few minor features.

Bugfixes

You can expect the following changes in 3.2.12. See the changelog for changes.

  • The console TableHelper more gracefully handles empty data. (@thinkingmedia)
  • Junction table conditions are now reset correctly. (@ulistaerk)
  • ExistsIn and IsUnique application rules are no longer invoked twice. (@markstory)
  • Generated junction table classes now inherit the connection of the table defining the BelongsToMany association. This makes it easier to have plugin specific connections. (@markstory)
  • URLs with uppercase protocols are now autolinked by TextHelper. (@ADmad)
  • Cache groups defined in injected cache engine instances are now registered correctly. (@dakota)
  • Request::header() can now read the Content-Length and Content-Type header values. (@markstory)

Minor Enhancements

  • Schema reflection will now include per-column collation data when available. (@chinpei215)
  • TimeHelper now supports an outputTimezone config option. This lets you set a global output timezone making it easier to localise formatted dates/times. (@markstory)
  • HtmlHelper::image() now supports CID: URLs. (@markstory)
  • Table::findOrCreate() now supports an atomic option. (@thinkingmedia)
  • Performance optimizations in find(list) (@dakota)
  • Folder::inCakePath() is now deprecated. Use Folder::inPath() instead. (@markstory)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Fri, 08 Jul 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/06/20/cakephp_3211_released.html https://bakery.cakephp.org/2016/06/20/cakephp_3211_released.html <![CDATA[CakePHP 3.2.11 Released]]> CakePHP 3.2.11 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.11. This is a maintenance release for the 3.2 branch that fixes several community reported issues and adds a few minor features.

Bugfixes

You can expect the following changes in 3.2.11. See the changelog for every commit.

  • SQLServer schema correctly handles default values of ‘NULL’. (@ADmad)
  • Model prefixed data is now merged with un-prefixed by the Marshaller instead of being used instead of un-prefixed data. (@markstory)
  • HttpClient will now correctly timeout connections from servers that never close the connection. (@chinpei215)
  • The Marshaller now correctly uses custom primary keys consistently. (@ndm2)
  • Invalid maxLimit values no longer result in a division by zero error. (@markstory)
  • SQLServer driver can now reflect views. (@tgr0ss)
  • A more clear exception is raised when associations define invalid primary keys. (@burzum)
  • A clearer exception is raised when validator methods don’t return a Validator instance. (@dakota)
  • Sessions are now garbage collected when they expire, not after a long delay. (@hyaza)
  • RouteBuilder::redirect() now lets you use custom route classes. (@burzum)

Minor Enhancements

  • API documentation improvements (@ravage84, @ADmad, @frankfoerster, @ndm2)
  • HttpClient OAuth 1 adaptor now supports RSA-SHA1. (@TheFRedFox)
  • bin/cake --version now outputs the installed version of CakePHP. (@alysson-azevedo)
  • EventManager instances can now track the events they dispatch. (@burzum)
  • Route matching results now include a _matchedRoute parameter. This provides access to the template of the matched route. (@lorenzo)
  • Response::mapType() is now more efficient for common media types. (@jrbasso)
  • DateTimeType objects only create instances as needed now. (@lorenzo)
  • FormHelper::postButton() lets you customize the form element. (@TheFredFox)
  • TestCase::assertEventFired() and TestCase::assertEventFiredWith() were added. These methods make it easier to assert that events were triggered. (@jeremyharris)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Mon, 20 Jun 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/06/12/cakephp_285_released.html https://bakery.cakephp.org/2016/06/12/cakephp_285_released.html <![CDATA[CakePHP 2.8.5 Released]]> CakePHP 2.8.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.8.5. This is a maintenance release for the 2.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.8.5. See the changelog for every commit.

  • Bake now recommends using the FlashComponent instead of the deprecated SessionComponent. (@xhs345)
  • RequestHandlerComponent will now automatically parse request data for PATCH requests as it does for POST. (@icyrizard)
  • Sqlite now correctly handles DEFAULT CURRENT_TIMESTAMP. (@MarkusBauer)
  • FormHelper now resets the unlocked fields when a form is closed (@nojimage)

Minor Features

  • ApcEngine now supports APCu on PHP7. (@jrbasso)
  • Folder::read() can now sort by modified time. (@steampilot)
  • FormHelper::radio() now supports the fieldset option for customizing the generated fieldset element. (@xhs345)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 12 Jun 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/05/26/cakephp_3210_released.html https://bakery.cakephp.org/2016/05/26/cakephp_3210_released.html <![CDATA[CakePHP 3.2.10 Released]]> CakePHP 3.2.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.10. This is a maintenance release for the 3.2 branch that fixes several community reported issues and adds a few minor features.

Bugfixes

You can expect the following changes in 3.2.10. See the changelog for every commit.

  • Query::insert() now resets columns when called multiple times. (@markstory)
  • The ExistsIn rule no longer enforces constraints on new entities that have no dirty fields. This reverts a problematic change introduced in 3.2.9. (@markstory)
  • Exceptions for missing mailer transports have been improved. (@graziel)
  • Request URLs that contain another embedded URL are now handled correctly. (@chinpei215)
  • FormHelper now resets the unlocked fields each time end() is called. This prevents fields unlocked in one form from being unlocked in subsequent forms. (@nojimage)
  • Multi-part mime message boundaries are now generated with Security::randomBytes(). This removes the possibility of timing attacks on mime-message boundary markers. (@chinpei215)
  • RequestHandler no longer overwrites response content-types when no extension has been parsed. (@ADmad)
  • The insecure fallback for Security::randomBytes() behaves more consistently with the secure modes now. (@chinpei215)
  • The IsUnique rule once again enforces unique-ness as a SQL constraint would. This means that NULL values will never be equivalent for unique checks. This reverts a problematic change introduced in 3.2.9. (@markstory)
  • The BelongsToMany::find() uses the correct foreign key columns when creating queries that involve junction table join conditions. (@TheFRedFox)

Minor Enhancements

  • Folder::subdirectories() was added (@frankfoerster).
  • MissingAction and MissingTemplate error pages are now compatible with errors coming out of Mailers. (@markstory)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Thu, 26 May 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/05/16/cakephp_329_released.html https://bakery.cakephp.org/2016/05/16/cakephp_329_released.html <![CDATA[CakePHP 3.2.9 Released]]> CakePHP 3.2.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.9. This is a maintenance release for the 3.2 branch that fixes several community reported issues and adds a few minor features.

Bugfixes

You can expect the following changes in 3.2.9. See the changelog for every commit.

  • ‘chef’ is now pluralized correctly. (@ADmad)
  • Valiation::notBlank() now accepts ‘0’. (@dereuromark)
  • CookieComponent now correctly uses the encryption key configured on specific top-level keys. (@jorisvaesen)
  • SQLite schema generation now handles DEFAULT 'NULL' correctly. (@chinpei25)
  • Cache\Engine\FileEngine uses less memory when writing cache data. (@psaintjust)
  • EntityContext no longer modifies query objects. (@lorenzo)
  • Session::renew() no longer triggers errors when object destruction fails. (@lorenzo)
  • The ExistsIn rule now correctly applies on new entities that don’t have the required columns set. (@raul338)
  • View classes set with viewBuilder() now take precedence over those defined with the deprecated viewClass property. (@markstory)
  • CompletionShell now correctly lists all subcommand names. (@markstory)
  • Bound parameters in eagerly loaded associations via the subquery strategy now work correctly. (@greew)
  • The IsUnique rule no longer emits field = NULL when properties are null. Instead it emits IS NULL. (@markstory)
  • Hash::merge() no longer emits an error when merging more than 2 arrays, containing mixed string/array values. (@markstory)
  • FormHelper::input() now forwards additional options to error() allowing you to turn of HTML escaping if you so wish. (@pperejon)

Minor Enhancements

  • Cache::clearAll() was added. This method lets you clear all data from all configured cache engines. (@mirkopagliai)
  • The ValidCount rule was added. This rule lets you ensure associations have the required number of associated values more easily. (@burzum)
  • BaseAuth now passes the ‘username’ to custom finders. (@phillaf)
  • Validator::hasAtLeast() and Validator::hasAtMost() were added. (@lorenzo)
  • Folder::read() now supports ordering files by modified time, or name. (@Tzaoh)
  • New mastercard numbers are now accepted by Validation::luhn (@psaintjust)
  • Date::setDefaultLocale() and Time::setDefaultLocale() were added. These methods replace direct access to the $defaultLocale property. (@markstory)
  • Named route mismatches now have better error messages. (@markstory)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Mon, 16 May 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/05/02/cakephp_284_released.html https://bakery.cakephp.org/2016/05/02/cakephp_284_released.html <![CDATA[CakePHP 2.8.4 Released]]> CakePHP 2.8.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.8.4. This is a maintenance release for the 2.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.8.4. See the changelog for every commit.

  • FormHelper::postLink() now correctly generates SecurityComponent field hashes when used within another form. (@MarkusBauer)
  • Validation::phone() now accepts ‘N11’ exchanges for North American phone numbers. (@markstory)
  • The Equifax Secure Certificate Authority root certificate was re-added. This fixes several issues with the certificate bundle update in 2.8.3. (@markstory)
  • BlowfishPasswordHasher now generates a random salt when comparing to a hashed password of ‘’. This prevents incorrect password matching on empty values. (@markstory)
  • FixtureTask honours the --records and --schema options when creating a fixture in a non-interactive fashion. (@markstory)
  • Several missing European locales were added (@bancer)
  • HTTP Range header parsing is more resilient (@markstory)
  • A regression introduced in 2.8.0 in FormHelper when handling the deprecated action option has been fixed. (@markstory)

Minor Features

  • Improved API docs (@jrbasso, @ravage84)
  • Added example configuration for using letsencrypt with CakePHP. (@ravage84)
  • You can now set the Response class used in ControllerTestCase (@felixmaier1989)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Mon, 02 May 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/04/24/cakephp_328_released.html https://bakery.cakephp.org/2016/04/24/cakephp_328_released.html <![CDATA[CakePHP 3.2.8 Released]]> CakePHP 3.2.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.8. This is a maintenance release for the 3.2 branch that fixes several community reported issues and adds a few minor features.

Bugfixes

You can expect the following changes in 3.2.8. See the changelog for every commit.

  • The Equifax Secure Certificate Authority root certificate was re-added. This fixes several issues with the certificate bundle update in 3.2.7. (@markstory)
  • Collection::every() now returns false on an empty collection (@ADmad).
  • Security::randomBytes() emits a warning when openssl is used and there was not a strong source of entropy available. (@markstory)
  • Text::truncate() better handles short words within HTML tags when the html and exact options are used. (@markstory)
  • Dependencies for cakephp/orm were updated. (@lorenzo)

Minor Enhancements

  • Improved API documentation (@thinkingmedia, @chav170)
  • ConsoleOptionParser now sorts options an arguments when displaying help. (@thinkingmedia)
  • Table::saveMany() was added. This method allows you to save multiple entities in a single method call. (@ADmad)

CakeFest Tickets Available Now

Tickets are now available for CakeFest 2016. Join us in Amsterdam for 2 days of workshops followed by 2 days of talks.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 24 Apr 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/04/10/cakephp_327_released.html https://bakery.cakephp.org/2016/04/10/cakephp_327_released.html <![CDATA[CakePHP 3.2.7 Released]]> CakePHP 3.2.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.7. This is a maintenance release for the 3.2 branch that fixes several community reported issues and adds a few minor features.

Bugfixes

You can expect the following changes in 3.2.7. See the changelog for every commit.

  • Connection drivers now support short classname references. (@ndm2)
  • Exception types raised by SecurityComponent have been updated to match the documented values. (@justinyost)
  • FormHelper postLink elements generated inside an open form now work as expected. (@markstory)
  • Schema reflection in MySQL now preserves TEXT & BLOB column lengths. (@HavokInspiration)
  • The bundled Certificate Authority file was updated using the latest Mozilla Certificate bundle. (@markstory)
  • Empty JSON values can be read by HttpClient. (@ADmad)

Minor Enhancements

  • Text::slug() was added. This method leverages the intl extension, and will replace Inflector::slug() which is now deprecated. (@ADmad)
  • Text::transliterate() was added. This method allows unicode strings to be transliterated into ASCII using the intl extension. (@ADmad)
  • Support for TINYTEXT, MEDIUMTEXT and LONGTEXT was added. These types are compatible with all core drivers. (@HavokInspiration)
  • Support for TINYBLOB, MEDIUMBLOG and LONGBLOB was added. These types are compatible with all core drivers. (@HavokInspiration)

CakeFest Tickets Available Now

Tickets are now available for CakeFest 2016. Join us in Amsterdam for 2 days of workshops followed by 2 days of talks.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 10 Apr 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/03/28/cakephp_283_3018_3113_326_released.html https://bakery.cakephp.org/2016/03/28/cakephp_283_3018_3113_326_released.html <![CDATA[CakePHP 2.8.3, 3.0.18, 3.1.13 and 3.2.6 Released]]> CakePHP 2.8.3, 3.0.18, 3.1.13 and 3.2.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.8.3, 3.0.18, 3.1.13, and 3.2.6. These releases contain security fixes. 3.2.6 and 2.8.3 also contain bugfixes.

Security Fixes

These releases fix a weakness in Validation::uploadedFile() where file inputs could be manipulated to accept existing files on the server. This could potentially lead to an attacker being able to access sensitive system files. If you are using Validation::uploadedFile() and not checking mime-types or ensuring that the file was in-fact an uploaded file, you should upgrade. We’d like to thank Kurita Takashi for reporting this issue.

Bugfixes in 2.8.3

  • Improved API docs. (@ravage84)
  • Boolean false is now treated as 0 when creating selectboxes. This allows select widgets to be used for boolean columns. (@markstory)
  • Optimized nested association loading. (@tharlinsmith)
  • ControllerTestCase::testAction() now clears the request stack after each call. This fixes issues where multiple calls to testAction() could not be done in the same test method when using array URLs. (@markstory)

Bugfixes in 3.2.6

  • Improved API documentation (@Sethathi, @thinkingmedia)
  • Queries generated by the marshaller now correctly alias primary key columns. (@markstory)
  • Complex conditions in BelongsToMany associations now work correctly. (@markstory)
  • Select box widgets for boolean values now generate correctly. false is now treated as equivalent to 0. (@markstory)
  • Http\Client now supports ssl_verify_peer_name option correctly now. (@curtisgibby)
  • CakePHP can now be used from within a phar file. (@lorenzo)
  • Bound parameters in sub-queries now propagate to their parent query. (@markstory)
  • A regression in the Postgres schema reflection code has been corrected. (@markstory)
  • Accessing TitleCase properties from entities now works as expected. (@dakota)
  • Cells in sub-namespaces now work as one would expect. (@markstory)
  • ‘’ is now a valid value for time inputs. (@markstory)

New Features in 3.2.6

  • Cake\ORM\Marshaller::one() now supports a forceNew option that can be used to create ‘new’ belongsToMany association records when the primary key is not defined. (@Tzaoh)
  • SecurityComponent now emits helpful error messages when secure field comparisons fail and an application is in debug mode. (@steinkel)
  • Validation::localizedTime() was added. (@ypnos-web)
  • Error logs contain request URL and referrer URLs. (@mirko-paglial)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Mon, 28 Mar 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/03/13/cakephp_2613_2711_282_3017_3112_325_released.html https://bakery.cakephp.org/2016/03/13/cakephp_2613_2711_282_3017_3112_325_released.html <![CDATA[CakePHP 2.6.13, 2.7.11, 2.8.2, 3.0.17, 3.1.12, and 3.2.5 Released]]> CakePHP 2.6.13, 2.7.11, 2.8.2, 3.0.17, 3.1.12, and 3.2.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.6.13, 2.7.11, 2.8.2, 3.0.17, 3.1.12, and 3.2.5. These releases contain security fixes. 3.2.5 and 2.8.2 also contain bugfixes.

Security Fixes

These releases contain fixes for arbitrary address spoofing when using the clientIp() method of the request object. Previously, this method would use the HTTP_CLIENT_IP header which can be spoofed easily. If you are using this method as a source of trusted data we recommend you upgrade. We’d like to thank the independent security researcher Dawid Golunski for discovering this vulnerability in CakePHP which was reported to us by Beyond Security’s SecuriTeam Secure Disclosure program.

Bugfixes in 2.8.2

  • Notice errors in request->referer() in PHP7 with no referrer were fixed. (@phlyper)
  • Email logs now include the subject and to headers when using the MailTransport (@garas)
  • Updated API documentation (@xhs345)
  • A regression in DbAcl introduced in 2.8.1 was fixed around how inherited permissions and explicit deny permissions interacted (@markstory)

Bugfixes in 3.2.5

  • Postgres schema reflection performs better on large databases. (@donkeyx, @markstory)
  • Xcache cache engine can now store objects (@SmiSoft)
  • Malformed HTTP Range headers no longer emit warnings. (@markstory)
  • Improved API documentation (@markstory, @curtisgibby, @dereuromark)
  • The __xn and __dxn functions now correctly use plural forms. (@chinpei215)

New Features in 3.2.5

  • assertCookieNotSet was added to IntegrationTestCase. (@lorenzo)
  • The ‘obj’ fetch type was added to PDOStatement. (@davalb)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 13 Mar 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/03/06/cakephp_324_released.html https://bakery.cakephp.org/2016/03/06/cakephp_324_released.html <![CDATA[CakePHP 3.2.4 Released]]> CakePHP 3.2.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.4. This is a maintenance release for the 3.2 branch that fixes several community reported issues and adds a few minor features.

Bugfixes

You can expect the following changes in 3.2.4. See the changelog for every commit.

  • Table names are now quoted in SQLserver schema reflection when reflecting indexes. This allows table names in different schemas to be used. (@markstory)
  • Validation::date(), Validation::dateTime() and Validation::time() now accept DateTimeImmutable. (@markstory)
  • Warning related to PO file parsing when a message exists as both a context inclusive and context free message have been fixed. In this situation, the first message encountered will be used and the other will not be accessible. (@markstory)
  • Serialization errors when reading negative numbers from Redis have been fixed. (@markstory)
  • The ORM will now emit warnings when association properties shadow properties in a table. (@ADmad)
  • Default string values now work correctly in Postgres. (@chinpei215)
  • RelativeTimeFormatter now correctly formats ‘about a month ago’/’in about a month’ (@chinpei215)
  • XML and JSON responses no longer contain stack traces. Including stack traces could cause fatal errors when unserializable objects were in the stack trace. (@markstory)
  • Routes don’t recompile each time they are used within a single request. (@Phillaf)
  • Unlinking HasMany associations correctly prefixes conditions, which fixes issues when an association finder includes additional associations by default. (@greew)
  • Unlinking empty HasMany associations no longer emits warnings on null. (@lorenzo)
  • UnaryExpression now correctly calls traverse on child expressions. (@greew)
  • Time formatting no longer emits errors when using Russian or other languages that have more than 2 plural forms. (@lorenzo)
  • Response::file() no longer attempts to clear the output buffering. This allows test cases involving files to not be marked as ‘risky’ by PHPUnit. (@lorenzo)

Minor Enhancements

  • Improved API docs (@btaens, @markstory, @antograssiot)
  • Response::getFile() was added. This gives you a way to read the file out of a response, which is helpful in testing. (@markstory)
  • Association::className() was added. This lets you read the className option out of an association. (@ifunk)
  • JsonConfig now pretty prints dumped files (@markstory)
  • Routes can now use the multibytePattern option to enable multi-byte sub patterns in routes. (@markstory)
  • UrlHelper::css(), UrlHelper::script() and UrlHelper::image() were added. (@jadb, @ADmad)
  • MultipleCheckboxWidget now handles grouped options. This makes it more consistent with Select boxes. (@markstory)
  • IntegrationTestCase::assertFileResponse was added. This method makes it easier to assert file responses. (@lorenzo)

We’d like to welcome @chinpei215 to the CakePHP team. He has been instrumental in finding and fixing a number of security issues in CakePHP.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 06 Mar 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/02/27/cakephp_281_released.html https://bakery.cakephp.org/2016/02/27/cakephp_281_released.html <![CDATA[CakePHP 2.8.1 Released]]> CakePHP 2.8.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.8.1. This is a maintenance release for the 2.8 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.8.1. See the changelog for every commit.

  • API documentation improvements. (@garas, @bcrowe, @dereuromark, @ravage84)
  • Validation::uploadedFile() no longer cares about key order. (@markstory)
  • CakeRequest now reads the request content-type in a way that is compatible with the built-in PHP webserver. (@challgren)
  • DbAcl inherited permissions for ‘*’ now take into account explicit allow/inherit in leaf nodes. (@markstory)
  • HttpSocket now correctly parses empty headers. (@markstory)
  • Negative numbers can now be read from RedisCacheEngine. (@markstory)

Minor Features

  • Postgres now supports a uuid type. This uses the native uuid type in Postgres. (@skie)
  • SecurityComponent::requireAuth() is now deprecated. It was already removed from 3.x. This makes the deprecation in 2.x official. (@ravage84)
  • Security::randomBytes() was added. This method replaces Text::uuid() as the seed value for CSRF token generation. The new method emits a warning if an insecure source of random data is used. This warning indicates that your CSRF tokens could be susceptible to timing attacks. (@markstory)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 27 Feb 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/02/21/cakephp_3016_3111_323_released.html https://bakery.cakephp.org/2016/02/21/cakephp_3016_3111_323_released.html <![CDATA[CakePHP 3.0.16, 3.1.11, and 3.2.3 Released]]> CakePHP 3.0.16, 3.1.11, and 3.2.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.16, 3.1.11, and 3.2.3. These releases contain security fixes. 3.2.3 and also contains bugfixes.

Security Fixes

An issue in PaginatorHelper has been fixed that would allow manipulation of pagination links. A malicious user could manipulate URLs to point at arbitrary destinations. A huge thank-you to Kurita Takashi for notifying us of this issue, and reviewing the fix.

Bugfixes in 3.2.3

In addition to the security fix, 3.2.3 contains the following bug fixes:

  • Camel-backed virtual properties can be accessed once again. This was a regression in 3.2.0. (@markstory)
  • Long paths in the error pages are now wrapped. (@bcrowe)
  • _joinData is no longer lost when marshalling existing BelongsToMany records using the id attributes. (@markstory)
  • Date::parseDate() now correctly handles timezones. (@lorenzo)
  • Setting a Cell’s templatePath inside the action now works. (@markstory)
  • FormHelper now consistently uses formatTemplate() internally. (@ypnos-web)
  • Hash::sort() now correctly sorts DateTimeImmutable objects. (@ndm2)
  • Security::randomBytes() was added. This method wraps the various ways to get secure random data. If secure data cannot be found, insecure data will be used and a warning will be emitted. (@markstory)
  • CSRF tokens are now generated with Security::randomBytes(). (@markstory)
  • Custom template paths are now factored into view path generation. (@phillaf)

Minor Enhancements

  • Improved API documentation (@dereuromark, @ndm2, @fxleblanc)
  • EventManager::matchingListeners() was added, allowing the caller to find listeners bound to the named event. (@jeffblack360)
  • Table::find('list') will automatically use the selected fields if there are 2 of them. This makes find(list) behave more consistently with 2.x easing migration. (@dereuromark)
  • TableRegistry::get() now accepts a connectionName parameter. This lets you define the connection by name instead of requiring the object. (@skie)
  • QueryExpression::identifierEquals() was added to increase compatiblity across the supported database vendors. (@skie)
  • App::shortName() was added. (@Marlinc)
  • AuthComponent finder option now permits finder options to be defined. (@ADmad)

CakeFest Call for Speakers is Still Open

CakeFest 2016 will be in Amsterdam from May 26th - May 29th. If you’d like to speak at CakeFest the call for [speakers is still open](https://cakefest.org/). Tickets [are also on sale](https://cakefest.org/tickets) at a special rate until the speaker list is announced.

CakePHP Newsletter

Be sure to sign up for our [Newsletter](https://cakephp.org/newsletter/signup) to stay updated with what is happening with CakePHP. We also have a security list for anyone that is interested in receiving details about security releases.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 21 Feb 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/02/11/cakephp_322_released.html https://bakery.cakephp.org/2016/02/11/cakephp_322_released.html <![CDATA[CakePHP 3.2.2 Released]]> CakePHP 3.2.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.2. This is a maintenance release for the 3.2 branch that fixes several community reported issues and adds a few minor features.

Bugfixes

You can expect the following changes in 3.2.2. See the changelog for every commit.

  • TimeHelper now interacts with immutable time objects correctly. (@antograssiot)
  • Query::matching() now correctly type-casts hydrated results in the _matchingData property. (@markstory)
  • When results are iterated in a result formatter, the _translations property is now always present. (@markstory)
  • Hydrating records containing date time fields in non-english locales no longer fatally errors. (@markstory)
  • Cell actions can once again set the template name. (@HavokInspiration)
  • Cell template names can now be set with the viewBuilder() (@HavokInspiration)
  • SecurityComponent now correctly handles field names ending in []. (@markstory)
  • Symlinked configuration files now load correctly. (@tersmitten)
  • The ProgressShellHelper now renders correctly on putty. (@HavokInspiration)
  • The test suite no longer fails to rebuild fixtures after fatal errors. (@HavokInspiration)
  • Hash::sort() better handles sorting on sparse data. (@markstory)

Minor Enhancements

  • API documentation improvements (@dereuromark, @bcrowe, @saeideng, @gmponos)
  • cake plugin loaded was added. This CLI tool lets you list the loaded plugins your application uses. (@dereuromark)
  • Exception messages from fixture creation are now clearer. (@burzum)
  • Fixtures now allow schema to be predefined and not managed by the fixtures. (@HavokInspiration)
  • cake i18n extract now runs faster. (@markstory)
  • CakeTestCase::assertSameAsFile() now allows expected results to be updated by setting an environment variable. (@AD7six)
  • SecurityComponent::requireAuth() is now deprecated and will be removed in 4.x
  • IntegrationTestCase::assertHeaderContains() was added. (@half2me)
  • FormHelper::text() and related functions now accept 'id' => true. This option enables the same automatic ID generation used in FormHelper::input(). (@ADmad)
  • Sub-split repositories now contain license files and status badges (@bravo-kernel)
  • FormHelper will now automatically load application widget classes that overload the core ones. (@ADmad)
  • HTTP status 422 was added to Response. (@jadb)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Thu, 11 Feb 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/02/06/cakephp_280_released.html https://bakery.cakephp.org/2016/02/06/cakephp_280_released.html <![CDATA[CakePHP 2.8.0 Released]]>

CakePHP 2.8.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.8.0. This release is the first stable release for the 2.8 branch which adds several new features to the 2.x series.

Deprecations

  • The action option in FormHelper::create() has been deprecated, as it was in 3.x. Note that this now makes the action key of an array URL consistently respected for the generation of the DOM ID. If you used the deprecated key you will want to compare the generated ID for forms before and after your upgrade.

PHP7 Compatibility

CakePHP 2.8 is compatible with, and tested against PHP7.

New Features

  • When handling fatal errors, CakePHP will now adjust the memory limit by 4MB to ensure that the error can be logged correctly. You can disable this behavior by setting Error.extraFatalErrorMemory to 0 in your Config/core.php.
  • Cache::add() has been added. This method lets you add data to a cache if the key did not already exist. This method will work atomically in Memcached, Memcache, APC and Redis. Other cache backends will do non-atomic operations.
  • CakeTime::listTimezones() has been changed to accept array in the last argument. Valid values for the $options argument are: group, abbr, before, and after.
  • A new option no-locations has been added to Console/cake i18n. When enabled, this option will disable the generation of location references in your POT files.
  • Hash::sort() now supports case-insensitive sorting via the ignoreCase option.
  • Magic finders now support custom finder types. For example if your model implements a find('published') finder, you can now use findPublishedBy and findPublishedByAuthorId functions through the magic method interface.
  • The Session.cacheLimiter configuration option was added. This option lets you define the cache control headers used for the session cookie. The default is must-revalidate.

3.x Backports

  • Shell Helpers have been backported from 3.x.
  • Validation::uploadedFile() was backported from 3.x.
  • 'url' => false is now supported for FormHelper::create() to allow form tags to be created without HTML action attribute.

The documentation for 2.8.0 is already available in the book and the API.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. Development will now begin on 2.9.0 with the target of releasing sometime in July of 2016.

Download a packaged release on github.

]]>
Sat, 06 Feb 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/02/05/cakephp_2710_released.html https://bakery.cakephp.org/2016/02/05/cakephp_2710_released.html <![CDATA[CakePHP 2.7.10 Released]]> CakePHP 2.7.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.7.10. This is a maintenance release for the 2.7 branch that fixes several community reported issues.

Outside of security releases, this will be the final release for 2.7. We recommend you upgrade to 2.8.x to continue receiving bugfixes.

Bugfixes

You can expect the following changes in 2.7.10. See the changelog for every commit.

  • Improved API docs. (@ndm2)
  • The IN operator now works in conditions when only one element is to be matched. (@pedrofs)
  • Support for NOT IN added for Model::find() conditions. This makes 2.x finders more compatible with 3.x (@pedrofs)
  • cake i18n extract now behaves better when CakePHP is installed with composer. (@garas)
  • Configure::load() can now read symlinked configuration files (@tersmitten)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Fri, 05 Feb 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/01/30/cakephp_3110_and_321_released.html https://bakery.cakephp.org/2016/01/30/cakephp_3110_and_321_released.html <![CDATA[CakePHP 3.1.10 and 3.2.1 Released]]> CakePHP 3.1.10 and 3.2.1 Released

The CakePHP core team is pleased to announce the immediate availability of CakePHP 3.1.10 and 3.2.1. These maintenance releases fix a regression with yesterday’s release of 3.1.9 and 3.2.0.

Bugfixes

You can read all of the changes in 3.1.10 and the changes in 3.2.1 in the respective changelogs.

  • A regression nested prefix routes being incorrectly inflected has been corrected. (@ADmad)

As always, a big thanks to all the community members that helped make this release happen by reporting issues and submitting pull requests.

Download a packaged release on github.

]]>
Sat, 30 Jan 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/01/29/cakephp_320_released.html https://bakery.cakephp.org/2016/01/29/cakephp_320_released.html <![CDATA[CakePHP 3.2.0 Released]]>

CakePHP 3.2.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.0. This is the first stable release for the 3.2 branch. Going forward 3.1 will only receive security updates. 3.2 is a backwards compatible release with 3.1 and 3.0 and provides new features and performance improvements.

Minimum PHP 5.5 Required

CakePHP 3.2 requires at least PHP 5.5.9. By adopting PHP 5.5 we can provide better Date and Time libraries and remove dependencies on password compatibility libraries.

Disabling Deprecation Warnings

Upon upgrading you may encounter several deprecation warnings. These warnings are emitted by methods, options and functionality that will be removed in CakePHP 4.x, but will continue to exist throughout the lifetime of 3.x. While we recommend addressing deprecation issues as they are encountered, that is not always possible. If you’d like to defer fixing deprecation notices, you can disable them in your config/app.php:

'Error' => [
    'errorLevel' => E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED,
]

The above error level will suppress deprecation warnings from CakePHP.

Carbon Replaced with Chronos

The Carbon library has been replaced with cakephp/chronos. This new library is a fork of Carbon with no additional dependencies. It also offers a calendar date object, and immutable versions of both date and datetime objects.

New Date Object

The Date class allows you to cleanly map DATE columns into PHP objects. Date instances will always fix their time to 00:00:00 UTC. By default the ORM creates instances of Date when mapping DATE columns now.

New Immutable Date and Time Objects

The FrozenTime, and FrozenDate classes were added. These classes offer the same API as the Time object has. The frozen classes provide immutable variants of Time and Date. By using immutable objects, you can prevent accidental mutations. Instead of in-place modifications, modifier methods return new instances:

use Cake\I18n\FrozenTime;

$time = new FrozenTime('2016-01-01 12:23:32');
$newTime = $time->modify('+1 day');

In the above code $time and $newTime are different objects. The $time object retains its original value, while $newTime has the modified value. As of 3.2, the ORM can map date/datetime columns into immutable objects as well.

CorsBuilder Added

In order to make setting headers related to Cross Origin Requests (CORS) easier, a new CorsBuilder has been added. This class lets you define CORS related headers with a fluent interface.

RedirectRoute raises an exception on redirect

Router::redirect() now raises Cake\Network\Routing\RedirectException when a redirect condition is reached. This exception is caught by the routing filter and converted into a response. This replaces calls to response->send() and allows dispatcher filters to interact with redirect responses.

ORM Improvements

  • Containing the same association multiple times now works as expected, and the query builder functions are now stacked.
  • Function expressions now correctly cast their results. This means that expressions like $query->func()->current_date() will return datetime instances.
  • Field data that fails validation can now be accessed in entities via the invalid() method.
  • Entity accessor method lookups are now cached and perform better.

Improved Validator API

The Validator object has a number of new methods that make building validators less verbose. For example adding validation rules to a username field can now look like:

$validator->email('username')
    ->ascii('username')
    ->lengthBetween('username', [4, 8]);

Console Improvements

  • Shell::info(), Shell::warn() and Shell::success() were added. These helper methods make using commonly used styling simpler.
  • Cake\Console\Exception\StopException was added.
  • Shell::abort() was added to replace error().

StopException Added

Shell::_stop() and Shell::error() no longer call exit(). Instead they raise Cake\Console\Exception\StopException. If your shells/tasks are catching \Exception where these methods would have been called, those catch blocks will need to be updated so they don’t catch the StopException. By not calling exit() testing shells should be easier and require fewer mocks.

Helpers initialize()

Helpers can now implement an initialize(array $config) hook method like other class types.

FormHelper

The action key for FormHelper::create() has been deprecated. You should use the url key directly.

Fatal Error Memory Limit Handling

A new configuration option Error.extraFatalErrorMemory can be set to the number of megabytes to increase the memory limit by when a fatal error is encountered. This allows breathing room to complete logging or error handling.

Deprecations

As we continue to improve CakePHP, certain features are deprecated as they are replaced with better solutions. Deprecated features will not be removed until 4.0:

  • Shell::error() is deprecated because its name does not clearly indicate that it both outputs a message and stops execution. Use Shell::abort() instead.
  • Cake\Database\Expression\QueryExpression::type() is deprecated. Use tieWith() instead.
  • Cake\Database\Type\DateTimeType::$dateTimeClass is deprecated. Use DateTimeType::useMutable() or DateTimeType::useImmutable() instead.
  • Cake\Database\Type\\DateType::$dateTimeClass is deprecated. Use DateTimeType::useMutable() or DateType::useImmutable() instead.
  • Cake\ORM\ResultSet::_calculateTypeMap() is now unused and deprecated.
  • Cake\ORM\ResultSet::_castValues() is now unused and deprecated.

Development on 3.3 will now start. The Roadmap for 3.3 is still incomplete, so if there is a feature or improvement you’d like to see reach out on IRC and github. The documentation for 3.2.0 is currently available in the book and the API.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Fri, 29 Jan 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/01/29/cakephp_319_released.html https://bakery.cakephp.org/2016/01/29/cakephp_319_released.html <![CDATA[CakePHP 3.1.9 Released]]> CakePHP 3.1.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.9. This is a maintenance release for the 3.1 branch that fixes several community reported issues. This is the last bugfix release for 3.1. You should upgrade to 3.2.0 to continue receiving bugfix releases. 3.1.x will continue to receive security fixes until the release of 3.4.0.

Bugfixes

You can expect the following changes in 3.1.9. See the changelog for every commit.

  • When merging data containing BelongsToMany associations with specific IDs the ORM now merges request data into the existing entities. This makes it easier to create a new record, link it to an existing associated records and update the existing record and its associations at the same time. (@markstory)
  • When using contain() on a BelongsToMany association, selecting specific fields and calling autoFields(), all fields are selected as expected. (@markstory)
  • Time::parseDateTime() now works on 1970-01-01 00:00:00. (@ChrisDBrown)
  • HtmlHelper::meta() uses the HTML5 shorthand for charset. (@afilina)
  • Cake\View\Context\FormContext no longer emits errors when an non-array error message is encountered. (@beporter)

Minor Enhancements

  • API documentation improvements in the ORM and helpers (@ndm)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Fri, 29 Jan 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/01/24/cakephp_279_released.html https://bakery.cakephp.org/2016/01/24/cakephp_279_released.html <![CDATA[CakePHP 2.7.9 Released]]> CakePHP 2.7.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.7.9. This is a maintenance release for the 2.7 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.7.9. See the changelog for every commit.

  • file:// paths are now handled correctly by File on windows. (@markstory)
  • PaginatorHelper::numbers() now treats string integers as strings in the first/last option. This allows the use of page numbers in the first/last buttons. (@markstory)
  • XmlView now works when return => domdocument is used. (@markstory)
  • Memcached can now connect to unix domain sockets. (@tersmitten)
  • Simulated GET requests (via method overriding) no longer POST data populated. This prevents GET requests from looking like they are POST requests that may cause unintentional side-effects. (@lorenzo)
  • SecurityComponent now validates data whenever $request->data is populated. This allows SecurityComponent to apply to PATCH and DELETE requests. (@markstory, @chinpei215)
  • Shell::CODE_ERROR was backported from 3.x. This constant serves as a default value for the exit code in shell tasks. (@dereuromark)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 24 Jan 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/01/23/cakephp_318_released.html https://bakery.cakephp.org/2016/01/23/cakephp_318_released.html <![CDATA[CakePHP 3.1.8 Released]]> CakePHP 3.1.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.8. This is a maintenance release for the 3.1 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.1.8. See the changelog for every commit.

  • Using matching() on a BelongsToMany association with conditions no longer emits invalid SQL. (@markstory)
  • Generated reciprocal BelongsToMany associations have the original conditions applied to them. (@markstory)
  • Inflector::camelize() now caches results (@ypnos-web)
  • ConnectionManager::config() no longer clones objects passed in. (@lorenzo)
  • Postgres schema reflection now only reads constraints in the connection’s schema (@lorenzo)
  • Memcached can now connect to unix domain sockets. (@tersmitten)
  • TreeBehavior now uses expression objects for field updates. This makes it compatible with datasources requiring identifier quoting. (@skiedr, @lorenzo)
  • Fixed incorrect behavior of TextHelper::autoLink() when CRLFs are present. (@jeremyharris)
  • The fullDebug argument of TestCase::assertHtml() now works as documented. (@jeremyharris)
  • Helpers now allow newlines in javascript confirm messages. (@markstory)
  • The cakephp-plugins.php file can now be located when cakephp/core is used as a standalone component. (@harikt)
  • Simulated GET requests (via method overriding) no longer POST data populated. This prevents GET requests from looking like they are POST requests that may cause unintentional side-effects. (@lorenzo)
  • SecurityComponent now validates data whenever $request->data is populated. This allows SecurityComponent to apply to PATCH and DELETE requests. (@markstory, @chinpei215)
  • Controller::$name is correctly inflected when using the base route class. (@markstory)

Minor Enhancements

  • Fixtures can now use public $import = ['model' => 'Articles'] to import schema and records from a defined model. (@dereuromark)
  • Improved API docs. (@bcrowe, @Mathieu, @Tzaoh, @Sergey, @luke83)
  • ConnectionManager::config() now accepts a callable. This makes it consistent with Log::config(). (@lorenzo)
  • Query::set() now accepts a builder callable. (@lorenzo)
  • Database\Type now allows objects to be injected via set(). (@jadb)
  • SQL Query logs now include execution time and rows returned. (@Bernat Arlandis)
  • Error logs now include Referring URL if it is available. (@flavius)

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 23 Jan 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/01/12/cakephp_280rc1_released.html https://bakery.cakephp.org/2016/01/12/cakephp_280rc1_released.html <![CDATA[CakePHP 2.8.0-RC1 Released]]>

CakePHP 2.8.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.8.0-RC1. This release is the first release candidate for the 2.8 branch which adds several new features to the 2.x series. We would appreciate any feedback you might have on the new features before their API definitions become stable.

Deprecations

  • The action option in FormHelper::create() has been deprecated, as it was in 3.x. Note that this now makes the action key of an array URL consistently respected for the generation of the DOM ID. If you used the deprecated key you will want to compare the generated ID for the forms before and after your upgrade.

PHP7 Compatibility

CakePHP 2.8 is compatible with, and tested against PHP7.

New Features

  • When handling fatal errors, CakePHP will now adjust the memory limit by 4MB to ensure that the error can be logged correctly. You can disable this behavior by setting Error.extraFatalErrorMemory to 0 in your Config/core.php.
  • Cache::add() has been added. This method lets you add data to a cache if the key did not already exist. This method will work atomically in Memcached, Memcache, APC and Redis. Other cache backends will do non-atomic operations.
  • CakeTime::listTimezones() has been changed to accept array in the last argument. Valid values for the $options argument are: group, abbr, before, and after.
  • A new option no-locations has been added to Console/cake i18n. When enabled, this option will disable the generation of location references in your POT files.
  • Hash::sort() now supports case-insensitive sorting via the ignoreCase option.
  • Magic finders now support custom finder types. For example if your model implements a find('published') finder, you can now use findPublishedBy and findPublishedByAuthorId functions through the magic method interface.

3.x Backports

  • Shell Helpers have been backported from 3.x.
  • Validation::uploadedFile() was backported from 3.x.
  • 'url' => false is now supported for FormHelper::create() to allow form tags to be created without HTML action attribute.

Unless there are major issues with the 2.8.0-RC1 release, we will have a stable release packaged in the next 4-5 weeks. The documentation for 2.8.0 is now available in the book and the API.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Tue, 12 Jan 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/01/09/cakephp_317_released.html https://bakery.cakephp.org/2016/01/09/cakephp_317_released.html <![CDATA[CakePHP 3.1.7 Released]]> CakePHP 3.1.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.7. This is a maintenance release for the 3.1 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.1.7. See the changelog for every commit.

  • Paginator::numbers() now treats numeric string values in first and last as strings.
  • Using invalid associations in ExistsIn rules now raises a helpful error.
  • BelongsToMany associations can have their fields limited through queryBuilder closures.
  • The $query->func()->now() query function works as expected in where conditions now.
  • XmlView no longer fails when attempting to output XML documents built with DOMDocument.
  • BelongsToMany _joinData is now marshalled consistently by Table::patchEntity().
  • Missing Controller error pages display the correct class name and path for prefixed controllers.

Minor Enhancements

  • IntegrationTestCase::cookieEncrypted() was added. This helper lets you set the value of encrypted cookies.
  • IntegrationTestCase::assertCookieEncrypted() was added. This assertion lets you compare encrypted cookie values.
  • FormHelper now forwards templateVars to the templates for submitContainer and inputSubmit.
  • Collection::chunk() was added. This method lets you split a collection into equal sized chunks.
  • Exception classes were added for Conflict (409), Gone (410), Not Acceptable (406) and Service Unavailable (506).
  • Configure::readOrFail() was added. This method will read a value from Configure and raise an exception if it does not exist.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 09 Jan 2016 00:00:00 +0000
https://bakery.cakephp.org/2016/01/02/cakephp_320rc1_released.html https://bakery.cakephp.org/2016/01/02/cakephp_320rc1_released.html <![CDATA[CakePHP 3.2.0-RC1 Released]]>

CakePHP 3.2.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.2.0-RC1. This release is the first release candidate for the 3.2 branch which adds several new features to the 3.x series. We would appreciate any feedback you might have on the new features before their API definitions become stable.

Minimum PHP 5.5 Required

CakePHP 3.2 requires at least PHP 5.5.10. By adopting PHP 5.5 we can provide better Date and Time libraries and remove dependencies on password compatibility libraries.

Disabling Deprecation Warnings

Upon upgrading you may encounter several deprecation warnings. These warnings are emitted by methods, options and functionality that will be removed in CakePHP 4.x, but will continue to exist throughout the lifetime of 3.x. While we recommend addressing deprecation issues as they are encountered, that is not always possible. If you’d like to defer fixing deprecation notices, you can disable them in your config/app.php:

'Error' => [
    'errorLevel' => E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED,
]

The above error level will suppress deprecation warnings from CakePHP.

Carbon Replaced with Chronos

The Carbon library has been replaced with cakephp/chronos. This new library is a fork of Carbon with no additional dependencies. It also offer a calendar date object, and immutable versions of both date and datetime objects.

New Date Object

The Date class allows you to cleanly map DATE columns into PHP objects. Date instances will always fix their time to 00:00:00 UTC. By default the ORM creates instances of Date when mapping DATE columns now.

New Immutable Date and Time Objects

The FrozenTime, and FrozenDate classes were added. These classes offer the same API as the Time object has. The frozen classes provide immutable variants of Time and Date. By using immutable objects, you can prevent accidental mutations. Instead of in-place modifications, modifier methods return new instances:

use Cake\I18n\FrozenTime;

$time = new FrozenTime('2016-01-01 12:23:32');
$newTime = $time->modify('+1 day');

In the above code $time and $newTime are different objects. The $time object retains its original value, while $newTime has the modified value. As of 3.2, the ORM can map date/datetime columns into immutable objects as well.

CorsBuilder Added

In order to make setting headers related to Cross Origin Requests (CORS) easier, a new CorsBuilder has been added. This class lets you define CORS related headers with a fluent interface.

ORM Improvements

  • Containing the same association multiple times now works as expected, and the query builder functions are now stacked.
  • Function expressions now correctly cast their results. This means that expressions like $query->func()->current_date() will return datetime instances.

Improved Validator API

The Validator object has a number of new methods that make building validators less verbose. For example adding validation rules to a username field can now look like:

$validator->email('username')
    ->ascii('username')
    ->lengthBetween('username', [4, 8]);

Console Improvements

  • Shell::info(), Shell::warn() and Shell::success() were added. These helper methods make using commonly used styling simpler.
  • Cake\Console\Exception\StopException was added.
  • Shell::abort() was added to replace error().

StopException Added

Shell::_stop() and Shell::error() no longer call exit(). Instead they raise Cake\Console\Exception\StopException. If your shells/tasks are catching \Exception where these methods would have been called, those catch blocks will need to be updated so they don’t catch the StopException. By not calling exit() testing shells should be easier and require fewer mocks.

Helpers initialize()

Helpers can now implement an initialize(array $config) hook method like other class types.

FormHelper

The action key for FormHelper::create() has been deprecated. You should use the url key directly.

Fatal Error Memory Limit Handling

A new configuration option Error.extraFatalErrorMemory can be set to the number of megabytes to increase the memory limit by when a fatal error is encountered. This allows breathing room to complete logging or error handling.

Deprecations

As we continue to improve CakePHP, certain features are deprecated as they are replaced with better solutions. Deprecated features will not be removed until 4.0:

  • Shell::error() is deprecated because its name does not clearly indicate that it both outputs a message and stops execution. Use Shell::abort() instead.
  • Cake\Database\Expression\QueryExpression::type() is deprecated. Use tieWith() instead.
  • Cake\Database\Type\DateTimeType::$dateTimeClass is deprecated. Use DateTimeType::useMutable() or DateTimeType::useImmutable() instead.
  • Cake\Database\Type\\DateType::$dateTimeClass is deprecated. Use DateTimeType::useMutable() or DateType::useImmutable() instead.
  • Cake\ORM\ResultSet::_calculateTypeMap() is now unused and deprecated.
  • Cake\ORM\ResultSet::_castValues() is now unused and deprecated.

Unless there are major issues with the 3.2.0-RC1 release, we will have a stable release packaged in the next 4-5 weeks. The documentation for 3.2.0 is now available in the book and the API.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 02 Jan 2016 00:00:00 +0000
https://bakery.cakephp.org/2015/12/23/cakephp_316_released.html https://bakery.cakephp.org/2015/12/23/cakephp_316_released.html <![CDATA[CakePHP 3.1.6 Released]]> CakePHP 3.1.6 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.6. This is a maintenance release for the 3.1 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.1.6. See the changelog for every commit.

  • The Auth.afterIdentify event is now triggered for stateless authentication.
  • Query::offset() now marks a query as modified.
  • Calling find() on a BelongsToMany association now joins the junction table. This allows association conditions to be applied to queries.
  • Redis DSN parsing was fixed.
  • FormContext::errors() now handles nested validation errors.
  • The existsIn() rule now uses an association’s bindingKey option.
  • requestAction() now passes cookies to the sub-request as documented.
  • FormHelper now treats string integer values as UTC timestamps. This mirrors how it handles integer values.
  • FormHelper now correctly generates name attributes for dot pathed field names that end in [].
  • A memory leak in ORM\ResultSet has been fixed.
  • DashedRoute now correctly handles vendor prefixed plugin names.
  • CORS domain handling is more robust and less permissive.
  • Postgres index reflection is more robust and can handle complex index definitions.
  • Postgres schema reflection more accurately defines SERIAL columns.
  • Pagination of complex queries using expressions in their ORDER clause no longer fail.
  • File can now open file:// paths on windows.
  • bin/cake i18n init now preserves the locale case.

Minor Enhancements

  • Session configuration now better handles environments where runtime modification of session configuration is not allowed.
  • The phpdbg SAPI is treated the same as CLI.
  • CompletionShell suggests task and shell names based on short forms. It can also suggest option names for subcommands and tasks now.
  • Compatibility with PHPUnit 5 was improved.
  • Query::removeJoin() was added. This method can be used to remove joins from a query by join alias.
  • View::reset() was added. This method lets you reset the contents of a view block.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Wed, 23 Dec 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/12/21/cakephp_278_released.html https://bakery.cakephp.org/2015/12/21/cakephp_278_released.html <![CDATA[CakePHP 2.7.8 Released]]> CakePHP 2.7.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.7.8. This is a maintenance release for the 2.7 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.7.8. See the changelog for every commit.

  • An extract() call was removed from Validation::comparison(). There was some concern that it could be used to circumvent validation.
  • Fixed issue around incorrect SNI validation when host name contains protocol for SmtpTransport.
  • Proxy Authentication with SSL no longer forwards proxy credentials in HttpSocket.
  • SchemaSchell clears the ClassRegistry after applying schema.
  • Context is reset when parsing MO files. Previously context could bleed between message identifiers.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Mon, 21 Dec 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/11/29/cakephp_315_released.html https://bakery.cakephp.org/2015/11/29/cakephp_315_released.html <![CDATA[CakePHP 3.1.5 Released]]> CakePHP 3.1.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.5. This is a maintenance release for the 3.1 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 3.1.5. See the changelog for every commit.

  • Collection::toArray() now drops the keys when dealing with RecursiveIterator. This makes the collection features easier to reason about as they generally do what people have been expecting.
  • Improved API documentation.
  • ResultSet::isEmpty() no longer consumes records on buffered iterators that had not already been iterated.
  • The ORM no longer emits invalid queries when eager loading associations using the subquery strategy, and using an ORDER BY clause. Fields used in ORDER BY clauses are also included in the selected fields.
  • Error handling is now compatible with PHP7. This removes the last known compatibility error with PHP7.
  • BelongsToMany associations use bindingKey correctly now.
  • Integer marshalling correctly accepts negative values now.
  • When executing Shell ‘main’ method the current command name is set to ‘main’.
  • spellcheck is now a standard attribute. Unlike most HTML5 attributes, spellcheck requires ‘true’ and ‘false’ values, which means it cannot be a minimized attribute.
  • CSRF validation is applied to all HTTP methods that are not ‘GET’, ‘OPTIONS’ or ‘HEAD’. This prevents invalid HTTP methods from bypassing CSRF validation.
  • RouterBuilder::resources() correctly inflects the object id when using 'inflect' => 'dasherize' and nested resources.
  • TimeHelper::format() no longer shifts string datetimes to the supplied timezone before formatting.
  • Shell::createFile() no longer converts \n to \r\n silently when running on windows.

Minor Enhancements

  • RouteBuilder::addExtension() was added. This method lets you incrementally add extensions instead of replacing the connected extensions.
  • The options passed to Table::save(), and HasMany/BelongsToMany link/unlink/replace methods are being passed through to the internal Table::save/delete() calls.
  • The CsrfComponent now supports an httpOnly option. Enabling this option makes the CSRF cookie inaccessible to client side scripting.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 29 Nov 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/11/22/cakephp_277_released.html https://bakery.cakephp.org/2015/11/22/cakephp_277_released.html <![CDATA[CakePHP 2.7.7 Released]]> CakePHP 2.7.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.7.7. This is a maintenance release for the 2.7 branch that fixes several community reported issues.

Bugfixes

You can expect the following changes in 2.7.7. See the changelog for every commit.

  • In a CLI environment, error handlers now default the CLI error handlers during application bootstrap. Previously, errors during application startup would emit HTML.
  • Fix a regression in HttpSocket where SNI validation would fail due to changes around SSL option handling.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 22 Nov 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/11/05/cakephp_3015_314_2612_276_released.html https://bakery.cakephp.org/2015/11/05/cakephp_3015_314_2612_276_released.html <![CDATA[CakePHP 3.1.4, 3.0.15, 2.7.6 and 2.6.12 released]]> CakePHP 3.1.4, 3.0.15, 2.7.6 and 2.6.12 released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.4, 3.0.15, 2.7.6, and 2.6.12. These releases contain security fixes. 3.1.4 and 2.7.6 also contain bugfixes.

Security Fixes

These releases contain fixes for a Remote File Inclusion issue caused by unsafe view template filenames. There is also a fix to correct how older Validation methods handle non-scalar data. We recommend that all users of CakePHP upgrade as soon as they can. More detail on both issues will be provided in a few weeks once people have the opportunity to upgrade. We’d once again like to thank Kurita Takashi for his help in identifying these issues and verifying the fixes.

Bugfixes in 2.7.6

  • Support for self signed certificates was added to the SmtpTransport.
  • Form input generation for numeric columns in postgres databases was corrected.
  • PaginatorHelper::meta() correctly generates URLs based on named parameters and pagiantion options
  • Improved API documentation.
  • CakeSocket supports all of the PHP provided SSL context options. SSL options will need an ssl_ prefix.
  • Memcached client failures during key clearing is now handled.
  • FlashComponent::__call() now handles the plugin option as documented.
  • Scaffold was updated to use FlashComponent.

Bugfixes in 3.1.4

  • PaginatorHelper always lowercases direction to be consistent.
  • Using the --debug flag in PHPUnit will also enable fixture schema SQL to be logged.
  • CounterCacheBehavior now uses bindingKey() resolving issues for associations that use custom binding keys.
  • The afterSaveCommit and afterDeleteCommit callbacks were added to behaviours.
  • The ability to set the default model type for classes using the ModelAwareTrait was added.
  • Default type inference in ORM\Query is now faster.
  • BelongsToMany link replacement no longer fails when the association conditions include columns from the junction table.
  • HasMany replace() now checks the return value of delete operations.
  • Nested validators are now aware of the create/update context.
  • Query::where() now throws an exception when empty conditions are added. This prevents the addition of 1 != 1 clauses.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Thu, 05 Nov 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/11/01/cakephp_1_3_21_released.html https://bakery.cakephp.org/2015/11/01/cakephp_1_3_21_released.html <![CDATA[CakePHP 1.3.21 Released]]> CakePHP 1.3.21 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 1.3.21. This is the final release for 1.3.x. CakePHP 1.3.0 was released more than 5 years ago, and since the release of 3.0, has had ever decreasing use. There will be no future security updates for this release series, and actively developed applications using 1.3, should consider upgrading to the 2.x release series to continue receiving bugfixes and security fixes.

Bugfixes

You can expect the following changes in 1.3.21. See the changelog for every commit.

  • TimeHelper no longer returns 1969 on invalid dates. Instead ‘’ is returned.
  • crc32 hash keys used in DboSource have been replaced with md5 sums. This reduces the chance of hash collision significantly.
  • MIME-Version is set on emails.
  • The node_modules directory is ignored when looking for PHP files.
  • View templates can no longer be located outside of the configured view paths.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 01 Nov 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/10/25/cakephp_3_1_3_released.html https://bakery.cakephp.org/2015/10/25/cakephp_3_1_3_released.html <![CDATA[CakePHP 3.1.3 Released]]> CakePHP 3.1.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.3. This is a maintenance release for the 3.1 branch that fixes bugs and includes small enhancements.

Bugfixes

You can expect the following changes in 3.1.3. See the changelog for every commit.

  • Fixed issues in the SMTP email transport when connecting to gmail.
  • Fixed regression in the BooleanType converted in database when using NULL.
  • Solved a couple problems when matching routes containing multibyte characters.
  • Improving Query::count() so that it does not execute the query twice when calling the method multiple times.
  • Avoided some errors when using XDebug in classes having __debugInfo

Enhancements

  • HasMany associations now have the link, unlink and replace methods implemented, like BelongsToMany associations do. This improves the usability of append-only associations.
  • Made it easier to use the IntegrationTestCase with controllers having the SecurityComponent enabled.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 25 Oct 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/10/18/cakephp_3_1_2_released.html https://bakery.cakephp.org/2015/10/18/cakephp_3_1_2_released.html <![CDATA[CakePHP 3.1.2 Released]]> CakePHP 3.1.2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.2. This is a maintenance release for the 3.1 branch that fixes bugs and includes small enhancements.

Bugfixes

You can expect the following changes in 3.1.2. See the [changelog](https://cakephp.org/changelogs/3.1.2) for every commit.

  • Contained associations now add column typ data into queries. This means that you can use complex datatypes like DateTime objects in conditions for association columns.
  • XHR requests with query strings that are converted into requestAction calls by RequestHandlerComponent now work as expected.
  • Hash::extract() compatibility with ArrayAccess objects was improved.
  • Case expressions in queries no longer mishandle ‘0’.
  • debug() no longer elides ‘schema’ and ‘prefix’.
  • Validation::datetime() now accepts ‘,’ between the date and time components. This makes validating en_US formatted dates easier.
  • Rendering issues in the ProgressHelper have been fixed.
  • clone on Query objects now creates a deep clone as one would expect.
  • Corrected API documentation.

Enhancements

  • HasMany associations now support a ‘replace’ save mode. In this mode, existing associations not in the entity’s current property will be removed. New records will also be inserted.
  • IntegrationTestCase now provides enableCsrfToken() and enableSecurityToken() methods to make testing with CsrfComponent and SecurityComponent much simpler.
  • The CSRF token post field is now removed from request data after being validated. This makes ‘Post Redirect Get’ workflows simpler as the CSRF token doesn’t need to be manually removed.
  • NetworkSocket now supports all standard SSL context options via prefixing. e.g ssl_verify_peer. These options can also be configured in the SmtpTransport.
  • Test Fixture constraint management has been greatly improved. You no longer need to carefully order fixtures to ensure constraints are applied correctly. Instead constraints are created after all tables and records have been created.
  • When preparing datatypes for SQL statements, exceptions will now be raised on invalid values instead of silent failures.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a [packaged release on github](https://github.com/cakephp/cakephp/releases).

]]>
Sun, 18 Oct 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/10/06/cakephp_3_1_1_released.html https://bakery.cakephp.org/2015/10/06/cakephp_3_1_1_released.html <![CDATA[CakePHP 3.1.1 Released]]> CakePHP 3.1.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.1. This is a maintenance release for the 3.1 branch that fixes bugs and includes small enhancements.

Bugfixes

You can expect the following changes in 3.1.1. See the changelog for every commit.

  • Query::contain() now correctly overwrites existing containments when $override is true.
  • Integration tests no longer swallow database errors stemming from missing tables or other low level issues. Instead these errors are bubbled up making the test failure obvious.
  • RequestHandlerComponent no longer overwrites explict viewClass usage.
  • Fixed dependencies for database package.
  • Email construction with a profile name works as expected now.
  • Plural form of ‘virus’ is now ‘viruses’.
  • Deprecation warnings related to ViewBuilder have been improved.
  • Validation::datetime() now correctly handles 12:xx PM with 12 hour formats.
  • JsonView serializes single variables more consistently now. Now if a single view var is set it’s inferred as '_serialize' => ['var'] instead of '_serialize' => 'var'.
  • IntegrationTestCase accepts POST bodies that are strings.

Enhancements

  • env() has an additional parameter for supplying default values.
  • Request::env() has an additional parameter for supplying default values.
  • Improved API documentation.
  • Console logging now abides the --verbose and --quiet flags.
  • Validator::requirePresence() accepts a callable to determine whether or not a field is required.
  • Validation::containsNonAlphaNumeric() was added.
  • Hash::extract() works with ArrayAccess objects now.

Download a packaged release on github.

]]>
Tue, 06 Oct 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/10/01/cakephp_2_7_5_released.html https://bakery.cakephp.org/2015/10/01/cakephp_2_7_5_released.html <![CDATA[CakePHP 2.7.5 Released]]> CakePHP 2.7.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.7.5. This is a maintenance release for the 2.7 branch that fixes a regresion in 2.7.4

Bugfixes

You can expect the following changes in 2.7.5. See the changelog for every commit.

  • The web test runner had a few undefined variable errors caused by some erroneous cleanup.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Thu, 01 Oct 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/09/28/cakephp_2_7_4_released.html https://bakery.cakephp.org/2015/09/28/cakephp_2_7_4_released.html <![CDATA[CakePHP 2.7.4 Released]]> CakePHP 2.7.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.7.4. This is a maintenance release for the 2.7 branch that fixes several reported issues.

Bugfixes

You can expect the following changes in 2.7.4. See the changelog for every commit.

  • When saving, models will always correctly set the ‘updated’ and ‘created’ fields. Even when a ‘fieldList’ is used, and those fields are not in the fieldList.
  • SessionHelper and FlashHelper are now more compatible with messages set through either the SessionComponent or FlashComponent.
  • Bake generates fixtures with only 1 record by default now.
  • The default value of CURRENT_TIMESTAMP is now supported for MySQL datetime columns.
  • Datasources no longer fatally error if isConnected() is called after disconnect().
  • Improved API documentation.
  • Email configuration defaults are now correctly loaded even when the configuration class has not been loaded.
  • Virus is now pluralized to viruses.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Mon, 28 Sep 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/09/21/cakephp_3_0_14_released.html https://bakery.cakephp.org/2015/09/21/cakephp_3_0_14_released.html <![CDATA[CakePHP 3.0.14 Released]]> CakePHP 3.0.14 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.14. This is a maintenance release for the 3.0 branch that fixes bugs and includes small enhancements. Other than security fixes, this will be the last scheduled release for 3.0.x as 3.1.0 was released last week.

Bugfixes

You can expect the following changes in 3.0.14. See the changelog for every commit.

  • I18n shell no longer outputs both merged and separate domain pot files when --merge is used.
  • StringTemplates convert 1 dimensional array values into strings. This fixes ‘array to string conversion’ errors when arrays are formatted into templates.
  • Option groups created by FormHelper can now have integer values.
  • Json view selection now reliably works with the Accept header when the json extension has not been enabled.
  • Postgres adapter correctly reflects schema for TIME WITHOUT TIMEZONE now.
  • FormHelper now correctly sets the required attribute for boolean columns in associations.
  • The BetweenExpression now accepts expression objects in each of its conditions.
  • Query::__debugInfo() and Table::__debugInfo() no longer raise fatal errors if they are invoked before object construction is complete.

Enhancements

  • Cache::registry() was added. This method is useful for replacing the cache backend registry in testing.
  • Improved API documentation.
  • UUID fields now marshal ‘’ as null.
  • TreeBehavior::recover() now supports a recoverSort option for defining how a tree should be sorted before recovery.
  • The jsonapi type had its mime type added to Response.
  • MySQL adapter supports CURRENT_TIMESTAMP default value in datetime columns.

Download a packaged release on github.

]]>
Mon, 21 Sep 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/09/19/cakephp_3_1_0_released.html https://bakery.cakephp.org/2015/09/19/cakephp_3_1_0_released.html <![CDATA[CakePHP 3.1.0 Released]]>

CakePHP 3.1.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.0. This release is an API stable release for 3.1. 3.1 delivers a number of improvements to the 3.x release series.

New in 3.1

ORM Enhancements

A big part of 3.1 was making the ORM even more awesome than it already is.

Lazy Eager Loading

You can now Lazily Eager Load Associations. This feature allows you to conditionally load additional associations into a result set, entity or collection of entities:

$articles = $this->Articles->find('popular')->all();

// Later on after some logic has run.
// We can load additional associations.
$withAuthors = $this->Articles->loadInto($articles, ['Authors']);

Additional Filtering Methods

You may have already used matching() on the query object. In 3.1 you can also use notMatching() to create a negated matching query:

// Find articles with no comments.
$query = $this->Articles->find('popular')
    ->notMatching('Comments');

You can use the leftJoinWith() and innerJoinWith() methods to join associations without loading columns from those associations. This makes it easy to do filtering on associations:

$query = $this->Articles->find()
    ->innerJoinWith('Authors')
    ->where(['Authors.promoted' => true]);

Mailers

Mailers allow you to create reusable emails throughout your application. They can also be used to contain multiple email configurations in one location. This helps keep your code DRYer and keeps email configuration noise out of other areas in your application. See the Mailer Documentation for more information.

Additional Template Variables in Templates

You can now add additional template placeholders in your application templates, and then populate those placeholders when generating inputs:

// Add a template with the help placeholder.
$this->Form->templates([
    'inputContainer' => '<div class="input {{type}}{{required}}">
        {{content}} <span class="help">{{help}}</span></div>'
]);

// Generate an input and populate the help variable
echo $this->Form->input('password', [
    'templateVars' => ['help' => 'At least 8 characters long.']
]);

Shell Helpers

Shell Helpers let you easily package up complex output generation code. Shell Helpers can be accessed and used from any shell or task:

// Output some data as a table.
$this->helper('table')->output($data);

// Get a helper from a plugin.
$this->helper('Plugin.HelperName')->output($data);

You can also get instances of helpers and call any public methods on them:

// Get and use the Progress Helper.
$progress = $this->helper('Progress');
$progress->increment(10);
$progress->draw();

CakePHP provides a Progress and Table helper that you can use to make your CLI tools look better.

Refreshed Default Application Styles

The styling used in the application skeleton have been streamlined and offer improved rendering on smaller devices. In addition to cleaner visuals, bake templates have been updated to create cleaner markup as well.

../../../_images/3-1-bake-screenshot.png

The above screenshot gives you a taste of what the new default styles look like.

Important Changes From 3.0

While none of the following changes modify method signatures, the behaviour of specific methods is slightly different than in the past:

  • FlashComponent now stacks Flash messages created with the set() or __call() methods. This means that the structure in the Session for stored Flash messages has changed.
  • New configuration option storage has been added. It contains the storage class name that AuthComponent uses to store user record. By default SessionStorage is used. If using a stateless authenticator you should configure AuthComponent to use MemoryStorage instead.
  • You can now also configure AuthComponent to do the auth check before controller’s beforeFilter() callback is run using the checkAuthIn configuration. This is particularly useful when using stateless authenticators.
  • RequestHandlerComponent now switches the layout and template based on the parsed extension or Accept-Type header in the beforeRender() callback instead of startup() callback.
  • The default mime-type used when sending requests has changed in HttpClient. Previously multipart/form-data would always be used. In 3.1, multipart/form-data is only used when file uploads are present. When there are no file uploads, application/x-www-form-urlencoded is used.

Other Enhancements

  • The default route class has been changed to DashedRoute in the cakephp/app repository. Your current code base is not affected by this, but it is recommended to use this route class from now on.
  • The breakpoint() helper function has been added. This function provides a snippet of code that can be put into eval() to trigger an interactive console.
  • Shell::dispatchShell() no longer outputs the welcome message from the dispatched shell.
  • You can now set _serialized to true for JsonView and XmlView to serialize all view variables instead of explicitly specifying them.
  • Time::fromNow() has been added. This method makes it easier to calculate differences from ‘now’.
  • Time::i18nFormat() now supports non-gregorian calendars when formatting dates.
  • Validation::latitude(), and Validation::longitude() were added.
  • Validation::ascii(), Validation::utf8(), and Validation::isInteger() were added.
  • Cache::add() was ported from 2.x. This method allows you to atomically add data to a cache backend if the key did not already exist.
  • Time::listTimezones() now supports options to display timezone abbreviations.
  • Hash::get() now supports objects implementing ArrayAccess.
  • Hash::sort() supports case-insensitive sorting through a new ignoreCase option.

Deprecations

As we continue to improve CakePHP, certain features are deprecated as they are replaced with better solutions. Deprecated features will not be removed until 4.0:

  • The SessionHelper has been deprecated. You can use $this->request->session() directly.

  • The following Controller properties are now deprecated:

    • layout
    • view
    • theme
    • autoLayout
    • viewPath
    • layoutPath

    Instead of setting these properties on your controllers, you should set them using the ViewBuilder.

The 3.1 migration guide has a full list of all the changes in 3.1.0 and is recommended reading for those considering upgrading.

Upgrading your Application

You can use composer to upgrade from 3.0 to 3.1:

php composer.phar require 'cakephp/cakephp:3.1.*' 'cakephp/debug_kit:3.2.*' 'cakephp/bake:1.1.*'

This will install the new core libraries, update bake and DebugKit. You should then address any deprecation warnings in your application, as deprecated features will be removed in the future. If you are using the default CSS provided with the application skeleton, you should also pull in the most recent CSS in cakephp/app as the default styling and bake templates have been refreshed.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 19 Sep 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/09/06/cakephp_3_0_13_released.html https://bakery.cakephp.org/2015/09/06/cakephp_3_0_13_released.html <![CDATA[CakePHP 3.0.13 Released]]> CakePHP 3.0.13 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.13. This is a maintenance release for the 3.0 branch that fixes bugs and includes small enhancements.

Bugfixes

You can expect the following changes in 3.0.13. See the changelog for every commit.

  • Query::count() no longer fails when there are fields with complex expressions in the select.
  • If FormHelper is used to create a visible input after a hidden input was created, the form is no longer blackholed by SecurityComponent.
  • Typehints in the API documentation have been corrected in a number of places.
  • When a new entity is saved with a specific UUID, the entity returned from save() retains the original id value.
  • Http\Client now correctly sets the proxy context options, allowing proxy connections to work.
  • Compatibility with PHP 5.x improved.

Enhancements

  • Shell::quiet() and Shell::verbose() were added. These helper methods provide shortcuts to $this->_io->quiet() and $this->_io->verbose() respectively.
  • I18n\Number has an ordinal() method for formatting the ordinal text for a given number. The ordinal() method is also available on NumberHelper.

Download a packaged release on github.

]]>
Sun, 06 Sep 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/08/29/cakephp_3_1_0_rc_released.html https://bakery.cakephp.org/2015/08/29/cakephp_3_1_0_rc_released.html <![CDATA[CakePHP 3.1.0-RC1 Released]]> CakePHP 3.1.0-RC1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.0-RC1. This release is the first release candidate for the 3.1 branch which adds several new features to the 3.x series. We would appreciate any feedback you might have on the new features before their API definitions become stable.

Changes Since 3.1.0-beta

There have been several changes to 3.1 through feedback on the beta releases. The following aspects have changed since the beta releases:

  • Controller::getView() has been removed. In its place viewBuilder() has been added. This method and new builder class resolves the issues that were caused by creating view instances eagerly.
  • Mailer instances now set their template names based on the action that was invoked.
  • View::viewPath() is now View::templatePath().
  • Auth.redirect is no longer set to referrer URL when accessing login action. Instead it is only set to a protected URL when trying to access it without authentication, before redirecting to login action.

Additional Features

  • Validation::latitude(), and Validation::longitude() were added.
  • Validation::ascii(), Validation::utf8(), and Validation::isInteger() were added.
  • Cache::add() was ported from 2.x. This method allows you to atomically add data to a cache backend if the key did not already exist.
  • Time::listTimezones() now supports options to display timezone abbreviations.
  • Hash::get() now supports objects implementing ArrayAccess.
  • Hash::sort() supports case-insensitive sorting through a new ignoreCase option.

Unless there are major issues with the 3.1.0-RC release, we will have a stable release packaged in the 2-3 weeks. The 3.1 migration guide has a full list of all the changes in 3.1.0 and is recommended reading for those considering upgrading.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 29 Aug 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/08/23/cakephp_2_7_3_released.html https://bakery.cakephp.org/2015/08/23/cakephp_2_7_3_released.html <![CDATA[CakePHP 2.7.3 Released]]> CakePHP 2.7.3 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.7.3. This is a maintenance release for the 2.7 branch that fixes several reported issues.

Bugfixes

You can expect the following changes in 2.7.3. See the changelog for every commit.

  • DboSource::isConnected() now emits a SELECT 1 query to ensure the connection is still active. This is helpful in long running processes like CLI tools.
  • Missing Flash templates were added. These templates were accidentally omitted from earlier 2.7 releases.
  • Model::exists() now always returns false, when a model uses useTable = false.
  • MediaView now correctly supports the documented extension option.
  • Forms secured with SecurityComponent no longer blackhole when a hidden input is followed by a visible input of the same name.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 23 Aug 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/08/21/cakephp_3_0_12_released.html https://bakery.cakephp.org/2015/08/21/cakephp_3_0_12_released.html <![CDATA[CakePHP 3.0.12 Released]]> CakePHP 3.0.12 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.12. This is a maintenance release for the 3.0 branch that fixes a couple bugfixes and small enhancements.

Bugfixes

You can expect the following changes in 3.0.12. See the changelog for every commit.

  • RuleChecker::existsIn() handles nullable fields better.
  • Entities created by plugin associations have the correct return value for source()
  • Case statements accept literal values now.
  • Methods defined on Controller can never be used as actions. Before, methods redefined on AppController, or a subclass could be invoked as actions.
  • Plugin dot syntax can no longer be used to reference controllers in URLs.
  • LocaleSelectorFilter no longer sets the default locale. Instead it sets the active locale.
  • AuthComponent correctly redirects when an application is in a subdirectory.

Enhancements

  • Query::orderAsc() and Query::orderDesc() were added. These methods make it possible to order on complex expressions.
  • PaginatorHelper::next() and prev() accept a templates option now.
  • The serialization format for Time objects can now be set with Time::setJsonEncodeFormat().

Download a packaged release on github.

]]>
Fri, 21 Aug 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/08/06/cakephp_2_5_9_2_6_10_2_7_2_released.html https://bakery.cakephp.org/2015/08/06/cakephp_2_5_9_2_6_10_2_7_2_released.html <![CDATA[CakePHP 2.5.9, 2.6.11 & 2.7.2 Released]]> CakePHP 2.5.9, 2.6.11 & 2.7.2 Released

The CakePHP core team is ready to announce the immediate availability of CakePHP 2.5.9, 2.6.11, and 2.7.2. These releases contain important security updates for applications using prefix routing.

Security Issues

There are two issues that can impact the security of a CakePHP application:

  • Unconventional URL paths would allow direct access to prefixed actions without setting the correct request parameters. If your authorization depends on the presence of the prefix routing key you should upgrade as soon as possible.
  • Validation::compare() and Validation::range() would allow specifically crafted data past certain criteria.

We’d like to thank ‘Kurita Takashi’ for contacting us through our security issue process about both issues. We recommend that all users of CakePHP upgrade to one of these releases as soon as possible. CakePHP 3.x is unaffected by the prefix routing issue.

Other Issues Fixed in 2.7.2

  • Uses of self were replaced with static to improve ability to subclass core classes.
  • HttpSocket now allows SNI_enabled to be disabled.
  • HttpSocket will continue to read data if it encounters a standalone ‘0’.
  • ObjectCollection classes now consistently handle plugin prefixes in attached(), unload(), and disable().
  • Configure now bootstraps after the multibyte shims have been loaded. This solves dependency issue in environments without mbstring.
  • Translation context is now correctly parsed out of mo files.
  • EmailComponent no longer fatally errors when sending messages with a null subject.

For a deeper insight of what changed, have a look at the release notes.

]]>
Thu, 06 Aug 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/08/05/cakephp_3_0_11_and_3_1_0_beta2_released.html https://bakery.cakephp.org/2015/08/05/cakephp_3_0_11_and_3_1_0_beta2_released.html <![CDATA[CakePHP 3.0.11 and 3.1.0-beta2 Released]]> CakePHP 3.0.11 and 3.1.0-beta2 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.11 and 3.1.0-beta2. These releases are a maintenance releases that contain bugfixes and fixes for security issues.

Security Fixes

There are two issues that can impact the security of a CakePHP application:

  • Cake\ORM\Query::where() would allow static methods to be invoked. This could create unintentional side effects, or undesired query manipulation.
  • Validation::compare() and Validation::range() would allow specifically crafted data past certain criteria.

We’d like to thank ‘Kurita Takashi’ for contacting us through our security issue process about the CsrfComponent issue. We recommend that all users of CakePHP upgrade to 3.0.11 or 3.1.0-beta as soon as possible.

Bugfixes

In addition to the security issues the following issues have been fixed on both branches:

  • Hash::insert() and Hash::remove() now support attribute matchers at all depths.
  • Table::get() supports a finder option that allows custom finders to be combined with get().
  • Terminal colours are enabled for Windows users using the ConEmu terminal application.
  • Query::matching() operations with no conditions no longer cause errors.
  • requestAction() with array parameters includes all default routing parameters.
  • View::prepend() now supports a capturing mode like start().
  • Typos in alias names used in contain() now trigger exceptions instead of generating incorrect result sets.
  • Http\Client better supports complex multipart requests.
  • PaginatorHelper::numbers() supports a modulus of 0 now.
  • DateTime instances can be sorted by Collection now.

For a deeper insight of what changed, have a look at the release notes.

]]>
Wed, 05 Aug 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/08/01/cakephp_3_1_0_beta_released.html https://bakery.cakephp.org/2015/08/01/cakephp_3_1_0_beta_released.html <![CDATA[CakePHP 3.1.0-beta Released]]> CakePHP 3.1.0-beta Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.1.0-beta. This release is the first release for the 3.1 branch which adds several new features to the 3.x series. We would appreciate any feedback you might have on the new features before their API definitions become stable.

ORM Enhancements

A big part of 3.1 was making the ORM even more awesome than it already is.

Lazy Eager Loading

You can now Lazily Eager Load Associations. This feature allows you to conditionally load additional associations into a result set, entity or collection of entities:

$articles = $this->Articles->find('popular')->all();

// Later on after some logic has run.
// We can load additional associations.
$withAuthors = $this->Articles->loadInto($articles, ['Authors']);

Additional Filtering Methods

You may have already used matching() on the query object. In 3.1 you can also use notMatching() to create a negated matching query:

// Find articles with no comments.
$query = $this->Articles->find('popular')
    ->notMatching('Comments');

You can use the leftJoinWith() and innerJoinWith() methods to join associations without loading columns from those associations. This makes it easy to do filtering on associations:

$query = $this->Articles->find()
    ->innerJoinWith('Authors')
    ->where(['Authors.promoted' => true]);

Mailers

Mailers allow you to create reusable emails throughout your application. They can also be used to contain multiple email configurations in one location. This helps keep your code DRYer and keeps email configuration noise out of other areas in your application. See the Mailer Documentation for more information.

Additional Template Variables in Templates

You can now add additional template placeholders in your application templates, and then populate those placeholders when generating inputs:

// Add a template with the help placeholder.
$this->Form->templates([
    'inputContainer' => '<div class="input {{type}}{{required}}">
        {{content}} <span class="help">{{help}}</span></div>'
]);

// Generate an input and populate the help variable
echo $this->Form->input('password', [
    'templateVars' => ['help' => 'At least 8 characters long.']
]);

Shell Helpers

Shell Helpers let you easily package up complex output generation code. Shell Helpers can be accessed and used from any shell or task:

// Output some data as a table.
$this->helper('table')->output($data);

// Get a helper from a plugin.
$this->helper('Plugin.HelperName')->output($data);

You can also get instances of helpers and call any public methods on them:

// Get and use the Progress Helper.
$progress = $this->helper('Progress');
$progress->increment(10);
$progress->draw();

CakePHP provides a Progress and Table helper that you can use to make your CLI tools look better.

Important Changes From 3.0

While non of the following changes modified method signatures, the behaviour of specific methods is slightly different than in the past:

  • FlashComponent now stacks Flash messages when set with the set() or __call() method. This means that the structure in the Session for stored Flash messages has changed.

  • New config storage has been added. It contains the storage class name that AuthComponent uses to store user record. By default SessionStorage is used. If using a stateless authenticator you should configure AuthComponent to use MemoryStorage instead.

  • You can now also configure AuthComponent to do the auth check before controller’s beforeFilter() callback is run using the checkAuthIn config. This is particularly useful when using stateless authenticators.

  • RequestHandlerComponent now switches the layout and template based on the parsed extension or Accept-Type header in the beforeRender() callback instead of startup().

  • The default mime type used when sending requests has changed in HttpClient. Previously multipart/form-data would always be used. In 3.1, multipart/form-data is only used when file uploads are present. When there are no file uploads, application/x-www-form-urlencoded is used instead.

  • The following Controller properties are now deprecated:

    • layout
    • view
    • theme
    • autoLayout
    • viewPath
    • layoutPath

    Instead of setting these properties on your controllers, you should set them on the view using methods with the same names.

Other Enhancements

  • The default route class has been changed to DashedRoute in the cakephp/app repo. Your current code base is not affected by this, but it is recommended to use this route class from now on.
  • The breakpoint() helper function has been added. This function provides a snippet of code that can be put into eval() to trigger an interactive console.
  • Shell::dispatchShell() no longer outputs the welcome message from the dispatched shell.
  • You can now set _serialized to true for JsonView and XmlView to serialize all view variables instead of explicitly specifying them.
  • Time::fromNow() has been added. This method makes it easier to calculate differences from ‘now’.
  • Time::i18nFormat() now supports non-gregorian calendars when formatting dates.

Deprecations

As we continue to improve CakePHP, certain features are deprecated as they are replaced with better solutions. Deprecated features will not be removed until 4.0:

  • The SessionHelper has been deprecated. You can use $this->request->session() directly.

Unless there are major issues with the 3.1.0-beta release, we will have a release candidate and stable release packaged in the 4-5 weeks. The documentation for 3.1.0 is now available in the book and the API.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sat, 01 Aug 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/07/23/cakephp_2_7_1_released.html https://bakery.cakephp.org/2015/07/23/cakephp_2_7_1_released.html <![CDATA[CakePHP 2.7.1 Released]]> CakePHP 2.7.1 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.7.1.

Bugfixes

You can expect the following changes in 2.7.1. See the changelog for every commit.

  • CakeText::tokenize() now works with multibyte separator values.
  • AJAX requests that failed authentication when AuthComponent did not have a loginElement configured, are no longer trapped in a redirect loop.
  • Hash::maxDimensions() now correctly calculates the depth when nested elements are not in the 0th element of the parent.
  • Model::saveMany() and Model::saveAssociated() behave correctly when saving with atomic = false and boolean fields set to false.
  • FormHelper::input() now correctly uses the value option with date/time/datetime input types.
  • Terminal colours are enabled in windows when using ConEmu.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Thu, 23 Jul 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/07/22/cakephp_2_6_10_released.html https://bakery.cakephp.org/2015/07/22/cakephp_2_6_10_released.html <![CDATA[CakePHP 2.6.10 Released]]> CakePHP 2.6.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.6.10. This release fixes a regression introduced in 2.6.9.

Bugfixes

You can expect the following changes in 2.6.10. See the changelog for every commit.

  • Model::saveMany() and Model::saveAssociated() behave correctly when saving with atomic = false and boolean fields set to false.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Wed, 22 Jul 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/07/21/cakephp_3_0_10_released.html https://bakery.cakephp.org/2015/07/21/cakephp_3_0_10_released.html <![CDATA[CakePHP 3.0.10 Released]]> CakePHP 3.0.10 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.10. This is a maintenance release for the 3.0 branch that fixes a couple important regressions introduced in 3.0.9.

Bugfixes

You can expect the following changes in 3.0.10. See the changelog for every commit.

  • Fixed issue with getting plugin behaviors by alias
  • FormHelper do not throw warnings anymore when the _ids property of a field is empty
  • Hash::maxDimensions() was fixed to report the actual nesting level of an array
  • Made Xml serialization in responses more resilient
  • ObjectRegistry classes now implement EventDispatcherInterface
  • Empty conditions passed to where() in a query are now ignored

Download a packaged release on github.

]]>
Tue, 21 Jul 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/07/16/cakephp_3_0_9_released.html https://bakery.cakephp.org/2015/07/16/cakephp_3_0_9_released.html <![CDATA[CakePHP 3.0.9 Released]]> CakePHP 3.0.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.9. This is a maintenance release for the 3.0 branch.

Bugfixes

You can expect the following changes in 3.0.9. See the changelog for every commit.

  • Index and constraint reflection in MySQL now scopes to the current database.
  • . is now allowed in ObjectRegistry keys. This allows cache configurations to have . in their names.
  • Datetime validation now correctly handles meridian values.
  • Improved API documentation.
  • Pagination link generation is correct with custom routes.
  • Entity::extractOriginalChanged() now returns properties that were initially null.
  • Marshalling _joinData in belongsToMany associations with existing entities is now handled correctly.
  • Text::tokenize() now works as expected when the separator is a multi-byte character.
  • Folders generated by i18n extract have the correct permissions assigned.
  • Entities are now marked as ‘clean’ after the afterSave event.
  • The ORM does not emit UPDATE statements for hasMany and belongsToMany associations that have not actually changed.
  • Response::file() now accepts files with .. in the basename.

Improvements

As part of the 3.0 patch releases we are experimenting with implementing smaller net new features. In 3.0.9 the following new features were added:

  • Associations can now define a bindingKey() this column allows you to bind associations to non-primary key columns. This aims to remove the need to define foreignKey => false in associations.
  • Collections can now be serialized and unserialized with ease. This makes caching collections easier.
  • Exception attributes are no longer logged when debug=0.
  • Response::body() accepts a callable that can echo content directly or return the response body.
  • Email::configuredTransport() was added to allow enumeration of the configured email transports.
  • String templates accept . and _ in variable names. This improves compatibility with arrays generated by Hash::flatten()
  • Custom Type classes can define a baseType that maps to a simpler type. This makes it easier for FormHelper to generate inputs for custom types.
  • i18n extract now supports a --no-location option. This option will omit the location comments for messages from the generated POT file.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Thu, 16 Jul 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/07/15/cakephp_2_6_9_released.html https://bakery.cakephp.org/2015/07/15/cakephp_2_6_9_released.html <![CDATA[CakePHP 2.6.9 Released]]> CakePHP 2.6.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.6.9. This is the last maintenance release for the 2.6 branch. We recommend you upgrade to 2.7 for future bugfix releases.

Bugfixes

You can expect the following changes in 2.6.9. See the changelog for every commit.

  • Deep saving hasMany associations now handles validation errors correctly.
  • Improved API documentation.
  • DboSource::rawQuery() behaves correctly now when there are bound parameters.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Wed, 15 Jul 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/07/11/cakephp_2_7_0_released.html https://bakery.cakephp.org/2015/07/11/cakephp_2_7_0_released.html <![CDATA[CakePHP 2.7.0 Released]]> CakePHP 2.7.0 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.7.0. 2.7.0 is an API compatible feature release for the 2.x release series. The last 2.6 release will be 2.6.9, which will be released later this week.

2.7.0 should be a drop in replacement for your existing 2.5 or 2.6 libraries. In 2.7 the following new features are available.

Requirements

As of CakePHP 2.7 the PHP version requirement for 2.x series has been updated to PHP 5.3.0.

Deprecations

  • The class String has been renamed to CakeText. This resolves some conflicts around HHVM compatibility as well as PHP7. The String class is still provided for compatibility reasons.
  • Validation::notEmpty() has been renamed to Validation::notBlank(). This aims to avoid confusion around the PHP notEmpty() function and that the validation rule accepts 0 as valid input.
  • SessionComponent::setFlash() has been deprecated. You should use FlashComponent instead.
  • SessionHelper::flash() has been deprecated. You should use FlashHelper instead.

Backported Features From 3.0

  • Plugin shells that share a name with their plugin can now be called without the plugin prefix. For example Console/cake MyPlugin.my_plugin can now be called with Console/cake my_plugin.
  • Configure::consume() has been added to read and delete from Configure in a single step.
  • CakeSession::consume() has been added to read and delete from session in a single step.
  • New setting level is now available in TreeBehavior. You can use it to specify field name in which the depth of tree nodes will be stored.
  • New method TreeBehavior::getLevel() has been added which fetches depth of a node.
  • SessionComponent::consume() has been added to read and delete from session in a single step.
  • SessionHelper::consume() has been added to read and delete from session in a single step.
  • Shell::param() has been added. This method allows you to read CLI options without notice errors.
  • The text/plain content type is no longer mapped to the ‘csv’ response type by RequestHandlerComponent. This helps fix issues when applications used jQuery and csv responses.

Other Improvements

  • SQL datasources will now cast '' and null into '' when columns are not nullable and rows are being created or updated.
  • Argument $renew has been added to CakeSession::clear() to allow emptying the session without forcing a new id and renewing the session. It defaults to true.
  • CakeEmail will now use the ‘default’ config set when creating instances that do not specify a configuration set to use. For example $email = new CakeEmail(); will now use the ‘default’ config set.
  • ControllerTestCase::testAction() now supports an array as URL.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues, writing documentation and sending pull requests.

Download a packaged release on github.

]]>
Sat, 11 Jul 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/06/29/cakephp_2_6_8_released.html https://bakery.cakephp.org/2015/06/29/cakephp_2_6_8_released.html <![CDATA[CakePHP 2.6.8 Released]]> CakePHP 2.6.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.6.8. This is a maintenance release for the 2.6 branch.

Bugfixes

You can expect the following changes in 2.6.8. See the changelog for every commit.

  • Fix issue with overlapping irregular inflections. When irregular inflections overlap we should choose the longest match, not the shortest.
  • Fix regression in Inflector::camelize(). The input should not be lowercased before camelizing, as this can cause inputs that were previously camelized to create incorrect results.
  • Fix Validation::multiple() regarding 0 value. Previously 0 could not be a valid option.
  • FormHelper::radio() now supports complex option definition. This makes it easier to define custom attributes on each radio button.
  • Element tags had trailing whitespace removed. If you have custom element tags with HtmlHelper you might need to update your templates.
  • Shells will now never print HTML errors. Previously if you used custom the console error handlers you could end up with HTML in your terminal.
  • SQL operators in Postgres are now less greedy when fields are quoted.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Mon, 29 Jun 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/06/28/cakephp_3_0_8_released.html https://bakery.cakephp.org/2015/06/28/cakephp_3_0_8_released.html <![CDATA[CakePHP 3.0.8 Released]]> CakePHP 3.0.8 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.8. This is a maintenance release for the 3.0 branch.

Bugfixes

You can expect the following changes in 3.0.8. See the changelog for every commit.

  • EntityTrait::toArray() now handles mixed arrays better. Previously if the first element was an entity, it assumed that all elements were entities.
  • Pagination now preserves query string arguments with 0 as their value.
  • Validation::multiple() now correctly handles ‘0’.
  • Previously it was impossible to use dot notation on two different calls to matching/contain when part of the string was shared (for example Articles.SpecialTags.Tags and Articles.SpecialTags.Authors).
  • TableRegistry::get() now correctly merges pre-configured options.
  • Table names in UPDATE queries are correctly quoted now.
  • Fixtures now correctly reflect composite primary keys when generated.
  • Both [] and '' are now treated the same when saving belongsToMany associations. This fixes silent failures when ‘’ was used.
  • Numeric fields are cast to their string values when creating form security tokens. This resolves issues where integer values would cause validation failures.
  • CsrfComponent now correctly sets the cookie expiry date.
  • The list of available shell commands is now correct if there is an app Shell with the same name as a core one.
  • Multicheckboxes generated with complex input types are now checked/disabled correctly.
  • When updating belongsToMany links, association conditions are used. This fixes issues with polymorphic joint tables.
  • Pagination with SQLServer 2008 now works better.
  • AuthComponent no longer causes infinite redirects when an ajax request fails and / requires authentication. This was a regression in 3.0.7.

Improvements

As part of the 3.0 patch releases we are experimenting with implementing smaller net new features. We want try delivering new features incrementally. In 3.0.8 the following new features were added:

  • The fallback domain for translations can be disabled with I18n::useFallback(false).
  • PaginatorComponents’ sortWhitelist option now allows false to disable sorting entirely.
  • Components now have a response property set during initialization.
  • cake i18n extract now generates missing directories.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 28 Jun 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/06/14/cakephp_2_7_0_rc_released.html https://bakery.cakephp.org/2015/06/14/cakephp_2_7_0_rc_released.html <![CDATA[CakePHP 2.7.0-RC Released]]> CakePHP 2.7.0-RC Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.7.0-RC. 2.7.0 will be the next API compatible release for the 2.x release series.

2.7.0 should be a drop in replacement for your existing 2.5 or 2.6 libraries. In 2.7 the following new features are available.

Deprecations

  • The class String has been renamed to CakeText. This resolves some conflicts around HHVM compatibility as well as possibly PHP7+. There is a String class provided as well for compatibility reasons.
  • Validation::notEmpty() has been renamed to Validation::notBlank(). This aims to avoid confusion around the PHP notEmpty() function and that the validation rule accepts 0 as valid input.
  • SessionComponent::setFlash() has been deprecated. You should use FlashComponent instead.
  • SessionHelper::flash() has been deprecated. You should use FlashHelper instead.

Backported Features From 3.0

  • Plugin shells that share a name with their plugin can now be called without the plugin prefix. For example Console/cake MyPlugin.my_plugin can now be called with Console/cake my_plugin.
  • Configure::consume() has been added to read and delete from Configure in a single step.
  • CakeSession::consume() has been added to read and delete from session in a single step.
  • New setting level is now available in TreeBehavior. You can use it to specify field name in which the depth of tree nodes will be stored.
  • New method TreeBehavior::getLevel() has been added which fetches depth of a node.
  • SessionComponent::consume() has been added to read and delete from session in a single step.
  • SessionHelper::consume() has been added to read and delete from session in a single step.

Other Improvements

  • SQL datasources will now cast '' and null into '' when columns are not nullable and rows are being created or updated.
  • Argument $renew has been added to CakeSession::clear() to allow emptying the session without forcing a new id and renewing the session. It defaults to true.
  • CakeEmail will now use the ‘default’ config set when creating instances that do not specify a configuration set to use. For example $email = new CakeEmail(); will now use the ‘default’ config set.
  • ControllerTestCase::testAction() now supports an array as URL.

If there are no major issues reported in the next 3-4 weeks, a stable release of 2.7.0 will be released.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues, writing documentation and sending pull requests.

Download a packaged release on github.

]]>
Sun, 14 Jun 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/06/14/cakephp_3_0_7_released.html https://bakery.cakephp.org/2015/06/14/cakephp_3_0_7_released.html <![CDATA[CakePHP 3.0.7 Released]]> CakePHP 3.0.7 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.7. This is a maintenance release for the 3.0 release series. See the changelog for every commit.

Bug Fixes in 3.0.7

  • Time validation rules now accept 12:15pm.
  • Table names with .’s to access tables in other databases in MySQL, now correctly generate foreignKeys using conventions.
  • Collection::sumOf() uses an identity function by default.
  • Overlapping irregular inflections are now handled correctly.
  • IntegrationTestCase::assertTemplate() now works when a view renders one or more cells.
  • Custom fields used in pagination will not be auto-prefixed. This was a regression introduced in 3.0.6.
  • Fixed incorrect ORDER BY clauses on SQLServer. Older versions of SQLServer require that ORDER BY expressions not be constant expression.
  • Where conditions for columns in belongsToMany junction tables are now properly type cast to their statement representations.
  • Parameter typehints in function expressions are now set correctly.
  • EventManager::off() can now disable all events of a single type as documented.
  • MySQL schema generation for unconventional tables has been improved.
  • Radio button sets now always include the hidden field as long as the option is enabled. This prevents blackholed requests when the current value is outside of the radio input options.
  • Identifier quoting in ORDER BY and IS NULL and IS NOT NULL expressions is now correct.
  • TreeBehavior now aliases the fields used to sort.

Improvements in 3.0.7

  • AssetFilter now supports a cacheTime option to control the cache headers.
  • RulesChecker features for the ORM were separated into a trait. This makes rules easier to reuse in other datasources.
  • EventDispatcherInterface was added. This lets you use instanceof instead of method_exists when testing if an object supports events.
  • A console output test stub class has been added to help making testing console applications easier.
  • Collection::extract() now supports the {*} wildcard when extracting properties.
  • Console commands and tasks now support the ability to overwrite all files, removing the need to answer y to each file.
  • All tests pass on PHP7.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues, writing documentation and sending pull requests.

Download a packaged release on github.

]]>
Sun, 14 Jun 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/05/28/cakephp_2_6_7_released.html https://bakery.cakephp.org/2015/05/28/cakephp_2_6_7_released.html <![CDATA[CakePHP 2.6.7 Released]]> CakePHP 2.6.7 Released

Earlier today, we announced the release of 2.6.6. This version contained a syntax error in PHP < 5.4. This error has been corrected in 2.6.7. If you are running PHP < 5.4.0 you should upgrade to 2.6.7 instead of 2.6.6.

In doing the security release, I did not follow our normal process of ensuring that there is a passing build on all supported PHP versions before doing the release. This was a mistake and will not happen again.

]]>
Thu, 28 May 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/05/28/cakephp_2_6_6_and_3_0_6_released.html https://bakery.cakephp.org/2015/05/28/cakephp_2_6_6_and_3_0_6_released.html <![CDATA[CakePHP 2.6.6 and 3.0.6 Released]]> CakePHP 2.6.6 and 3.0.6 Released

The CakePHP core team is ready to announce the immediate availability of CakePHP 2.6.6 and 3.0.6. These are maintenance releases that contain important security fixes.

Security Fixes

Earlier this week we were notified that RequestHandlerComponent had a vulnerability that would allow well crafted requests to create a denial of service attack. RequestHandlerComponent leverages Xml::build() which allows reading local files. We recommend that all applications using RequestHandlerComponent upgrade, or disable parsing XML payloads. To disable XML payload parsing you can do the following:

// In a controller's beforeFilter
$this->RequestHandler->addInputType('xml', array(0 => function() { return array(); }));

The above code will replace the built-in XML parsing with a no-op function. We’d like to thank Takeshi Terada for notifying us of this security issue using our Security Issue Process

Other Fixes in 2.6.6

  • FormHelper::radio() now correctly generates ID attributes for radio buttons with multibyte values.
  • Inflector::humanize() and Inflector::underscore() work correctly with UTF8 characters now.

Other Fixes in 3.0.6

  • FormHelper::radio() now correctly generates ID attributes for radio buttons with multibyte values.
  • Inflector::humanize() and Inflector::underscore() work correctly with UTF8 characters now.
  • URLs in FormHelper::postLink() are no longer double encoded.
  • PaginatorHelper::numbers() now supports the url option.
  • Error.trace is now respected when logging exceptions.
  • The Entity accessors cache introduced in 3.0.3 has been removed. It caused a number of issues and didn’t greatly improve performance.
  • EntityTrait::getOriginal() and EntityTrait::extractOriginal() now return values that were initially null.
  • Empty query expressions used in association query builders no longer cause invalid SQL to be generated.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Thu, 28 May 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/05/24/cakephp_2_6_5_released.html https://bakery.cakephp.org/2015/05/24/cakephp_2_6_5_released.html <![CDATA[CakePHP 2.6.5 Released]]> CakePHP 2.6.5 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.6.5. 2.6.5 is a bug fix release for the 2.6 release series.

A short list of the changes you can expect in 2.6.5 is:

  • Year form fields when created with input() now work as expected.
  • Support for the 429 HTTP status code has been added.
  • JsonView now supports a _jsonOptions view variable to configure the serialization options used in json_encode().
  • XmlView now supports a _xmlOptions view variable to configure the serialization options used when generating XML.
  • Code coverage in the web runner for non-app files works again.
  • SchemaShell no longer mangles file names ending in ‘p’ or ‘h’.
  • Multi-word irregular nouns are now inflected properly by Inflector. Previously words would contain letters transposed between the first and second word.
  • All HTML5 attributes that can be minimized have been added to HtmlHelper.
  • Identifier quoting of table aliases in sub-queries, used to create virtual fields has been corrected.

I’d like to thank the people who have contributed to these releases. Your issues, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github.

]]>
Sun, 24 May 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/05/17/cakephp_3_0_5_released.html https://bakery.cakephp.org/2015/05/17/cakephp_3_0_5_released.html <![CDATA[CakePHP 3.0.5 Released]]> CakePHP 3.0.5 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.5. This is a maintenance release for the 3.0 branch.

Bugfixes

You can expect the following changes in 3.0.5. See the changelog for every commit.

  • Filesystem libraries are now available as a standalone package through composer.
  • QueryLogger correctly interpolates parameters when there are more than 10 placeholders.
  • Datetime inputs correctly render seconds picker elements. Previously they did not include 00.
  • Marshalling belongsToMany _joinData was improved. The marshaller now correctly handles a mix of new and existing entities.
  • InstanceConfigTrait deletes nested data correctly now.
  • SQLite fixtures now generate primary key columns correctly in all situations.
  • Property caching in Entities was made less aggressive. The mutator caches are now completely invalided when any property is changed.
  • Association conditions are no longer used when marshalling existing belongsToMany records.
  • i18n shell creates separate po file entries for messages with differing contexts.
  • The @ syntax for file uploads in HttpClient was deprecated. Instead you should use resource handles. The @ syntax is unsafe with user supplied data and will be removed in a future version of CakePHP.
  • Blob fields in SQLServer are now hexdecoded before being converted into resource handles.
  • FormHelper will not default datetime pickers to ‘now’ unless the input also has the default => true option supplied. This was done to make it easier to work with nullable datetime fields.
  • QueryExpressions containing subqueries now correctly wrapped in parenthesis.

Improvements

As part of the 3.0 patch releases we are experimenting with implementing smaller net new features. We want try delivering new features incrementally. In 3.0.5 the following new features were added.

  • Validator::addNested() and Validator::addNestedMany() were added. These methods allow you to create validators for nested array properties.
  • Collection::unwrap() was added.
  • Folder::copy() now supports a non-recursive mode.
  • Collection::zip() and Collection::zipWith() were added.
  • The __debugInfo() method was implemented in Form and Validator objects. This improves DebugKit and debug() output.

CakeFest 2015 Tickets

CakeFest 2015 is happening in 11 days in NYC. If you haven’t already purchased your tickets, there is still time.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Sun, 17 May 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/05/07/cakephp_3_0_4_released.html https://bakery.cakephp.org/2015/05/07/cakephp_3_0_4_released.html <![CDATA[CakePHP 3.0.4 Released]]> CakePHP 3.0.4 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.4. This is a maintenance release that contains security fixes and bugfixes.

Security Fixes

There are two issues that can impact the security of a CakePHP application:

  • CsrfComponent fails to invalidate requests that are missing both the CSRF token, and CSRF post data.
  • When marshalling request data, empty entities could by bypass validation methods with carefully created JSON payloads. RulesChecker validations would not be bypassed by these empty entities.

We’d like to thank ‘Hayato Araki’ for contacting us through our security issue process about the CsrfComponent issue. We recommend that all users of CakePHP upgrade to 3.0.4 as soon as possible.

Bugfixes

In addition to the security issues the following defects have been fixed:

  • Cascading deletes on associations with custom aliases should no longer fail.
  • XmlView now supports _xmlOptions. This matches the behavior of JsonView.
  • EntityTrait::extractOriginal() now behaves consistently with extract(). Both methods now include all named properties, instead of just the unchanged properties. A new method extractOriginalChanged() can be used to extract only the original values of changed attributes.
  • Query string parameters are now correctly supported in IntegrationTestCase.
  • Collection::isEmpty() and Cake\ORM\Query::isEmpty() was added.
  • Forms can now be created without the action attribute.
  • Accessing entity data is now more efficient. Entities will cache the result of custom accessors, and invalidate the cache when properties are changed or removed.

For a deeper insight of what changed, have a look at the release notes.

CakeFest 2015 Tickets

There is still time to get your tickets for CakeFest 2015 if you haven’t already. May 28th and CakePHP’s 10th anniversary are quickly approaching.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.

]]>
Thu, 07 May 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/05/03/cakephp_3_0_3_released.html https://bakery.cakephp.org/2015/05/03/cakephp_3_0_3_released.html <![CDATA[CakePHP 3.0.3 Released]]> CakePHP 3.0.3 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 3.0.3. This is maintenance releases that improves speed and reliability of the framework.

Some of the changes introduced were:

  • Extracted the validation logic into a trait that can be reused in projects outside the framework or directly into other parts of your application.
  • Fixed several problems in the Http client class, added support for the OPTIONS and TRACE methods. Improved ssl connections in PHP 5.6
  • Improved performance of find('list') by only selecting the columns that it needs to use for generating the result, when possible.
  • Using the multi-table update syntax in MySQL is now allowed when using a ORMQuery object
  • Numerous bug fixes.

CakeFest 2015 Tickets

There is still time to get your tickets for CakeFest 2015 if you haven’t already. May 28th and CakePHP’s 10th anniversary are quickly approaching.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests. The Cake is still rinsing!

Download a packaged release on github.

]]>
Sun, 03 May 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/04/26/queries_log_for_your_ajax_requests.html https://bakery.cakephp.org/2015/04/26/queries_log_for_your_ajax_requests.html <![CDATA[Queries log for your AJAX requests]]> Queries log for your AJAX requests

Have you ever needed to look inside what’s going on with your AJAX requests?

With the rise of javascript-heavy applications it is becoming necessary to have more powerful tools for inspecting and debugging asynchronous requests without reloading the browser or using special browser plugins.

With DebugKit 3.1, inspecting XHR requests is now possible. By default, all AJAX requests are logged into the History panel in your DebugKit Toolbar:

DebugKit Ajax Panel

By clicking on any of the logged XHR requests you will be able to see toolbar information for that specific request, including the SQL log, view variables, logged messages and timers.

This update is immediately available for all CakePHP 3.0.x users, please update your DebugKit installation by doing:

composer update cakephp/debug_kit

We hope this feature will make you as happy and excited as we are. Keep baking!

]]>
Sun, 26 Apr 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/04/18/cakephp_2_6_4_and_3_0_2_released.html https://bakery.cakephp.org/2015/04/18/cakephp_2_6_4_and_3_0_2_released.html <![CDATA[CakePHP 2.6.4 and 3.0.2 Released]]> CakePHP 2.6.4 and 3.0.2 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.6.4 and 3.0.2. Both releases are bug fix releases for their respective branches.

2.6.4

A short list of the changes you can expect in 2.6.4 is:

  • When json_encode() fails in JsonView an exception is raised.
  • PaginatorHelper will not emit notice errors when generating links for models that were not paginated.
  • Memcache cache engine can now connect to domains starting with ‘u’. Previously, these values were treated as unix sockets.
  • The regression around vendor paths introduced in 2.6.3 has been fixed.
  • HttpSocket can now connect to HTTPS sites via a HTTP Proxy.
  • Sessions are renewed even when the session id is ‘0’.
  • Hash::maxDimensions() now works with arrays of 1 or 0 dimensions.
  • Inflector now correctly inflects ‘sieves’.
  • DboSource::__destruct() now correctly rolls back any open transactions. This restores behavior that was unintentionally removed in an earlier 2.x release.
  • CakeRequest::header() now correctly reads headers with a value of ‘’ and ‘0’.
  • ControllerTestCase now works better with actions that use CakeResponse::file(). Previously warnings were emitted about ob_end_clean() failing.
  • API documentation improvements.

3.0.2

A short list of the changes you can expect in 3.0.2 is:

  • SessionHelper is deprecated. You should use the FlashHelper, or $this->request->session() instead.
  • Saving BelongsToMany associations that contain a mixture of new and existing records has been improved.
  • Validation::notEmpty() has been renamed to Validation::notBlank(). Validation::notEmpty() is now deprecated.
  • Validation::userDefined() is now deprecated, you can set callables directly in the Validator objects instead.
  • SQLite schema reflection now works with older versions of SQLite. Foreign key update/delete clauses will not be reflected with older versions of SQLite.
  • Hash::get() no longer raises an exception on a path of '' or null.
  • Fatal errors when saving belongsToMany relationships that were not marshaled into entities have been fixed.
  • Collection now implements __debugInfo().
  • Magic finder methods now correctly alias fields in the where clause.
  • Cascading deletes now prioritize associations with cascading callbacks, and then apply to associations without callbacks.
  • Shells dispatched with dispatchShell() no longer output the welcome message.
  • MySQL driver now uses SET NAMES to fix encoding errors in some installations.
  • IntegrationTestCase now recursively merges request data into the stubbed request.
  • Responses in IntegrationTestCase now allow better content-type assertions.
  • 0000-00-00 is now converted into null by the database type system. This prevents issues in how PHP’s DateTime handles year 0.
  • FormHelper fields that use integers as their name no longer trigger black hole errors.

CakeFest 2015 Tickets

There is still time to get your tickets for CakeFest 2015 if you haven’t already. May 28th and CakePHP’s 10th anniversary are quickly approaching.

I’d like to thank the people who have contributed to these releases. Your issues, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github.

]]>
Sat, 18 Apr 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/04/04/cakephp_3_0_1_released.html https://bakery.cakephp.org/2015/04/04/cakephp_3_0_1_released.html <![CDATA[CakePHP 3.0.1 Released]]> CakePHP 3.0.1 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 3.0.1. 3.0.1 is a bugfix release for the 3.0 release branch. A short list of the changes you can expect is:

  • Reduced chances for timing attacks in HMAC comparisons in Security::decrypt() by using more constant time string comparisons.
  • FormHelper now supports an idPrefix option. This option allows you to specify the prefix you want prepended to id attribute of all inputs FormHelper generates.
  • FormHelper now supports group templates for each input type. For example, the radioFormGroup template will be used for radio button sets.
  • Elements included in a prefixed request context now look in prefixed paths. When a controller runs in a prefixed route/namespace it will automatically append the current prefix to the view paths used to locate elements.
  • Schema reflection for Postgres no longer fails when foreign keys rely on stored procedures.
  • Schema reflection now treats money columns as strings. Due to leading currency codes the ORM cannot easily map this type into float values.
  • Selectboxes disable and select active options correctly now when complex option data is used.
  • Selectboxes can now have an empty name attribute.
  • URL filters are applied before the existing request context is applied now.
  • CakeI18nTime now supports short timezone offset formats.
  • Query logging now works when the duplicate named parameters are used.
  • existsIn rules now correctly set an error message when used with a list of fields.
  • RulesChecker methods can now return strings to indicate failure. The returned strings will be used as the error message if a field was also defined for the rule.
  • Primary key values can now be defined when creating entities. This improves compatibility with UUID’s where ID’s are generated outside of your application.
  • When saving/updating entities, existing HasMany associations can be re-linked using a _ids input similar to BelongsToMany associations.
  • Greatly improved performance around hydrating ORM results.
  • Improved PHP7 & HHVM compatibility.
  • Improved API documentation.

There is still time to get your tickets for CakeFest 2015 if you haven’t already. May 28th and CakePHP’s 10th anniversary are quickly approaching.

You can view the full changelog on cakephp.org. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github.

]]>
Sat, 04 Apr 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/03/31/cakefest_2015_new_york_usa.html https://bakery.cakephp.org/2015/03/31/cakefest_2015_new_york_usa.html <![CDATA[CakeFest 2015: New York, USA]]> CakeFest 2015: New York, USA

Join us at CakeFest 2015, the annual CakePHP conference, held this year in New York, USA, from the 28th until the 31st of May, and experience the very best of Open Source! Visit https://cakefest.org for info and tickets.

The biggest CakePHP event, ever!

This year we’re celebrating the stable release of 3.0, as well as an incredible 10 years of CakePHP and Open Source with the whole community. This is a huge milestone for the project, so we couldn’t think of anywhere better than the awesome city of New York, USA.

Workshops

The 2 days of workshops at CakeFest are the perfect opportunity to learn the best parts of CakePHP 3.0 with core developers, and a great way to get up to speed with all the new features included in the latest major version of the framework. You’ll also receive your own certificate of attendance.

This year we have both basic and advanced workshops, from getting the most out of CakePHP, to going deep into the internals of the framework, allowing both beginners and veterans to get a piece of the cake!

Conference

Covering 2 full days of keynotes, presentations and talks on CakePHP and related technologies, the conference portion of CakeFest is an event you don’t want to miss, for both enthusiasts and newcomers to the framework. It’s a unique time to engage and network with the community, learn from other experienced developers, and hang out with the core team! See https://cakefest.org/schedule for more details.

Sponsors

This year we’ve teamed up again with some of the biggest names in the industry, to make this the best CakePHP and Open Source community conference ever! These people, organisations and companies help make everything happen, so be sure to check them out at https://cakefest.org/sponsors and say hi!

Event

The event itself is held from Thursday the 28th until Sunday the 31st of May. The first 2 days are dedicated to the workshops, while the weekend sees the 2 conference days through to the closing of the conference.

There are tickets for only the workshops, just the conference days, or the full event (recommended), and we currently have the Early Bird discount on all prices. Grab your tickets now at https://cakefest.org/tickets, and see you there!

]]>
Tue, 31 Mar 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/03/22/CakePHP-3-0-0-is-Here.html https://bakery.cakephp.org/2015/03/22/CakePHP-3-0-0-is-Here.html <![CDATA[CakePHP 3.0.0 is Here!]]>

CakePHP 3.0.0 is Here!

The CakePHP core team is thrilled to announce the release of CakePHP 3.0.0. This is the first API stable release for the 3.0 branch. This release is a backwards incompatible release with previous CakePHP versions. The new minimum requirements for CakePHP are:

  • PHP 5.4.16 or greater.
  • mbstring extension
  • intl extension

Some of the key features in CakePHP 3.0 are outlined in the following sections.

Key Features

A New ORM

The largest and most exciting change in CakePHP 3.0, is the new ORM. While the Model layer in CakePHP has served the community very well for the past 8 years, we felt there was a big opportunity to learn from the tools other frameworks provide and create a flexible and powerful ORM for CakePHP. We are very proud of the results. The ORM migration guide gives an overview of the new ORM, and how it differs from the old one.

Some of the key features of the new ORM are:

Faster and More Flexible Routing

Reverse routing has almost consistent time complexity now. In previous releases reverse routing performance decreased as the number of routes increased. Thanks to named routes and some additional optimizations, routing performance will not degrade even with large numbers of routes.

With the usage of routing scopes, routes can also be parsed and dispatched even faster than in previous releases of CakePHP. You can learn more about the new Router in the Routing section of the manual.

Improved Migrations

A more powerful migrations plugin based on phinx allows you to easily create and deploy migrations for your application.

Better Internationalization

The I18n subsystem was completely rewritten to take advantage of the intl PHP extension. This allows CakePHP to offer:

Improved Debugging Toolbar

DebugKit has been rebuilt for 3.0 and offers more features than ever before with less overhead to your application. DebugKit is installed by default in the new application skeleton.

DebugKit History Panel

Composer Usage

CakePHP, the Application skeleton and several components (bake, acl, migrations and DebugKit are now installed with composer. We recommend using composer for installing CakePHP as it greatly simplifies maintaining the dependencies for your application.

Standalone libraries

A number of CakePHP libraries have been split out into standalone libraries. Each of these libraries can be used outside of CakePHP applications, or in a 2.x application where you want to start leveraging some of the new features in 3.0.

View Cells

View cells are small classes that offer controller-like functionality but can be used directly in the view to pull data from any source and render certain template. Read more about View Cells.

Getting started

On top of the framework changes, we’ve created a new repository for the application skeleton[3]. You can install this and the development preview of CakePHP using composer[4]. After downloading and installing composer you can use:

$php composer.phar create-project cakephp/app

This will generate a new application, so you can start experimenting with CakePHP 3.0.

Learn More With the Documentation

Once you have an application started, you can read the quickstart guide or migration guide to learn more about all the changes and new abilities in CakePHP 3.0.

Community Plugins

Even though CakePHP 3.0 is young, it already counts on a big community behind it. A big list of plugins has been created for this new version and some of the favorite plugins that are used for version 2 have already been upgraded. You can check the list of CakePHP 3 community plugins. To get an overview of what is available and what still needs to be upgraded to the new version.

This new release of CakePHP has been a few years in the making and we’re very thankful for all the help we’ve received. From documentation edits, to pull requests and bug reports, we’ve been impressed with the level of community involvement starting from before the first development preview.

Download a packaged release or get started with the quickstart guide.

]]>
Sun, 22 Mar 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/03/16/CakePHP-2-6-3-Released.html https://bakery.cakephp.org/2015/03/16/CakePHP-2-6-3-Released.html <![CDATA[CakePHP 2.6.3 Released]]> CakePHP 2.6.3 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.6.3.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.6.3. 2.6.3 is a bugfix release for the 2.6 release branch. A short list of the changes you can expect is:

  • The postgres driver can now convert text fields into integer fields through SchemaShell.
  • Files with .. in their name can now be downloaded through CakeResponse.
  • LC_TIME messages are ignored when extracting messages via the I18nShell. Previously, incompatible po files were extracted for LC_TIME messages.
  • Fence post errors were fixed in CakeEmail when sending messages with lines equal to 999 bytes.
  • Words with WWW in the middle are no longer autolinked by TextHelper.
  • PaginatorComponent now handles order conditions like Model::find() does.
  • Maxlength attributes are no longer generated by FormHelper for decimal fields. In 2.6.2 maxlength was corrected, however, the fix added in 2.6.2 made it impossible to use the full length of decimal columns.
  • The limit and maxLimit settings for PaginatorComponent are now independent.
  • Model’s whitelist is no longer empty in afterSave.
  • Class names in Scaffold errors are now correct.

The schedule for CakeFest 2015 has been posted. Get your tickets now as May 28th and CakePHP’s 10th anniversary are quickly approaching.

You can view the full changelog on cakephp.org. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github.

]]>
Mon, 16 Mar 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/02/19/CakePHP-2-6-2-Released.html https://bakery.cakephp.org/2015/02/19/CakePHP-2-6-2-Released.html <![CDATA[CakePHP 2.6.2 Released]]> CakePHP 2.6.2 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.6.2.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.6.2. 2.6.2 is a bugfix release for the 2.6 release branch. A short list of the changes you can expect is:

  • Fixed exception rendering when ExceptionRenderer raised an error.
  • Notice errors in PaginatorHelper when no model was set have been fixed.
  • ConsoleOutput does not generate errors when used with php://output.
  • Redirect responses now use 302 as the default status code instead of 200.
  • Plugin bake now generates correct directories for Views/Layouts.
  • FormHelper no longer creates invalid maxlength attributes for decimal columns when the text type is forced.
  • TextHelper no longer doubly links urls starting with //
  • POT file generation no longer includes the ‘POT-Creation-Date’ header. It often lead to pointless noise in version control.

You can view the full changelog on cakephp.org. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github.

]]>
Thu, 19 Feb 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/02/09/CakePHP-3-0-0-RC2-Released.html https://bakery.cakephp.org/2015/02/09/CakePHP-3-0-0-RC2-Released.html <![CDATA[CakePHP 3.0.0-RC2 Released]]>

CakePHP 3.0.0-RC2 Released

The CakePHP core team is excited to announce the release of CakePHP 3.0.0-RC2.

The CakePHP core team is excited to announce the release of CakePHP 3.0.0-RC2. Our plan is that this will be the final 3.0.0 release candidate and in ~6 weeks time 3.0.0 stable will be released. Since 3.0.0-RC1, we’ve been hard at work incorporating community feedback, fixing many issues and improving the documentation.

Upgrading From an Earlier 3.0.0 release

When upgrading from an earlier 3.0.0 release there are a few important changes you’ll need to make.

Plugin Installation

The use and role of the CakePHP Plugin installer has changed and requires the following updates to your app’s composer.json file:

"require": {
    "cakephp/plugin-installer": "*",
    "cakephp/bake": "dev-master"
},
"scripts": {
    "post-autoload-dump": "Cake\\Composer\\Installer\\PluginInstaller::postAutoloadDump"
}

These additions will ensure that your plugins continue to install correctly. Plugins installed with composer will now be installed under /vendor. This change was done to make the separation between external and in-app plugins clearer. Having both in the same directory was confusing for a number of users.

String renamed to Text

In preparation for PHP7 and HHVM, the String class was renamed to CakeUtilityText. The old class name continues to work but will be removed in a future 3.x release.

Configuration File Changes

Configuration files loaded through Configure::load() previously required the extension. The extension being present made switching configuration file formats hard. For RC2, you must remove the extensions. So Configure::read(‘app.php’) is now Configure::read(‘app’). PHP based configuration files should now return their data instead of setting the $config variable. The $config variable is now deprecated and will be removed in a future 3.x release.

ORM Callback Consistency

The various ORM callbacks had somewhat inconsistent types used for the $options parameter. All callbacks will now receive an ArrayObject for the $options parameter. Query::formatResults() no longer gets the query as an argument either. If you need access to the query from a result formatter, use a closure.

EventManager::detach() and EventManager::attach() are deprecated

These methods have been replaced with on() and off(). These new methods use an interface much like jQuery’s methods. attach() and detach() are now deprecated and will be removed in a future 3.x release. We’d like to welcome Jad Bitar (jadb), Walther Lalk (dakota) and Anthony Grassiot (antograssiot) to the core team. Each of them has helped make 3.0.0 what it is today.

For more details on all the changes in 3.0.0, you should consult the migration guide. In closing, we’d like to thank all of the people that have helped so far with the 3.0 release. Download a packaged release.

]]>
Mon, 09 Feb 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/01/16/CakePHP-2-6-1-Released.html https://bakery.cakephp.org/2015/01/16/CakePHP-2-6-1-Released.html <![CDATA[CakePHP 2.6.1 Released]]> CakePHP 2.6.1 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.6.1.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.6.1. 2.6.1 is a bugfix release for the 2.6 release branch. A short list of the changes you can expect is:

  • I18nShell now correctly extracts messages with context.
  • Improved web test runner. All URL options now have links in the interface.
  • Session directories are now created when debug is enabled.
  • Text columns in SQLServer no longer contain length when reflected. The length value was not useful and was causing FormHelper to misbehave.
  • AssetDispatcher no longer sets the Content-Length header as it was incorrect when assets included PHP code.
  • URL autolinking has been improved.
  • Criterion is now correctly inflected.
  • Time strings are now correct when mbstring is not installed.
  • The exception emitted when headers were sent has been removed. This exception was causing more problems than it was solving, including infinite loops on fatal error pages.
  • Radio buttons that are only partially disabled are now added to the list of secured fields.
  • MySQL now correctly quotes SET column values.

You can view the full changelog on cakephp.org. We’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github.

]]>
Fri, 16 Jan 2015 00:00:00 +0000
https://bakery.cakephp.org/2015/01/02/CakePHP-3-0-0-RC1-Released.html https://bakery.cakephp.org/2015/01/02/CakePHP-3-0-0-RC1-Released.html <![CDATA[CakePHP 3.0.0-RC1 Released]]> CakePHP 3.0.0-RC1 Released

What is the best way to start a new year? Having the most advanced and flexible version of CakePHP ready to be used in your projects!

The CakePHP core team is proud to announce the first release candidate for CakePHP 3.0.0. It’s been an intense time since our last beta release. We have been busy polishing most of the rough edges that we could find with the help of the community.

This polishing sprint meant a few breaking API breaking changes from beta3, specifically around the validation subsystem, due to many shortcomings found in the previous implementation.

Below the list of new features and changes that made it into 3.0.0-rc1:

Revamped Validation

The validation process was split into two stages. The first stage is a user-facing type of validation and has not changed since the last release except for where and when it is performed.

In previous versions you would do

 `
$article=$this->Articles->newEntity($this->request->data);
$this->Articles->save($article,['validate'=>'myCustomValidatorName']);

`

But now, user-facing validation is performed when creating the entity and not when saving it. This requires you to pass the validation option to either newEntity or patchEntity methods:

 `
$article=$this->Articles->newEntity($this->request->data,[
'validate'=>'myCustomValidatorName'
]);
$this->Articles->save($article);

`

It is important to notice that fields that fail validation will not be copied into the resulting entity.

The second validation step, that we have called “application rules”, is done when saving or deleting an entity. The rules checking step is meant to check application integrity, such as uniqueness of a column, arity or foreignKey constraints:

 `
//InUsersTable.php

publicfunctionbuildRules(RulesChecker$rules){
$rules->add($rules->isUnique('email'));
return$rules;
}

`

Application rules can also be used to enforce business logic constraints such as state machines, and workflow states.

The validate() and validateMany() methods have been removed from the Table class.

You can read more about the application rules system in the rules checker documentation.

New Error Pages

The error pages containing the exception stack traces have been redesigned to be easier to read and spot what caused the error originally. The new look was inspired by the Rails’ better errors plugin

New Bake Plugin

The cake bake command is now a plugin. This will help us evolve its code at a higher pace and introduce new code generators and configuration options.

One important change concerning bake is that it now uses CakePHP’s View system to render the templates. This means that it is possible to attach listeners to the Bake.beforeRender and Bake.afterRender events to modify bake’s output.

Additionally, the templating syntax has changed to make them more readable. If you had your own bake templates in the past, they will need to be updated to use the new syntax which uses erb style tags. To get the Bake plugin run:

 `
composerrequirecakephp/bake=dev-master--dev

`

And load it in your application bootstrap_cli.php file:

Plugin::load(‘Bake’);

Table-less Forms

Due to popular request, there is now a Form object that is capable of defining a schema and validating form data without the use of ORM tables or entities:

 `
publicfunctionadd()
{
$contact=newContactForm();
if($this->request->is('post')){
if($contact->execute($this->request->data)){
$this->Flash->success('Wewillgetbacktoyousoon.');
return$this->redirect(['action'=>'add']);
}
$this->Flash->error('Therewasaproblemsubmittingyourform.');
}
$this->set('contact',$contact);
}

`

You can read more about them here https://book.cakephp.org/3.0/en/core-libraries/form.html

Adopted PSR-2

We have recently adopted the PSR-2 coding style standard for CakePHP and all the official plugins. You can read more about the reasoning in this blog post

]]>
Fri, 02 Jan 2015 00:00:00 +0000
https://bakery.cakephp.org/2014/12/29/CakePHP-Community-2014.html https://bakery.cakephp.org/2014/12/29/CakePHP-Community-2014.html <![CDATA[CakePHP Community 2014]]> CakePHP Community 2014

2014 again beat everyone’s expectations, with the CakePHP community growing around the world.

3.0: the evolution of a PHP framework

If anything were to have marked 2014 for CakePHP we’d probably all agree it was 3.0, the latest major version of the framework in it’s 10 year lifetime. After a series of successful developer previews and several beta releases, we’re now in position to freeze the API inline for a final stable version, just after community review of the release candidates.

It’s been a long way to get where we are right now, but the direction taken has advanced the framework, and brought it inline with what developers have been asking for. There have been some significant changes and great new additions, as well as some important decisions, but we truly feel this best represents the community’s expectations as a whole, and prepares us for the next generation of CakePHP applications.

So far, this year has seen 30+ releases, including versions 2.5 and 2.6 of the framework, and over 120 releases to date. This was made possible by some 290 contributors to the project, and that doesn’t even count the more than 360 contributors to the documentation. Above all, CakePHP continues to be ranked in the top 5 most popular PHP frameworks on GitHub by developers.

The project has also begun to increase it’s modularity even further by splitting the core framework into modules (or packages), which allow aspects of CakePHP to be remixed with other projects. This hasn’t stopped people from being inspired by the framework in the past, even Doctrine gave us a hat tip with their Inflector class. All in all, this just shows how committed we really are about contributing back to the Open Source community as a whole, while allowing developers to use the best of CakePHP where they see fit.

The community effect

On the social side of things we now have over 15,000 likes on Facebook as well as some 12,000 followers on Twitter. There were also various book released this year, accompanied by the launch of both the official podcast and certification platform by the Cake Software Foundation.

We saw some great talks and presentations on CakePHP, numerous interviews and podcasts, lots of blog posts and many tutorials, developers giving their own personal experiences with the project, as well as a community curated list of awesomeness and some stunning displays of contribution growth and developer dedication. We’ve also witnessed the community grow in terms of developer organized meetups, with events now taking place in locations such as the Netherlands, France, Germany, Ahmedabad, Tokyo and New York.

A conference to remember

On the topic of events, CakeFest 2014, the annual CakePHP conference, was held this year in Madrid, Spain. The event, covering 4 days of workshops and conference, left us with lots of memorable moments. It also had some really amazing reviews as well as some awesome feedback from the community.

It was by far one of our biggest turn-outs ever, with an incredible line-up of high profile speakers, and an awesome array of sponsors, including CakeDC, Microsoft Azure, GitHub, Rackspace, O’Reilly, JetBrains, Packt Publishing, NuSphere, Loadsys, SANIsoft, ZenServ, Broadband Finder and Intersective.

The slides for the community keynote are available, or you can listen to it on an episode of the CakePHP podcast. More talks and slides from the conference days can also be found here, or check out images from the event. And finally, a big shout-out to everyone who joined us for 2014, we hope to see you all again next year for another incredible gathering of the CakePHP community!

Drawing to a close

Looking back, this year has been a remarkable year for us. Without a doubt, and after 10 long years, CakePHP still remains a very popular framework for PHP development. It’s the direct result of a community working together!

If you’ve contributed to the project, in any manner, shape or form, then feel proud that you’ve played a part in this awesome social experiment we call Open Source. Words aren’t enough to express our gratitude, so all we can say is… Thank You.

]]>
Mon, 29 Dec 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/12/23/CakePHP-2-6-0-Released.html https://bakery.cakephp.org/2014/12/23/CakePHP-2-6-0-Released.html <![CDATA[CakePHP 2.6.0 Released]]> CakePHP 2.6.0 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.6.0.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.6.0. There have been a few changes to 2.6.0 since the RC1 release:

  • AuthComponent now fires the Auth.afterIdentify event after users are logged in.
  • HtmlHelper::script() and HtmlHelper::css() no longer share a single asset list for the once option.
  • Postgres driver supports sslmode.
  • The test suite can now use PHPUnit’s phar file.
  • The RLIKE operator is now supported by the MySQL driver.
  • API documentation improvements
  • PaginatorHelper now merges options used for active links with options used for disabled links.

New Feature Highlight

  • stackTrace() has been added as a convenience wrapper function for Debugger::trace(). It directly echos just as debug() does. But only if debug level is on.
  • ConsoleOptionParser::removeSubcommand() was added.
  • Shell::overwrite() has been added to allow generating progress bars or to avoid outputting too many lines by replacing text that has been already outputted to the screen.
  • When using AclBehavior, The model’s parentNode() method now gets the type (Aro, Aco) passed as first argument: $model->parentNode($type).
  • Schema migrations with MySQL now support an after key when adding a column. This key allows you to specify which column the new one should be added after.
  • Model::save() had the atomic option back-ported from 3.0.
  • CakeRequest::param() can now read values using :ref: hash-path-syntax like data().
  • CakeRequest:setInput() was added.
  • HttpSocket::head() was added.
  • You can now use the protocol option to override the specific protocol to use when making a request.
  • CakeTime::timeAgoInWords() now supports strftime() compatible absolute date formats. This helps make localizing formatted times easier.
  • CakeTime::timeAgoInWords() now supports a relativeStringFuture option. This option is a printf compatible string for outputting future relative time date formats. This helps make localizing formatted times easier.
  • Hash::get() now raises an exception when the path argument is invalid.
  • Hash::nest() now raises an exception when the nesting operation results in no data.
  • HtmlHelper::css() had the once option added. It works the same as the once option for HtmlHelper::script(). The default value is false to maintain backwards compatibility.
  • The maxlength attribute will now also be applied to textareas, when the corresponding DB field is of type varchar, as per HTML specs.
  • New i18n functions have been added. The new functions allow you to include message context which allows you disambiguate possibly confusing message strings. For example ‘read’ can mean multiple things in English depending on the context. The new __x, __xn, __dx, __dxn, __dxc, __dxcn, and __xc functions provide access to the new features.
  • AuthComponent now triggers the Auth.afterIdentify event after successfully identifying a user.
  • Model::afterFind() now always uses a consistent format for afterFind(). When $primary is false, the results will always be located under $data[0][‘ModelName’]. You can set the $this->useConsistentAfterFind = false to restore the original behaviour if your application relies on the old behavior.
  • Configure value I18n.preferApp can now be used to control the order of translations. If set to true it will prefer the app translations over any plugins’ ones.

Deprecations

In addition to new features, a few features have been deprecated, and will be removed in CakePHP 3.0.0

  • Validation::between has been deprecated, you should use Validation::lengthBetween instead.
  • Validation::ssn has been deprecated and may be provided as standalone/plugin solution.
  • The $confirmMessage argument of HtmlHelper::link() has been deprecated. You should instead use key confirm in $options to specify the message.
  • The $confirmMessage argument of FormHelper::postLink() has been deprecated. You should instead use key confirm in $options to specify the message.

The Future of 2.x

With 2.6.0 released, the development branch for 2.7.0 has been created. This branch will be released in 5-6 months and will be another 2.x API compatible release. While the core team doesn’t have any large improvements planned for 2.7, there will be some efforts to backport useful features from 3.0 to help you migrate more easily.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you CakePHP wouldn’t be possible.

]]>
Tue, 23 Dec 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/12/23/CakePHP-2-5-8-released.html https://bakery.cakephp.org/2014/12/23/CakePHP-2-5-8-released.html <![CDATA[CakePHP 2.5.8 released]]> CakePHP 2.5.8 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.8.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.8. 2.5.8 is a bugfix release for the 2.5 release branch. A short list of the changes you can expect is:

  • Improved error messages when fixtures are missing fields.
  • Human is now properly pluralized by Inflector
  • TreeBehavior regression introduced in 2.5.7 was fixed.
  • RequestHandler::startup() failures no longer prevent error pages from rendering. This could happen when custom input parsers were used.
  • Fixture baking will now ignore unconventional tables instead of stopping.
  • Importing schema from MySQL tables using timestamp columns now works better.

With the release of 2.6.0 complete, this will be the last release of 2.5.x barring any security related issues.

You can view the full changelog on cakephp.org. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github.

]]>
Tue, 23 Dec 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/12/16/CakePHP-3-to-fully-adopt-PSR-2.html https://bakery.cakephp.org/2014/12/16/CakePHP-3-to-fully-adopt-PSR-2.html <![CDATA[CakePHP 3 to fully adopt PSR-2]]> CakePHP 3 to fully adopt PSR-2

As of version 3, the framework will fully adopt PSR-2 as a PHP community standard

As many in the community know, since the very beginning CakePHP has maintained and adhered to its own coding standard. Since the creation of CakePHP however, other coding standards have arisen with wider adoption among the PHP community as a whole. To increase consistency with other PHP projects, the core team has decided to fully adopt PSR-2, starting with the release of 3.0.0.

This was not a light decision, and involved much internal debate within the team; we’re all individuals with our own personal preferences, but collectively we agree that the benefits of adopting PSR-2 outweigh our personal editor preferences. We already have an A+ rating for our existing coding conventions, of which 99% conform to the same as other major PHP projects.

Why change this now?

As noted a few months ago, an RFC was suggested to bring the framework more inline with common practices, accepted as a general consensus by the global PHP community. This spurned a long debate over the standards used and why, and who prefers what and when. From this discussion, and seeing the varied points of view, we decided to hold a core vote on whether to fully adopt PSR-2 as a standard, and therefore end our history of partial adoption.

Of course, this change does NOT mean that you have to write your application following the PSR-2 standard. You can in fact choose any coding standard or conventions which align with your style and approach as a programmer. There are even some variations of the PSR-2 standard, if you prefer. This change is mostly oriented towards the coding style of the framework’s core and extended code base, and if desirable, that of community plugins as well.

What are the benefits?

By adopting PSR-2 we can remove or reduce the code we maintain related to enforcing coding standards - as there are common tools, used by the rest of the community, to validate and revise CS issues, without requiring exceptions.

For new users coming to CakePHP, they will have the warm fuzzy feeling of seeing code formatted in a way they are familiar with.

It also allows any effort exerted to discussing why we maintain our own coding standard, which differs from PSR-2, to instead be dedicated to fixing bugs or adding functionality to CakePHP. And, if you’re a developer who uses various frameworks, you’ll no longer have to handle these in your IDE or deployment system to contemplate the edge cases CakePHP introduced.

Our decision to make this announcement now, and separately from a release, is to prepare the community for this change to come, and allow us to advance the process of adapting our existing code bases where necessary.

]]>
Tue, 16 Dec 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/12/09/CakePHP-2-5-7-released.html https://bakery.cakephp.org/2014/12/09/CakePHP-2-5-7-released.html <![CDATA[CakePHP 2.5.7 released]]> CakePHP 2.5.7 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.7. 2.5.7 is a bugfix release for the 2.5 release branch.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.7. 2.5.7 is a bugfix release for the 2.5 release branch. A short list of the changes you can expect is:

  • Unsetting the email address pattern in CakeEmail now works as documented.
  • Console tools now exit non-zero on failure.
  • Fixed inflection of schema class names in SchemaShell.
  • SQLite datasource correctly parses field names out of queries containing subqueries.
  • TreeBehavior now works with models that have a default order property defined.
  • HttpSocket gracefully handles invalid chunked responses now.
  • HttpSocket now honors the version config option, allowing HTTP 1.0 connections to be made.
  • Postgres datasource now works with sequences defined outside schemas.
  • CakeEmail no longer strips lines that only contain ‘0’.
  • Fix more segfaults in Memcached cache engine.
  • Cached file_map no longer regenerates on every request.
  • CakePHP is now compatible with the phpunit.phar package.
  • Improved API docs, specifically around triggered events.

You can view the full changelog on cakephp.org. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github.

]]>
Tue, 09 Dec 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/11/17/CakePHP-3-0-0-beta3-released.html https://bakery.cakephp.org/2014/11/17/CakePHP-3-0-0-beta3-released.html <![CDATA[CakePHP 3.0.0-beta3 released]]>

CakePHP 3.0.0-beta3 released

The CakePHP core team is excited to announce the release of CakePHP 3.0.0-beta3. While we had originally planned on only doing 2 beta releases, we’re not entirely satisfied with the current ORM validation workflow, and want to do some additional work there. The new plan is to have at least two RC releases after beta3. The RC releases will be API frozen and no new features or breaking changes will be added.

The CakePHP core team is excited to announce the release of CakePHP 3.0.0-beta3. While we had originally planned on only doing 2 beta releases, we’re not entirely satisfied with the current ORM validation workflow, and want to do some additional work there. The new plan is to have at least two RC releases after beta3. The RC releases will be API frozen and no new features or breaking changes will be added.

Since 3.0.0-beta2, we’ve been hard at work incorporating community feedback, and completing the remaining changes that will break compatibility in a significant way.

Breaking Changes since 3.0.0-beta2

  • Bake templates now use a templating mechanism that involves a pre- parsing steps of the templates. This was done to improve the readability and ease of creating new bake templates. This also means that any custom templates that you may have will need to be updated.
  • The default replacement for Inflector::slug() is now - instead of _.
  • LOG_ERROR and TESTS constants were unused and have been removed.
  • Controller::$actions was removed and replaced with Controller::isAction(). The new method makes it easier to customize which methods your controllers consider to be routable actions.
  • Component::initialize() is now a post-constructor hook like all other initialize methods.
  • Component has a new beforeFilter() event listener that is fired before a controllers’ beforeFilter method is.
  • CakeSession::read() returns null in all failure scenarios now.
  • Controller actions invoked with requestAction() must return a Response object now. All other return values will trigger an error.
  • Database configuration no longer accepts the ‘login’ key. You must use ‘username’. This was changed to resolve inconsistencies across the framework.
  • Checkbox and radio inputs are now nested inside their attached label elements. This was done to improve compatibility with a few popular CSS libraries. If you have customized the templates FormHelper uses, you may need to update your templates.
  • CakeViewErrorMissingViewException is now CakeViewErrorMissingTemplateException in order to allow MissingView to be used for missing view classes.
  • Authentication objects that had implemented logout() need to be updated to use the new Auth.logout event.
  • The App.www_root configuration value has been renamed to App.wwwRoot for consistency reasons.

New features since 3.0.0-beta2

  • CakeCacheEngineFileEngine now generates directories when debug is off.
  • There are several new standalone libraries extracted from CakePHP. The Cache, Log, Utility packages are now installable separately with composer.
  • The pj() (print json) helper method has been added as a convenience when working in the interactive console or test cases.
  • The Model.initialize event has been added. This event is fired right after a table’s initialize hook has completed, allowing plugins or other listeners to interact with table objects.
  • Database connections, cache engines, loggers and email transports can now be configured with a Datasource Name (DSN) using the url key. This makes it easier to define configuration in environment variables which is a recommended approach by many Platform as a service providers.
  • Component::initialize() and View::initialize() were added.
  • Arbitrary meta tags can be created with HtmlHelper::meta().
  • Exceptions are now raised when custom view class cannot be found.
  • Request data marshaled into entities is not forcibly cast now. This makes validating entity data a bit easier as entity data more closely represents the original request data.
  • The query expression builder now has a between() method for generating BETWEEN clauses.
  • CakeORMBehavior::initialize() was added.
  • Stack traces are now displayed on fatal errors if xdebug is installed.
  • Request::is() now caches results in memory.
  • AuthComponent has two new events. Auth.afterIdentify is fired after a user is identified or logged in. Auth.logout is fired when AuthComponent::logout() is called.
  • SessionComponent is deprecated. Instead you should be using $this->request->session() instead.
  • Each hasher in the FallbackHasher class can have separate options now.

For more details on all the changes in 3.0.0, you can consult the migration guide. In closing, we’d like to thank all of the people that have helped so far with the 3.0 release. We’ve made great progress and without your help we wouldn’t be here today.

Download a packaged release.

]]>
Mon, 17 Nov 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/11/08/CakePHP-2-5-6-and-2-6-0-RC-released.html https://bakery.cakephp.org/2014/11/08/CakePHP-2-5-6-and-2-6-0-RC-released.html <![CDATA[CakePHP 2.5.6 and 2.6.0-RC released]]> CakePHP 2.5.6 and 2.6.0-RC released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.6 and 2.6.0-RC1.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.6 and 2.6.0-RC1. 2.5.6 is a bugfix release for the 2.5 release series, while 2.6.0-RC1 is beta release of the upcoming 2.6.0 release. A list of the changes you can expect in 2.5.6 are:

  • CakeSession::read() returns null on all failure cases.
  • Model::isUnique() now works as validator for multiple fields.
  • CakeTestCase::getMockForModel() now injects the test datasource for all connection names.
  • Digest Auth now handles &, ` ?` in digest auth data.
  • FormHelper no longer generates a hidden input for disabled mulitple checkbox inputs.
  • Folder::create() now handles relative paths.
  • Stack traces now output more context on exceptions.
  • Fatal errors now include stack traces if xdebug is enabled.
  • Virtual fields no longer incorrectly replace ` IN` clauses.

Changes in 2.6.0-RC

In addition to the changes in 2.5.6, 2.6.0-RC contains the following changes:

  • Hash::merge() and Hash::expand() are now more performant.
  • TranslateBehavior properly handles the atomic flag.
  • Redis Engine now includes a default prefix based on your application directory.
  • MySQL schema reflection includes comment support now.
  • CakeRoute::__set_state was added. This helps make it easier to cache routes with var_export.
  • CakeResponse::file() accepts ranges even when the download option is set to false.
  • AuthComponent now has a userFields option which allows you to limit which fields are loaded into the session.
  • PaginatorHelper::meta() has been added. This method helps you easily generate meta tags containing pagination information.

If there are no blocking issues found in the RC release we expect to have a stable 2.6.0 release ready in 3 or 4 weeks.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework.

]]>
Sat, 08 Nov 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/10/05/CakePHP-2-5-5-and-2-6-0-beta-released.html https://bakery.cakephp.org/2014/10/05/CakePHP-2-5-5-and-2-6-0-beta-released.html <![CDATA[CakePHP 2.5.5 and 2.6.0-beta released]]> CakePHP 2.5.5 and 2.6.0-beta released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.5 and 2.6.0-beta.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.5 and 2.6.0-beta. 2.5.5 is a bugfix release for the 2.5 release series, while 2.6.0-beta is beta release of the upcoming 2.6.0 release. A list of the changes you can expect in 2.5.5 are:

  • Console applications will not output colours if there is no TTY.
  • Files are not overwritten by Folder::copy() when the SKIP flag is used.
  • Hash::insert() and Hash::get() now handle 0 as the first path element.
  • Improved API documentation.
  • Fixed a situation where Hash::remove() would remove data incorrectly.
  • UUID columns are now reflected properly by postgres.
  • CakeEmail::reset() now resets the email pattern.
  • Hash::expand() and Hash::merge() are now much faster.

New features in 2.6

Like all the other 2.x releases, 2.6.0 will be backwards compatible with previous versions of CakePHP 2.x, and include a number of new enhancements and improvements. Here is what you can expect in 2.6.0:

  • stackTrace() has been added as a convenience wrapper function for Debugger::trace(). It directly echos just as debug() does. But only if debug level is on.
  • ConsoleOptionParser::removeSubcommand() was added.
  • Shell::overwrite() has been added to allow generating progress bars or to avoid outputting too many lines by replacing text that has been already outputted to the screen.
  • When using AclBehavior, The model’s parentNode() method now gets the type (Aro, Aco) passed as first argument: $model->parentNode($type).
  • Schema migrations with MySQL now support an after key when adding a column. This key allows you to specify which column the new one should be added after.
  • Model::save() had the atomic option back-ported from 3.0.
  • CakeRequest::param() can now read values using :ref: hash-path-syntax like data().
  • CakeRequest:setInput() was added.
  • HttpSocket::head() was added.
  • You can now use the protocol option to override the specific protocol to use when making a request.
  • CakeTime::timeAgoInWords() now supports strftime() compatible absolute date formats. This helps make localizing formatted times easier.
  • CakeTime::timeAgoInWords() now supports a relativeStringFuture option. This option is a printf compatible string for outputting future relative time date formats. This helps make localizing formatted times easier.
  • Hash::get() now raises an exception when the path argument is invalid.
  • Hash::nest() now raises an exception when the nesting operation results in no data.
  • HtmlHelper::css() had the once option added. It works the same as the once option for HtmlHelper::script(). The default value is false to maintain backwards compatibility.
  • The maxlength attribute will now also be applied to textareas, when the corresponding DB field is of type varchar, as per HTML specs.
  • New i18n functions have been added. The new functions allow you to include message context which allows you disambiguate possibly confusing message strings. For example ‘read’ can mean multiple things in English depending on the context. The new __x, __xn, __dx, __dxn, __dxc, __dxcn, and __xc functions provide access to the new features.

A long standing issue in the Model class has been fixed. Because it may be construed as API changes, there is a flag to restore the original behaviour.

  • Model::afterFind() now always uses a consistent format for afterFind(). When $primary is false, the results will always be located under $data[0][‘ModelName’]. You can set the useConsistentAfterFind property to false on your models to restore the original behaviour.

In addition to new features, a few features have been deprecated, and will be removed in CakePHP 3.0.0

  • Validation::between has been deprecated, you should use Validation::lengthBetween instead.
  • Validation::ssn has been deprecated and may be provided as standalone/plugin solution.
  • The $confirmMessage argument of HtmlHelper::link() has been deprecated. You should instead use key confirm in $options to specify the message.
  • The $confirmMessage argument of FormHelper::postLink() has been deprecated. You should instead use key confirm in $options to specify the message.

If the beta release doesn’t have any major issues reported, you can expect an release candidate in ~1 month, with a stable release shortly afterwards.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework.

]]>
Sun, 05 Oct 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/09/28/CakePHP-3-0-0-beta2-released.html https://bakery.cakephp.org/2014/09/28/CakePHP-3-0-0-beta2-released.html <![CDATA[CakePHP 3.0.0-beta2 released]]> CakePHP 3.0.0-beta2 released

One month after our first beta release we are ready to ship the next batch of features.

The CakePHP core team is proud to announce the second beta release for CakePHP 3.0.0. It’s been a month since our first beta release, and we are excited by the big welcome the community has given to the new version. All the positive feedback and help has been a great motivation for the core team to work harder on improving the developer experience for 3.0.

This will be the last beta release for 3.0, this means that the API is already stabilizing and we’re mostly focusing on polishing the current features, performance optimizations, documentation and quickly solving any issues reported in Github.

We’ve had a very busy month implementing a few missing features we had in our roadmap and upgrading some of the popular plugins for CakePHP.

Below the list of new features and changes that made it into 3.0.0-beta2:

DebugKit

Debugging CakePHP 3.0 applications is even better. The new DebugKit is easier to install, faster and looks gorgeous.

DebugKit is a application toolbar that collects useful statistics about your code such as time and memory, executed queries, log messages and view variables. To install Debugkit just use

 `
composerrequirecakephp/debug_kit"3.0.*-dev"

`

And add this line to your bootstrap.php file:

Plugin::load('DebugKit', ['bootstrap' => true]);

If you install a new application using the app skeleton, DebugKit will be automatically installed for you.

Database Migrations

Migrations is now an official CakePHP plugin. It wraps the excellent Phinx library into a CakePHP shell to avoid repeating configuration strings and add some of the cake experience. A database migration generated by this plugin would look like:

<?php
use Phinx\Migration\AbstractMigration;
class CreateUsersTable extends AbstractMigration {
    /**
     * Change.
     */
    public function change() {
        // create the table
        $table = $this->table('users');
        $table->addColumn('id', 'integer')
            ->addColumn('username', 'string')
            ->addColumn('password', 'string')
            ->addColumn('created', 'datetime')
            ->create();
    }

Migrations are reversible. This means that with the same code you can create or rollback the changes done to the database schema.

To install the Migrations plugins run:

 `
composerrequirecakephp/migrations"dev-master"

`

And add this line to your bootstrap.php file:

Plugin::load('Migrations');

New Logger interface

CakePHP has adopted the PSR-3 recommendation for loggers. Now all log engines implement the ` PrsLogLoggerInterface`interface. This means that the entire logging system can easily be replaced by other implementations, such as the popular Monolog library.

Integration Tests and Data Integrity

Testing controllers has always been problematic. While ControllerTestCase solved some of the problems, we identified this class as a source of problems and confusion among our users. We decided to implement the new IntegrationTestCase class as a way totest all aspects of an HTTP request in your application without much mocking being involved. This should help you improve code quality and ensure that your application and routes are working as expected.

We also made the fixtures system better, allowing developers to define and work with foreign key constraints in their database. The fixtures system will now correctly load all data and enable constraints right before your test code is executed.

New Bake templates

With the date for a stable release getting closer and closer we decided to give a new look to default baked applications. Hopefully the new look will feel fresher, more modern, and easier to work with.

Separate packages

We’ve seen an increasing interest in using the new ORM outside the framework or within older CakePHP applications. One of our goals since the start has been making this possible. We have already begun the work to split the framework into various standalone components that can be reused and installed with composer. While the ORM has not yet been extracted into its own repository, most of the necessary pre- requisites are complete. As a product of this work, we have already extracted several components out of the main code base:

  • Collections: Provides a set of tools to manipulate arrays or Traversable objects in an efficient and elegant way.
  • Validation: The excellent and flexible validation library can now be used in any project!
  • Utility: Provides the Hash, Inflector, String and Xml classes.
  • Event: Our Signal-Slot (or Observer Pattern) implementation.
  • Core: The CakePHP core, containing the Configuration and Plugin management classes.

It is important to note that the these repositories are read-only, development will continue in the main CakePHP repository and code will be synchronized regularly to these splits. Please open any ticket or pull request directly in the main github repository.

Plugin Shells

Shells in plugins can now be called without prefixing with the plugin name. For example for a do_stuff shell living in the Tools plugin, you can execute:

 `
bin/cakedo_stuff

`

Other improvements

  • New uploadedFile validation rule.
  • Made String::uuid() 3 times faster.
  • Better exception reporting on fatal errors.
  • Inflector was optimized for better performance.
  • Several optimizations in the Hash class.
  • Added Collection::buffered() to transform non-rewindable iterators in rewindable ones.

Community Plugins

More plugins for version 3.0 are starting to pop. Here’s a list of what we found interesting:

  • TwigView Use Twig as the default templating engine.
  • Imagine Image manipulation plugin
  • Geo Contains utility libraries and behaviors for working with geo data.
  • Blame Records the user id who modified a row in the database.
  • CakePdf Generates PDF files using different engines
  • Authenticate Authorization and Authentication adapters
  • TinyAuth A lightweight authorization system.
  • TwitterBootstrap A plugin to generate Boostraped interfaces
  • Whoops Replaces the default exception renderer with a nice debugging interface.
  • Assetic Minifies and pre-processes CSS and Javascript We’d like to thank again everyone who has contributed thoughts, code, documentation or feedback to 3.0 so far.

Download the release

You can grab the packaged release here: cakephp-3-0-0-beta2.zip

]]>
Sun, 28 Sep 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/09/02/CakePHP-2-5-4-released.html https://bakery.cakephp.org/2014/09/02/CakePHP-2-5-4-released.html <![CDATA[CakePHP 2.5.4 released]]> CakePHP 2.5.4 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.4.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.4. 2.5.4 is a bugfix release for the 2.5 release branch. A short list of the changes you can expect is:

  • Improved SMTP auth reply checks.
  • Headers are now correctly sent when using ajaxLogin elements with AuthComponent.
  • Errors in sample schema files were corrected.
  • SecurityComponent no longer puts URLs containing a space into the blackhole callback.
  • Year validation now accepts dates from 1800 and later.
  • RequestHandlerComponent will unserialize request bodies on DELETE requests.
  • Transactions are now rolled back in saveAssociated/saveMany when exceptions are raised.
  • Model::afterFind() is no longer called twice for hasOne/belongsTo associations. It is now only called once, with the model alias format.
  • Join building now accepts no conditions. When joins are created with no conditions a cross will be created unless where conditions correctly restrict the query.
  • SchemaShell now correctly handles the –file and –name switches.
  • Generated schema files have more predictable names now. Instead of using the APP_DIR value, they will always used ‘App’ for application schema files.
  • Exceptions arising from race conditions in FileEngine are now ignored.
  • CakeTime now returns ‘’ on invalid input.
  • Translation functions correctly format placeholders when the first value is null.
  • CURRENT_TIMESTAMP is no longer used as a string default value for TIMESTAMP columns with UPDATE CURRENT_TIMESTAMP in MySQL.
  • Words ending in ‘data’ are no longer inflected to datum. This means works like ‘FileMetadata’ are not inflected incorrectly.

You can view the full changelog on cakephp.org. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github.

]]>
Tue, 02 Sep 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/08/23/CakePHP-3-0-0-beta1-released.html https://bakery.cakephp.org/2014/08/23/CakePHP-3-0-0-beta1-released.html <![CDATA[CakePHP 3.0.0-beta1 released]]>

CakePHP 3.0.0-beta1 released

The CakePHP core team is excited to announce the first beta release of CakePHP 3.0.0.

The CakePHP core team is excited to announce the first beta release of CakePHP 3.0.0. In the weeks since 3.0.0-alpha2, we’ve been hard at work incorporating community feedback on the new release, and completing the remaining changes that will break compatibility in a significant way.

Breaking Changes since 3.0.0-alpha2

Since the release of 3.0.0-alpha2 there have been several changes that will break compatibility with existing applications.

I18n has been re-implemented

Built on top of ext/intl and Aura/Intl the new localization subsystem offers more powerful replacement syntax, and retains a backwards compatible sprintf() based formatter. Consult the new i18n documentation for more information. The L10n class has been removed.

NumberHelper uses intl now

The Number library and NumberHelper now use intl internally for formatting currencies and values. This makes NumberHelper completely aware of the application’s current locale. The addFormat() method has been removed.

Directory layout changes

More changes to the directory layout of a CakePHP application have been made:

  • src/Config is now /config.
  • src/bootstrap.php is now /config/bootstrap.php.
  • Log files are now in a top level directory by default. Having them mixed in with other actually temporary data sometimes resulted in people accidentally deleting their log files.
  • Bake templates should now be put in src/Template/Bake.

Vendor Prefixed Plugins Have Changed

Plugins that use vendor prefixes e.g: (AcmeCorpUsers) are no longer renamed. Instead of using Users.User, you must now use AcmeCorp/Users.User. Additionally the vendor prefix will be used as folder name in the plugins folder, so the plugin will be installed in plugins/AcmeCorp/Users folder.

Methods removed

  • Many of the infrequently used methods defined in basics.php have been removed. Functions like config() no longer exist.
  • Validation::ssn() has been removed.
  • Support for CASE statements has been added to the ORM.
  • Helper::webroot(), Helper::assetUrl(), Helper::assetTimestamp() have been moved to a UrlHelper. This allows you to easily replace the URL building features in each of your helpers. You will need to add Url to the $helpers list in your helpers.
  • App::objects() has been removed.

We hope to minimize the impact of breaking changes in future beta and release candidate releases.

New features in 3.0.0-beta1

  • Improved error pages for plugins.
  • Numerous bugs have been fixed in the ORM and across the framework.
  • Cookie paths are now set to the application’s base directory by default.
  • Query objects can be json serialized now.
  • Shell::param() was added.
  • Added a new collection() global shorthand function to convert arrays to collections.
  • Many API documentation blocks and book sections have been improved.
  • Multiple optimizations for performance.

For more details on all the changes in 3.0.0, you can consult the migration guide. In closing, we’d like to thank all of the people that have helped so far with the 3.0 release. We’ve made great progress and without your help we wouldn’t be here today.

Download a packaged release.

]]>
Sat, 23 Aug 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/07/28/CakePHP-3-0-0-alpha2-Released.html https://bakery.cakephp.org/2014/07/28/CakePHP-3-0-0-alpha2-Released.html <![CDATA[CakePHP 3.0.0-alpha2 Released]]> CakePHP 3.0.0-alpha2 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 3.0.0-alpha2.

The CakePHP core team is proud to announce the immediate availability of CakePHP 3.0.0-alpha2. CakePHP 3.0.0-alpha2 is the second alpha release for CakePHP 3.0.0. In the month since 3.0.0-alpha1 a few new features have been merged, and many issues have been fixed.

New Features in 3.0.0-alpha2

Router Refactor and Builder Based APIs.

The Router class has been re-factored internally and new methods have been added to allow your routes file to stay DRYer than ever before. In addition to improved methods, the performance of parsing incoming URLs has been greatly improved. Router is stricter about missing routes, and will notify you (via an exception) when a URL cannot be parsed or matched with the connected routes.

The default routes provided by CakePHP have been removed. While helpful in the prototyping stages, these routes created issues with duplicate content and were often not used in larger applications. In their place, a smaller subset of routes is provided to help with the prototype stage of application development. If you have an existing application using 3.0, you will need to update your routes.php file.

CacheHelper Removed

CacheHelper has been removed from CakePHP. The core team feels that the functionality this helper provided is best handled by standalone servers like Varnish. While we explored building a ESI based replacement for CacheHelper, there were a number of edge cases that would have complicated the implementation.

ORM Improvements

  • Empty associations in BelongsTo and HasOne associations no longer hydrate an empty entity. Instead the association property will be ` null`.
  • Options for all the various ORM operations are now consistent.
  • You can specify a white list of fields when marshaling data out of the request and into entities.
  • It is now easier to implement custom column types with the ` _initializeSchema` table hook method.
  • Query::newExpr() now accepts a SQL expression.
  • Conditions with nullable values are easier to build ` ‘fieldIS’=>$val` will generate correct SQL when ` $val` is not ` NULL`.
  • Conditions with ` IN` clauses work better with empty data.

Other Changes

  • HtmlHelper and FormHelper had their ` $confirmMessage` arguments removed and replaced with ` confirm` options.
  • Improved errors for Cells.
  • Prefixed controllers can now use prefixed layouts which will be checked automatically.
  • Cookies are now read and decrypted lazily.
  • The ` ssl` routing option is now ` _ssl`.
  • The ` [method]` routing option is now ` _method`.
  • Header based route matching has been removed. It was very infrequently used.
  • Router::resourceMap() has been removed. New options for Router::mapResources() replace the need to have this method.
  • Bcrypt hashing has been removed from ` Security::hash()`

There are still tickets available for CakeFest 2014. You can get your tickets now to join us in Madrid for exciting talks and tutorials on CakePHP and related technologies.

For more details on all the changes in 3.0.0, you can consult the migration guide. I’d like to thank everyone who has contributed thoughts, code, documentation or feedback to 3.0 so far. We are very grateful for all the early adopters and their feedback. Getting issues found and fixed early is a huge help.

]]>
Mon, 28 Jul 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/07/21/CakePHP-2-5-3-and-1-3-20-released.html https://bakery.cakephp.org/2014/07/21/CakePHP-2-5-3-and-1-3-20-released.html <![CDATA[CakePHP 2.5.3 and 1.3.20 released]]> CakePHP 2.5.3 and 1.3.20 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.3 and CakePHP 1.3.20.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.3 and CakePHP 1.3.20. CakePHP 2.5.3 is a bugfix release for the 2.5.x release branch. 1.3.20 is a bugfix release for 1.3.x. The 1.3.20 release contains an important fix to address a potential race condition in Model::save() that can cause data loss when records are deleted during concurrent updates. The same fix is included in 2.5.3.

A short list of the changes you can expect in 2.5.3 are:

  • TextHelper::autoLinkEmail() now links email addresses adjacent to HTML elements.
  • ‘research’ is now pluralized by Inflector properly now.
  • ‘stadium’ is now pluralized by Inflector properly now.
  • The schema included for the ACL tables now includes indexes to help improve performance.
  • APCEngine cache is now compatible with APCu.
  • App::pluginPath() is deprecated. You should use Plugin::path() instead.
  • API doc blocks have been improved in many classes.
  • Email validation rules in CakeEmail have been relaxed. Both email addresses with UTF-8 characters and IDN domain names are generally deliverable but were failing filter_var().
  • CakeResponse::sharable() now sets the public max-age header.
  • Model::getDataSource() now correctly switches the schemaName property. This fixes a regression introduced in 2.4.8.
  • Validation::inList() no longer accepts hexadecimal values for numeric checks.
  • Multi use CSRF tokens now have their expiration updated on each request.
  • h() now performs better.
  • Missing fixture errors have been improved.

If you missed out on the early-bird tickets for for CakeFest 2014, there are still tickets available and the conference schedule.

We’d like to thank Kurita Takashi for his on-going help in identifying possible security issues in CakePHP. You can view the full 2.5.3 changelog and 1.3.20 changelog on cakephp.org. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking.

You can download packaged releases on github.

]]>
Mon, 21 Jul 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/06/25/CakePHP-3-0-0-alpha1-released.html https://bakery.cakephp.org/2014/06/25/CakePHP-3-0-0-alpha1-released.html <![CDATA[CakePHP 3.0.0-alpha1 released]]> CakePHP 3.0.0-alpha1 released

We are excited to announce one new release in the 3.x series, approaching now a stable release

The CakePHP core team proudly announces the first alpha release of CakePHP 3.0.0. In the months between 3.0.0-dev3 and this release, we’ve been working really hard at getting more of the remaining parts implemented, and incorporating all the great feedback we’ve gotten from the community so far.

There are still a few larger features to be completed before we go to a beta release, most importantly:

  • Updated i18n and L10n features.
  • A replacement for CacheHelper based on Edge Side Includes.
  • A new routing API for simpler and faster route declaration.

The alpha releases will focus on getting these key features completed. After which, we’ll start beta releases focusing on polishing up any rough or confusing features, improving error messages/help and porting over plugins produced by the core team.

We’ve been truly humbled by the fantastic feedback and support we’ve received from the community in the last month. We’ve had numerous bug reports, pull requests and documentation edits that have helped improve 3.0 overall.

This release also comes with complete documentation for the new features and changes, make sure you check out the new CakePHP 3.0 book to read about them in detail.

Below is the list of new features and changes that made it into 3.0.0-alpha1:

Reworked Dispatcher Filters

Dispatcher filters have been reworked and expanded to include some of the previously ‘magic’ features of CakePHP. Filters are now registered as instances instead of through configuration data making it simple to do dependency injection.

Dispatcher filters also include a way to restrict when they are applied to any given request.

New Session Object

Session management has always been a static class in CakePHP which has proven to be problematic in a number of ways. For CakePHP 3.0, you can access the session from the request object ` $this->request->session()`.

This change also makes the session easier to test, and allows CakePHP to use PHPUnit 4.x

FlashHelper and FlashComponent

Flash messages play an important part in modern web applications. While CakePHP has always had rudimentary flash messaging support, CakePHP 3.0 gives developers even more tools to create and render multiple kinds of messages in a simple way. To make this happen a separate component and helper were created. We’d like to thank jadb and bcrowe for making this code happen.

CookieComponent

CookieComponent has only been able to manage one cookie namespace at a time in the past. While it offered powerful tools for creating encrypted cookies, those tools were hard to use consistently and correctly. The redesigned CookieComponent makes it much easier to separate the configuration of cookie namespaces and the handling of cookie data.

Passwords Default to Bcrypt

Using bcrypt for passwords is a current best-practice. To help steer developers in the right direction, we’ve made bcrypt the default password hashing system in CakePHP, and provided an easy to use FallbackHasher that will allow you to incrementally update your password hashes from older hashing algorithms.

Themes and Plugins Merged

For CakePHP 3.0.0, we wanted to make themes more powerful and more robust. As we looked at ways of improving themes, we realized that what we really wanted were plugins. To that end, you can now use any plugin as a theme. This makes packaging and re-distributing themes easy as they are simply plugins do and can include helpers and cells.

App and Plugins share a standard suggested directory layout

To make your experience developing as consistent as possible, we’ve updated both the application skeleton and plugin skeletons to use the same directory structure. This will help make working with plugins feel just like you’re working in a small modular application.

ORM Improvements

Several API changes made their way into the new ORM. Now it is simpler to specify deep associations for saving operations and we have changed a couple conventions to reduce the learning curve and confusion among new adopters.

Better Performance

We’ve taken an initial performance review over the new features in 3.0, and spent some time removing obvious bottlenecks. We’re happy to announce that we succeeded at making the bootstrap process and several parts of the helpers template generation faster.

Additionally, we’ve identified a way to make the routing process several times faster. We’ll be implementing these new ideas for the following beta release.

You can download the release or just use composer create-project -s dev cakephp/app to start using CakePHP 3.0 today!

]]>
Wed, 25 Jun 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/06/15/CakePHP-2-5-2-and-1-3-19-released.html https://bakery.cakephp.org/2014/06/15/CakePHP-2-5-2-and-1-3-19-released.html <![CDATA[CakePHP 2.5.2 and 1.3.19 released]]> CakePHP 2.5.2 and 1.3.19 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.2 and CakePHP 1.3.19.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.2 and CakePHP 1.3.19. CakePHP 2.5.2 is a bugfix release for the 2.5.x release branch. 1.3.19 is a bugfix release for 1.3.x. The 1.3.18 release contained a regression related to the form tampering security fix that 1.3.19 resolves.

A short list of the changes you can expect in 2.5.2 are:

  • cake console command now works when CDPATH is used.
  • Inflection of ‘feedback’ is now correct.
  • Incorrect status line parsing in HttpSocketResponse has been fixed.
  • Form tampering protection has been fixed when form URL’s contain multiple query string parameters.
  • Creating disabled select options no longer disables the select element when array(1) is used for the disabled option.
  • Trailing star routes can now be reverse routed.
  • Older blowfish hashes are now accepted, and can be used with AuthComponent.
  • A username of ‘0’ can now be used with AuthComponent.
  • Improved API docs.
  • Hash::extract() now allows [prop=1] to match boolean true.

If you haven’t already purchased your ticket for CakeFest 2014 the conference schedule has been announced and this year is shaping up to be another fantastic installment in the CakeFest tradition.

You can view the full 2.5.2 changelog and 1.3.19 changelog on cakephp.org. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking.

You can download packaged releases on github

]]>
Sun, 15 Jun 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/05/18/CakePHP-2-4-10-and-2-5-1-released.html https://bakery.cakephp.org/2014/05/18/CakePHP-2-4-10-and-2-5-1-released.html <![CDATA[CakePHP 2.4.10 and 2.5.1 released]]> CakePHP 2.4.10 and 2.5.1 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.10 and 2.5.1.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.10 and 2.5.1. 2.4.10 is the final bugfix release for the 2.4 release series. Going forward, 2.4 will only receive security releases. 2.5.1 is a bugfix release for the 2.5 release branch. A short list of the changes you can expect in 2.4.10 is:

  • Controller::referer() behaves correctly when local URLs are generated.
  • TextHelper::tail() was restored.
  • FormHelper security tokens only use the path and query parts of a URL to generate hashes. This fixes problems when absolute URL’s were used to create forms.
  • Missing component error pages have correct paths now.
  • Compatibility with PHP5.6 was improved. 2.5.1 contains the following changes:
  • Loading data from models and their associations with multiple datasources works properly now. This fixes a regression added in 2.5.0-beta.
  • FormHelper::postLink() had a backwards incompatible signature change in 2.5.0-dev. This method is now backwards compatible.
  • CakeEmail now uses the correct mimetype for emails that contain text & html but no attachments. Previously, multipart/mixed was used which caused some clients to incorrectly handle email messages.
  • The test harness will now locate PHPUnit installed through composer.

If you haven’t already purchased your ticket for CakeFest 2014 the conference schedule has recently been announced and this year is shaping up to be another fantastic installment in the CakeFest tradition.

You can view the full 2.4.10 changelog and 2.5.1 changelog on cakephp.org. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking.

You can download packaged releases on github

]]>
Sun, 18 May 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/05/13/CakePHP-2-5-0-Released.html https://bakery.cakephp.org/2014/05/13/CakePHP-2-5-0-Released.html <![CDATA[CakePHP 2.5.0 Released]]> CakePHP 2.5.0 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.0.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.0. There have been a few changes to 2.5.0 since the RC2 release:

  • FormHelper::postLink() fixes from 2.4.9 have been merged in.
  • Numerous API documentation improvements.
  • TextHelper::tail() was fixed.
  • SQLServer::describe() was failing no longer fails when used with fixtures.
  • Authentication adapters can be aliased allowing you to use the same adapter multiple times with different password hashing strategies.
  • The redis cache engine now supports unix_socket.
  • PaginatorComponent will no longer do a find(‘count’) for the first page when there are fewer records than the current page limit.

You can view the detailed changelogs as well.

New feature highlights

Cache::remember()

This method allows you to implement read-through cache operations. For the passed cached key, it will first look for any cached data that is still valid. If not found, a callback method will be executed and its return value stored under the cache key.

You will find this useful for reducing the amount of repetitive code around checking for cache misses.

Improved Memcached support

A new Cache engine has been added to provide support for the php extension ext/memcached, which is the faster and better supported extension for utilizing this popular key-value database. In introducing this new adapter, we have deprecated the old Memcache engine and plan for its removal in 3.0.

CompletionShell

For shell environments that support command completion such as bash and zsh, we have provided a cake shell that will help you get command and options completion for your cake shells by hitting the tab key. If you have ever wondered what shells are available, or what options they can take, this might be for you. Make sure to check the documentation for more information on how to set this up.

Security::encrypt() and AES encrypted cookies

If for any reason you are storing data in cookies that should not be changed by the user, you can now use AES encrypted cookies. This utilizes the new AES-256 encryption offered by the Security class to prevent various classes of attacks, such as cookie tampering.

Consistent priorities in global and local events

One limitation in previous CakePHP versions was that listeners attached to the global EventManager would always be called before any other local listeners, despite the priorities. CakePHP 2.5 unifies the priority queue between global and local event listeners. With a single unified set of priorities, you can implement more complex and complete aspect oriented programs.

CakePHP 2.5.0 is now marked as stable. 2.5.x is an API compatible upgrade for the 2.x release series. Make sure you read the migration guide as there are a few deprecations you may want to account for. Development has already started on 2.6.0, which will be another API compatible release for the 2.x release series.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. As an entirely community powered project CakePHP relies on your contributions to continue.

]]>
Tue, 13 May 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/05/06/CakePHP-3-0-0-dev3-released.html https://bakery.cakephp.org/2014/05/06/CakePHP-3-0-0-dev3-released.html <![CDATA[CakePHP 3.0.0-dev3 released]]> CakePHP 3.0.0-dev3 released

Fresh slices of the new development preview for version 3.0 are hot and out of the oven!

The CakePHP core team proudly announces the third development preview of CakePHP 3.0.0. In the couple months between 3.0.0-dev2 and this release, we’ve been working really hard at getting the remaining big parts of the new features we wanted to introduce into the framework.

We have decided to not do a future 3.0.0-dev4 release as everything that was planned for it was already completed. This means that the next release will be ‘alpha’ and the team will focus mostly on polishing the current features, documentation and porting some of the 2.x plugins. We’re really happy with the progress we have made and the pace at which 3.0 is going.

Additionally the team has spent plenty of time incorporating all the community feedback into the new ORM and we’re humbled by the amount of people putting some of their time into making it even more comprehensive and easy to use.

This release also comes with full documentation for the new features and changes, make sure you check out the new CakePHP 3.0 book To read about them in detail.

Below the list of new features and changes that made it into 3.0.0-dev3:

Console improvements

  • New ConsoleIO class added. It is a convenience class containing common method for input/output in shells.
  • Console methods will receive passed arguments as function parameters, much like controller actions.
  • Adding subcommands for Tasks is now required.
  • Possibility to alias any shell command, for example instead of ` Console/cakebakemodel` you could do ` Console/cakebmodel`.

View Cells

View cells are small classes that offer controller-like functionality but can be used directly in the view to pull data from any source and render certain template. Read more about View Cells

New Time Library

The Time class was completely re-implemented to internally use Carbon. Whatever the Carbon library and ` DateTime` can do, the new Time lib can too. This means that the method in ` Time` are no longer static, you need and instance of the object to get access to its methods.

In addition to the new Time class being added, it has been integrated with the ORM, meaning that any timestamp/datetime columns in your entities will be able to leverage the power CakeUtilityTime provides.

Lastly, the Time lib uses the ` intl` php extension to provide reliable locale-aware date formatting which is several times superior to the support that we could offer in the 2.x series.

Read more about Time

Bake

Bake is finally working again in CakePHP 3.0, but it also brings a nice number of great new features:

  • Bake is now pluggable! You can create your own bake tasks and they will be automatically discovered. This means that you can now implement your own ` Console/cakebakesuper_table`
  • Ability to bake shells, cells, components, behaviors and more

Additionally we added some other changes:

  • Microsoft SQL Server support was added to the new ORM
  • TreeBehavior was re-implemented and offers feature parity with its previous version form 2.x
  • Both Behaviors and Components have now a ` config()` method, configuration using public properties was removed
  • Multiple bugfixes in the ORM
  • ` Collection::nest()` and ` Collection::listNested()` were added for dealing with hirarchical data
  • ` Validator::notEmpty()` was added as a complement to ` Validator::allowEmpty()`
  • Moved exception files to their corresponding namespaces
  • Simplified View objects construction, they are not dependent on controllers anymore
  • ` Request::isMobile` now uses an external library to correctly match the ever-growing number of mobile devices

Community plugins

Some have been also very busy catching up with the changes introduced daily in the 3.0 branch. We’d like to mention the CRUD plugin which contains a dynamic scaffolding and automatic Admin generator. It may be a great way of getting on into CakePHP 3.0 the fast way.

Dereuromark’s Tools plugin seems to be having some interesting activity with some good behaviors ready to use in CakePHP 3.0.

Up next

Our next release will be marked as alpha and we are going to focus on the following:

  • Make the session object live inside the Request object. It will not be static anymore
  • Implementing the new middleware layer
  • Themes implemented as plugins
  • CookieComponent reworked.
  • Overhaul i18n to use intl and add support for i18n engines

We’d like to thank everyone who has contributed thoughts, code, documentation or feedback to 3.0 so far. It looks like it is going to be the single most important and feature rich release when it is marked stable!

]]>
Tue, 06 May 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/04/30/CakePHP-2-4-9-released.html https://bakery.cakephp.org/2014/04/30/CakePHP-2-4-9-released.html <![CDATA[CakePHP 2.4.9 released]]> CakePHP 2.4.9 released

The CakePHP core team is happy to announce the immediate availability of 2.4.9[1]. This releases contain a bug fix related to the security fix in 2.4.8.

The CakePHP core team is happy to announce the immediate availability of 2.4.9[1]. This releases contain a bug fix related to the security fix in 2.4.8. A short list of changes you can expect in 2.4.9 are:

  • FormHelper::postLink() now works correctly with SecurityComponent. In 2.4.8 a mistake was made that resulted in incorrect hashes being generated.

If you use postLink() and have upgraded to 2.4.8 it is recommended that you upgrade to 2.4.9 to avoid any potential issues. You can download a packaged release from github[2].

]]>
Wed, 30 Apr 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/04/29/CakePHP-1-3-18-and-2-4-8-released.html https://bakery.cakephp.org/2014/04/29/CakePHP-1-3-18-and-2-4-8-released.html <![CDATA[CakePHP 1.3.18 and 2.4.8 released]]> CakePHP 1.3.18 and 2.4.8 released

The CakePHP core team is happy to announce the immediate availability of 1.3.18 and 2.4.8. These releases contain security fixes and are recommended for all CakePHP developers using SecurityComponent.

The CakePHP core team is happy to announce the immediate availability of 1.3.18[1] and 2.4.8[2]. These releases contain security fixes and are recommended for all CakePHP developers using SecurityComponent. A short list of changes you can expect in 2.4.8 are:

  • SQLServer now properly appends the schema name when describing tables.
  • Hash::extract() can now match boolean attributes.
  • fclose() errors when using shells should no longer happen.
  • CakeResponse::file() now throws an exception when paths contain ‘..’.
  • ShellDispatcher now casts argv to an array. This fixes issues when cake console was invoked from a non-cli SAPI.
  • TextHelper::autoLink() now correctly links urls with subdomains containing ‘_’.
  • SecurityComponent form tampering hashes now include the URL including the query string as a hash input.

A short list of changes you can expect in 1.3.18 are:

  • Model conditions containing : or ? are now handled correctly. This fixes issues around using casting in conditions
  • SecurityComponent form tampering hashes now include the URL path as a hash input.

As previously mentioned, a security issue related to the SecurityComponent was fixed. These releases are recommended upgrades for anyone using SecurityComponent. Prior to these relases, forms secured by SecurityComponent could be submitted to any action without triggering SecurityComponent’s tampering protection. If an application contains multiple POST forms to manipulate the same models, it could be vulnerable to mass assignment issues. Thanks to Kurita Takashi for notifying the CakePHP team of this issue, and suggesting a fix.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP.

]]>
Tue, 29 Apr 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/04/27/CakePHP-2-5-0-RC2-Released.html https://bakery.cakephp.org/2014/04/27/CakePHP-2-5-0-RC2-Released.html <![CDATA[CakePHP 2.5.0-RC2 Released]]> CakePHP 2.5.0-RC2 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.0-RC2

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.0-RC2[1]. This is the second release candidate for the 2.5.0 branch. 2.5.0-RC2 contains bugfixes and a few new features added since 2.5.0-RC1 was released. When complete, 2.5.0 will replace the 2.4.x branch. A migration guide is available in the book [2] and we encourage you to read it if you are upgrading from an older version.

Changes since 2.5.0-RC1:

  • AssetDispatcher early 404’s were reverted. They caused problems with extension based routing in plugins.
  • View paths for plugins are now cached. This change optimizes lookup times when using multiple views/elements from a plugin.
  • CakeEmail configuration can now set the layout without setting the template.
  • Transliteration rules used by Inflector::slug() have been expanded.
  • CakeResponse::file() now rejects paths with ..

If there are no important issues found, a stable release of 2.5.0 should be released in the next few weeks.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework.

]]>
Sun, 27 Apr 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/04/11/CakePHP-2-5-0-RC1-Released.html https://bakery.cakephp.org/2014/04/11/CakePHP-2-5-0-RC1-Released.html <![CDATA[CakePHP 2.5.0-RC1 Released]]> CakePHP 2.5.0-RC1 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.0-RC1.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.0-RC1[1]. This is the first release candidate for the 2.5.0 branch. The 2.5.0-RC contains bugfixes and a few new features added since 2.5.0-beta was released. When complete, 2.5.0 will replace the 2.4.x branch. A migration guide is available in the book [2] and we encourage you to read it if you are upgrading from an older version.

Changes since 2.5.0-beta

  • HtmlHelper::addCrumb() can now be chained to add multiple crumbs.
  • BaseAuthorize::mapActions() can now map custom action types.
  • cake acl delete now deletes all matching rows.
  • Dispatcher::_invoke() no longer takes a response parameter.
  • Set class is now deprecated and has been removed in 3.0. You should use Hash class instead.
  • CakePlugin::loadAll() now merges settings with defaults.
  • AssetDispatcher now returns 404 errors with no content body when plugin/theme assets cannot be found.

If there are no important issues found, a stable release of 2.5.0 should be released in the next few weeks.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework.

]]>
Fri, 11 Apr 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/04/05/CakePHP-2-4-7-Released.html https://bakery.cakephp.org/2014/04/05/CakePHP-2-4-7-Released.html <![CDATA[CakePHP 2.4.7 Released]]> CakePHP 2.4.7 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.7

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.7. 2.4.7 is a bugfix release for the 2.4 release branch. A short list of the changes you can expect is:

  • Core fixtures are now included in PEAR packages.
  • Limburgish locale was added to L10n.
  • MailTransport now includes the last error in the exception raised when mail() fails.
  • HtmlHelper::getCrumbList() supports the escape parameter now.
  • Describing tables in specific SQLserver schemas now works correctly.
  • Improved API docs for several classes.
  • URLs are correctly generated when two routing keys start with the same substring.
  • Model::deleteAll() works correctly when using MySQL views.
  • CakeEmail sets theme on helpers now.
  • Hidden inputs generated in radio(), select() and checkbox() have the ‘form’ attribute set when provided.
  • Inflection for words ending in ‘aves’ was improved.
  • CakeTestCase::assertTags() now runs much faster.
  • CakeTestCase::assertTags() requires all attributes to be verified now.
  • AclShell::delete now removes all matching records.
  • CakeEmail now correctly renders messages when the template and layout are in different plugins.

You can view the full changelog on cakephp.org[1]. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github[2].

]]>
Sat, 05 Apr 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/03/26/CakePHP-2-5-0-beta-Released.html https://bakery.cakephp.org/2014/03/26/CakePHP-2-5-0-beta-Released.html <![CDATA[CakePHP 2.5.0-beta Released]]> CakePHP 2.5.0-beta Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.0-beta.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.5.0-beta[1]. This is the first beta release for the 2.5 branch. The 2.5.0-beta release contains several new features that improve CakePHP’s performance, security and ease of use. When done, this new version will replace the 2.4.x branch. A migration guide is provided in the book [2] and we encourage you to read it if you are upgrading from an older version.

New features

While the migration guide[2] contains all the changes in 2.5.0, here are a few we are excited about.

Cache::remember()

This method allows you to implement read-through cache operations. For the passed cached key, it will first look for any cached data that is still valid. If not found, a callback method will be executed and its return value stored under the cache key.

You will find this useful for reducing the amount of repetitive code around checking for cache misses.

Improved Memcached support

A new Cache engine has been added to provide support for the php extension ext/memcached, which is the faster and better supported extension for utilizing this popular key-value database. In introducing this new adapter, we have deprecated the old Memcache engine and plan for its removal in 3.0.

CompletionShell

For shell environments that support command completion such as bash and zsh, we have provided a cake shell that will help you get command and options completion for your cake shells by hitting the tab key. If you have ever wondered what shells are available, or what options they can take, this might be for you. Make sure to check the documentation for more information on how to set this up.

Security::encrypt() and AES encrypted cookies

If for any reason you are storing data in cookies that should not be changed by the user, you can now use AES encrypted cookies. This utilizes the new AES-256 encryption offered by the Security class to prevent various classes of attacks, such as cookie tampering.

Consistent priorities in global and local events

One limitation in previous CakePHP versions was that listeners attached to the global EventManager would always be called before any other local listeners, despite the priorities. CakePHP 2.5 unifies the priority queue between global and local event listeners. With a single unified set of priorities, you can implement more complex and complete aspect oriented programs.

The API docs[3] and cookbook have been updated to reflect the changes and updates for 2.5.0.

The CakePHP core team would also like to welcome Brian Crowe (bcrowe) to the team. Brian has been actively improving the cookbook, API docs and code during the development of 2.5, and 3.0.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework.

]]>
Wed, 26 Mar 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/03/12/CakePHP-3-0-0-dev-preview-2-released.html https://bakery.cakephp.org/2014/03/12/CakePHP-3-0-0-dev-preview-2-released.html <![CDATA[CakePHP 3.0.0 dev preview 2 released]]> CakePHP 3.0.0 dev preview 2 released

The CakePHP core team is very excited to announce the second development preview of CakePHP 3.0

The CakePHP core team is excited to announce the second development preview of CakePHP 3.0.0[1]. In the few months since 3.0.0-dev1, we’ve been hard at work incorporating community feedback on the ORM, and building out some of the functionality that was missing in the first development preview.

New features in 3.0.0-dev2

  • CakePHP has adopted the PSR-4 autoloader standard. If you are updating, make sure you update composer as well using ` composerself- update`.
  • The directory structure of both CakePHP and the App skeleton has been simplified a bit thanks to PSR-4.
  • The AclComponent has been removed - It will be returning as a plugin.
  • The TestShell, and webrunner have been removed in favor of only supporting phpunit from the CLI, and VisualPHPUnit.
  • View templates have been moved from View/ to Template/. This was done so the View/ directory would only contain view classes and helpers.
  • The HtmlHelper, FormHelper, and SessionHelper use string templates consistently.
  • ID attributes are now always generated with ` -` instead of CamelCase. This was done to standardize on one convention for CSS selectors.
  • API documentation and the cookbook have had many new sections and improvements.
  • Scaffold has been removed. Improved dynamic scaffolding is now available through the CRUD plugin[2] which is already compatible with 3.0 and takes away much of the repetitive tasks done in controllers.
  • The UpgradeShell has been moved into a separate plugin.
  • Better debugging output for some complex objects like Entities, Tables and Queries. Also added a special method to control what data is outputed for objects when using the debug() function
  • Added Collection::insert()

FormHelper

FormHelper has been re-built from the ground up. It features a new extensible widget system. Form widgets allow you to build self contained input widgets. This makes it easy to define complex widgets like the datetime widget in application or plugin code. Once created, widgets can be combined with other FormHelper features like ` input()`.

FormHelper also works with the new ORM now. You can create forms for individual entities, or collections of entities:

 `
//Createaformforasingleentity&itsassociations
echo$this->Form->create($article);

//Createaformformultipleentities&theirassociations.
echo$this->Form->create($articles);

`

FormHelper also features a pluggable context system that allows you to integrate FormHelper with any ORM you may wish to use.

TranslateBehavior

TranslateBehavior has been re-built from the ground up. It features the long awaited ability to translate all models including associations from a find(). The new ` TranslateTrait` makes dealing with multiple translations in your entities simple as well.

ORM improvements

We’ve continued to build out capabilities in the ORM. Some notable improvements in dev2 were:

  • Composite primary key support - The ORM now supports composite primary keys in all associations.
  • The Model.beforefind event is now triggered for all associations in the same query.
  • Eager loading is now separate from the Query class. This makes implementing custom eager loading much easier.
  • Model/Repository was renamed to Model/Table. Several people found ‘Repository’ to be a confusing and alien term.
  • Interfaces have been extracted to reduce the reliance on concrete implementations.
  • The formatResults() method has been added to provide many of the features that afterFind() used to do.
  • Query::counter() was added to provide support for complex count logic. This makes it easier to override the count in the PaginatorComponent.
  • Table::patchEntity() was added, it enables you to merge requet form data into an existing entity and its associations.

Up next

Our next release will be yet another development preview. In the dev3 release we are going to focus on updating:

  • Bake and all the related tasks need to be updated to work with the new ORM.
  • Update the i18n extract task to extract validation messages from Table objects
  • Add support for SQLServer. With the database layer reasonably stable adding SQLServer will help developers on windows.

For more details on all the changes in 3.0.0, you can consult the migration guide[2]. I’d like to thank everyone who has contributed thoughts, code, documentation or feedback to 3.0 so far. It’s going to be a major milestone for the project, and we’re just getting started with making it the best version of CakePHP ever.

]]>
Wed, 12 Mar 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/03/02/CakePHP-2-4-6-Released.html https://bakery.cakephp.org/2014/03/02/CakePHP-2-4-6-Released.html <![CDATA[CakePHP 2.4.6 Released]]> CakePHP 2.4.6 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.6. 2.4.6 is a bugfix release for the 2.4 release branch.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.6. 2.4.6 is a bugfix release for the 2.4 release branch. A short list of the changes you can expect is:

  • Extract task handles quotes inside validation messages correctly.
  • Model::field() now works with fields translated with TranslateBehavior.
  • Core tests are no longer part of PEAR packages. This solves issues when the pear package is used as a composer dependency, and an incorrect classmap was generated.
  • FormHelper::checkbox() can now generate checkboxes for empty values.
  • Postgres can now convert boolean fields to integer when using SchemaShell.
  • Changes to how ID’s are generated for radio inputs were reverted. These changes caused issues in some applications.
  • API documentation has been improved.
  • Reverse routing for prefixed actions was improved.
  • Temporary associations setup with TranslateBehavior::bindTranslation() are now correctly unbound & restored.
  • Clearing data with MemcacheEngine will now work with greater than 100 slabs.
  • Validation::decimal() now works with localized floats.
  • Invalid data in datetime pickers is now correctly handled.
  • FormHelper::postLink() and FormHelper::postButton() now handle N dimensional data.

You can view the full changelog on cakephp.org[1]. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github[2].

]]>
Sun, 02 Mar 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/02/19/Scaffold-on-Bootstrap-3.html https://bakery.cakephp.org/2014/02/19/Scaffold-on-Bootstrap-3.html <![CDATA[Scaffold on Bootstrap 3]]> Scaffold on Bootstrap 3

My samples in the scaffold design using Bootstrap 3 Nice Scaffolding for CakePHP github.com/xv1t/cakephp-scaffold-bootstrap3 Required: Bootstrap 3 (Testing on 3.1.1) Please see the screenshots: index, view, form

]]>
Wed, 19 Feb 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/02/18/CakeFest-2014-Madrid-Spain.html https://bakery.cakephp.org/2014/02/18/CakeFest-2014-Madrid-Spain.html <![CDATA[CakeFest 2014: Madrid, Spain]]> CakeFest 2014: Madrid, Spain

Join us at CakeFest 2014, the annual CakePHP conference, held this year in Madrid, Spain, from the 21st until the 24th of August, and experience the very best of open source! Visit https://cakefest.org for info and tickets.

The big 3.0

This year we’re celebrating 9 years of CakePHP, and we want to do it with all of you, our awesome community. There’s also a very important milestone on the horizon, in the form of the lucky number “3”. You really cannot miss this year’s event, held in the beautiful European city of Madrid, Spain, from Thursday the 21st until Sunday the 24th of August.

See more details on the location at https://cakefest.org/location.

We’ve also got an incredible offer for you this year, as we’re providing some tickets which include a room plus breakfast in the 4* hotel that’s hosting the conference! That’s right, all you need is to get there and we’ll take care of the rest. Who said we don’t love you guys?!

Get your tickets now at https://cakefest.org/tickets.

Workshops

The 2 day workshops at CakeFest are an ideal opportunity to learn the internals of CakePHP, and a great way to get up to speed with the latest version of the framework. We’ll be focusing part of the workshops on the new 3.0 code base, helping people get to grips with the new features for this third major revision of CakePHP. Attendees will also receive a personal certificate of attendance from the Cake Software Foundation.

Conference

The conference covers 2 jam packed days of keynotes, presentations, discussions and talks on CakePHP and related technologies, plus an array of activities, such as lightning talks, core team Q, the Hour of Contribution and a raffle. It’s a great time to engage and network with the community, learn from other experienced developers, and party with the core team. Plus, there will be cake!

Call for Papers

Would you like to be a speaker at a conference which draws an international crowd who love PHP and all things cake related? Never spoken before, or don’t think you have anything interesting to share? The annual CakePHP conference draws an exceptionally friendly community of developers, tech lovers and geeks in general. If you’re interested in giving a talk this year, then CakeFest is the ideal event. The submissions are open until April 30th! Just head over to https://cakefest.org and submit your talk proposals. We’re open to anyone for submissions. All it takes is a interesting idea, and we’d love to hear yours!

Sponsorship

Are you working for a company or own a business that would benefit from the unique exposure that comes from sponsoring the annual CakePHP conference? Consult our sponsorship prospectus for more details as well as the sponsor packages currently available.

]]>
Tue, 18 Feb 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/01/26/CakePHP-2-4-5-Released.html https://bakery.cakephp.org/2014/01/26/CakePHP-2-4-5-Released.html <![CDATA[CakePHP 2.4.5 Released]]> CakePHP 2.4.5 Released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.5

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.5. 2.4.5 is a bugfix release for the 2.4 release branch. A short list of the changes you can expect is:

  • Generated DOM ids for radios and checkboxes should now be collision free when using non-alphanumeric values.
  • The postgres driver now quotes schema names. This solves issues with legacy schemas using special characters.
  • Translate behavior now correctly handles translated values of ‘0’.
  • Controller baking now provides better feedback when no controllers are generated.
  • Datetime inputs will not select year 0 when the selected value is ‘0000-00-00’. This improves compatibility with MySQL.
  • Schema creation with the connection parameter now works as expected.
  • URLs are no longer double URL decoded. This fixes lost data when named parameters or path segments contain values that look like URL encoded data.
  • Model::updateCounterCache() no longer triggers a notice error when $this->data is empty.

You can view the full changelog on cakephp.org[1]. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github[2].

]]>
Sun, 26 Jan 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/01/23/Qimage-Component-Image-Manipulation-Component-Cake-2-x.html https://bakery.cakephp.org/2014/01/23/Qimage-Component-Image-Manipulation-Component-Cake-2-x.html <![CDATA[Qimage Component (Image Manipulation Component Cake 2.x)]]> Qimage Component (Image Manipulation Component Cake 2.x)

Quick Image Component (Qimage) is a component for CakePHP to facilitate image upload and manipulation.

Methods

copy -> Copy uploaded images.

resize -> Resize an image.

watermark -> Add watermark in an image.

crop -> Crop an image.

getErrors -> Get all errors that occurred in Qimage.

More details can be found in the comments of the methods.

See more in Github.

]]>
Thu, 23 Jan 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/01/11/An-ElasticSearch-powered-Search-Index-your-data-stays-in-default.html https://bakery.cakephp.org/2014/01/11/An-ElasticSearch-powered-Search-Index-your-data-stays-in-default.html <![CDATA[An ElasticSearch powered Search Index - your data stays in default]]>

An ElasticSearch powered Search Index - your data stays in default

Use ElasticSearch for your searches, but keep your data in MySQL/Postgres (your default DB config). This behavior saves an “index” string to ElasticSearch for each record afterSave, and searches happen against that, but your data is exactly as it was before.

Elastic Search Index

https://github.com/zeroasterisk/CakePHP-ElasticSearchIndex

This plugin allow for a very easy search index powered by`ElasticSearch`_ with all kinds of`Lucene`_ powered goodness. (it powers GitHub)

With this, you keep your models on your own normal (default) datasource. All saves and finds and joins and callbacks… normal.

But when you attach this behavior, you now have additional callbacks which gather the data you want to use as a search index… it stores that data to ElasticSearch via it’s own datasource, ` index` as setup via the (above) Elastic plugin.

What you end up with is having you cake and eating it too.

  • Your Model and datasource are unchanged and work as before. ** all your data is still where it has always been ** you can still do joins ** non-search conditions can still work on the normal fields
  • The searchy goodness of ElasticSearch / Lucene is avaialble to you ** The indexed string for each record is a customizable second copy of the data’s text ** It’s avaialble on ElasticSearch for any other usage as well

Now you can search by

  • term: foo
  • multi-term: foobar
  • partials: fo*
  • partials in the front: *oo
  • phrases: “foobar”
  • fuzzy term: ~bars (prefix with ` ~`)
  • … and more … (suggestions?)

Note: it is working great, but we could use more ElasticSearch special sauce if you want to help improve it.

Install

Get this plugin into place

 `
git submodule add https://github.com/zeroasterisk/CakePHP-ElasticSearchIndexapp/Plugin/ElasticSearchIndex
#or
git clone https://github.com/zeroasterisk/CakePHP-ElasticSearchIndexapp/Plugin/ElasticSearchIndex

`

And install the`Icing`_ Plugin

 `
gitsubmoduleaddhttps://github.com/AudiologyHoldings/Icingapp/Plugin/Icing
#or
gitclonehttps://github.com/AudiologyHoldings/Icingapp/Plugin/Icing

`

In ` app/Config/bootstrap.php` load the plugin

 `
CakePlugin::load('Icing');
CakePlugin::load('ElasticSearchIndex');

`

Copy the default ` ElasticSearchRequest` configuration into your app and edit it to suit your setup.

 `
cpapp/Plugin/Icing/Config/elastic_search_request.php.defaultapp/Config/elastic_search_request.php

`

Note that there’s a ` default` config and a ` test` config which will override the ` default` config… But only if your tests set the following Configure variable:

 `
Configure::write('inUnitTest',true);

`

Now setup into any Models you want to search / index

In your ` Model` add this behavior

 `
public$actsAs=array(
'ElasticSearchIndex.ElasticSearchIndexable'=>array(),
);

`

And here are the behaviour config options, with default values

 `
public$actsAs=array(
'ElasticSearchIndex.ElasticSearchIndexable'=>array(
//urltotheelasticsearchindexforthismodel/table
'url'=>null,
//extraconfigforElasticSearchRequest(parsedfromURL)
'index'=>null,
//extraconfigforElasticSearchRequest(parsedfromURL,ordefaultedto$Model->useTable)
'table'=>null,
//limitthesearchresultstothismanyresults
'limit'=>200,
//detailsneededtolinktoModel
'foreignKey'=>false,//primaryKeytosaveagainst
//dowebuildtheindexaftersave?(yes...)
'rebuildOnUpdate'=>true,
//whenwebuildtheindex,considerthesefields(ignonredifcustommethodonmodel)
//eg:array('title','name','email','city','state','country'),
//orforall(text/varchar)fields:'*'
'fields'=>'*',
//whenwebuildtheindex,dowefinddatafirst?(iffalse,weonlyhavethedatawhichwassaved)
'queryAfterSave'=>true,
//optionalconfigforHttpSocket(bettertoconfigureElasticSearchRequest)
'request'=>array(),
),
);

`

How to Save Records

It’s automatic, after every save , the behaviour will post that record to the ElasticSearch index.

If you want to manually index any model ` $data` arrays (with the fields from this model), in your ` Model` you can do:

 `
$data=$this->read(null,'1234');
$id=$data[$this->alias][$this->primaryKey];
$success=$this->saveToIndex($id,$data);

`

If you have a simple string, you want to index for a record on your ` Model` then you can use:

 `
$id='1234';
$success=$this->saveIndexDataToIndex($id,'Thisisacustomstring,thiswillbeindexed');

`

Customize the data to save to the Index

You can specify a few methods on your model, which override the basic functionality.

Make this method on your model to get customized data for the indexing. It should return a data array for a single record, similar to a ` find(‘first’)`

 `
$findFirstData=$this->getDataForIndex($id)

`

Make this method on your Model to process a data array into a string for indexing.

It expects to get it’s data array from ` $this->data` not from a passed in argument

It should return a string (the text which will be stored in the index)

 `
$indexText=$this->indexData()

`

Make this method on your Model to clean or post-process the index text. You can replace terms, characters or whatever you like.

 `
$indexText=$this->cleanForIndex($indexText)

`

How to re-index all Records

In any Model you can run ` reIndexAll($conditions)` and it will walk through your data and re-index all of them… it can be really slow…

 `
//thisisreallyslow,butitwillre-indexeverything(create/updateindexes)
$statusString=$this->reIndexAll();
//oryoucanpassinanyconditionsyouliketolimitthescopeofthereIndex
$statusString=$this->reIndexAll(array(
'modified>'=>date('Y-m-d00:00:00',strtotime('-2months')),
));

`

How to Search with results Sorted by best match

Search results are usually sorted by which results are the best match for the search term.

 `
$sortedIds=$this->searchAndReturnAssociationKeys('SearchTerm');
$results=$this->find('all',array(
'conditions'=>array(
"{$this->alias}.{$this->primaryKey}"=>$sortedIds
)
));
$results=$this->searchResultsResort($results,$sortedIds);

`

Convenience Search, Resort, and Return Data

If you want to just get search results, without any other conditions, it’s really simple:

 `
$findAllResults=$this->search($term)

`

And here are all the possible paramters…

 `
$findAllResults=$this->search($term,$optionsForFindAll,$optionsForElasticSearchRequest);

`

Background

This project is based in large part on the`Searchable/SearchIndex`_ Plugin/Behavior and my former fork of it. The original version stored all of the index data into a MySQL table with a full-text-index. That worked pretty well, but it only worked with the MyISAM table engine and it doesn’t offer all the sweet search syntax/features.

Initially, this was using the`Elasitc`_ Plugin/Datasource and it worked ok… but there were un-necissary complications due to the data storage patter (as CakePHP nested models) and because all of the data for all of the models was stored in the same “table” on ElasticSearch. Also the Elastic model required curl, not bad but not needed.

Now ElasticSearchIndex is using`Icing.Lib/ElasticSearch`_. for interactions with ElasticSearch.

It’s a little odd to interact with a “database” not through a “datasource” but the Lib is really an extension of the HttpSocket utility, and it’s indended to facilitate both a raw interactions (where you manually create whatever data you want to send) and it has tools to help automate simple data to pass.

Attribution

This project is an extension of Searchable/SearchIndex and informed by the Elastic DataSource… The base of the work is theirs. Big thanks!

and of course, you… pull requests welcome!

License

This code is licensed under the MIT License

Copyright (C) 2013–2014 Alan Blount alan@zeroasterisk.com https://github.com/zeroasterisk/

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

]]>
Sat, 11 Jan 2014 00:00:00 +0000
https://bakery.cakephp.org/2014/01/05/CakePHP-3-0-0-dev-preview-1-released.html https://bakery.cakephp.org/2014/01/05/CakePHP-3-0-0-dev-preview-1-released.html <![CDATA[CakePHP 3.0.0 dev preview 1 released]]> CakePHP 3.0.0 dev preview 1 released

The CakePHP core team is very excited to announce the first development preview of CakePHP 3.0

The CakePHP core team is very excited to announce the first development preview of CakePHP 3.0[1]. The team has been hard at work for the while, and we’re very excited and pleased with the progress we’ve made so far. Our goal with development preview releases like this is to gather early feedback about the changes coming in CakePHP 3.0. While a number of things will be changing in CakePHP 3.0, our focus for this release has been the ORM.

The Model layer in CakePHP has served the community very well for the past 8 years, but it has started to show its age. One of the goals of CakePHP 3.0 is to replace the ageing ORM with a more modern object- orientated implementation. This development preview has the underpinnings of the new ORM. The ORM has many of the features/methods you can expect in future 3.0 release, albeit with a few rough spots.

CakePHP 3.0 represents a significant break in backwards compatibility. One of the largest the project has ever had. We’re trying to modify existing methods and classes only where it’s required. However, modernizing the ORM has caused a significant ripple effect to other parts of the framework. You can expect fairly significant changes in everything that touches the ORM/Models as we’ve started over and built what we will become a great ORM.

Still a preview

We’d like to remind you that this is a development preview release. Many features are incomplete or missing. For example, the TreeBehavior and TranslateBehavior do not yet have 3.x versions. This release is not intended for production use, and should be considered alpha software. We are hoping that by releasing preview releases we can get feedback from you - the community - about CakePHP 3.0. The following features are known to be incomplete or broken. We will not be accepting any bug reports on these features at this time:

  • Console/cake bake does not work at this time.
  • FormHelper does not work with the new ORM yet.
  • SchemaShell has been removed.
  • Scaffold has been removed.
  • Many behaviors have been removed or are not working.
  • AclComponent is not working with DbAcl.

In addition to incomplete subsystems, many subsystems have had breaking API changes made to them. We recommend you checkout the migration guide[2] for more detail on which methods/classes have been changed.

Other improvements

In addition to the ORM we’ve improved other parts of the framework. A short list of improvements you an expect are:

  • Reverse routing has almost consistent time complexity now. In previous releases reverse routing performance decreased as the number of routes increased. Thanks to named routes and some additional optimizations routing performance should stay more consistent even with large numbers of routes.
  • Routing prefixes now map to controllers in sub-namespaces and not prefixed methods.
  • New HTTP client. The HttpSocket class has been entirely re-written. It is now simpler, more performant and easier to use.
  • Simplified configuration. While CakePHP does not have much configuration required. The configuration it does have is now much simpler and more transparent than ever before.
  • Community standards adopted. CakePHP is leveraging PSR-0, PSR-1 and composer support.
  • Streamlined events system. The events system is now simpler and more efficient than ever before.

Getting started

On top of the framework changes, we’ve created a new repository for the application skeleton[3]. You can install this and the development preview of CakePHP using composer[4]. After downloading and installing composer you can use:

$ php composer.phar create-project -s dev cakephp/app

This will generate a new application, so you can start experimenting with CakePHP 3.0.

Documentation online

While this is a preview release, we have been busy building documentation alongside the code changes. The in-development book[5] and API[6] are already online. They will be receiving frequent updates as more documentation and examples are written.

Getting involved

If you’re as excited about CakePHP 3.0 as we are, there are many ways you can get involved. You could help with the open issues in github[7], or provide your thoughts on any of the open RFC/Enhancement tickets. Both of these help us design and build the best framework we can. If you’re reading through the documentation and notice an error, please let us know, either by opening an issue or sending a pull request.

I’d like to thank everyone who has contributed thoughts, code, documentation or feedback to 3.0 so far. It’s going to be a major milestone for the project, and we’re just getting started with making it the best version of CakePHP ever.

]]>
Sun, 05 Jan 2014 00:00:00 +0000
https://bakery.cakephp.org/2013/12/29/CakePHP-Community-2013.html https://bakery.cakephp.org/2013/12/29/CakePHP-Community-2013.html <![CDATA[CakePHP Community 2013]]> CakePHP Community 2013

2013 has been an incredible year for us, as it saw the CakePHP community grow stronger than ever.

CakePHP: the community driven framework

We’ve been very busy, and have a lot to show for it. Late last year we created the Community Center, as a central location for everyone to find their way around, and help people get involved with the project. This year we launched My CakePHP, as a hub for developers to create a profile, and unify the experience across all of our sites. The Cake Software Foundation website also received a well overdue facelift. Additionally, after continuous requests, and with a little help from CakeDC, we improved the schedule for the official CakePHP training, which is now provided on a regular basis.

Earlier this year we also announced our agreement with Microsoft to make CakePHP available on Windows Azure. That doesn’t mean you can’t get your piece of the cake on other platforms, such as Rackspace’s Cloud Sites, Amazon’s Elastic Beanstalk or RedHat’s OpenShift, as well as other PaaS providers, like Pagoda Box or Fortrabbit. There’s a lot to choose from.

It was also great to see that, since our efforts last year to extend the reach of the CakePHP community, both the Facebook interest page and our official Twitter account have reached over 10,000 likes and followers each. The official group on Facebook also surpassed 3,000 members, becoming even larger than groups for other major PHP frameworks. But the growth didn’t stop there. We had almost 1 million more visits to the CakePHP sites compared to last year, with the CookBook seeing nearly an additional 10 million page views, reaching over 26 million. For more numbers and stats check out this year’s community keynote.

Which takes us to San Francisco, USA, where we held CakeFest 2013, the annual conference dedicated to everything CakePHP. Over 80 developers from around the world joined us for 4 days of workshops and conference. We listened to your feedback from the previous year and broke the workshop schedule into beginner and advanced sessions over the first 2 days. This was then followed by another 2 days of 16 talks given by 12 international speakers, as well as keynotes, lightning talks, core team Q, and the raffle. We took away some really memorable moments, the best of all being the “Hour of Contribution”, where we saw everyone contributing to the project for an hour, in true open source fashion. It was a beautiful sight, and a humbling experience. Oh, and who could forget about the cake!

But wait, there’s more. Work has been going strong on version 3.0 of CakePHP, with the new ORM almost ready for it’s first developer preview release. The roadmap is slowly being completed, with the milestone available for anyone to join in on the fun. In the meantime, this year saw the release of versions 2.3 and 2.4 of the framework, with a sum of 28 releases in total. There’s also been a lot of activity in the developer community, with almost 6,000 additional questions tagged on Stack Overflow this past year alone. We also saw some interesting projects released, a couple of videos, interviews and books published, a few useful tools, as well as some nice cheat sheets. Not to mention some great initiatives, and of course, an honorable mention to core member Jose Gonzalez, who delivered a total of 25 successive posts on his blog as part of his CakePHP advent series. For all our Japanese developers, there was a similar series created previous years.

Overall, 2013 was an amazing year, and one to be proud of as a member of the community! A big thank you goes out to everyone who has been involved and helped make CakePHP what it is - a framework built by the community! Thank you.

]]>
Sun, 29 Dec 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/12/25/User-Management-Plugin-with-Twitter-Bootstrap-3-x-for-cakephp-2-x-version-2-3.html https://bakery.cakephp.org/2013/12/25/User-Management-Plugin-with-Twitter-Bootstrap-3-x-for-cakephp-2-x-version-2-3.html <![CDATA[User Management Plugin with Twitter Bootstrap 3.x for cakephp 2.x version 2.3]]> User Management Plugin with Twitter Bootstrap 3.x for cakephp 2.x version 2.3

I have released a new version(2.3) of my plugin for user management. Demo at http://umpremium.ektanjali.com. This plugin has more than 100 features. This plugin is Basic need of your website. Basically It gives you all features which you need on starting your website or a project in cakephp 2.x framework.

This plugin has more than 100 features.

It is very helpful for Beginners because of following features-

Clean code with coding standards Proper documentations Newbie will learn- a. How to write code in Cakephp? b. How to use CSRF/XSS protection in cakephp c. How to use SSL/HTTPS in cakephp for whole site as well as only some pages. d. How to use Ajax Pagination in cakephp. e. How to use Ajax Form Validations in cakephp. f. How to use ajax search features.

and many more.

For all features, Beginners please have a look on http://developers.ektanjali.com/docs/umpremium/version2.3/beginners.html Experts will also learn many other things. For all features http://umpremium.ektanjali.com You can start your project or a website in few minutes with this plugin because this plugin has all things which you can think in starting of your project.

The main features are- Twitter Bootstrap framework 2.x and 3.x Login with Facebook, Twitter, Linkedin, Four Square, Gmail, Yahoo. All Configurations are database driven. No need to touch php code for config setting. No need to hard code your site URL any where. View Online users and guest and admin can take many action on online users. SSL support for selected pages or whole site. Most of the things are Ajax driven. Mailer system

I cannot describe all features here so please have a look on demo at http://umpremium.ektanjali.com here you can find all features of this plugin.

]]>
Wed, 25 Dec 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/12/24/CakePHP-2-4-4-released.html https://bakery.cakephp.org/2013/12/24/CakePHP-2-4-4-released.html <![CDATA[CakePHP 2.4.4 released]]> CakePHP 2.4.4 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.4.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.4. 2.4.4 is a bugfix release for the 2.4 release branch. A short list of the changes you can expect is:

  • TextHelper::autoLink() now handles email addresses inside URLs correctly.
  • Pagination request data is set even when a NotFoundException is raised now.
  • Model::deleteAll will only delete distinct records now.
  • Router::mapResources() now ensures that the prefix has both the leading and trailing slash.
  • An infinite loop condition in CakeSession was fixed. This could be triggered by starting an already invalidated session.
  • Hash::numeric() now works as expected with negative numbers and other numeric values.
  • The ‘my’ and ‘ym’ formats for Validation::date() have been relaxed to allow both 2 and 4 digit year values.
  • FormHelper will not infer types incorrectly when type=checkbox is provided.
  • Postgres biginteger primary keys now correctly use the bigserial type.
  • FormHelper::dateTime() correctly handles times around 12:00:00 when an interval is also used.
  • Hash::combine() now throws exceptions when the key and value paths result in arrays of differing lengths.
  • CakeRequest::referer() no longer incorrectly reads the HTTP_X_FORWARDED_HOST header.
  • CakeRequest::host() now has a trustProxy parameter that allows access to the proxy host value.

You can view the full changelog on cakephp.org[1]. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github[2].

]]>
Tue, 24 Dec 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/11/25/CakePHP-2-4-3-released.html https://bakery.cakephp.org/2013/11/25/CakePHP-2-4-3-released.html <![CDATA[CakePHP 2.4.3 released]]> CakePHP 2.4.3 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.3.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.3. 2.4.3 is a bugfix release for the 2.4 release branch. A short list of the changes you can expect is:

  • API Documentation improvements.
  • Long headers are no longer wrapped with PHP_EOL when sending email with MailTransport. This should solve delivery issues with Qmail, and other SMTP transport agents.
  • Model::_clearCache() has improved performance.
  • Model’s now work better with schema’s containing numeric column names.
  • An exception is now raised when a view block is opened while it is already open.
  • SchemaShell no longer uses schema.php as the filename when a custom name parameter is provided.
  • MKV is a supported content type.
  • CookieComponent writes are now more consistent. Previously writing multi-key and single writes were handled very differently. Fixing the write consistency makes deletion data saner and results in fewer cookies being transmitted.
  • Empty array data in cookies is now parsed correctly.
  • CakeTime::dayAsSQL() now correct supports the timezone parameter.
  • COUNT(DISTINCT x) queries work better in SQLServer now.
  • Postgres sequence values now use custom primary keys.
  • HtmlHelper now correctly encodes URLs generated for meta tags.
  • Using FormHelper::postLink() after creating a GET form now works as expected.
  • Model::saveAssociated() handles expression objects correctly now.
  • Model::setSource() does not alter the datasource’s cacheSources property anymore.
  • Non-breaking spaces are now removed by Inflector::slug()

You can view the full changelog on cakephp.org[1]. I’d like to thank the people who have contributed to this release. Your bug tickets, documentation edits, and patches/pull requests are a big part of what keeps CakePHP alive and ticking. Download a packaged release on github[2].

]]>
Mon, 25 Nov 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/10/23/CakePHP-2-4-2-released.html https://bakery.cakephp.org/2013/10/23/CakePHP-2-4-2-released.html <![CDATA[CakePHP 2.4.2 released]]> CakePHP 2.4.2 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.2.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.2[1]. 2.4.2 is a bugfix release for the 2.4 release branch. A short list of the changes you can expect is:

  • Sqlite::truncate() will verify that the sqlite_sequence table exists before modifying it.
  • Label elements now have their for attributes generated correctly for radio inputs.
  • Improved API documentation for a number of classes and methods.
  • TreeBehavior::recover() now correctly uses the scope conditions.
  • Hash::contains() can now look for needle values containing nulls.
  • Disabled radio buttons are now generated correctly when integer and string keys are used.
  • International domains are now accepted by Validation::url()
  • Inflector now handles ‘quota’ and ‘curves’ correctly.
  • jQueryEngineHelper now treats the ‘xhr’ option as a callback argument.
  • Bake now adds the numeric validator for float fields.
  • DboSource::renderStatement() now trims whitespace from generated queries.

As always, a big thank you to everyone involved in both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release [2].

]]>
Wed, 23 Oct 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/10/12/Issues-have-moved-to-Github.html https://bakery.cakephp.org/2013/10/12/Issues-have-moved-to-Github.html <![CDATA[Issues have moved to Github]]> Issues have moved to Github

The CakePHP team is happy to announce that as of today both issues and pull requests will be managed at github.

The CakePHP team is happy to announce that as of today both issues and pull requests will be managed at github. We have archived the lighthouse projects and made them read-only. All open tickets from lighthouse have been migrated to their respective github projects. We’ll be continuing to wrangle and update tickets in github over the next few days. We’ll also be updating the links on the various CakePHP sites to reflect this change, and ask your patience while we get all the information updated.

Why change?

While moving bug trackers is rarely a pleasant experience, we think the move to github will be positive for the community. Since our move to lighthouse in 2009, the ticket management features provided by github have improved dramatically. With excellent search and tight integration with pull requests we feel the ticketing features provided by github now offer a number of advantages over lighthouse. We hope that moving issues to github makes it easier and simpler for new and existing contributors to continue making CakePHP a fantastic project. We’d like to thank lighthouse for the excellent service and hosting over the past 4 years.

]]>
Sat, 12 Oct 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/09/15/CakePHP-2-4-1-released.html https://bakery.cakephp.org/2013/09/15/CakePHP-2-4-1-released.html <![CDATA[CakePHP 2.4.1 released]]> CakePHP 2.4.1 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.1[1]. 2.4.1 is a bugfix release for the 2.4 release branch.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.1[1]. 2.4.1 is a bugfix release for the 2.4 release branch. A short list of the changes you can expect is:

  • Improved API documentation and links to the book from the API.
  • Notice errors when loading LC_TIME files should no longer happen.
  • TreeBehavior::generateTreeList() now includes the scope defined in the model’s actsAs property.
  • Support for readline was added to Shell commands. If your environment supports readline, arrow keys will no longer output escape sequences.
  • FormHelper::input() will now use attributes defined in the label key.
  • Inflection support was improved.
  • Performance of CakeTime::timeAgoInWords() was improved.
  • Method signatures of Behavior callbacks was corrected. If you are using PHP5.4 you may have to update the method signatures of your behaviors to resolve any E_STRICT errors.
  • CROSS JOINs work correctly now.
  • SqlServer::value() now correctly handles NULL values.
  • Cache::clearGroup() with FileEngine and no prefix behaves as expected now.
  • CakeEmail now quotes email aliases that contain non-alphanumeric characters, that have not already been encoded.
  • Phone number validation was simplified to fix valid area codes being detected as invalid.

Security disclosure

In 2.3.8 a security issue in AssetDispatcher was fixed. In the spirit of being open and transparent a more detailed description of the issue is being provided. By carefully crafting a URL the AssetDispatcher would allow arbitrary file access. A successful attack required at least one theme or plugin to be in use. An example url would look like:

http://example.com/DebugKit/%2e.//%2e.//%2e.//%2e.//%2e.//%2e.//%2e.//%2e.//%2e.//%2e.//%2e.//%2e.//%2e./etc/passwd

AssetDispatcher incorrectly checked for directory traversal before decoding the URL. We’d like to thank Takeshi Terada of Mitsui Bussan Secure Directions, Inc for notifying us of the issue.

As always, a big thank you to everyone involved in both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release [2].

]]>
Sun, 15 Sep 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/09/11/Plugin-for-Paypal-Web-Payments-Pro-for-Cake-PHP-2-x.html https://bakery.cakephp.org/2013/09/11/Plugin-for-Paypal-Web-Payments-Pro-for-Cake-PHP-2-x.html <![CDATA[Plugin for Paypal Web Payments Pro for Cake PHP 2.x]]> Plugin for Paypal Web Payments Pro for Cake PHP 2.x

Basic Plugin that uses the NVP Methods for the WPP API from Paypal. Component pushes method and NVP combo to paypal url curl. Required php5-curl configuration in php.

PayPal WebPaymentsPro (WPP) Plugin for CakePHP 2.x

CakePHP 2.x Plugin for interfacing with Paypal WPP

Plugin can be found at https://bitbucket.org/chrispierce/paypalwpp-plugin-for-cakephp-2.x/overview

Usage

Load plugin in your APP and enable it by using the following bootstrap.php config:

 `
CakePlugin::load('PaypalWPP');
`

Configure your account by opening the Config/paypal.php file as follows

 `
$config=array(
'paypal'=>array(
'username'=>'username_api1.domain.com',
'password'=>'THGSWS658IKUN79S',
'signature'=>'AFYn4irhcVyzOOiJkc.H2zPIuztlArzO7mr5uXMO6DLICAE85JF.H5PPp',
'endpoint'=>'https://api-3t.paypal.com/nvp',
'version'=>'53.0',
),
);
`

Load the Component into the controller of your choice.

 `
public$components=array(
'PaypalWPP.PaypalWPP',
);
`

Next urlencode your data and send it to the component using a method and an nvp. For doing payments using DoDirectPayment (https://developer.paypal.com/webapps/developer/docs/classic/api/merchant/DoDirectPayment_API_Operation_NVP/) the following example would work:

 `
publicfunctionadd(){
if($this->request->is('post')||$this->request->is('put')){
$firstName=urlencode($this->request->data['Sale']['first_name']);
$lastName=urlencode($this->request->data['Sale']['last_name']);
$creditCardType=urlencode($this->request->data['Sale']['card_type']);
$creditCardNumber=urlencode($this->request->data['Sale']['card_number']);
$expDateMonth=$this->request->data['Sale']['exp']['month'];
$padDateMonth=urlencode(str_pad($expDateMonth,2,'0',STR_PAD_LEFT));
$expDateYear=urlencode($this->request->data['Sale']['exp']['year']);
$cvv2Number=urlencode($this->request->data['Sale']['cvv2']);
$amount=urlencode($this->request->data['Sale']['amount']);
$nvp='&PAYMENTACTION=Sale';
$nvp.='&AMT='.$amount;
$nvp.='&CREDITCARDTYPE='.$creditCardType;
$nvp.='&ACCT='.$creditCardNumber;
$nvp.='&CVV2='.$cvv2Number;
$nvp.='&EXPDATE='.$padDateMonth.$expDateYear;
$nvp.='&FIRSTNAME='.$firstName;
$nvp.='&LASTNAME='.$lastName;
$nvp.='&COUNTRYCODE=US&CURRENCYCODE=USD';

$response=$this->PaypalWPP->wpp_hash('DoDirectPayment',$nvp);
if($response['ACK']=='Success'){
$this->Session->setFlash('PaymentSuccessful');
}else{
$this->Session->setFlash('PaymentFailed');
}
debug($response);
}
}
`

Other Methods can be found at https://devtools-paypal.com/apiexplorer/PayPalAPIs

]]>
Wed, 11 Sep 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/08/30/CakePHP-2-4-0-is-ready.html https://bakery.cakephp.org/2013/08/30/CakePHP-2-4-0-is-ready.html <![CDATA[CakePHP 2.4.0 is ready]]> CakePHP 2.4.0 is ready

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.4.0 and 2.3.10[1]. There have been a few small improvements and fixes since the release of 2.4.0-RC2.

CakePHP 2.4.0

CakePHP 2.4.0 is now marked as stable. It is a new version in the 2.x series that is API compatible with other releases in the 2.x series. Make sure you read the migration guide [2] before upgrading as there are a few changes you may need to make.

A quick overview of the changes in 2.4 are:

  • The constants IMAGES_URL, JS_URL, CSS_URL have been deprecated and replaced with config variables App.imageBaseUrl, App.jsBaseUrl, App.cssBaseUrl respectively. Each of the deprecated constants will be removed in 3.0.
  • The CAKEPHP_SHELL constant has been deprecated and will be removed in 3.0.
  • Sanitize class has been deprecated and will be removed in 3.0.
  • FileLogs can now have a max size and simple rotation configured.
  • Logging now support syslog out of the box.
  • A number of locales have been renamed.
  • JSONP support has been added to the JsonView
  • You can disable updating counterCache values with the counterCache option when saving models.
  • Password hashing has been extracted into a set of PasswordHasher classes. These classes make changing out password hashing strategies for the various authentication adapters simple.
  • Stateless authentication has been improved.

For a full list of the changes and improvements you should review the 2.4 Migration guide [2].

Changes to 2.4.0 since 2.4.0-RC2

  • confirm handlers are now correctly encoded.
  • Helpers are now loaded during View construction. This ensures that helpers are always available.
  • View blocks can now operate on any object that can be converted to a string.
  • All changes detailed in the 2.3.10 changelogs are also included with 2.4.0

CakePHP 2.3.10

2.3.10 marks the end of normal bug fix releases for 2.3.x. Security fixes will continue to be released for 2.3.x until 2.6.0. The following is a short list of issues fixed and changes you can find in 2.3.10

  • Configuration values are now merged between Emails and their transports.
  • CakeTime::timeAgoInWords() now uses ‘about X ago’ when the time delta is lower than accuracy.
  • DbAcl now uses INNER joins instead of LEFT joins. This yields improved performance with some database vendors.
  • CakeEmail::template() can now disable the layout as documented.
  • Number formatting in locales that use ‘,’ for a decimal separator is now correct.
  • RedirectRoute now honors the ‘persist’ parameter correctly.
  • Constants are now conditionally defined in ShellDispatcher.
  • session.auto_start is no longer set as it never worked and triggers errors in PHP 5.5.
  • Sqlite now generates schema correctly when BIGINT columns are used as a primary key.
  • FileCache now removes special characters that would cause issues on windows systems.
  • i18n shell now correctly extracts categories other than LC_MESSAGES.

Development continues to progress on 3.0 with pull requests being frequently opened. Work has also begun on 2.5, another API compatible release in the 2.x line of releases. A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release [3].

]]>
Fri, 30 Aug 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/08/28/Generating-Tree-compatible-with-twitter-bootstrap-nav-subnav.html https://bakery.cakephp.org/2013/08/28/Generating-Tree-compatible-with-twitter-bootstrap-nav-subnav.html <![CDATA[Generating Tree compatible with twitter bootstrap nav subnav]]> Generating Tree compatible with twitter bootstrap nav subnav

I needed a helper which show my Menu items in twitter bootstrap navigation bar format with unlimited deep. First i did google for finding it but there was no result or there was not free. So i will show you how i did do that. first of all: My MenuItems Model has simple fields: id,parent_id,title,link,lft,rght and it’s actsAs Tree (Behavior)

so after i fetched data in threaded mode with find function i passed it to this little tiny long time function in a helper:

public function renderMenu($array,$root=true,$hasChildren=false) {
    if (count($array)) {
        if ($root)
            echo "\n<ul class=\"nav\">\n";
        else
            if ($hasChildren)
                echo "\n<ul class=\"dropdown-menu\">\n" ;
            else
                echo "\n<ul>\n";
        foreach ($array as $vals) {

            if (count($vals['children']) && (!$hasChildren))
                $liClass="dropdown" ;
            else
                                if ($hasChildren && count($vals['children']))
                                        $liClass = 'dropdown-submenu' ;
                                else
                                        $liClass=null ;


            echo "<li " ;
            if (!is_null($liClass))
                echo 'class="'.$liClass.'"' ;

            echo " id=\"".$vals['MenuItem']['id']."\">".$this->Html->link($vals['MenuItem']['title'],$vals['MenuItem']['link'],array('class'=>'dropdown-toggle', 'data-toggle'=>'dropdown'));
            if (count($vals['children'])) {
                $this->renderMenu($vals['children'],false,true);
            }
            echo "</li>\n";
        }
        echo "</ul>\n";
    }
}

it will print out a Bootstrap navigation bar compatible nested ul li.

Regards

]]>
Wed, 28 Aug 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/08/24/Bootstrap-3-Formhelper-CakePHP-2-x.html https://bakery.cakephp.org/2013/08/24/Bootstrap-3-Formhelper-CakePHP-2-x.html <![CDATA[Bootstrap 3 Formhelper (CakePHP 2.x)]]> Bootstrap 3 Formhelper (CakePHP 2.x)

A little FormHelper for horizontal Bootstrap3-compatible forms in CakePHP 2.x.

Hi,

Nothing really big but never the less it might be useful to some people:

I wrote a little BootstrapFormHelper which will create Bootstrap3-compatible Forms via the normal FormHelper-Calls. You do not need to change any views for this.

https://gist.github.com/Suven/6325905

If you have feedback or suggestions, feel free to tell them (:

]]>
Sat, 24 Aug 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/08/19/CakePHP-2-4-0-RC2-released.html https://bakery.cakephp.org/2013/08/19/CakePHP-2-4-0-RC2-released.html <![CDATA[CakePHP 2.4.0-RC2 released]]> CakePHP 2.4.0-RC2 released

The CakePHP core team is happy to announce the immediate availability of the second release candidate for 2.4.0[1].

The CakePHP core team is happy to announce the immediate availability of the second release candidate for 2.4.0[1].

CakeFest 2013[2] is just around the corner. If you haven’t already bought your ticket do it now. It will be a great time to learn way beyond just CakePHP, this year we feature talks about performance, the future of PHP and modern javascript frontend frameworks. The core team is making great strides for having a new stable version for CakeFest and workshops will be based off the great new features next release is included.

A short list of changes you can expect in 2.4.0-RC2 are:

  • Config data between Email and Transport classes now merges correctly.
  • CakeTime::timeAgoInWords() uses fuzzy terms when time is below thresholds.
  • Confirm values are now correctly encoded. This was a regression introduced in 2.4.0-RC1.
  • DbAcl uses INNER joins instead of LEFT joins to help increase performance.
  • CakeEmail::template() can now disable rendering the layout as documented.
  • Formatting number in european locales now works correctly.
  • Translation strings were updated to exclude non-translable content.
  • RedirectRoute now persists parameters using the same methods as normal routes.
  • Components with settings are now mocked better.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release [3].

]]>
Mon, 19 Aug 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/08/11/CakePHP-2-4-0-RC1-and-2-3-9-released.html https://bakery.cakephp.org/2013/08/11/CakePHP-2-4-0-RC1-and-2-3-9-released.html <![CDATA[CakePHP 2.4.0-RC1 and 2.3.9 released]]> CakePHP 2.4.0-RC1 and 2.3.9 released

The CakePHP core team is happy to announce the immediate availability of the first release candidate for 2.4.0 and a new maintenance release for the 2.3 branch.

The CakePHP core team is happy to announce the immediate availability of the first release candidate for 2.4.0[1] and a new maintenance release for the 2.3 branch[2].

As the date for CakeFest 2013[3] comes closer, you should be thinking on buying a ticket if haven’t already. It will be a great time to learn way beyond just CakePHP, this year we feature talks about performance, the future of PHP and modern javascript frontend frameworks. The core team is making great strides for having a new stable version for CakeFest and workshops will be based off the great new features next release is including.

A short list of changes you can expect in 2.4.0-RC1 are:

  • Support for query parameters on Router::parse()
  • Add option to send email attachment from string in CakeEmail
  • Allow variable aliasing when using _serialize for the JsonView and XmlView. It also support pretty printing when available
  • Improving phone validation for USA and Canada
  • New option to multiply decimal percentages in CakeNumber::toPercentage()
  • Ability to provide custom strings for timeAgoInWords()
  • Minutes display with FormHelper can now be rounded to the next or previous custom value
  • PaginatorHelper won’t display the first page argument for the first page, to avoid duplication on search engines
  • Added CakeResponse::location() to quickly send redirect status codes and location
  • Ability to set multiple headers at once with CakeRespose::header()
  • Improved handling of response codes to avoid sending invalid HTTP responses
  • Added SSL support to MySQL PDO connections
  • IMAGES_URL, CSS_URL, JS_URL are now deprecated and can be controlled with a new Configure value
  • ConsoleShell was also deprecated
  • Support for setting full URLs in css/js/image constants and configure values
  • CakeTestCase::getMockForModel() is now smarted and can mock AppModel
  • Deprecated DEFAULT_LANGUAGE constant
  • Deprecated Sanitize class
  • Missing directories under tmp used for logging and caching are now created automatically in debug mode

Maintenance release 2.3.9 incorporates over 20 bugfixes and some performance improvements, developers are encouraged to upgrade their apps to profit from these changes.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release [4].

]]>
Sun, 11 Aug 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/07/23/Search-plug-in-for-CakePHP-2.html https://bakery.cakephp.org/2013/07/23/Search-plug-in-for-CakePHP-2.html <![CDATA[Search plug-in for CakePHP 2]]> Search plug-in for CakePHP 2

This plug-in allows basic but flawlessl accent-insensitive text search and result highlighting.

Searching texts in a database and highlighting matches in results display is a very common functionality on websites. It can be quite hard and very frustrating to implement when dealing with languages that use Unicode special characters (mainly accentuated letters), since no universal and complete method exists to correctly de- accentuate text. Furthermore, Unicode characters double-byte encoding makes the standard PHP string functions unreliable since it makes characters indexes inconsistent between the de-accentuated text and the original one.

This plug-in takes care of these issues. It consists mainly of a Behavior that makes a custom ‘search’ find type available to Models, with special options for database filtering and result highlighting. It also contains a Lib class, mainly for use by the Behavior but this class has a static function to strip the accents from a text that you can use besides the search functionality.

The functionalities of this plug-in are still very basic, but will be improved in the future, probably starting with results ordering.

]]>
Tue, 23 Jul 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/07/23/NeptunIDE-CakePHP-dedicated-IDE-is-now-available-for-everyone.html https://bakery.cakephp.org/2013/07/23/NeptunIDE-CakePHP-dedicated-IDE-is-now-available-for-everyone.html <![CDATA[NeptunIDE - CakePHP dedicated IDE is now available for everyone!]]> NeptunIDE - CakePHP dedicated IDE is now available for everyone!

Two years ago I posted here about my new project - NeptunIDE, a cloud-based IDE supporting CakePHP.

I was looking for Beta testers and there were many responses, much more than we could actually handle at that time.

After two years of intensive development NeptunIDE is nearly ready, and to celebrate this we are opening NeptunIDE Beta today. In the next couple of days anyone can register and start using NeptunIDE beta immediately - and totally for free. I’d say that it’s ready to use for production development.

What makes NeptunIDE so special? It’s the first IDE with dedicated CakePHP support.

And what does it mean? It means you can start developing a new CakePHP project with just a few clicks. It means you can run an action you are working on by pressing F5 on your keyboard (no matter if you are editing controller method, view or even CakePHP shell - shell will be executed in NeptunIDE built-in terminal).

And last, but definitely not least: it means that NeptunIDE will provide CakePHP autocomplete sugestions based on CakePHP conventions. No other IDE can provide this by analysing PHP Code. Imagine it: you type ` $components` in your controller and NeptunIDE suggests you names of all CakePHP components in your project. You type ` $this->Html->link` in view and NeptunIDE suggests you the list of controllers and actions that you can link to. You style your CakePHP project and NeptunIDE suggests automagically created css classes in your css files.

Well, you don’t have to imagine this. You can see it with your own eyes now! Just sign up for 100% free Beta at neptunide.com. Hurry up! Free Beta subscription is available only until the end of July 2013 and will run until the end of August 2013.

]]>
Tue, 23 Jul 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/07/18/Document-Manager-Plugin-for-CakePHP-2-x.html https://bakery.cakephp.org/2013/07/18/Document-Manager-Plugin-for-CakePHP-2-x.html <![CDATA[Document Manager Plugin for CakePHP 2.x]]> Document Manager Plugin for CakePHP 2.x

This plugin offers the the possibility to have an online browser allowing to manage files inside a directory tree. You can upload, rename, delete files, create folders, get the absolute URL of a file and much more…

The Document Manager plugin provides an out of the box simple file management interface for any CakePHP 2.x application.

You define a base directory inside the webroot folder for your arborescence and inside you can create folders, upload/rename/delete files, browse them, obtain the absolute URL of any file in order to be able to link to it. Uploaded files informations are stored inside a Document table which allows to easily access them in your application.

Moreover it can be hooked to an user management system to manage ownership of files and prevent files edition or deletion by other users. If you do not have an user management system, you can easily disable file ownership management to have an open system.

It requires jQuery and jQuery-UI to perform. It is styled with Bootstrap.

The source code can be found on GitHub : Document Manager Plugin for CakePHP. More informations at La Pâtisserie.

]]>
Thu, 18 Jul 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/07/18/CakePHP-2-3-8-2-2-9-released.html https://bakery.cakephp.org/2013/07/18/CakePHP-2-3-8-2-2-9-released.html <![CDATA[CakePHP 2.3.8 & 2.2.9 released]]> CakePHP 2.3.8 & 2.2.9 released

The CakePHP core team is happy to announce the immediate availability of 2.3.8[1] and 2.2.9[2]. These releases contain security fixes and are recommended for all CakePHP developers.

The CakePHP core team is happy to announce the immediate availability of 2.3.8[1] and 2.2.9[2]. These releases contain security fixes and are recommended for all CakePHP developers. A short list of changes you can expect in 2.3.8 are:

  • Improved API documentation.
  • I18nShell now extracts plugin model validation messages correctly.
  • ServerShell now serves static assets with query string parameters.
  • ServerShell correctly uses the document_root parameter.
  • Inflector can now pluralize additional words.
  • File responses using HTTP Range now work correctly.
  • A regression introduced to AuthComponent in 2.3.7 for redirectUrl() when an application is running in a subdirectory has been fixed.
  • Pagination sort whitelists are now trusted implicitly. No additional validation is done on whitelisted fields. This makes it easier to sort on synthetic columns, or columns added through joins in custom finds.

As previously mentioned, a security issue related to the AssetDispatcher was fixed. This upgrade is important for all applications serving assets out of themes or plugins using the built- in AssetDispatcher. A big thank you to Takeshi Terada of Mitsui Bussan Secure Directions for contacting us about the security issue and providing steps to reproduce it. We’ll disclose more details about the vulnerability in the future once people have had the chance to upgrade.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release [4].

]]>
Thu, 18 Jul 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/07/17/CakeFest-2013-San-Francisco-USA.html https://bakery.cakephp.org/2013/07/17/CakeFest-2013-San-Francisco-USA.html <![CDATA[CakeFest 2013: San Francisco, USA]]> CakeFest 2013: San Francisco, USA

Join us at CakeFest 2013, the annual CakePHP conference, held this year in San Francisco, from the 29th of August until the 1st of September, and experience open source at it’s very best! Visit https://cakefest.org for info and tickets.

One event for everything CakePHP

We want to celebrate 8 years of CakePHP with you and the whole community, and how better than to host our annual conference in the awesome city of San Francisco! Don’t miss out on this unique event dedicated to the framework.

Workshops

The 2 days of workshops at CakeFest are an ideal opportunity to learn the ins and outs of CakePHP, and a great way to get up to speed with the latest versions and innovations from the framework. Attendees will also receive their own certificate of attendance. This year we have both basic and advanced workshops, ranging from getting the most out of CakePHP, to going deep into the internals of the project, allowing both beginners and veterans to get a piece of the cake!

Conference

Covering 2 fully packed days of keynotes, presentations and talks on CakePHP and related technologies, the conference portion of CakeFest is an event not to be missed, for both new and old users of the framework. It’s a great time to engage and network with the community, learn from other experienced developers, and party with the core team! See https://cakefest.org/schedule for more details.

Sponsors

This year we’ve teamed up with some big names in the industry, to make this the biggest and best CakePHP conference ever! These people, organisations and companies help make everything happen, so be sure to check them out at https://cakefest.org/sponsors and say hello.

Event

The event itself is held from Thursday, the 29th of August, until Sunday, the 1st of September. The first 2 days are dedicated to the workshops, while the weekend sees the 2 conference days through to the closing of the conference.

There are tickets for only the workshops, just the conference days, or the full event (recommended), and currently we have an early bird discount on prices which will end on Monday the 22nd of July.

Oh, and… did we mention there will be cake? See you there!

Get your tickets now at https://cakefest.org/tickets.

]]>
Wed, 17 Jul 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/07/05/CakePHP-2-3-7-2-4-0-beta-released.html https://bakery.cakephp.org/2013/07/05/CakePHP-2-3-7-2-4-0-beta-released.html <![CDATA[CakePHP 2.3.7 & 2.4.0-beta released]]> CakePHP 2.3.7 & 2.4.0-beta released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.7 & 2.4.0-beta. 2.3.7 is a bugfix release for the 2.3 branch, while 2.4.0-beta is the first release of the 2.4 branch

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.7 & 2.4.0-beta[1]. 2.3.7 is a bugfix release for the 2.3 branch, while 2.4.0-beta is the first release of the 2.4 branch. A short list of the changes you can expect in 2.3.7 are:

  • Cached views now contain their Content-Type header. It is recommended that you flush your view caches when upgrading.
  • Return-Path is now excluded on emails delivered via SMTP.
  • The automatic created & modified times when saving records are now consistent. There used to be an edge case where they could differ by one second.
  • Undocumented, untested features around the IIS_SERVER constant have been removed.
  • FormHelper::dateTime() now selects the correct year when creating an input which has a maxYear earlier than the current year.
  • Email views now calculate the boundary later in the rendering process fixing issues where View callbacks could append inline images or attachments, resulting in incorrect boundary markers.
  • AuthComponent now correctly generates redirect URL’s when the application base path matches the controller name.
  • Errors generated from requests containing ‘index.php’ now render correctly.
  • Classnames containing ‘..’ are now rejected.

There was a security fix in this release that fixes an issue where controllers outside of the application could be loaded under certain conditions. This is an important upgrade for applications that accept uploaded PHP files where user data is used to determine the final file name. In these situations it would be possible for an attacker to upload a PHP file and remotely execute code. A big thanks to Adrian Ulrich for contacting us about the issue, and providing steps to reproduce it.

2.4.0-beta

The 2.4.0-beta release contains several new features that improve CakePHP’s performance, security and ease of use. When done, this new version is intended to be a replacement for the 2.3.x branch. A migration guide is provided in the book [2] and we encourage you to read it if you are upgrading from an older version.

The current list of the new features & changes you can expect in 2.4.0:

Console

  • Logged notice messages will now be colourized in terminals that support colours.

SchemaShell

  • cake schema generate now supports the –exclude parameter.

BakeShell

  • cake bake model now supports baking $behaviors. Finding lft, rght and parent_id fields in your table it will add the Tree behavior, for example. You can also extend the ModelTask to support your own behaviors to be recognized.

FixtureTask

  • cake bake fixture now supports a –schema parameter to allow baking all fixtures with noninteractive “all” while using schema import.

Object

  • Object::log() had the $scope parameter added.

Components

AuthComponent

  • AuthComponent now supports proper stateless mode when using Basic or Digest authenticators. Starting of session can be prevented by setting AuthComponent::$sessionKey to false. Also now when using only Basic or Digest you are no longer redirected to login page. For more info check the AuthComponent page.
  • Property AuthComponent::$authError can be set to boolean false to suppress flash message from being displayed.

PasswordHasher

  • Authenticating objects now use new password hasher objects for password hash generation and checking.

Models

  • Model::save(), Model::saveField(), Model::saveAll(), ` Model::saveAssociated()`, Model::saveMany() now take a new ` counterCache` option. You can set it to false to avoid updating counter cache values for the particular save operation.
  • Model::clear() was added.

Datasource

  • Mysql, Postgres, and SQLserver now support a ‘settings’ array in the connection definition. This key => value pair will be issued as SET commands when the connection is created.

View

JsonView

  • JSONP support has been added to :php:class: JsonView.

HtmlHelper

  • The API for HtmlHelper::css() has been changed.
  • New option escapeTitle added to HtmlHelper::link() to control escaping of only link title and not attributes.

TextHelper

  • TextHelper::autoParagraph() has been added. It allows to automatically convert text into HTML paragraphs.

PaginatorHelper

  • PaginatorHelper::param() has been added.

Network

CakeRequest

  • CakeRequest::param() has been added.
  • CakeRequest::is() has been modified to support an array of types and will return true if the request matches any type.
  • CakeRequest::isAll() has been added to check that a request matches all the given types.

CakeEmail

  • Logged email messages now have the scope of email by default. If you are not seeing email contents in your logs, be sure to add the email scope to your logging configuration.

HttpSocket

  • HttpSocket::patch() has been added.

L10n

  • ell is now the default locale for Greek as specified by ISO 639-3 and gre its alias. The locale folders have to be adjusted accordingly (from /Locale/gre/ to /Locale/ell/).
  • fas is now the default locale for Farsi as specified by ISO 639-3 and per its alias. The locale folders have to be adjusted accordingly (from /Locale/per/ to /Locale/fas/).
  • sme is now the default locale for Sami as specified by ISO 639-3 and smi its alias. The locale folders have to be adjusted accordingly (from /Locale/smi/ to /Locale/sme/).
  • mkd replaces mk as default locale for Macedonian as specified by ISO 639-3. The corresponding locale folders have to be adjusted, as well.
  • Catalog code in has been dropped in favor of id (Indonesian), e has been dropped in favor of el (Greek), n has been dropped in favor of nl (Dutch), p has been dropped in favor of pl (Polish), sz has been dropped in favor of se (Sami).
  • Kazakh has been added with kaz as locale and kk as catalog code.
  • Kalaallisut has been added with kal as locale and kl as catalog code.

Logging

  • Log engines do not need the suffix Log anymore in their setup configuration. So for the FileLog engine it suffices to define ‘engine’=>’File’ now. This unifies the way engines are named in configuration (see Cache engines for example). Note: If you have a Log engine like DatabaseLogger that does not follow the convention of using the Log suffix, you will have to adjust your class name to ` DatabaseLog`. You should also avoid class names like SomeLogLog which include the suffix twice at the end.

FileLog

  • Two new config options size and rotate have been added for FileLog engine.

SyslogLog

  • The new logging engine SyslogLog was added to stream messages to syslog.

Utility

  • pr no longer outputs HTML when running in cli mode.

Validation

  • Validation::date() now supports the y and ym formats.
  • The country code of Validation::phone() for Canada has been changed from can to ca to unify the country codes for validation methods according to ISO 3166 (two letter codes).

CakeNumber

  • The currencies AUD, CAD and JPY have been added.
  • The symbols for GBP and EUR are now UTF-8. If you upgrade a non-UTF-8 application, make sure that you update the static $_currencies attribute with the appropriate HTML entity symbols (&#163; and &#8364;) before you use those currencies.

CakeTime

  • CakeTime::isPast() and CakeTime::isFuture() were added.

Xml

  • New option pretty has been added to Xml::fromArray() to return nicely formatted Xml.

Error

ErrorHandler

  • New configuration option skipLog has been added, to allow skipping certain Exception types to be logged. Configure::write(‘Exc eption.skipLog’,array(‘NotFoundException’,’ForbiddenException’)); will skip logging these exceptions and the ones extending them when ` ‘Exception.log’` config is true

Routing

Router

  • Router::baseUrl() was added. This method replaces ` FULL_BASE_URL`. Which is now deprecated.

The API docs[3] and cookbook have been updated to reflect the changes and updates for 2.4.0.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release [4].

]]>
Fri, 05 Jul 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/06/25/Croogo-1-5-2-API.html https://bakery.cakephp.org/2013/06/25/Croogo-1-5-2-API.html <![CDATA[Croogo 1.5.2 API]]> Croogo 1.5.2 API

Croogo 1.5.2 API generate with Apigen

https://github.com/rafaeldecruzeiro/croogoapi_1.5.2

]]>
Tue, 25 Jun 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/06/25/CakePHP-1-3-17-Released-Important-upgrade-for-1-3.html https://bakery.cakephp.org/2013/06/25/CakePHP-1-3-17-Released-Important-upgrade-for-1-3.html <![CDATA[CakePHP 1.3.17 Released - Important upgrade for 1.3]]> CakePHP 1.3.17 Released - Important upgrade for 1.3

CakePHP 1.3.17 has been released. This is an important update for all users of 1.3. It is recommended that all users of 1.3 should upgrade as soon as possible.

CakePHP 1.3.17 has been released. This is an important update for all users of 1.3. It is recommended that all users of 1.3 should upgrade as soon as possible.

In the previous release for 1.3.16 a mistake was made when creating the 1.3.16 tag. An important fix was missed from the packaged release. We recommend that all applications using 1.3 upgrade to 1.3.17 immediately safeguard against the SQL injection issue that 1.3.16 was intended to fix.

How did this happen?

When creating the package for 1.3.16, a git clone was not correctly updated before generating the new tag. To prevent this issue in the future, we’ll be updating the automated build script used to package CakePHP to always update the local clone. This should prevent similar errors in the future.

]]>
Tue, 25 Jun 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/06/23/CakePHP-2-Export-as-CSV-plugin.html https://bakery.cakephp.org/2013/06/23/CakePHP-2-Export-as-CSV-plugin.html <![CDATA[CakePHP 2 Export as CSV plugin]]> CakePHP 2 Export as CSV plugin

The Export as CSV plugin takes the results of a Model find(‘all’) call, including nested belongsTo associations, flattens the resulting array, and exports it as a CSV.

Exporting a flat keys/values array as a CSV is pretty simple.

Exporting the results of a Model find(‘all’) call, when there are multiple nested belongsTo associations, when not every association exists for every record, etc. is a bit more complex.

This plugin flattens out such an array and exports it as CSV.

Source and documentation available on GitHub: https://github.com/joshuapaling/CakePHP-Export-CSV-Plugin

Example Usage

var $components = array('Export.Export');

public function export_data() {
    $data = $this->MyModel->find('all');
    $this->Export->exportCsv($data);
}

Options

The exportCsv() function has 5 params:

  1. $data - an array of data to export. This array should be of the format returned by a call to $this->MyModel->find(‘all’);
  2. $fileName (optional) - the name of the file to download. If blank, it will use a date-stamped name like export_2013-09-24.csv
  3. $maxExecutionSeconds (optional) - if set, this will change the PHP max_execution_time. Useful when dealing with large amounts of data.
  4. $delimiter (optional) - The delimiter for your CSV. Defaults to comma (,).
  5. $enclosure (optional) - The enclosure for your CSV. Defaults to double-quote (“).

Example input / output

Lets say City belongsTo State, which belongsTo country. You might fetch data from the City model looking something like this:

array(
    0 => array(
        'City' => array(
            'name' => 'Sydney',
            'population' => '4.6m'
        ),
        'State' => array(
            'name' => 'NSW',
            'Country' => array(
                'name' => 'Australia',
            )
        )
    ),
    1 => array(
        'City' => array(
            'name' => 'Melbourne',
            'population' => '4.1m'
        ),
        'State' => array(
            'name' => 'VIC',
            'Country' => array(
                'name' => 'Australia',
            )
        )
    ),
)

And the export component will output a CSV like this:

<table cellpadding=”7” > <tr> <th>City.name</th> <th>City.population</th> <th>State.name</th> <th>State.Country.name</th> </tr> <tr> <td>Sydney</td> <td>4.6m</td> <td>NSW</td> <td>Australia</td> </tr> <tr> <td>Melbourne</td> <td>4.1m</td> <td>VIC</td> <td>Australia</td> </tr></table>

]]>
Sun, 23 Jun 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/06/10/CakePHP-2-3-6-released.html https://bakery.cakephp.org/2013/06/10/CakePHP-2-3-6-released.html <![CDATA[CakePHP 2.3.6 released]]> CakePHP 2.3.6 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.6[1]. 2.3.6 is a bugfix release for the 2.3 release branch. Since the release of 2.3.5 there have been 64 commits and 17 tickets resolved.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.6[1]. 2.3.6 is a bugfix release for the 2.3 release branch. Since the release of 2.3.5 there have been 64 commits and 17 tickets resolved. A short list of the changes you can expect is:

  • Datetime comparisons in CakeTime are more accurate now.
  • FormHelper now correctly marks fields with error classes on forms that save multiple records.
  • Controller::$modelClass is now set before components are initialized.
  • The file reading features of CakeEmail are now available outside the class.
  • Email line wrapping compatibility with japanese messages has been improved.
  • HtmlHelper::tag() now returns the content when $tag is false.
  • Mocked components are now enabled when using ControllerTestCase::testAction().
  • The type attribute can now be set when using HtmlHelper::script() and HtmlHelper::scriptBlock().
  • Passing an empty array does not reset SmtpTransport’s configuration anymore.
  • Xml parse errors with SimpleXmlElement now throw XmlException.
  • FormHelper now disables options in multi-select elements now.
  • TranslateBehavior now always uses $name instead of alias when updating/inserting rows.
  • Cookie expiry times in the distant future now work on 32bit systems.
  • FileEngine now clears groups with differing prefixes correctly.

Security disclosure

There were 3 recent security releases for CakePHP. With the goal of being open and transparent, and holding true to our previous commitments, below are more detailed descriptions of each problem.

Authentication forms

Authentication forms were vulnerable to query manipulation through the addition of additional POST data. Forms that were not also protected by SecurityComponent were vulnerable. If in a login form you had:

<input name=”data[User][username]” type=”text”><br /><input name=”data[User][password]” type=”password”>

Before submitting the form an attacker could add this HTML to the form:

<input name=”data[User][username][OR][id LIKE]” value=”1” type=”hidden”><input name=”data[User][username][OR][username LIKE]” value=”%admin%” type=”hidden”>

When the form was submitted, the $conditions used to log the user in would have the value of:

"OR" => array(
  "id like" => 1,
  "username like" => "%admin%"
)

This issue was introduced accidentally when adding support for blowfish authentication. The issue was resolved by treating any non- scalar conditions when authenticating users as a failure. This issue was corrected in this commit c327bd. Thanks to Magnus Andersson for the report and patch.

Pagination SQL injection

Through manipulation of the model alias used to sort a pagination URL, arbitrary SQL could be executed. This issue effected the 1.2, 1.3, and 2.x series of releases and was accidentally introduced 5 years ago. PaginatorComponent only validated the field name, but not the model alias. This meant that any SQL contained in the alias would be inlined as SQL. An example exploit URL would look like:

http://yourtest.com/users/index/sort:id%20LIMIT%2010;delete%20FROM%20%60contacts%60;.id

The above URL injects a DELETE query into the pagination request which would be executed without sanitization due to it being a sort key. This issue was fixed by ignoring the user data and using the known model alias in this commit 6017db. Thanks to ‘Ahmad’ for reporting the issue on lighthouse and helping the CakePHP team find a fix.

Cross site scripting through webroot

By manipulating the URL an attacker could generate an error page that allowed the execution of arbitrary javascript. The webroot property on the request object was incorrectly trusted as safe even though it contained user input. An example exploit could look like:

http://example.com/index.php/%3E%22%3E%3Cscript%3Ealert%28%27hehe%27%29;%3C/script%3E%3Clink%20href=%22HTTP/1.0%22%3C

The solution to this issue was to urlencode the user supplied webroot property when the request object is created. This makes generated URL’s safe to use in all normal contexts. The fix for this was applied in this commit db6dd1.

I’d like to thank the various people who reported the security issues and assisted in getting them fixed. I’d also like to thank all of the contributors who help keep CakePHP cooking. Without you there would be no CakePHP. Download a packaged release[2].

Links

]]>
Mon, 10 Jun 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/05/28/How-to-Cache-CakePHP-Db-ACL-Checks.html https://bakery.cakephp.org/2013/05/28/How-to-Cache-CakePHP-Db-ACL-Checks.html <![CDATA[How to Cache CakePHP Db ACL Checks]]> How to Cache CakePHP Db ACL Checks

After enabling SQL query logging to Chrome Console I began noticing that queries against the ARO table appear running at 300 milliseconds or higher. This is data that doesn’t change often and is needed on every request so its a great candidate for caching. Unfortunately I couldn’t find any mechanism for caching DbAcl checks. Here is my solution.

CacheDbAcl

This is fairly straight forward. First create a new file at app/Lib/CacheDbAcl.php and copy and paste the code in (hyperlink) or see bottom of the article.

Next add the following configurations to app/Config/bootstrap.php: Configure::write(‘CacheDbAclConfig’,’default’); > Configure::write(‘CacheDbAclAro’,’User.UserGroup’);<br > > <p>Now add or edit the following in app Config/core.php: Configure::write(‘Acl.classname’, ‘CacheDbAcl’); ><br > Code Explained

The CacheDbAcl library works the exact same as the DbAcl library that is shipped with CakePHP 2.x. The only changes made are to the check() method. What it does:

  1. CacheDbAcl verifies caching is enabled. If it’s not enabled it just resumes normal operation.
  2. Reads in the name of the cache config you want to use, see CacheDbAclConfig.
  3. Checks what portion of the ARO you want to use as your cache key (more on this later), see CacheDbAclAro.
  4. Checks if an entry for the Aro, Aco, and Action exists in the cache. If not it performs its normal operations and then caches the results. Otherwise it just reads from the cache.

More on the CacheDbAclAro Setting

Since the ARO array passed into DbAcl::check can be quite different depending on your database structure and application requirements I allow you to set exactly which portion of the ARO you want to use as a unique cache key. If you want a cache created for each user, just don’t set this setting at all.

If you only want cache entries created for each group then use something similar to what I posted above. Maybe you have a special use-case and only want it using a very specific portion of the ARO as a key, this gives you that flexibility.

I went with User.UserGroup for this applicaton because our permissions are group based and I wanted to reduce the overall amount of cache entries created. When a group’s permissions are changed the modified field in the UserGroups model will naturally be updated so new cache entries will automatically be created and the old ones will eventually expire.

My original blog post

/**
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Chris Nizzardini
 * @link          https://cakephp.org CakePHP(tm) Project
 * @package       Cake.Controller.Component.Acl
 * @license       MIT License (https://www.opensource.org/licenses/mit-license.php)
 */
App::uses('AclInterface', 'Controller/Component/Acl');
App::uses('Hash', 'Utility');
App::uses('ClassRegistry', 'Utility');

/**
 * CacheDbAcl works the exact sabe as DbAcl expect that it will cache the results to using a cache config of your choosing:
 * - Configurations in bootstrap.php:
 * App::uses('CacheDbAcl', 'Lib');
 * Configure::write('CacheDbAclConfig','Name_of_Your_Cache_Config')
 * Configure::write('CacheDbAclAro','YourArrayKey.YourArray');
 *
 * - Configurations in core.php:
 * Configure::write('Acl.classname', 'CacheDbAcl');
 *
 * @package       Cake.Controller.Component.Acl
 */
class CacheDbAcl extends Object implements AclInterface {

/**
 * Constructor
 *
 */
    public function __construct() {
            parent::__construct();
            $this->Permission = ClassRegistry::init(array('class' => 'Permission', 'alias' => 'Permission'));
            $this->Aro = $this->Permission->Aro;
            $this->Aco = $this->Permission->Aco;
    }

/**
 * Initializes the containing component and sets the Aro/Aco objects to it.
 *
 * @param AclComponent $component
 * @return void
 */
    public function initialize(Component $component) {
            $component->Aro = $this->Aro;
            $component->Aco = $this->Aco;
    }

/**
 * Checks if the given $aro has access to action $action in $aco
 *
 * @param string $aro ARO The requesting object identifier.
 * @param string $aco ACO The controlled object identifier.
 * @param string $action Action (defaults to *)
 * @return boolean Success (true if ARO has access to action in ACO, false otherwise)
 * @link https://book.cakephp.org/2.0/en/core-libraries/components/access-control-lists.html#checking-permissions-the-acl-component
 */
    public function check($aro, $aco, $action = "*") {

        // if cache is disabled then default to normal operation
        if(Configure::read('Cache.disable') == true){
            return $this->Permission->check($aro, $aco, $action);
        }

        // read name of cache config for AclCache
        $cacheConfig = Configure::read('CacheDbAclConfig');
        // if not found then use default
        if(!$cacheConfig){
            $cacheConfig = 'default';
        }

        // check which portion of $aro to use for key
        $cacheAro = Configure::read('CacheDbAclAro');
        // if not set just serialze $aro
        if(!$cacheAro){
            $cacheKey = 'CacheDbAcl_'.md5(serialize($aro).$aco.$action);
        }
        // use custom portion of $aro
        else{
            $tmp = explode('.', $cacheAro);
            $aroTmp = false;
            foreach($tmp as $i){
                if($aroTmp == false){
                    $aroTmp = $aro[$i];
                }
                else{
                    $aroTmp = $aroTmp[$i];
                }
            }

            if(!isset($aroTmp) || empty($aroTmp)){
                $cacheKey = 'CacheDbAcl_'.md5(serialize($aro).$aco.$action);
            }
            else{
                $cacheKey = 'CacheDbAcl_'.md5(serialize($aroTmp).$aco.$action);
            }
        }

        // check for cache key in cache
        $check = Cache::read($cacheKey);

        // if key exists then return value
        if( $check !== false ){
            return $check;
        }
        // check database and write to cache
        else{
            $check = $this->Permission->check($aro, $aco, $action);
            Cache::write($cacheKey,$check,$cacheConfig);
        }

            return $check;
    }

/**
 * Allow $aro to have access to action $actions in $aco
 *
 * @param string $aro ARO The requesting object identifier.
 * @param string $aco ACO The controlled object identifier.
 * @param string $actions Action (defaults to *)
 * @param integer $value Value to indicate access type (1 to give access, -1 to deny, 0 to inherit)
 * @return boolean Success
 * @link https://book.cakephp.org/2.0/en/core-libraries/components/access-control-lists.html#assigning-permissions
 */
    public function allow($aro, $aco, $actions = "*", $value = 1) {
            return $this->Permission->allow($aro, $aco, $actions, $value);
    }

/**
 * Deny access for $aro to action $action in $aco
 *
 * @param string $aro ARO The requesting object identifier.
 * @param string $aco ACO The controlled object identifier.
 * @param string $action Action (defaults to *)
 * @return boolean Success
 * @link https://book.cakephp.org/2.0/en/core-libraries/components/access-control-lists.html#assigning-permissions
 */
    public function deny($aro, $aco, $action = "*") {
            return $this->allow($aro, $aco, $action, -1);
    }

/**
 * Let access for $aro to action $action in $aco be inherited
 *
 * @param string $aro ARO The requesting object identifier.
 * @param string $aco ACO The controlled object identifier.
 * @param string $action Action (defaults to *)
 * @return boolean Success
 */
    public function inherit($aro, $aco, $action = "*") {
            return $this->allow($aro, $aco, $action, 0);
    }

/**
 * Allow $aro to have access to action $actions in $aco
 *
 * @param string $aro ARO The requesting object identifier.
 * @param string $aco ACO The controlled object identifier.
 * @param string $action Action (defaults to *)
 * @return boolean Success
 * @see allow()
 */
    public function grant($aro, $aco, $action = "*") {
            return $this->allow($aro, $aco, $action);
    }

/**
 * Deny access for $aro to action $action in $aco
 *
 * @param string $aro ARO The requesting object identifier.
 * @param string $aco ACO The controlled object identifier.
 * @param string $action Action (defaults to *)
 * @return boolean Success
 * @see deny()
 */
    public function revoke($aro, $aco, $action = "*") {
            return $this->deny($aro, $aco, $action);
    }

/**
 * Get an array of access-control links between the given Aro and Aco
 *
 * @param string $aro ARO The requesting object identifier.
 * @param string $aco ACO The controlled object identifier.
 * @return array Indexed array with: 'aro', 'aco' and 'link'
 */
    public function getAclLink($aro, $aco) {
            return $this->Permission->getAclLink($aro, $aco);
    }

/**
 * Get the keys used in an ACO
 *
 * @param array $keys Permission model info
 * @return array ACO keys
 */
    protected function _getAcoKeys($keys) {
            return $this->Permission->getAcoKeys($keys);
    }

}
]]>
Tue, 28 May 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/05/18/CakePHP-Modular-Admin-And-Structured-Content-Cloggy.html https://bakery.cakephp.org/2013/05/18/CakePHP-Modular-Admin-And-Structured-Content-Cloggy.html <![CDATA[CakePHP Modular Admin And Structured Content - Cloggy]]> CakePHP Modular Admin And Structured Content - Cloggy

Cloggy is a plugin for CakePHP for website administration. With Cloggy,all administration activities will be separated by modules. In addition to administration, Cloggy also provides a MySql database structure to facilitate developer / programmer to manage their contents.

Every website that we made, still need an administration area to manage their users,contents, and others. This is a mission of Cloggy. To help programmers to manage their admins.

Today i want to introduce my cakephp plugin to manage administration area. With Cloggy, all administration activities separated by modules, such as for blogging, users,search and others. You dont have to create your admin from scratch, just create a module that you need.

Inside Cloggy, module is a plugin extension (think about HMVC). You can create and manage your module without broke CakePHP convention standard, it means you don’t need to learn about module anymore.

Features:

  1. User module
  2. Search module
  3. Blog module
  4. Documentation module
  5. A nodes to manage your content

Beside an administration area, Cloggy also give a structured table content using node concept to help you to manage your content.

For detail information, just clone this plugin (documentation included!) :)

Cloggy still on active and agressive development until stable release (ver1.x). I need a feedback and your contribution to manage this plugin.

Github: Cloggy

]]>
Sat, 18 May 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/05/11/Security-Fix-CakePHP-2-3-5-released.html https://bakery.cakephp.org/2013/05/11/Security-Fix-CakePHP-2-3-5-released.html <![CDATA[Security Fix: CakePHP 2.3.5 released]]> Security Fix: CakePHP 2.3.5 released

After conducting a security audit on our code we have patched a possible security risk in current CakePHP release.

CakePHP 2.3.5 has just been released to fix a critical issue with how the webroot property in CakeRequest is handled that could potentially lead to XSS attacks on certain pages. In the following days we will offer a full description of the vulnerability and how it can be exploited, after some reasonable time has passed for our users to upgrade.

A huge thanks to Florian Krämer for conducting a full security audit on the CakePHP code and Carl Sutton for report and providing a candidate patch.

In addition to the security fix 2.3.4 contains fixes for the following issues:

  • Increasing compatibility with old CentOS servers and the way they handle PHP regular expressions
  • Preventing pagiation limit from overflowing the max integer value
  • Making sure form ids generated in FormHelper::postLink() are actually unique
  • Fixed a bug in TextHelper auto link utility

We recommend all users of 2.x release series upgrade as soon as possible to the new release.

]]>
Sat, 11 May 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/05/08/How-to-Log-PHP-Errors-and-SQL-to-Chrome-Console-in-CakePHP.html https://bakery.cakephp.org/2013/05/08/How-to-Log-PHP-Errors-and-SQL-to-Chrome-Console-in-CakePHP.html <![CDATA[How to Log PHP Errors and SQL to Chrome Console in CakePHP]]> How to Log PHP Errors and SQL to Chrome Console in CakePHP

PHP errors can be a obnoxious when you’re developing an XHR heavy application with lots of JSON responses. The errors just aren’t very readable. So today I finally decided to implement ChromeLogger in our application here at work. This is one thing I’ve always missed since moving away from FireFox and its excellent plugin FirePHP.

First install ChromeLogger.

Setting up Chrome Logger and Error Handling

After installing the chrome plugin you’ll want to add the associated server-side library to app/Vendor/ChromePhp/ChromePhp.php. Next create a new file for handing errors in your CakePHP 2 project. Create a new class at app/Lib/AppError.php and add in the following code:

App::import('Vendor', 'ChromePhp/ChromePhp');
//in app/Lib/AppError.php
class AppError {
    public static function handleError($code, $description, $file = null, $line = null, $context = null) {
        ChromePhp::error('PHP Error Code '.$code.': '.$description.' '.$file.':'.$line);
    }
}

Next adjust your core.php and bootstrap.php files as follows.

In core.php

 'AppError::handleError',
    'level' => E_ALL & ~E_DEPRECATED,
    'trace' => true
));

In bootstrap.php

App::uses('AppError', 'Lib');

You’re done! For more information in AppError review the CakePHP2 documentation.

Setting up Chrome Logger For SQL Logging

Since most applications we write these days are XHR heavy the standard SQL Log CakePHP ships with is rendered useless. If you’re like me and obsess about optimizing queries then you’ll probably want all your queries logged to the Chrome Console. To add this functionality to your application open up your AppController and add the following to your afterFilter.

Now just set Configure::write(‘debug’,2) when you want to see queries exported to your Chrome Console. You’ll notice that I set all queries that took more than 100 milliseconds to appear as warnings and everything else as informational. Check out my blog for more CakePHP tutorials.

]]>
Wed, 08 May 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/04/28/Security-Release-CakePHP-1-2-12-1-3-16-2-2-8-and-2-3-4.html https://bakery.cakephp.org/2013/04/28/Security-Release-CakePHP-1-2-12-1-3-16-2-2-8-and-2-3-4.html <![CDATA[Security Release - CakePHP 1.2.12, 1.3.16, 2.2.8 and 2.3.4]]> Security Release - CakePHP 1.2.12, 1.3.16, 2.2.8 and 2.3.4

If you are using CakePHP’s PaginatorComponent without whitelisted sort fields you should upgrade as soon as possible to prevent possible SQL injections.

CakePHP 1.2.12, 1.3.16, 2.2.8 and 2.3.4 have just been released to fix a critical issue with how pagination & PaginatorComponent handle sort criteria. When paginating without a sort column whitelist it was possible to execute arbitrary SQL by manipulating the sort conditions. In the following days we will offer a full description of the vulnerability and how it can be exploited, after some reasonable time has passed for our users to upgrade.

In addition to the security fix 2.3.4 contains fixes for the following issues:

  • Support for HTTP code 505 was added.
  • Router::currentRoute() returns false when there is no current route.
  • Writing to file cache after clearing a group now works as expected.
  • Asset URLS using fullBase are now generated correctly when not using URL re-writing.

There are no additional fixes outside the security fix in 2.2.8.

In addition to the security fix 1.3.16 contains fixes for the following issues:

  • Databases is now singularized correctly.
  • Saving translations with saveAll() now works better.
  • Oracle listSources() no longer reads from the global table namespace.
  • The cake console command now works on MacOS properly.
  • Mixing query[contain] and contain() now interact properly.

In addition to the security fix 1.2.12 contains fixes for the following issues:

  • umask is now set when creating cache files.
  • Boundaries for multipart email messages are now generated correctly.
  • Compatibility with PHP 5.4 has been improved.

We recommend all users of 1.2, 1.3, and 2.x release series upgrade as soon as possible to the new releases.

]]>
Sun, 28 Apr 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/04/24/Security-fix-CakePHP-2-3-3-available.html https://bakery.cakephp.org/2013/04/24/Security-fix-CakePHP-2-3-3-available.html <![CDATA[Security fix: CakePHP 2.3.3 available]]> Security fix: CakePHP 2.3.3 available

We have found a severe security issue that affects all applications running CakePHP version 2.3.0 and above that are using user authentication via forms with the AuthComponent without the Security component form tampering prevention.

The CakePHP core team pushed a maintenance release for 2.3 branch earlier than planned for the 2.3 branch of the framework. We have found a severe security issue that affects all applications running CakePHP version 2.3.0 and above that are using user authentication via forms with the AuthComponent without the Security component form tampering prevention.

If you have a login form and are using the AuthComponent without SecurityComponent field locking feature, you are strongly encouraged to upgrade to this version as soon as possible. In the following days we will offer a full description of the vulnerability and how it can be exploited, after some reasonable time has passed for our users to upgrade.

A huge thanks to Magnus Andersson for the report and patch.

CakePHP 2.3.3[1] is a bugfix release for the 2.3 release branch. Since the release of 2.3.2 there have been 31 commits and 8 tickets resolved. A short list of the changes you can expect is:

  • Fixed Vendor/bin/cake not working when installing CakePHP with composer.
  • Allowing behaviors’ beforeSave callback to change the datasource to be used for the actual save.
  • Fixing bug in FormHelper where the incorrect meridian would be selected for time fields.
  • Solved issues with models not being added when $uses = true.
  • Fixed condition parsing in mysql specific cases.
  • Added support for key => value cookies in HttpSocket.
  • Preventing “maxlength” attribute input element of type “number”.
  • Fixed incorrect timestamp values when using CakeTime::fromString()
]]>
Wed, 24 Apr 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/04/19/Save-HABTM-data-in-a-single-simple-format.html https://bakery.cakephp.org/2013/04/19/Save-HABTM-data-in-a-single-simple-format.html <![CDATA[Save HABTM data in a single simple format]]> Save HABTM data in a single simple format

Saving data from a HasAndBelongsToMany (HABTM) relationship with CakePHP is not the easiest part of using this framework. The main difficulty is that the format of HABTM data is not the same wether you want to associate existing records together (only update entries in the join table), or create new records and also associate them (create new records in the models table and in the join table).

When you wander out of CakePHP standards and automatically baked views and start saving custom data (using JavaScript for example), then you have to manually construct the data you send to your controllers and you have complete control over its format. You thus might want to be sure that your records and association will be saved in the right way wether you create new records or not. The simplest way is to settle for a format and always construct your data in the same fashion and let models handle the data (that is their job afterall).

The data format returned by a find() is the simplest to use: you easily have access to it in your views, and it is quite logical to use the same data format for find() and save(). You have an index for the main model of the find() and then an index for each associated Model. Multiple associated models like hasMany or hasAndBelongsToMany have subsequent subarrays for each associated entry. Building this type of array with existing data (we have an id) or new data (there is no id yet) is very simple. In the following example, Foo hasAndBelongsToMany Bar:

 `
array(
'Foo'=>array(
'id'=>'...',
...
),
'Bar'=>array(
(int)0=>array(
'id'=>'...',//ExistingBar,wehaveitsid
'name'=>'...'//Thenamemayhavebeenmodified
),
(int)1=>array(
'name'=>'...'//ThisBarwillbecreated
)
)
)
`

Then with a simple snippet of code, you can overload the saveAssociated() function to save each instance of Bar: create new ones (those without an id) and update existing ones. Then call the parent saveAssociated() function from the library (you rarely want to entirely overload functions from the library) with a nicely formated association array (the one from our first case) to update the entries in the join table. Copy the following code in your AppModel.php and the trick is done!

 `
publicfunctionsaveAssociated($data=null,$options=array()){
foreach($dataas$alias=>$modelData){
if(!empty($this->hasAndBelongsToMany[$alias])){
$habtm=array();
$Model=ClassRegistry::init($this->hasAndBelongsToMany[$alias]['className']);
foreach($modelDataas$modelDatum){
if(empty($modelDatum['id'])){
$Model->create();
}
$Model->save($modelDatum);
$habtm[]=empty($modelDatum['id'])?$Model->getInsertID():$modelDatum['id'];
}
$data[$alias]=array($alias=>$habtm);
}
}
returnparent::saveAssociated($data,$options);
}
`

Read more….

]]>
Fri, 19 Apr 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/04/07/CakePHP-2-3-2-released.html https://bakery.cakephp.org/2013/04/07/CakePHP-2-3-2-released.html <![CDATA[CakePHP 2.3.2 released]]> CakePHP 2.3.2 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.2[1]. 2.3.2 is a bugfix release for the 2.3 release branch.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.2[1]. 2.3.2 is a bugfix release for the 2.3 release branch. Since the release of 2.3.1 there have been 60 commits and 17 tickets resolved. A short list of the changes you can expect is:

  • API documentation has been improved for a number of methods.
  • Imported fixtures without a primary key no longer trigger notice errors.
  • FormHelper::year() supports dates outside of 1901-2038 on all platforms now.
  • SchemaShell should more reliabily detect schema changes when dumping schema.
  • CakeTestCase::$dropTables is no longer ignored in some situations.
  • PHPUnit can now be included as a dependency via composer.
  • Using a Datasource from a non-datasource package will now raise an exception. This prevents hard to debug errors when you accidentally use a model/other class as a datasource.
  • FormHelper now correctly selects the hour at midnight with a 12hr format. As well as correctly handling the meridian.
  • Validation::uuid() is now more strict.
  • Canadian postal code validation is now more strict.
  • Default values for SqlServer are now correctly handled for nullable columns.
  • The object cache used by App is only loaded as needed now instead of on every request.
  • HtmlHelper::script() and HtmlHelper::css() now handle the fullBase option.
  • JS, CSS, IMAGES constants are now conditionally defined by CakePHP making it possible to override them in your application.
  • FormHelper now better handles the disabled attribute when defined as an array value instead of an array key.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release[2].

]]>
Sun, 07 Apr 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/04/06/User-Management-Plugin-with-Twitter-Bootstrap-for-cakephp-2-x-version-2-2.html https://bakery.cakephp.org/2013/04/06/User-Management-Plugin-with-Twitter-Bootstrap-for-cakephp-2-x-version-2-2.html <![CDATA[User Management Plugin with Twitter Bootstrap for cakephp 2.x version 2.2]]> User Management Plugin with Twitter Bootstrap for cakephp 2.x version 2.2

I have released a new version(2.2) of my plugin for user management. Demo at http://umpremium.ektanjali.com. This plugin has total 85 features. This plugin is Basic need of your website. Basically It gives you all features which you need on starting your website or a project in cakephp 2.x framework.

This plugin has total 85 features.

It is very helpful for Beginners because of following features-

Clean code with coding standards Proper documentations Newbie will learn- a. How to write code in Cakephp? b. How to use CSRF/XSS protection in cakephp c. How to use SSL/HTTPS in cakephp for whole site as well as only some pages. d. How to use Ajax Pagination in cakephp. e. How to use Ajax Form Validations with File/Image in cakephp.

and may more.

For all features, Beginners please have a look on http://developers.ektanjali.com/docs/umpremium/version2.2/beginners.html Experts will also learn many other things. For all features http://umpremium.ektanjali.com You can start your project or a website in few minutes with this plugin because this plugin has all things which you can think in starting of your project.

The main features are- Twitter Bootstrap framework added Login with Facebook, Twitter, Linkedin, Four Square, Gmail, Yahoo. All Configurations are database driven. No need to touch php code for config setting. No need to hard code your site URL any where. View Online users and guest and admin can take many action on online users. SSL support for selected pages or whole site. Most of the things are Ajax driven. Mailer system

I cannot describe all features here so please have a look on demo at http://umpremium.ektanjali.com here you can find all features of this plugin.

]]>
Sat, 06 Apr 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/03/27/Petit-four-the-quick-and-easy-online-CakePHP-baking-tool.html https://bakery.cakephp.org/2013/03/27/Petit-four-the-quick-and-easy-online-CakePHP-baking-tool.html <![CDATA[Petit four, the quick and easy online CakePHP baking tool]]> Petit four, the quick and easy online CakePHP baking tool

Petit four is an online application that allows you to design the models of your applications and then automatically generate a SQL database and the base files for CakePHP: models, controllers and view directories.

In our Web agency we have been glad to use CakePHP for almost two years as it has really helped us speed up our projects.

However from time to time there are still some tasks that feel a bit slow or tiresome, like creating the basics files to start a project, or add models on the fly during the development process. The console baking tool can be useful and has been improved over the years but has many limitations and you don’t always want to start it each time you add a new model to your application in order to bake a model, a generic controller and generic view files that you won’t necessary use as such.

That is why we developed a tool that allows us to speed up our modeling process by easily creating the models, their attributes and their relations and generating at the same time the SQL file ready to be imported in a database, and the CakePHP basic files needed to build an application on it.

Mind that this is only a beta version with a narrow set of functionalities. We focused on the first layer that is needed for any kind of MVC application: a database and models files. We throwed in the creation of controllers and view directories, because they can be useful, but as they are not always needed, we left them empty for the moment.

Bake your Cakes online.

We designed a tool that would be useful for us, and we hope it will also benefit the community and we plan on continuously improving it. We already have a few improvements in mind, mainly to bring it to the same level as the console bake for code generation:

  • Editing the validation rules for model attributes
  • Optionally generating the basics controller actions and views
  • Attaching behaviors to a model

Read more instructions and more improvements that we have in mind.

Please comment this article, or send us suggestions for this tool on the pâtisserie or by email at contact@keensoftware.com .

]]>
Wed, 27 Mar 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/03/24/Create-your-own-Pinterest-App-with-Engaged-Made-with-CakePHP.html https://bakery.cakephp.org/2013/03/24/Create-your-own-Pinterest-App-with-Engaged-Made-with-CakePHP.html <![CDATA[Create your own Pinterest App with Engaged - Made with CakePHP]]> Create your own Pinterest App with Engaged - Made with CakePHP

Engaged is an open source software that lets you create your own Pinterest like applications. With Engaged - You can share your interests (of course) - You can create hierarchical interest categories - You can change app’s look & feel using settings - You can add new users thanks to Authake plugin

Engaged

LIVE DEMO: http://www.mtkocak.net/engaged DOWNLOAD: https://github.com/mtkocak/engaged

Engaged is an open source software that lets you create your own Pinterest like applications. With Engaged - You can share your interests (of course) - You can create hierarchical interest categories - You can change app’s look & feel using settings - You can add new users thanks to Authake plugin

Features B0x1A1

  • A Flexible user interface that you can almost change everything. Background images, Header & Pin colors can be changed using color picker.
  • Easy to use control panel
  • Hierarchical Categories like a tree
  • Multiple language support (For now English & Turkish)
  • Authake User Management https://github.com/mtkocak/authake

Requirements B0x1A1

  • PHP installed webserver 5.3+
  • MySQL database

Installation B0x1A1

  1. Copy the all files to your server. For general xampp or mamp there is a htdocs folder. Create a folder named ‘engaged’ and copy all files there. If you install to your local webserver, at the end you should access to you Engaged app from http://127.0.0.1/engaged. Don’t try to access it now. Installation is not finished yet :)
  2. You have to first change permissions of App/tmp folder and it’s subfolders. If you receive App/tmp/cache/persistent error, just create that folder. Also change the permissions for App/webroot/img folders. (Unix: Chmod 777) (Windows: I don’t know)
  3. On your MySQL database, create a database called engaged. Import engaged.sql file in the db folder.
  4. Change App/Config/database.php like:
public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'YOURHOSTNAME',
    'login' => 'YOURUSERNAME',
    'password' => 'DATABASEPASSWORD',
    'database' => 'engaged',
    'prefix' => '',
    //'encoding' => 'utf8',
);

public $authake = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'YOURHOSTNAME',
    'login' => 'YOURUSERNAME',
    'password' => 'DATABASEPASSWORD',
    'database' => 'engaged',
    'prefix' => '',
    //'encoding' => 'utf8',
);
  1. After you change the database config, you can access http://127.0.0.1/engaged. A wild installation form will appear. Simply change that as you want and you are ready!

Author B0x1A1 Mutlu Tevfik Kocak (a.k.a Midori)`http://www.mtkocak.net`_

For questions and everything: mtkocak@gmail.com

]]>
Sun, 24 Mar 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/03/20/CakeFest-2013-Vote-for-the-location.html https://bakery.cakephp.org/2013/03/20/CakeFest-2013-Vote-for-the-location.html <![CDATA[CakeFest 2013 - Vote for the location]]> CakeFest 2013 - Vote for the location

CakeFest 2013 will be happening later in the year. We need your help to decide the location!

CakeFest 2013 has a number of large communities around the world. Two of our largest, the USA and Japan, are up for selection for the next CakePHP conference. We’d like to empower you, the user, to input your own selection and help us decide where to take the next CakeFest conference.

Visit the CakeFest Website for more information and to put forward your vote!

]]>
Wed, 20 Mar 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/03/12/CakePHP-product-management-2-x.html https://bakery.cakephp.org/2013/03/12/CakePHP-product-management-2-x.html <![CDATA[CakePHP product management 2.x]]> CakePHP product management 2.x

WidShop is a CakePHP based product management plugin where user can add/edit and manager offers. ><br > Demo at http://www.widahead.com/cakephp-product-plugin > <br > Contact @ widahead@gmail.com General Features: > 1. Add Edit Category > 2. Create Update Services/product and assign on category > 3. Create Update offer on the services > 4. Select Currency type based on country<br > 5. Paypal Do Direct payment method > 6. Back Order functionality (Offer if expired, book then we send mail to get confirmation to get the offer. when we activate after.)<br > 7. Add counter on product/service listing page and view page > 8. Dynamic Categories<br > 9. Side Cart Block with product list > <br > > Additional Features:<br > 1. Admin prefix Urls > 2. SEO Enabled URL<br > 3. Unique URL for all products > 4. Resize Images<br > 5. Create single offer or multiple offer based on single or multiple services > 6. Create day hours bases deals > 7. Multiple service with in a single offer like a bundle of service in a single offer<br >

]]>
Tue, 12 Mar 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/03/08/Rails-Migration-in-Your-CakePHP-application.html https://bakery.cakephp.org/2013/03/08/Rails-Migration-in-Your-CakePHP-application.html <![CDATA[Rails Migration in Your CakePHP application.]]> Rails Migration in Your CakePHP application.

Manage your database like a PRO :) ================================= Today I wrote something that may help you in your cakephp application. Managing database is a pain. If you ever have used rails. Switching between rails and cakephp I always missed the migration thingy. If you use composer.phar then its fairly simple to use this code. And I believe application nowdays are not bound to one programming language. So your next application can be a hybrid application that uses Ruby and PHP :) ….. You find the code in github. https://github.com/rajibahmed/rake-db-migrator

Rails Less Migration =====================

Today I was wanted to use rails goodness inside of my php project. So, I searched online found a solution somewhere. Fixed it up for any project to use using composer.

I assume you are using tools listed below and know how to use command line.

  • POSIX OS
  • Ruby the programming Language
  • Rake the build tool written in Ruby
  • Activerecord gem, defaults with Rails !!!!

To enable it, add this dependency to your composer.json file:

"rajibahmed/rake-db-migrator": "dev"

Or Find it here rajibahmed/rake-db-migrator

Step 1: To enable it in your application you need to create few directories from you terminal :)

$ mkdir -p db/migrate
$ mkdir config

Note 1: You do not need to create the structure if you already have it. Note 2: I have provided a demo database.yml configuration file copy over to config folder.

Step 2: symlink my rake file to root of you project.

$ ln -s vendor/rajibahmed/rake-db-migrator/Rakefile .

Step 3: You are done !!

So now you can use this rake file to create and migrate you configured database. Available Rake tasks are,

rake db:create    # Create the database from config/database.yml for the current DATABASE_ENV
 rake db:drop      # Drops the database for the current DATABASE_ENV
 rake db:generate  # Generate migration files
 rake db:migrate   # Migrate the database (options: VERSION=x, VERBOSE=false).
 rake db:rollback  # Rolls the schema back to the previous version (specify steps w/ STEP=n).
 rake db:version   # Retrieves the current schema version number

Now, Running

rake db:generate

Will create a template file that you can use as a reference point for writing your first migration.

Note[IMPORTANT] : Class name in a migration file must match the file naming convention. ie.

CreateUser < ActiveRecord::Migration
 # file name should be timestramp_create_user.rb
 end

You are good to go !!! This is a few hours effort. If you want to extend it please fork it or send me emails.

LICENSE: Do whatever you want with it. I don’t want money from you and can’t be held responsible any fu*k ups. Good luck !!! Simple isn’t it.

]]>
Fri, 08 Mar 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/03/03/CakePHP-2-3-1-released.html https://bakery.cakephp.org/2013/03/03/CakePHP-2-3-1-released.html <![CDATA[CakePHP 2.3.1 released]]> CakePHP 2.3.1 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.1. 2.3.1 is a bugfix release for the 2.3 release branch.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.1[1]. 2.3.1 is a bugfix release for the 2.3 release branch. Since the release of 2.3.0 there have been 70 commits and 20 tickets resolved. A short list of the changes you can expect is:

  • The ServerShell now correctly handles plugin and theme assets.
  • FormHelper::inputs() now correctly handles plugin models.
  • Backwards compatibility for HABTM checkboxes has been improved.
  • Schema generation works better with SQLServer now.
  • Baking models better detects has and belongs to many associations.
  • Security::rijndael() now correctly generates random iv values. It will continue to decrypt values encrypted with a fixed iv. This improves security of encrypted values, by preventing dictionary attacks on the key/value.
  • Altering tables with Postgres properly renames fields now.
  • Regular expression operators are better supported in Postgres.
  • Fatal errors now display when gzip encoding is enabled.
  • Model whitelists are restored when a save() fails due to no data, when a model has no created/updated fields.
  • Validation::$errors is no longer populated with booleans, this prevents memory consumption issues in longer running scripts.

In addition to the release of 2.3.1, the API docs have been updated and replaced with a system based on apigen. The new API docs fix a number of issues with the old docs and provides an easy way for you to create local API docs.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release[2].

]]>
Sun, 03 Mar 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/02/18/CAKEPHP-DATATABLE-A-component-for-working-with-jQuery-DataTables.html https://bakery.cakephp.org/2013/02/18/CAKEPHP-DATATABLE-A-component-for-working-with-jQuery-DataTables.html <![CDATA[CAKEPHP-DATATABLE - A component for working with jQuery DataTables]]> CAKEPHP-DATATABLE - A component for working with jQuery DataTables

CakePHP-Datables provides server-side interoperability between CakePHP 2.x and the jQuery DataTables plugin.

Features:

  • Takes paginated data and converts into json response compatible with datatables
  • Accepts dataTables ORDER BY requests
  • Accepts dataTables WHERE conditions
  • Accepts dataTables pagination
  • Works LinkableBehavior and to a lesser extent Containable

Dependancies: - PHP 5.x - CakePHP 2.x - LinkableBehavior is recommended but not required - and ofcourse the latest version of DataTabes.

Installation

You can either clone the project, download the project, or just copy & paste DataTableComponent.php into your projects Controller/Component directory

Demo `https://cakephpdatatables.cnizz.com/`_

See https://github.com/cnizzdotcom/cakephp-datatable for full documentation or `https://blog.cnizz.com/2013/01/31/cakephp-datatables-a-component-for-interoperability-between-cakephp-and-jquery-datatables/`_

]]>
Mon, 18 Feb 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/02/02/CakePHP-2-2-7-released.html https://bakery.cakephp.org/2013/02/02/CakePHP-2-2-7-released.html <![CDATA[CakePHP 2.2.7 released]]> CakePHP 2.2.7 released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.2.7.

CakePHP 2.2.7 released

The CakePHP core team is happy to announce the immediate availability of CakePHP 2.2.7[1]. This is a bugfix release for the 2.2.x release branch. After the release of 2.2.6 last week a regression was reported for how select element and selected values were being handled. This issue is now resolved, and 2.2.7 should be the final 2.2.x release unless additional regressions are reported.

A big thanks to those involved in finding and fixing this issue. Download a packaged release [2]

]]>
Sat, 02 Feb 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/01/28/CakePHP-2-3-0-is-out.html https://bakery.cakephp.org/2013/01/28/CakePHP-2-3-0-is-out.html <![CDATA[CakePHP 2.3.0 is out!]]> CakePHP 2.3.0 is out!

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.0 and 2.2.6[1]. There have been a few small improvements and fixes since the release of 2.3.0-RC2.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.0 and 2.2.6[1]. There have been a few small improvements and fixes since the release of 2.3.0-RC2.

CakePHP 2.3 is now marked as stable

2.3.0 is a new version that is completely compatible with its 2.2.5 predecessor. If you get excited to upgrade your projects right away after reading this announcement, make sure you read the migration guide in the book [2], as there are a few changes that your application might require

This is a quick review of the changes that made it in this new iteration.

Authorization

AuthComponent received some love, it is now much easier to implement stateless authorization mechanisms that will respond with appropriate error codes instead of redirecting on missing access rights. The new ` AuthComponent::$unauthorizedRedirect` property was added to control this behavior at runtime and it can be set to false or to an URL as needed.

For improved security, we have added a new Blowfish adapter that will hash your passwords using blowfish/bcrypt.

Additionally, we have deprecated ` AuthComponent::redirect()` in favor of ` AuthComponent::redirectUrl` to better reflect what the method is doing.

Paginator

If you want to use a custom find method in your pagination calls, it is now easier. Just set the ` findType` key in the Paginator settings array and profit!

We have also decided to return a NotFoundException error in case any user tries to access a page of out range instead of serving an inexistent one or the first, which was the previous behavior.

Now setting the ‘limit’ manually in the Paginator settings array to a value bigger than maxLimit will actually bring maxLimit to the same value, no need to repeat yourself.

Custom view classes

Don’t like the built-in implementation for content type views? Need to extend them somehow? That is easier than ever! Just set the view class name using ` RequestHandlerComponent::viewClassMap()` or set the map directly in the settings array for the RequestHandlerComponent.

We <3 PHP 5.4

Yeah, we still support 5.2. But, it did not prevent us from releasing a cool shell command for creating an standalone php server for quick development. Just start it with ` Console/cakeserver`

Configuring your app

Configuration engines are now capable of storing their internal state to the format they understand. ` ConfigReaderInterface::dump()` was added and the correspondent implementation for the IniReader engine. This is useful if you need to persist dynamically generated configuration or if you want to implement a custom configuration engine that stores in a database.

A common complaint about CakePlugin::loadAll() was that it did not check whether the bootstrap files in plugins actually existed or not. This made it difficult for applications like a CMS to load all extensions in one go. While we still believe each plugin should be loaded with the correct settings, we have added a new ` ignoreMissing` key in the plugin configuration array. ` CakePlugin::loadAll(array(‘ro utes’=>true,’bootstrap’=>true,’ignoreMissing’=>true))` will load all plugins and not yell at you if one of the routes.php or bootstrap.php files is missing.

Networking and email

Just as you can read the posted data using dot notation with ` request->data(‘key’)`, you can now do the same with the querystring, by using the method ` request->query(‘key’)`

After some thought, we decided to deprecate MediaView. All its code lives now in CakeResponse::file(), this makes it a one-liner to send files directly to the browser either by streaming it or making it an download.

We added support for TLS connections in CakeSocket, this made it possible to send emails over SMTP + TLS protocols. Also, it is now possible to set the Content-Disposition header for attachments sent with CakeEmail by using the ` contentDisposition` option

As a minor, but important change, HttpResponse was deprecated and all its code resides in the new class HttpSocketResponse.

Views and helpers

The view class received some love once again, continuing our efforts since 2.1. One of the changes is to make ` View::fetch()` have a default text in case the requested block is empty. Also, ` View::prepend` handy method was added to prepend text to any existing block. In case you were interested in executing some code only if a block already existed, then the new ` View::startIfEmpty()` might be what you were looking for.

If you had a case where you could not know in advance whether an element file existed or not, 2.3 is now for you. We have introduced ` View::elementExists()` and added the ` ignoreMissing` option to ` View::element()` to suppress the missing element errors.

Another simple yet important change: our default layout uses HTML5 as doctype. We did this because now FormHelper will add the ` required` attribute to your fields.

FormHelper got even more intelligent, it can now select the correct input type for telephone and email fields. Also, it is now possible to to use any HTTP verb in ` FormHelper::postLink()`

PaginatorHelper got a few new and very much anticipated features:

  • ` PaginatorHelper::numbers()` now has a new option currentTag to allow specifying extra tag for wrapping current page number.
  • For ` PaginatorHelper::prev()` and ` PaginatorHelper::next()` it is now possible to set the tag option to false to disable the wrapper. Also a new option disabledTag has been added for these two methods.

Finally, helpers got a $settings property, that will be set with any array specified from the controller.

Caching

  • File Engine is now the default caching engine, this solves quite a few problems with people not having APC installed or forgetting to change the cache prefix when having multiple apps on the same server
  • It is finally possible to have different full page caches, for example a different cache per subdomain. This is achieved with the new viewPrefix setting in the cache configuration. ` Configure::write(‘Cache.viewPrefix’,‘YOURPREFIX’);`

Models

IMPORTANT: ` Model::find(‘first’)` will now return an empty array when no records are found. Make sure you update your tests!

  • Added support for bigint data types and MySQL FULLTEXT indexes.
  • ` Validation::fileSize()` was added.

When testing models, or controllers, you can now use ` CakeTestCase::getMockForModel()` for quickly generating model mocks that will have the correct alias, table name and be correctly registered in the ClassRegistry.

Since 2.3.0-RC2 the following bit were changed

  • Renamed AuthComponent::redirect() to AuthComponent::redirectUrl().
  • Added “tel” and “email” input type guessing.
  • Controller::_getViewObject() method for constructing the View object when rendering
  • Don’t set “required” attribute for checkboxes (unless explicitly specified).
  • Removed Security.level from core.php
  • Display exact PDO error on default homepage
  • Allow AuthComponent::$unauthorizedRedirect to be an url.
  • Added feature to ignore include errors for CakePlugin
  • Allowed ` between` option for radio buttons to be an array of strings

See the changelog for a full list of changes in 2.3.0[3]

Changes for the 2.2.x branch

  • Make sure sessions are started before destroying them.
  • Consistently inflecting theme names, this means that every theme should start with an uppercase as the other folders
  • Add OK or Successful HTTP codes 200-206 to HttpResponse::isOK(). Fixes #3531
  • Only bake HABTM associations for tables that exist.
  • Add support for –admin to bake controller all.
  • Fixing the way to follow redirects when fetching XML files.
  • Fix Token fields being added to GET forms.
  • Allow afterFind() to fully remove an associated record. By returning array() or unsetting the 0’th result an afterFind callback should be able to fully remove data from the results.

The changelog[4] has the full list of changes in 2.2.5

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP.

Download a packaged release [1]

]]>
Mon, 28 Jan 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/01/27/Internationalization-with-static-and-dynamic-content-routing-and-switching.html https://bakery.cakephp.org/2013/01/27/Internationalization-with-static-and-dynamic-content-routing-and-switching.html <![CDATA[Why that solutions?]]> Internationalization with static and dynamic content, routing and switching =========

Many times, when I prepare a new website I always think how to solve better internationalization. Mainly how resolve displaying dynamic content in the event that this has not been translated into the selected language, how to make search friendly links (called nice urls, slugs) in the database, how to solve the problem of routing these links and how to perform switching and keeping language. In last web project I was prepared application without Cookies and Session, but I only by switching parameter in the address (URL).

Why that solutions?

Because Session and Cookies works perfectly when We haven’t translated links by magic function from Gettext ( __(); ).

In many tutorials setting language is inside Controller (mainly AppControler or Component). This doesn’t work when We use translate content in Router ( Router::connect(); ). Sometimes tutorials resolved problem by set language and refresh page (by $this->redirect(); ). I don’t like that!

Routing

I would like URL like these:

/ // home page for default language
/en // home page for english
/pl // home page for polish
/de // home page for germany
/register // register action (for e.g. UsersController) for default language
/pl/rejestracja // register action for polish
/de/anmeldung // register action for germans

And I thinking shouldn’t work links like these:

/pl/register // polish language for translated action name
/en/anmeldung // like above
…

Why? Because in my opinion there is no place for mixing links (mainly for SEO).

My solutions is setting language before app starting (AppController) and this is most ugly part in my article, latter I wrote why.

Let’s start coding!

bootstap.php (app/Config):

define('DEFAULT_LANGUAGE', 'en').

Configure::write('Config.languages', array(
    'en' => 'English version',
    'pl' => 'Język polski',
    'de' => 'Deutsch Version'));

In first line we define constant with 2-letter code for default language, which is English. Next prepare array with codes and description languages for own app and save it in configuration.

routes.php (app/Config):

$language = substr(Router::url(''), 0, 2); // check that it works properly (sometimes You must trip part of url, for e.g. folder names)
$languages = array_keys(Configure::read('Config.languages'));

if(!in_array($language, array_diff($languages, array(DEFAULT_LANGUAGE)))) {
    $language = DEFAULT_LANGUAGE;
    $schema = '';
} else {
    $schema = '/:language';
}

Configure::write('Config.language', $language);

/* PagesController */
Router::connect('/', array(
    'controller' => 'pages',
    'action' => 'display',
    'home'));
Router::connect('/:language', array(
    'controller' => 'pages',
    'action' => 'display',
    'home'), array(
            'language' => implode('|', $languages)));

/* UsersController */
Router::connect($schema .'/'. __('register', true), array(
    'controller' => 'users',
    'action' => 'register'), array(
            'persist' => array(
                    'language')));

Yeah, in first line is most ugly code from all codes. This get first 2 letters from url for checking what is code represent language inside configurations ‘Config.languages’. Next prepare schema for using in routing schemas and write selected language to Config.language . In this code I was prepare 3 routing schemas for home page with default language and with selected language and last for registration page.

Note: How prepare app to using static translated content, using Poedit app It has been well described in the book “CakePHP 1.3 Application Development Cookbook” by Mariano Iglesias (Yeap, the book was translated to polish!).

There is no different between 1.3 and 2.x.

I use magic parameter ‘persist’ for routing. It’s works for adding language params for $this->Html->links(); when the schema using /:language . More info on Router API.

AppHelper.php (app/Views/Helpers):

function url($url = null, $full = false) {
    if($this->params['language'] == DEFAULT_LANGUAGE) {
            unset($this->params['language']);
    }

    return parent::url($url, $full);
}

I must rewrite url() method because I want using language parameter from configuration. I unset language params when it is default, because we have duplicate content (by 2 urls: /register and /en/register).

When I rewrite url() method and using persist in routing schemas these two things work perfectly together!

default.ctp (app/Views/Layouts/):

Now we test own app with codes below:

foreach(Configure::read('Config.languages') as $code => $language) { // show links for translated version
    echo $this->Html->link($language, array(
            'controller' => 'pages',
            'action' => 'display',
            'home',
            'language' => $code)) .' ';
}

echo $this->Html->link(__('register', true), array( // show link to registartion page
    'controller' => 'users',
    'action' => 'register'));

And static, routing and switching all done.

Dynamic content

For dynamic conent Cake setting $locale variable by default in own app from configuration ( Config.language ). How setting this variable by hand is described on Saving in another language.

But if We want display translate article from database and this article isn’t translated I want view oryginal version. How do this?

AppController.php (app/Controller):

Put code below to beforeFilter(); .

if(Configure::read('Config.language') !== DEFAULT_LANGUAGE) {
    $this->{$this->modelClass}->locale = array(Configure::read('Config.language'), DEFAULT_LANGUAGE);
} else {
    $this->{$this->modelClass}->locale = DEFAULT_LANGUAGE;
}

This try get translated version (first array param) or oryginal version (second param).

How add, edit and translate content? I think the best way is adding content in only default language, but if You want translate content and save it, You must switch language and go to edit page.

This is magic! Whem we are on edit page and there is no language param in url, we save it in default language, but when there is language param in url, we save it in selected language.

Don’t forget to prepare i18n database table and Your model for translated fields.

That’s all! I waiting on question and comments! Tested on 2.2.5 version.

Sorry, but I still learn english.

kicaj blog.kdev.pl

]]>
Sun, 27 Jan 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/01/25/Backup-your-SQL-database-with-BackupMe-console-application.html https://bakery.cakephp.org/2013/01/25/Backup-your-SQL-database-with-BackupMe-console-application.html <![CDATA[Backup your SQL database with BackupMe console application]]> Backup your SQL database with BackupMe console application

BackupMe is a console script to create SQL databases dump backups for CakePHP applications.

A shell application to create SQL databases dump backups (Tables only!).

Download: https://bitbucket.org/mmahgoub/cakephp-backupme/

This script is based upon the one written by David Walsh and published on his blog on August 18, 2008 https://davidwalsh.name/backup-mysql-database-php

Many thanks to him!

Instructions

  1. Download the repo and put it in your app/ folder.
  2. Open up your CakePHP shell and run the command “cake backup” (You can use cron jobs)

This script backup all of your tables by default but you can select specific tables by uncommenting

//$tables = array('orders', 'users', 'profiles');

and filling your own table names.

  • Notice: This application uses ProgressBar Task written by Matt Curry. If you want to use it should be in vendors/shells/tasks directory otherwise please comment the lines which contains:
$this->ProgressBar->start($num_fields);

$this->ProgressBar->next();

I don’t know why you wanna do that! That progress bar is awesome! Thanks Matt!

Arguments

  1. Database configuration, default is “default”.
  2. Rows per query (less rows = less ram usage but more running time) default is 0 which means all rows.
  3. Absolute path for the directory to save your backup, it will be created automatically if not found, default is app/db-backups/yyyy-mm- dd

Additional possible features

  1. Upload backup using FTP.
]]>
Fri, 25 Jan 2013 00:00:00 +0000
https://bakery.cakephp.org/2013/01/09/CakePHP-2-3-0-RC2-and-2-2-5-released.html https://bakery.cakephp.org/2013/01/09/CakePHP-2-3-0-RC2-and-2-2-5-released.html <![CDATA[CakePHP 2.3.0-RC2 and 2.2.5 released]]> CakePHP 2.3.0-RC2 and 2.2.5 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.0-RC2 and 2.2.5[1]. There have been a few small improvementsand fixes since the release of 2.3.0-RC1. If there are no serious issues reported 2.3.0 stable should be released within a few weeks.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.0-RC2 and 2.2.5[1]. There have been a few small improvementsand fixes since the release of 2.3.0-RC1. If there are no serious issues reported 2.3.0 stable should be released within a few weeks.

Changes since 2.3.0-RC1

Since the release fo 2.3.0-RC1 a few new improvements have been added. In addition, all changes in 2.2.5 are also present in 2.3.0-RC2. The new improvments to 2.3.0-RC2 are:

  • Using an unknown cache engine results in exceptions being thrown.
  • Improved support for HTML5 attributes.
  • PaginatorComponent now throws exceptions when users request page numbers that are out of range. This is instead of displaying duplicate content from the last page in the series.
  • PaginatorHelper::prev() and PaginatorHelper::next() now support the ‘disabledTag’ option. This option can be used to set the wrapping tag when these controls are not available.
  • An .editorconfig file was added.
  • The default doctype is now HTML5
  • FormHelper sets the required attribute on inputs based on detected validation rules.
  • Support for php.ini style numbers was added to CakeNumber::fromReadableSize()
  • Generated text for pagination buttons in related models are now easier to read.
  • FormHelper::postLink() sets the target attribute on the form element instead of the a element.

See the changelog[2] for a full list of changes in 2.3.0-RC2

Changes in 2.2.5

2.2.5 is a bugfix/maintenance release for the 2.2.x release branch. There have been 40 commits & 19 issues fixed since 2.2.4. Some of the notable fixes are:

  • Fields using the || operator are now quoted correctly.
  • Stack traces on error pages now highlight code excerpts correctly.
  • File inputs no longer include the value attribute. This fixes HTML validation with HTML5 doctypes.
  • ConsoleOptionParser now correctly handles options with the value of ‘0’.
  • Mysql datasource now correctly handles indexes with a length value.
  • The 5th argument is no longer passed to mail() when safe_mode is active.
  • Email bodies are now wrapped at 998 instead of 78 characters. This fixes issues where HTML content would be spliced.
  • TreeBehavior and nested deletes work as expected now.
  • Infinite loops when rendering error 500 pages with extensions declared by Router::parseExtensions() have been fixed.
  • Requests to the SecurityComponent’s blackholeCallback are now blackholed. This was an issue when using a public unprefixed method as the SecurityComponent’s blackhole callback.
  • Theme names are now consistently camelcased in both helper assets & view files.
  • FormHelper::radio() now treats boolean values as equivalents to 1 and 0 respectively.
  • Hash::expand() no longer loops infinitely in PHP5.2 when expanding deeply nested structures.

The changelog[3] has the full list of changes in 2.2.5

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release [1]

]]>
Wed, 09 Jan 2013 00:00:00 +0000
https://bakery.cakephp.org/2012/12/28/CakePHP-Community-2012.html https://bakery.cakephp.org/2012/12/28/CakePHP-Community-2012.html <![CDATA[CakePHP Community 2012]]> CakePHP Community 2012

2012 was the year CakePHP turned 7 years old, maintaining it’s reign as one of the major PHP frameworks.

CakePHP: a framework built and shaped by the community

2012 was an important year for CakePHP. Versions 2.1 and 2.2 of the framework were released, and work on the future 3.0 version began. We had over 7 million combined visits to the CakePHP sites, with over half of those being new visitors. More than 17 million page views were registered for the CookBook alone, with https://book.cakephp.org being the most popular location of all.

CakeFest 2012 saw some excellent guest speakers, with people from across the globe who couldn’t make it tuning in and watching the event via streaming video. We also got a lot of feedback this year from the community, prompting us to create official Facebook, Google and LinkedIn groups for CakePHP, to help people stay in touch with the latest news and discussions.

We also gathered some interesting demographics to share with you all, for the people who were most active and influential with CakePHP in 2012.

The top 5 communities, based on country, were the following:

  1. United States
  2. Brazil
  3. India
  4. France
  5. Japan

They were followed by Germany, United Kingdom, Canada and Spain, with the number one city based upon engagement world wide being Tokyo, Japan.

Additionally, the top 5 languages were the following:

  1. English (en-us/gb)
  2. Portuguese (pt-br)
  3. French (fr)
  4. Spanish (es)
  5. Japanese (ja)

It was also interesting to see that 45% of the community who engaged with us were aged between 25-34, followed by 30% from 18-24, and the remaining over 34 or under 18. The gender difference was around 10% female and 90% male.

And finally, based upon browser usage, Chrome came out on top, with 46% of all visits to the CakePHP site. It was followed by Firefox (34%), Safari (9%) and IE (6%).

Of course, these statistics are just numbers. The reality is that every single person who contributes to CakePHP, no matter where you are, or which language you speak, male of female, you are important. That’s why we thank each and every one of you for making CakePHP what it is today - a framework created by the community! Thank you.

]]>
Fri, 28 Dec 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/12/20/Display-Tree-Index-with-OL-and-LI.html https://bakery.cakephp.org/2012/12/20/Display-Tree-Index-with-OL-and-LI.html <![CDATA[Display Tree Index with OL and LI]]> Display Tree Index with OL and LI

As i prefer using the original helpers and behaviors, i also use it for my Trees. In this article i’d like to clearify how we can display a tree using unsorted lists or even tables. Expecting you created your database tables consulting Trees, you should be able to use the following code in the controller of your category model:

<?php
class CategoriesController extends AppController {
    public function index() {

            $categories = $this->Category->find('threaded', array(
                    'order' => array('Category.lft'))
            );
            $this->set('categories', $categories);

    }
}
?>

This returns an array with all categories in a nested structure.

To parse, or let me say, to display this array without having trouble to use UL- or OL-Tag’s, or even tables, let me introduce recursive functions to you:

<?php
function RecursiveCategories($array) {

    if (count($array)) {
            echo "\n<ul>\n";
        foreach ($array as $vals) {

                    echo "<li id=\"".$vals['Category']['id']."\">".$vals['Category']['name'];
                    if (count($vals['children'])) {
                            RecursiveCategories($vals['children']);
                    }
                    echo "</li>\n";
        }
            echo "</ul>\n";
    }
} ?>

This function returns a list of ul’ and li’s for each category and it’s children. If a child has got children, the function just calls itself for them and returns a further ul. Now just print the result in your view:

<?= RecursiveCategories($categories) ?>

Should be easy to add your arrows for moving categories up or down, or even delete. You just have to put them into the li.

]]>
Thu, 20 Dec 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/12/02/CakePHP-2-3-0-RC1-and-2-2-4-are-finally-here.html https://bakery.cakephp.org/2012/12/02/CakePHP-2-3-0-RC1-and-2-2-4-are-finally-here.html <![CDATA[CakePHP 2.3.0-RC1 and 2.2.4 are finally here]]> CakePHP 2.3.0-RC1 and 2.2.4 are finally here

Following the release of 2.3.0-beta around one month ago, we are excited to announce that 2.3 is very close to be marked as stable!

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.0-RC1 and 2.2.4[1]. 2.3.0-RC1 marks the freezing of 2.3.0 API and it is jsut a matter of a few weeks to mark it as stable if no bugs are found in current codebase.

Changes since 2.3.0-beta

  • Added ConfigReaderInterface::dump() and made all readers’ dump() method support ‘Plugin.keyname’ format for keys
  • Made View trigger notice by default if elements are missing and added elementExists() method
  • Added Helper::$settings to match other objects like components and behaviors
  • You no longer have to specify ‘maxLimit’ when setting ‘limit’ greater than default ‘maxLimit’ when configuring pagination settings.
  • Added type hinting to Model::validator()
  • prev() and next() methods of PaginatorHelper now possible to place the ‘tag’ option to ‘false’ to disable the wrapping element.
  • Calling Form->input() with ‘errorMessage’=>false should trigger field error, but not render error message (HTML element).
  • New options in HtmlHelper::getCrumbList() to make it compatible with Twitter Bootstrap, Zurb foundation or other CSS frameworks.
  • Added CakeTestCase::getMockForModel convenience method.
  • Implemented SSL peer verification in HttpSocket.
  • Added context() to CakeSocket.
  • Renamed HttpResponse to HttpSocketResponse. HttpResponse will continue to exist for backwards compatibility.
  • Using bytecode sequence for unicode ellipsis in String::trim().
  • When using XmlView, you can configure the top level element name by setting the _rootNode view variable.
  • Added warning to home.ctp when DebugKit is not installed and added a list of official plugins to home.ctp
  • Added View::startIfEmpty()
  • Added foreignKey to whitelist in saveAssociated()
  • RedisEngine: authenticate connection if ‘password’ is set

Changes in 2.2.4

2.2.4 is a bugfix/maintenance release for the 2.2.x release branch. These are some of the changes included:

  • Update TLD validation to accept gTLD variations
  • Fixed sorting empty data with Hash & Set.
  • Fixed multi-model validators with deep & atomic validation error nesting
  • Fixed exceptions being thrown in beforeFilter breaking error pages.
  • Using HttpSocket to get proper exceptions when trying to load XML from remote servers to fix warnings from file_get_contents() in Xml::build()
  • Send charset=UTF-8 if Content-Type is JSON.
  • Added query logging to DboSource::insertMulti().
  • Fixed contain rule parsig in authentication adapters
  • Fixed required validation rule
  • Removed Inflector::slug() replacement from Ä to A
  • Fixed issue with Model::saveAssociated() and TranslateBehavior
  • Only setting $request->data with PUT/DELETE when it can be decoded.
  • Improved “required” field detection.
  • Made Model::find(‘first’) always return an array.
  • Fixed issue where the incorrect meridian would be selected in FormHelper::dateTime()
  • Fixed issue where createSchema() would omit primary keys sometimes.
  • Fixed saveAssociated() with validate=first, atomic=false
  • Showing the last 200 queries instead of the first 200 in SQL log.
  • Fixed 0’th index file not being copied to $_FILES.
  • Fixed autoLinkUrls so it re-capture query strings.
  • Allow saving new records with pre specified primary key value with treebehavior.
  • Fix find(‘count’) with ‘group’ when result has only one group.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release [3]

]]>
Sun, 02 Dec 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/11/24/Versioned-DbMigrations.html https://bakery.cakephp.org/2012/11/24/Versioned-DbMigrations.html <![CDATA[Versioned DbMigrations]]>

Versioned DbMigrations

Need more control than only just being able to update your database schema via CakePHP’s Migration shell ? Well, this is a dirty quick solution for actually versioning your database ! And a great tool to let all developers on your CakePHP project to keep their respective databases up-to-date. You can choose to either do this auto-magically, or use the plugin’s GUI to go back and forth between versions at will. The best part is that it utilizes CakePHP’s “Model” layer to it’s fullest, hence you can practically do anything when you jump from version to version.

CakePHP: Versioned Db Migrations Plugin for CakePHP 2.0

Installation

Install this plugin following the simple steps below:

  1. Copy this plugin in a directory called “DbMigrations” inside your app/Plugin directory.
  2. Now load the plugin in your application’s bootstrap file (typical location: app/Config/bootstrap.php) by pasting this line:
CakePlugin::load('DbMigrations');
  1. After this, take a look at DbMigrations/Config/config.php. Here you will find two setting:
table => 'db_migrations'
and sanityCheck => true

These settings are as simple as they sound. The "table" is the name of the table the DbMigrations plugin is going to use.
You can change it to your liking.
The second setting: "sanityCheck", when turned to "TRUE" lets DbMigrations check if the table specified in the "table"
property exists. If not, it simply creates it so that you won't have to do a thing :)
  1. After following the above steps, there are two ways in which you can keep your databases up-to-date.
4.1. You can simply paste this line "ClassRegistry::init('DbMigrations.Migration')->upgrade(true)" in your AppController::beforeFilter().
     Following this way, whenever your you hit a page, the AppController::beforeFilter() will be executed, hence, the DbMigrations plugin
     will update your database to the latest version if it's not already.

4.2. OR you can go to the plugin's GUI, http://your_website_url/db_migrations/migrations and choose the revision you'd like
     your database to be updgraded or downgraded to.

NOTE: I won’t recommend using both 4.1 or 4.2 at the same time.

And you’re all set ! - Also, I would always advise to keep this kind of auto-upgrades for environments like Test and Development. It won’t be good practice at all to use this for production. Fits the dev environment best though.

How this works B0x1A6 So to get started, after when you have followed the installation steps make a folder “Migrations” in your “app” directory. You will find a “Migrations” folder already in the “DbMigrations” directory. That is the default folder. You’d be better off keeping your files organized in a folder in your app dir for better organization. (In future versions I can have that folder name and path configurable too).

A sample file list in the “Migrations” folder would look like this:

001_initial_db_dump.php
002_users_table_add_deleted_field.php
003_create_samples_table.php
004_changes_for_issue_336.php

There are two parts to the files you create. As you can see, the name of the files that is prefixed by a version number. These version numbers need to be unique as it’s going to be an incremental updates for the database.

Now to look inside a sample file. For, say, the second file, “002_users_table_add_deleted_field.php”, the contents would be simply:

class DbMigration_2 extends DbMigrationsAppModel {

    public function up() {
        $sql = "ALTER TABLE  `users` ADD  `deleted` TINYINT( 1 ) NOT NULL";
        $this->query($sql);
    }

    public function down() {
        $sql = "ALTER TABLE `users` DROP `deleted`";
        $this->query($sql);
    }
}

After making all the changes (following steps in the installation) and making these files, if you are following step 4.1 to update your database, then when you run your application for the first time, it will run all these files, hence pushing all changes in your database.

If you notice, you’ll see that all “DbMigration_{$revisionNumber}” classes are instances of the CakePHP Model. Hence you can use CakePHP’s model layer to it’s full potential !

If at any point in time, say you need to downgrade your changes to a specific revision number, assuming 2 for this explanation. All you need to do is execute this statement at any suitable place in your code:

ClassRegistry::init('DbMigrations.Migration')->downgrade(2);

This will rollback all changes till revision 2. Which means it will drop the table “samples” (you should code the drop statement in the downgrade() function of DbMigration_3 class).

If you wish to make your database up-to-date again, then just issuing the upgrade() statement, it will re-create the samples table and push all changes for issue 336. It won’t execute changes for files 001 and 002.

OR alternatively, you can follow step 4.2.

Important Notes

You will need to be carefuly to name your DbMigration_X classes, that “X” should correspond to the revision number that is prepended to every migration file.

There are no checks implemented at this point. No exceptions if you screw up. So you will really need to be careful in coding the up() and down() functions for your DbMigration_X classes.

You can also even insert data into tables and issue update statements.

Hope this plugin makes your life easier and makes development fast !

Find this plugin on my GitHub profile: https://github.com/SayB/DbMigrations

]]>
Sat, 24 Nov 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/11/14/Tagcloud-Helper-Cakephp-2.html https://bakery.cakephp.org/2012/11/14/Tagcloud-Helper-Cakephp-2.html <![CDATA[Tagcloud Helper Cakephp 2]]> Tagcloud Helper Cakephp 2

Adjustable Helper to build a word/tag cloud.

<?php

/*
 *  @author: syl-via@go2.pl & Suhail Doshi
 */

class TagcloudHelper extends Helper {
    /* font sizes */

    var $minSize = 10;
    var $maxSize = 50;

    /* colors */
    var $red = 110;
    var $green = 105;
    var $blue = 255;

    /* div sizes */
    var $div_size = 400;

    /* show frequencies */
    var $show_frequencies = false;

    /*  @author: syl-via
     *  @param array $tags Tags to build the cloud on. Ex array('name'=>20,'tag2'=>32)
     *  @param (optional) int  $div_size The size of the div for the words
     *  @param (optional) int  $minSize  Minimum size of the font
     *  @param (optional) int  $maxSize  Maximum size of the font
     *  @param (optional) int  $red
     *  @param (optional) int  $green
     *  @param (optional) int  $blue
     *
     *  returns string div with span of tags.
     */

    public function word_cloud($tags, $div_size = null, $show_frequencies = null, $minSize = null, $maxSize = null, $red = null, $green = null, $blue = null) {
        if ($show_frequencies != null)
            $this->show_frequencies = $show_frequencies;
        if ($div_size != null)
            $this->div_size = $div_size;
        if ($minSize != null)
            $this->minSize = $minSize;
        if ($maxSize != null)
            $this->maxSize = $maxSize;
        if ($red != null)
            $this->red = $red;
        if ($green != null)
            $this->green = $green;
        if ($blue != null)
            $this->blue = $blue;

        $data = $this->formulateTagCloud($tags);
        $data = $this->shuffleTags($data);

        /* Build cloud */
        $cloud = "<div style=\"width: {$this->div_size}px\">";
        foreach ($data as $word => $options) {
            $cloud .= "<span style=\"font-size: {$options['size']}px; color: {$options['color']};\">";
            $cloud .= str_replace(" ", " ", $word);
            if ($this->show_frequencies) {
                $cloud .= " <small>({$options['score']})</samll> ";
            }
            $cloud .= "</span> ";
        }
        $cloud .= "</div>";
        return $cloud;
    }

    /*
     *  @author: Suhail Doshi
     */

    public function formulateTagCloud($dataSet) {
        asort($dataSet); // Sort array accordingly.
        // Retrieve extreme score values for normalization
        $minimumScore = intval(current($dataSet));
        $maximumScore = intval(end($dataSet));

        // Populate new data array, with score value and size.
        foreach ($dataSet as $tagName => $score) {
            $size = $this->getPercentSize($maximumScore, $minimumScore, $score);
            $color = $this->getColor($maximumScore, $score);
            $data[$tagName] = array('score' => $score, 'size' => $size, 'color' => $color);
        }

        return $data;
    }

    /*  @author: syl-via
     *  @param int $maximumScore Maximum score value in array.
     *  @param int $currentValue Current score value for given item.
     *
     *  returns string Hex(ex: #000012) value of RGB.
     */

    public function getColor($maximumScore, $currentValue) {
        $b = floor($this->blue * ($currentValue / $maximumScore));
        return '#' . sprintf('%02s', dechex($this->red)) . sprintf('%02s', dechex($this->green)) . sprintf('%02s', dechex($b));
    }

    /*  @author: Suhail Doshi
     *  @param int $maxValue Maximum score value in array.
     *  @param int $minValue Minimum score value in array.
     *  @param int $currentValue Current score value for given item.
     *  @param int [$minSize] Minimum font-size.
     *  @param int [$maxSize] Maximum font-size.
     *
     *  returns int percentage for current tag.
     */

    private function getPercentSize($maximumScore, $minimumScore, $currentValue) {
        if ($minimumScore < 1)
            $minimumScore = 1;
        $spread = $maximumScore - $minimumScore;
        if ($spread == 0)
            $spread = 1;
        // determine the font-size increment, this is the increase per tag quantity (times used)
        $step = ($this->maxSize - $this->minSize) / $spread;
        // Determine size based on current value and step-size.
        $size = $this->minSize + (($currentValue - $minimumScore) * $step);
        return $size;
    }

    /*  @author: Suhail Doshi
     *  @param array $tags An array of tags (takes an associative array)
     *
     *  returns shuffled array of tags for randomness.
     */

    public function shuffleTags($tags) {
        while (count($tags) > 0) {
            $val = array_rand($tags);
            $new_arr[$val] = $tags[$val];
            unset($tags[$val]);
        }
        if (isset($new_arr))
            return $new_arr;
    }

}
?>
]]>
Wed, 14 Nov 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/11/12/Authake-for-CakePHP-2-2-3-is-finally-out.html https://bakery.cakephp.org/2012/11/12/Authake-for-CakePHP-2-2-3-is-finally-out.html <![CDATA[Authake for CakePHP 2.2.3 is finally out!]]> Authake for CakePHP 2.2.3 is finally out!

The most easy to use authorization plugin is finally out with tremendous changes.

To dovnload & contribute:https://github.com/mtkocak/authake

For install instructions and feedback, please go to Authake home page: http://www.mtkocak.net/?p=507

http://www.mtkocak.net/wp-content/uploads/2012/11/authake.png

Newest features are:

  1. Totally new look & feel. New interface using twitter bootstrap library<br/>
  2. Generated schema file to use cache schema create
  3. Total adaptation to CakePHP 2.2.3
  4. Totally new Dashboard
  5. Gravatar Support
  6. Better alerts
  7. Beautiful navigation and breadcrumbs
  8. html5shiv support for older browsers
  9. Dropdown lists for commands
  10. Help file with regex information
  11. Settings page (needs some effort)
  12. Better readme files with markdowns

Further changes are here for your contribution:

  • sha1 security
  • long id’s
  • settings save issue
  • For questions and issues: Mutlu Tevfik Kocak mtkocak(at) gmail.com
]]>
Mon, 12 Nov 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/10/28/CakePHP-2-3-0-beta-released.html https://bakery.cakephp.org/2012/10/28/CakePHP-2-3-0-beta-released.html <![CDATA[CakePHP 2.3.0-beta released]]> CakePHP 2.3.0-beta released

This release contains several new features that improves CakePHP performance, security and ease of use.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.3.0-beta[1]. This release contains several new features that improves CakePHP performance, security and ease of use. When it is done, this new version is intended to be a replacement for the 2.2.x branch and will be completely backwards compatible. A migration guide is provided in the book [2] and we encourage you to read it if you are upgrading from an older version.

A short list of the changes you can expect are:

Constants

  • An application can now easily define CACHE and LOGS, as they are conditionally defined by CakePHP now

Caching

  • FileEngine is always the default cache engine. In the past a number of people have had difficulty setting up and deploying APC correctly both in cli + web. Using files should make setting up CakePHP simpler for new developers.

Components

AuthComponent

  • A new authenticate adapter has been added to support blowfish/bcrypt hashed passwords. You can now use Blowfish in your $authenticate array to allow bcrypt passwords to be used.
  • Allow throwing exception instead of redirecting upon unauthorized access attempt, this is controlled by a new option in AuthComponent. This is useful when you want to block access to users with stateless authentication

PaginatorComponent

  • PaginatorComponent now supports the findType option. This can be used to specify what find method you want used for pagination. This is a bit easier to manage and set than the 0’th index.

SecurityComponent

  • SecurityComponent now supports the unlockedActions option. This can be used to disable all security checks for any actions listed in this option.

RequestHandlerComponent

  • RequestHandlerComponent::viewClassMap() has been added, which is used to map a content type to view class name. You can add $settings[‘viewClassMap’] for automatically setting the correct viewClass based on extension/content type.

CookieComponent

  • CookieComponent::check() was added. This method works the same as CakeSession::check() does.

Console

  • The server shell was added. You can use this to start the PHP5.4 web-server for your CakePHP application.
  • Baking a new project now sets the application’s cache prefix to the name of the application.
  • Adding symlink resolution to app/Console/cake

I18n

  • nld is now the default locale for Dutch as specified by ISO 639-3 and dut its alias. The locale folders have to be adjusted accordingly (from /Locale/dut/ to /Locale/nld/).
  • Albanian is now sqi, Basque is now eus, Chinese is now zho, Tibetan is now bod, Czech is now ces, Farsi is now fas, French is now fra, Icelandic is now isl, Macedonian is now mkd, Malaysian is now msa, Romanian is now ron, Serbian is now srp and Slovak is now slk. The corresponding locale folders have to be adjusted, as well.
  • Corrected the usage of domain translation for a few internal strings in validation rules.
  • Now all translation functions can be overridden by declaring the function first.

Configure

  • Configure::check() was added. This method works the same as CakeSession::check() does.

Exceptions

  • CakeBaseException was added, which all core Exceptions now extend.
  • The base exception class also introduces the responseHeader() method which can be called on created Exception instances to add headers for the response, as Exception responses don’t reuse any response instances.

Model

  • Support for the biginteger type was added to all core datasources, and fixtures.
  • Support for FULLTEXT indexes was added for the MySQL driver.
  • Model::find(‘list’) now sets the recursive based on the max containment depth or recursive value. When find(‘list’) is used with ContainableBehavior.
  • Added DboSource::resetSequence(). This allows datasources to reset sequence values in tables. This is useful for datasources like Postgres, and makes using fixtures much easier.
  • DboSource::getLog() will now show the last 200 queries instead of the first 200.

Validation

  • Missing validation methods will always trigger errors now instead of only in development mode.
  • Added CakeNumber::fromReadableSize() and Validation::filesize()

Network

  • Added enableCrypto() method to CakeSocket class
  • TLS/SSL support was added for SMTP connections.

CakeRequest

  • CakeRequest::onlyAllow() was added.
  • CakeRequest::query() was added to access variables in the query string using dot notation.

CakeResponse

  • CakeResponse::file() was added. This deprecates MediaView.
  • When instantiating a CakeResponse, it will by default set its charset to App.encoding

CakeEmail

  • The contentDisposition option was added to CakeEmail::attachments(). This allows you to disable the Content-Disposition header added to attached files.

Router

  • Support for tel:, sms: were added to Router::url().
  • Enable dot notation for passing plugin for routeClass parameter
  • Routes are loaded as late as possible. As a consequence - routes will also work by default in the cli.

View

  • MediaView is deprecated, and you can use new features in CakeResponse to achieve the same results.
  • Serialization in Json and Xml views has been moved to _serialize()
  • beforeRender and afterRender callbacks are now being called in Json and Xml views when using a view templates.
  • View::fetch() now has a $default argument. This argument can be used to provide a default value should a block be empty.
  • View::prepend() has been added to allow prepending content to existing block.

Helpers

FormHelper

  • FormHelper::select() now accepts a list of values in the disabled attribute. Combined with ‘multiple’ => ‘checkbox’, this allows you to provide a list of values you want disabled.
  • FormHelper::postLink() now accepts a method key. This allows you to create link forms using HTTP methods other than POST.
  • Fixed disabled attribute for multiple checkboxes
  • Hidden divs created by FormHelper can now be customized by using the hiddenblock template in HtmlHelper::$tags property
  • Improved “required” field detection.

TextHelper

  • TextHelper::tail() was added to truncate text starting from the end.
  • ending option in TextHelper::truncate() is deprecated in favor of ellipsis

PaginatorHelper

  • PaginatorHelper::numbers() now has a new option currentTag to allow specifying extra tag for wrapping current page number.

CakeNumber

  • CakeNumber::fromReadableSize() was added.
  • CakeNumber::formatDelta() was added.
  • CakeNumber::defaultCurrency() was added.

Folder

  • Folder::copy() and Folder::move() now support the ability to merge the target and source directories in addition to skip/overwrite.

String

  • String::tail() was added to truncate text starting from the end. ending in String::truncate() is deprecated in favor of ellipsis

Debugger

  • Debugger::exportVar() now outputs private and protected properties in PHP >= 5.3.0.

Security

  • Support for bcrypt was added. See the Security::hash() documentation for more information on how to use bcrypt.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release [3]

]]>
Sun, 28 Oct 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/10/12/Cake-Bake-Templates-for-Twitter-Bootstrap.html https://bakery.cakephp.org/2012/10/12/Cake-Bake-Templates-for-Twitter-Bootstrap.html <![CDATA[Cake Bake Templates for Twitter Bootstrap]]> Cake Bake Templates for Twitter Bootstrap

Templates for baking BootStrap compatible views in CakePHP.

Templates for baking BootStrap compatible views in CakePHP

Put this folder in your appConsoleTemplatedefault and copy the actions and classes folder from the CakeConsoleTemplatesdefault folder, too.

Now when you bake that app you will get custom views that make a reasonably decent Bootstrap app.

Use the default.ctp layout file as a good starting point.

https://github.com/vz28bh/CakePHP-Bootstrap-Templates

]]>
Fri, 12 Oct 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/10/11/Twitter-Bootstrap-Plugin-for-CakePHP.html https://bakery.cakephp.org/2012/10/11/Twitter-Bootstrap-Plugin-for-CakePHP.html <![CDATA[Twitter Bootstrap Plugin for CakePHP]]> Twitter Bootstrap Plugin for CakePHP

Twitter Bootstrap (http://twitter.github.com/bootstrap/) is a powerful front-end framework. I’d really love to use this for several projects and pages. Now I have created a simple plugin to use the power of Twitter Bootstrap easier inside CakePHP.

With Twitter Bootstrap you get a fast and powerful front-end framework that makes it easier to design pretty cool websites. In my eyes this is a must for every web-designer and developer.

My plugin can be found on GitHub under https://github.com/visionred/BootstrapCake

It comes across with a easy shell for loading the framework files, creating compatible layouts and a strong view helper. A documentation is also available.

So just take a look at it and enjoy the power of Twitter Bootstrap.

If you have any questions, ideas or bugs send me a message or report an issue on GitHub.

Cheers, Florian Nitschmann

]]>
Thu, 11 Oct 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/10/11/Jquery-Validation-Helper.html https://bakery.cakephp.org/2012/10/11/Jquery-Validation-Helper.html <![CDATA[Jquery Validation Helper]]> Jquery Validation Helper

JQuery Validation Helper reduces the duplication of the Cake model configuration in Javascript.

I was implementing JQuery Validate plugin for the first time and quickly realized that it required adding all the same validation rules that are in the Cake models. Since that seemed to violate DRY, I came up with a helper that scans the model validation rules and creates the equivalent validation rules for the JQuery plugin and stores them as a string in the dialog class item.

https://github.com/vz28bh/CakePHP-JqueryValidationHelper

First, include JQuery and the Validate plugin in your layout. There is also an ‘additional-methods’ file that defines a few extra validation rules. You also need the metadata plugin to decode the string with the validation rules.

echo $this->Html->script('jquery-1.7.2.min');
echo $this->Html->script('jquery.validate.min');
echo $this->Html->script('additional-methods.js');
echo $this->Html->script('jquery.metadata');

Then add the helper in your controller

public $helpers = array( 'Html','Form', 'Js' => array('Jquery'), 'JqueryValidation' );

When you create a dialog you need to provide a special class that is used in the javascript to detect which forms to validate:

echo $this->Form->create('Order', array('class' => 'jquery-validation'));

Then for each element that you want to validate, use the helper function for the input:

echo $this->JqueryValidation->input('serial', $options);

This function just calls the Form->input after modifying the options array.

Here is the code for the helper. This is still a work in progress so there are a couple of Cake validation rules that I don’t have working, so feel free to update or add new rules. The good news is the basic validation rules are covered with very little additional work. Note that it only works for multiple rules per field format.

App::uses('AppHelper', 'View/Helper');

class JqueryValidationHelper extends AppHelper {

  public $helpers = array('Form');

  #-- Map to replace constants with jquery and class info
  #-- Pass as $options['jquery-validate']
  public $options = array(
      'map' => array(
          '__formSelector__' => '.jquery-validation',
          '__errorElement__' => 'span',
          '__errorClass__' => 'help-block',
          '__hilightClass__' => 'form-error',
          '__closestSelector__' => '.control-group',
          '__closestErrorClass__' => 'error'
      )
  );
  private $validation_messages = array();
  private $js = "
    $(document).ready(function(){
      $('__formSelector__').each( function(index) {
        $(this).validate({
          'errorElement': '__errorElement__',
          'errorClass': '__errorClass__',
          'highlight': function(element,errorClass) {
            $(element)
            .siblings().remove();
            $(element)
            .addClass('__hilightClass__')
            .closest('__closestSelector__').addClass('__closestErrorClass__');
          },
          'unhighlight': function(element,errorClass) {
            $(element)
            .removeClass('__hilightClass__')
            .closest('__closestSelector__').removeClass('__closestErrorClass__')
          },
        });
      });
    });";

  /**
   * input
   *
   * Routine to mimic form helper in order to get needed info.
   *
   * @param type $fieldName
   * @param type $options
   */
  public function input($fieldName, $options = array()) {

    $map = $this->options['map'];
    if (isset($options['jquery-validate'])) {
      if (isset($options['jquery-validate']['map'])) {
        $map = array_merge($map, $options['jquery-validate']['map']);
      }
      unset($options['jquery-validate']);
    }
    $model = $this->Form->defaultModel;
    $meta = $this->meta($model, $fieldName);
    if (!empty($options['class'])) {
      $options['class'] .= ' {' . $meta . '}';
    } else {
      $options['class'] = $meta;
    }
    $response = '';
    #-- Inlcude the js if needed
    if (!empty($this->js)) {
      $formatted_js = strtr($this->js, $map);
      $response .= "<script type=\"text/javascript\">" . $formatted_js . "</script>";
      $this->js = '';
    }
    $response .= $this->Form->input($fieldName, $options);
    return $response;
  }

  /**
   * meta
   *
   * Returns a meta string to be added to the class of a dialog input
   *
   * @param type $model
   * @param type $field
   * @return string
   */
  public function meta($model, $field) {
    $model_object = new $model();
    foreach ($model_object->validate as $validateField => $validateItem) {
      CakeLog::write('debug', 'JqueryValidate->meta: validateField=' . $validateField);
      if ($field == $validateField) {
        if (is_array($validateItem)) {
          CakeLog::write('debug', 'JqueryValidate->meta: validateItem=' . print_r($validateItem, true));
          foreach ($validateItem as $validateName => $validateParams) {
            if (!empty($validateParams['rule'])) {
              $rule = $validateParams['rule'];
              CakeLog::write('debug', 'JqueryValidate->meta: $rule=' . print_r($rule, true));

              if (is_array($rule)) {
                $msg = $rule[0];
              } else {
                $msg = $rule;
              }
              if (!empty($validateParams['message'])) {
                $msg = $validateParams['message'];
              }
              $ruleName = $rule[0];
              CakeLog::write('debug', 'JqueryValidate->meta: ruleName=' . $ruleName);
              $methodName = 'jquery_validate_' . $ruleName;
              if (method_exists($this, $methodName)) {
                $meta[] = $this->$methodName($model, $field, $rule, $msg);
                CakeLog::write('debug', 'JqueryValidate->meta: $meta=' . $meta);
              } else {
                CakeLog::write('debug', 'JqueryValidate->meta: function $ruleName not found');
              }
            }
          }
        }
      }
    }
    if (is_array($meta)) {
      $messages_str = '';
      if (is_array($this->validation_messages)) {
        $messages_str = implode($this->validation_messages, ', ');
      }
      $meta_str = implode($meta, ', ');
      return "'rules': {" . $meta_str . ", 'messages': { " . $messages_str . "}}";
    } else {
      return '';
    }
  }
/**
 *  Various functions to convert a CakePHP validation to a Jquery Validate meta tag
 */
  private function jquery_validate_alphaNumeric($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->date: params=' . print_r($params, true));
    $this->validation_messages[] = "date: '" . $msg . "'";
    return "'date': true";
  }

  private function jquery_validate_between($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->between: params=' . print_r($params, true));
    $this->validation_messages[] = "between: '" . $msg . "'";
    return "'min': " . $params[1] . ", 'max': " . $params[2];
  }

  private function jquery_validate_blank($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->blank: params=' . print_r($params, true));
    $this->validation_messages[] = "rangelength: '" . $msg . "'";
    return "'rangelength': [0, 0]";
  }

  private function jquery_validate_boolean($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->boolean: params=' . print_r($params, true));
    return '';
    $this->validation_messages[] = "boolean: '" . $msg . "'";
    return "'boolean': true";
  }

  private function jquery_validate_cc($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->cc: params=' . print_r($params, true));
    $this->validation_messages[] = "creditcard: '" . $msg . "'";
    return "'creditcard': true";
  }

  private function jquery_validate_comparison($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->comparison: params=' . print_r($params, true));
    $op = $params[1];
    $value = $params[2];
    switch ($op) {
      case '>':
        $value++;
        $this->validation_messages[] = "'min': '" . $msg . "'";
        return "'min': " . $value;
        break;
      case '>=':
        $this->validation_messages[] = "'min': '" . $msg . "'";
        return "'min': " . $value;
        break;
      case '<':
        $value--;
        $this->validation_messages[] = "'max': '" . $msg . "'";
        return "'max': " . $value;
        break;
      case '<=':
        $this->validation_messages[] = "'max': '" . $msg . "'";
        return "'max': " . $value;
        break;
      case '!=':
        $value++;
        $this->validation_messages[] = "'min': '" . $msg . "'";
        $str = "'min': " . $value;
        $value = $value - 2;
        $this->validation_messages[] = "'max': '" . $msg . "'";
        return $str . ", 'max': " . $value;
        break;
      default:
        return '';
    }
  }

  private function jquery_validate_date($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->date: params=' . print_r($params, true));
    $this->validation_messages[] = "date: '" . $msg . "'";
    return "'date': true";
  }

  private function jquery_validate_datetime($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->datetime: params=' . print_r($params, true));
    return '';
    $this->validation_messages[] = "datetime: '" . $msg . "'";
    return "'datetime': true";
  }

  private function jquery_validate_decimal($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->decimal: params=' . print_r($params, true));
    $this->validation_messages[] = "number: '" . $msg . "'";
    return "'number': true";
  }

  private function jquery_validate_email($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->email: params=' . print_r($params, true));
    $this->validation_messages[] = "email: '" . $msg . "'";
    return "'email': true";
  }

  private function jquery_validate_equalTo($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->equalTo: params=' . print_r($params, true));
    $this->validation_messages[] = "equalTo: '" . $msg . "'";
    return "'equalTo': '" . Inflector::camelize($model) . Inflector::camelize($params[1]) . "'";
  }

  private function jquery_validate_extension($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->extension: params=' . print_r($params, true));
    $this->validation_messages[] = "accept: '" . $msg . "'";
    return "'accept': '" . implode($params[1], "|") . "'";
  }

  private function jquery_validate_inList($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->inList: params=' . print_r($params, true));
    return '';
    $this->validation_messages[] = "inList: '" . $msg . "'";
    return "'inList': true";
  }

  private function jquery_validate_ip($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->ip: params=' . print_r($params, true));
    $this->validation_messages[] = "ipv4: '" . $msg . "'";
    return "'ipv4': true";
  }

  private function jquery_validate_luhn($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->luhn: params=' . print_r($params, true));
    return '';
    $this->validation_messages[] = "luhn: '" . $msg . "'";
    return "'luhn': true";
  }

  private function jquery_validate_maxLength($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->maxLength: params=' . print_r($params, true));
    $this->validation_messages[] = "'maxlength': '" . $msg . "'";
    return "'maxlength': " . $params[1];
  }

  private function jquery_validate_minLength($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->minLength: params=' . print_r($params, true));
    $this->validation_messages[] = "'minlength': '" . $msg . "'";
    return "'minlength': " . $params[1];
  }

  private function jquery_validate_money($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->money: params=' . print_r($params, true));
    return '';
    $this->validation_messages[] = "money: '" . $msg . "'";
    return "'money': true";
  }

  private function jquery_validate_notEmpty($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->notEmpty: params=' . print_r($params, true));
    $this->validation_messages[] = "required: '" . $msg . "'";
    return "'required': true";
  }

  private function jquery_validate_numeric($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->numeric: params=' . print_r($params, true));
    $this->validation_messages[] = "number: '" . $msg . "'";
    return "'number': true";
  }

  private function jquery_validate_naturalNumber($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->naturalNumber: params=' . print_r($params, true));
    $this->validation_messages[] = "digits: '" . $msg . "'";
    return "'digits': true";
  }

  private function jquery_validate_required($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->required: params=' . print_r($params, true));
    $this->validation_messages[] = "required: '" . $msg . "'";
    return "'required': true";
  }

  private function jquery_validate_phone($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->phone: params=' . print_r($params, true));
    $this->validation_messages[] = "phoneUS: '" . $msg . "'";
    return "'phoneUS': true";
  }

  private function jquery_validate_postal($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->postal: params=' . print_r($params, true));
    $this->validation_messages[] = "minlength: '" . $msg . "'";
    $this->validation_messages[] = "maxlength: '" . $msg . "'";
    return "'minlength': 5, 'maxlength': 5";
  }

  private function jquery_validate_range($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->range: params=' . print_r($params, true));
    $this->validation_messages[] = "min: '" . $msg . "'";
    $this->validation_messages[] = "max: '" . $msg . "'";
    return "'min': " . $params[1] . ", 'max': " . $params[2];
  }

  private function jquery_validate_ssn($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->ssn: params=' . print_r($params, true));
    $this->validation_messages[] = "minlength: '" . $msg . "'";
    $this->validation_messages[] = "maxlength: '" . $msg . "'";
    return "'minlength': 9, 'maxlength': 9";
  }

  private function jquery_validate_time($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->time: params=' . print_r($params, true));
    $this->validation_messages[] = "time: '" . $msg . "'";
    return "'time': true";
  }

  private function jquery_validate_url($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->url: params=' . print_r($params, true));
    $this->validation_messages[] = "url: '" . $msg . "'";
    return "'url': true";
  }

  private function jquery_validate_uuid($model, $field, $params, $msg) {
    CakeLog::write('debug', 'JqueryValidate->uuid: params=' . print_r($params, true));
    return '';
    $this->validation_messages[] = "uuid: '" . $msg . "'";
    return "'uuid': true";
  }
}
]]>
Thu, 11 Oct 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/10/09/JSON-with-your-tables.html https://bakery.cakephp.org/2012/10/09/JSON-with-your-tables.html <![CDATA[JSON with your tables]]> JSON with your tables

Be able to easily save and retrieve PHP arrays to/from a database’s column Have you ever needed to save a PHP array into your database? Well, this behavior is for that. You won’t have to worry about encoding (when saving) and decoding (when retrieving) your data.

Behavior code below.

How to use in your model:

<?php
class Recipe extends AppModel{

    public $actsAs = array(
        'JsonColumn' => array(
            'fields' => array('additional_info') /** add the fields you wanna encode here **/
        )
    );
?>

That’s it! Now when you save/retrieve data the magic will happens:

<?php class RecipesController extends AppController {
    public function save(){
         // add some fake data here. This could come from a submit/form, for instance
         $this->request->data('Recipe.additional_info', array('flavor' => 'strawberries', 'type' => 'cake'));
         $this->Recipe->save($this->request->data);
    }
}

This will save the following json data into the “additional_info” column:

{"flavor":"strawberries","type":"cake"}

And the following:

$this->Recipe->findById(1);

Will result in:

Array
(
    [Recipe] => Array
        (
            [id] => 1
            [additional_info] => Array
                (
                    [flavor] => strawberries
                    [type] => cake
                )

             ...
            [created] => 2012-10-09 16:46:11
            [updated] => 2012-10-09 16:46:11
        )

)

JsonColumnBehavior.php

<?php
/**
 * Be able to easily save and retrieve PHP arrays to/from a database's column
 *
 * @author Lucas Pelegrino <lucas.wxp@gmail.com>
 */
class JsonColumnBehavior extends ModelBehavior {
/**
 * The default options for the behavior
 *
 * @var array
 * @access public
 */
    public $settings = array(
        'fields' => array()
    );

/**
 * Setup the behavior.
 *
 * @param object $model Reference to model
 * @param array $settings Settings
 * @return void
 * @access public
 */
    public function setup(Model $model, $settings) {
        $this->settings = array_merge($this->settings, $settings);
    }

/**
 *
 * @param object $model Reference to model
 * @access public
 */
    public function beforeSave(Model $model) {
        foreach($this->settings['fields'] as $field){
            if(isset($model->data[$model->alias][$field]))
                $model->data[$model->alias][$field] = $this->_encode($model->data[$model->alias][$field]);
        }
            return true;
    }


/**
 *
 * @param object $model Reference to model
 * @access public
 */
    public function afterFind(Model $model, $results) {
        foreach($results as $i => &$res){
            foreach($this->settings['fields'] as $field){
                if(isset($res[$model->alias][$field]))
                    $res[$model->alias][$field] = $this->_decode($res[$model->alias][$field]);
            }
        }
        return $results;
    }

/**
 * Encode json
 *
 * @param $data
 * @return mixed
 */
    protected function _encode($data){
        return json_encode($data);
    }

/**
 * Decode json
 *
 * @param $data
 * @return mixed
 */
    protected function _decode($data){
        $decode = json_decode($data);
        return is_object($decode) ? (array)$decode : $decode;
    }
}
?>

Have fun!

]]>
Tue, 09 Oct 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/10/09/CakePHP-2-2-3-released.html https://bakery.cakephp.org/2012/10/09/CakePHP-2-2-3-released.html <![CDATA[CakePHP 2.2.3 released]]> CakePHP 2.2.3 released

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.2.3

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.2.3[1]. This is a bugfix/maintenance release for the 2.2.x release branch. Since the release of 2.2.2, there have been 65 commits, and over 70 tickets closed. A short list of the changes you can expect are:

  • virtualField quoting around - was improved again.
  • Errors for SchemaShell and missing schema files/classes were improved.
  • The URL /0 is now properly handled.
  • Model options are now properly forwarded in PaginatorHelper::_pagingLinks().
  • Required field detection in FormHelper was improved.
  • Permission denied redirects in AuthComponent are now relative to the application host.
  • Multiple select boxes now work better with SecurityComponent.
  • Radio buttons with falsey values now select correctly.
  • Exceptions raised in AppController::beforeRender() no longer cause infinite loops.
  • CakeEmail’s autogenerated Message-ID headers no longer contain port numbers.
  • Multiple extensions in layouts that contain elements, now works as expected.
  • Issues where scoped loggers would recieve all messages of matching types was corrected.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP. Download a packaged release [2]

]]>
Tue, 09 Oct 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/09/22/ConfigAdmin-Administration-of-Custom-Configuration-File.html https://bakery.cakephp.org/2012/09/22/ConfigAdmin-Administration-of-Custom-Configuration-File.html <![CDATA[ConfigAdmin - Administration of Custom Configuration File]]> ConfigAdmin - Administration of Custom Configuration File

ConfigAdmin Pulgin is management of custom configuration file. > This is created on top of available functionality in cakephp 2.1<br > Ref: https://book.cakephp.org/2.0/en/development/configuration.html #reading-and-writing-configuration-files > To use this plugin you must have cakephp version 2.1+. <br > This gives ability to end-user to modify key-value pairs in configuration file through simple UI design.

Installation & Usage

1. Download plugin from > 2. Copy Paste ~/plugin/ConfigAdmin folder to your app/Plugin folder. > 3. Copy Paste config_admin_codes.php file into app/Config folder. > 4. That’s it now you can test it. http: /your-project- name/config_admin/settings > If you are testing it on localhost then - Ex. localhost your_project/config_admin/settings > 5. Now you can use config_admin_codes.php file by loading it in your controller to set it in view.<br > 6. Load config_admin_codes at the top of controller. Read it in any of action wherever you want to use configuration file. > Ex. <code><span style=”color: #000000”> <br ><?php App::uses(‘AppController’,’Controller’); Configure::load(‘config_admin_codes’);//Lodingconfigfile classContactsControllerextendsAppController{ publicfunctionindex(){ $this->Contact->recursive=0; $this->set(‘contacts’,$this->paginate()); $codes=Configure::read(‘config_admin_codes’);//Readingconfigfile $this->set($codes);//settingconfigvaluestoview } } ?>

Contact

Email: developers@maxbohr.com

]]>
Sat, 22 Sep 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/09/09/Multistep-forms.html https://bakery.cakephp.org/2012/09/09/Multistep-forms.html <![CDATA[Multistep forms]]> Multistep forms

One of the features I really love about PHP frameworks is form management. Coding forms in plain PHP can easily become a pain if not well planned out. Multistep forms take this complexity even further, especially when you care about user experience. In this tutorial you’ll be amazed by how much little code can manage a whole full featured multistep form when taking advantage of CakePHP powerful classes. We’ll build the form in only 60 lines of controller code. Original article here, with better syntax highlighting.

The form will have the following features:

  • automagical data management
  • flexible steps control
  • back and forth buttons
  • progress indicator
  • data validation and error messages

For this demo we’ll create a sort of social network style user registration page with four steps and very few fields. We won’t deal with CSS styling since this is not the focus of this tutorial. Complete source is available for download.

Create model and table

Run the following query to create our database table, where we are going to store each submission data. Saving to multiple (related) models is not a problem and should require very little adaption.

CREATE TABLE `users` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `created` datetime DEFAULT NULL,
 `modified` datetime DEFAULT NULL,
 `username` varchar(99) DEFAULT NULL,
 `password` varchar(99) DEFAULT NULL,
 `first_name` varchar(99) DEFAULT NULL,
 `last_name` varchar(99) DEFAULT NULL,
 `mobile` varchar(20) DEFAULT NULL,
 `sex` varchar(6) DEFAULT NULL,
 `birthdate` date DEFAULT NULL,
 `city` varchar(99) DEFAULT NULL,
 `zip` varchar(5) DEFAULT NULL,
 `about` longtext,
 `interests` longtext,
 `job` longtext,
 PRIMARY KEY (`id`)
)

Now let’s create a basic User class with some validation rules at Model/User.php:

class User extends AppModel {
    var $validate = array(
            'username' => array(
                    'unique' => array(
                            'rule' => 'isUnique',
                            'message' => 'User already registered'
                    ),
                    'email' => array(
                            'rule' => 'email',
                            'message' => 'Username must be a valid email address'
                    )
            ),
            'password' => array(
                    'rule' => array('minLength', 6),
                    'message' => 'Minimum six characters please'
            ),
            'first_name' => array(
                    'rule' => 'notEmpty',
                    'message' => 'required field'
            ),
            'last_name' => array(
                    'rule' => 'notEmpty',
                    'message' => 'required field'
            ),
            'mobile' => array(
                    'rule' => 'notEmpty',
                    'message' => 'required field'
            ),
            'birthdate' => array(
                    'rule' => 'notEmpty',
                    'message' => 'required field'
            ),
            'city' => array(
                    'rule' => 'notEmpty',
                    'message' => 'required field'
            ),
            'zip' => array(
                    'numeric' => array(
                            'rule' => 'numeric',
                            'message' => 'zip code can contain only numeric values'
                    ),
                    'lenght' => array(
                            'rule' => array('between', 5,5),
                            'message' => 'zip code must be 5 digits long'
                    )
            )
    );
}

The controller

This is the really interesting part. Using this method, we will have a single method managing write to session/database and validation of every step . A specific view file for each step will be loaded by the controller based on a parameter from the URL. The total number of steps is dynamically calculated by counting the number of view files that start with “msf_step_” (we will name msf_step_1.ctp and so on). If you don’t like this level of dynamicity you can just hardcode the value in your controller’s beforeFilter. Of course, we will also implement a series of checks to prevent users playing with the URL , to arbitrarily skip the steps or load non existent views. Another time saving feature of CakePHP is the ability to restore previously submitted data to the same form with just a single command . In our case, data is saved and retrieved, on each step, using Cake’s Session class. Ok, here is the code of Controller/UsersController.php. Everything is explained in the comments!

class UsersController extends AppController {

    /**
     * use beforeRender to send session parameters to the layout view
     */
    public function beforeRender() {
            parent::beforeRender();
            $params = $this->Session->read('form.params');
            $this->set('params', $params);
    }

    /**
     * delete session values when going back to index
     * you may want to keep the session alive instead
     */
    public function msf_index() {
            $this->Session->delete('form');
    }

    /**
     * this method is executed before starting the form and retrieves one important parameter:
     * the form steps number
     * you can hardcode it, but in this example we are getting it by counting the number of files that start with msf_step_
     */
    public function msf_setup() {
            App::uses('Folder', 'Utility');
            $usersViewFolder = new Folder(APP.'View'.DS.'Users');
            $steps = count($usersViewFolder->find('msf_step_.*\.ctp'));
            $this->Session->write('form.params.steps', $steps);
            $this->Session->write('form.params.maxProgress', 0);
            $this->redirect(array('action' => 'msf_step', 1));
    }

    /**
     * this is the core step handling method
     * it gets passed the desired step number, performs some checks to prevent smart users skipping steps
     * checks fields validation, and when succeding, it saves the array in a session, merging with previous results
     * if we are at last step, data is saved
     * when no form data is submitted (not a POST request) it sets this->request->data to the values stored in session
     */
    public function msf_step($stepNumber) {

            /**
             * check if a view file for this step exists, otherwise redirect to index
             */
            if (!file_exists(APP.'View'.DS.'Users'.DS.'msf_step_'.$stepNumber.'.ctp')) {
                    $this->redirect('/users/msf_index');
            }

            /**
             * determines the max allowed step (the last completed + 1)
             * if choosen step is not allowed (URL manually changed) the user gets redirected
             * otherwise we store the current step value in the session
             */
            $maxAllowed = $this->Session->read('form.params.maxProgress') + 1;
            if ($stepNumber > $maxAllowed) {
                    $this->redirect('/users/msf_step/'.$maxAllowed);
            } else {
                    $this->Session->write('form.params.currentStep', $stepNumber);
            }

            /**
             * check if some data has been submitted via POST
             * if not, sets the current data to the session data, to automatically populate previously saved fields
             */
            if ($this->request->is('post')) {

                    /**
                     * set passed data to the model, so we can validate against it without saving
                     */
                    $this->User->set($this->request->data);

                    /**
                     * if data validates we merge previous session data with submitted data, using CakePHP powerful Hash class (previously called Set)
                     */
                    if ($this->User->validates()) {
                            $prevSessionData = $this->Session->read('form.data');
                            $currentSessionData = Hash::merge( (array) $prevSessionData, $this->request->data);

                            /**
                             * if this is not the last step we replace session data with the new merged array
                             * update the max progress value and redirect to the next step
                             */
                            if ($stepNumber < $this->Session->read('form.params.steps')) {
                                    $this->Session->write('form.data', $currentSessionData);
                                    $this->Session->write('form.params.maxProgress', $stepNumber);
                                    $this->redirect(array('action' => 'msf_step', $stepNumber+1));
                            } else {
                                    /**
                                     * otherwise, this is the final step, so we have to save the data to the database
                                     */
                                    $this->User->save($currentSessionData);
                                    $this->Session->setFlash('Account created!');
                                    $this->redirect('/users/msf_index');
                            }
                    }
            } else {
                    $this->request->data = $this->Session->read('form.data');
            }

            /**
             * here we load the proper view file, depending on the stepNumber variable passed via GET
             */
            $this->render('msf_step_'.$stepNumber);
    }
}

The views

This is the easiest part. Here is the content of each step view.

// View/Users/msf_step_1.ctp
echo $this->Form->create('User');
echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->input('first_name');
echo $this->Form->input('last_name');
echo $this->Form->end('Next step');

// View/Users/msf_step_2.ctp
echo $this->Form->create('User');
echo $this->Form->input('birthdate');
echo $this->Form->input('sex');
echo $this->Form->input('mobile');
echo $this->Html->link('Previous step',
    array('action' => 'msf_step', $params['currentStep'] -1),
    array('class' => 'button')
);
echo $this->Form->end('Next step');

// View/Users/msf_step_3.ctp
echo $this->Form->create('User');
echo $this->Form->input('city');
echo $this->Form->input('zip');
echo $this->Html->link('Previous step',
    array('action' => 'msf_step', $params['currentStep'] -1),
    array('class' => 'button')
);
echo $this->Form->end('Next step');


// View/Users/msf_step_4.ctp
echo $this->Form->create('User');
echo $this->Form->input('about');
echo $this->Form->input('interests');
echo $this->Form->input('job');
echo $this->Html->link('Previous step',
    array('action' => 'msf_step', $params['currentStep'] -1),
    array('class' => 'button')
);
echo $this->Form->end('Save');
?>

// View/Users/msf_index.ctp
echo $this->Html->link('Start form >', array('action' => 'msf_setup'));

A little bit of editing of the layout file is needed to display the progress indicator, which also provides link functionality, allowing to users to jump back and forth. Place this code in your layout file where you want the progress indicator to appear.

for ($i=1; $i <= $params['steps']; $i++) {
    if ($i > $params['maxProgress'] + 1) {
            echo 'Step '.$i.'';
    } else {
            $class = ($i == $params['currentStep']) ? 'active' : 'normal';
            echo $this->Html->link('Step '.$i,
                    array('action' => 'msf_step', $i),
                    array('class' => $class)
            );
    }
}

Some CSS styling is required to properly display the indicator, and you can find my version in the zipped source.

Conclusion

This is just an example of how much CakePHP can help you write less and better code. I hope you liked it! Share your thoughts using the comments below.

]]>
Sun, 09 Sep 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/09/08/Google-Maps-Helper.html https://bakery.cakephp.org/2012/09/08/Google-Maps-Helper.html <![CDATA[Google Maps Helper]]> Google Maps Helper

# Google Maps Helper for CakePHP 2.x Helper for CakePHP framework that integrates a Google Map in your view using Google Maps API V3.

Installation

  1. Place the helper into app/View/Helper/GoogleMapHelper.php
  2. Add this line into the controller : `php public $helpers = array('GoogleMap'); //Adding the helper `
  3. Then we need to add the necessary Javascript files into the view : `php<?= $this->Html->script('`http://maps.google.com/maps/api/js?sen sor=true',`_ false); ?> ` Note that the API key is not required but it you may want to add it if you want to monitor your usage or to buy additional usage quota. To add the api key: `php<?= $this->Html->scr ipt('`http://maps.google.com/maps/api/js?key=YOUR_API_KEY&sensor=true' ,`_ false); ?> `

Usage

Print the map to your view `phpGoogleMap->map(); ?> `

Map Options

Below are the options available to set to your map:

**id:** Map
canvas id * **width:** Map width * **height:** Map height * **style:**
Map canvas CSS style * **zoom:** Map zoom * **type:** Type of map -
`ROADMAP`, `SATELLITE`, `HYBRID` or `TERRAIN` * **custom:** Any other
map option not mentioned before and available for the map. For example
`mapTypeControl: true`. See more map options at:
https://developers.google.com/maps/documentation/javascript/controls *
**localize:** Boolean to localize your position or not. Overrides
'latitude' & 'longitude' and 'address' (Localize have priority versus
Latitude & Longitude and Address) * **latitude:** Default latitude if
the browser doesn't support localization or you don't want
localization (Latitude & Langitude have priority versus Address) *
**longitude:** Default longitude if the browser doesn't support
localization or you don't want localization (Latitude & Langitude have
priority versus Address) * **address:** Default address if the browser
doesn't support localization or you don't want localization (Latitude
& Langitude have priority versus Address) * **marker:** Boolean to put
a marker in your position or not * **markerTitle:** Marker title (HTML
title tag) * **markerIcon:** Default icon of the marker of your
position * **markerShadow:** Default icon' shadow of the marker of
your position * **infoWindow:** Boolean to show an information window
when you click your position marker or not * **windowText:** Default
text inside your position marker´s information window

In order modify any of the default options shown above you need to create your map passing the array as follows:

<?php
// Override any of the following default options to customize your map
$map_options = array(
    'id' => 'map_canvas',
    'width' => '800px',
    'height' => '800px',
    'style' => '',
    'zoom' => 7,
    'type' => 'HYBRID',
    'custom' => null,
    'localize' => true,
    'latitude' => 40.69847032728747,
    'longitude' => -1.9514422416687,
    'address' => '1 Infinite Loop, Cupertino',
    'marker' => true,
    'markerTitle' => 'This is my position',
    'markerIcon' => 'http://google-maps-icons.googlecode.com/files/home.png',
    'markerShadow' => 'http://google-maps-icons.googlecode.com/files/shadow.png',
    'infoWindow' => true,
    'windowText' => 'My Position'
);
?>

<?= $this->GoogleMap->map($map_options); ?>

Adding Markers

To add a marker use:

GoogleMap->addMarker($map_id, $marker_id,
$position); ?> ``` Where: * **$map_id** is the map canvas id
('map_canvas' by default) * **$marker_id** is the unique identifiyer
for that marker * **$position** could be a simple string with the
address or an array with latitude and longitude.
Example with address (using geolocation) ```php<?=
$this->GoogleMap->addMarker("map_canvas", 1, "1 Infinite Loop,
Cupertino, California");

Example with latitude and longitude:

<?= $this->GoogleMap->addMarker("map_canvas", 1, array('latitude' => 40.69847, 'longitude' => -73.9514)); ?>

Marker Options

There are some marker options available to customize the marker popup info window: * showWindow: Boolean to show or not the popup info window * windowText: Text to show inside the popup info window * markerTitle: Marker title (HTML title tag) * markerIcon: Marker icon * markerShadow: Marker icon shadow In order modify any of the default options shown above you need to create your marker passing the array as follows:

<? // Override any of the following default options to customize your
marker $marker_options = array( 'showWindow' => true, 'windowText' =>
'Marker', 'markerTitle' => 'Title', 'markerIcon' =>
'`http://labs.google.com/ridefinder/images/mm_20_purple.png',`_
'markerShadow' =>
'`http://labs.google.com/ridefinder/images/mm_20_purpleshadow.png',`_
); ?>

<?= $this->GoogleMap->addMarker("map_canvas", 1, "1 Infinite Loop,
Cupertino, California", $marker_options); ?>
]]>
Sat, 08 Sep 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/09/01/For-the-Core-Translation-Behavior-i18n.html https://bakery.cakephp.org/2012/09/01/For-the-Core-Translation-Behavior-i18n.html <![CDATA[For the Core Translation Behavior (i18n)]]> For the Core Translation Behavior (i18n)

I started using the Core Translation Behavior. I discovered that if I added a record, it was only being added in ONE language. I don’t know how other people create the records in the i18m table for the other languages, at the same time. What I did is a little hack on the TranslateBehavior’s afterSave, so if the record was $created it would be created in ALL languages I have defined in my core.php.

I have all the languages used in my App defined in core.php as

Configure::write('Config.languages', array(
    'spa' => __('Español', true),
    'eng' => __('English', true),
));

So it is easy to add them to a selectbox and select the language.

I first copied translate.php from CakePHP core files into my APP/models/behavior directory.

Then, the change in the translate.php afterSave method is as follows:

function afterSave(&$model, $created) {
      if (!isset($this->runtime[$model->alias]['beforeSave'])) {
        return true;
    }

    if ($created) {
        if (!($locales = Configure::read('Config.languages'))) {
            $locale = $this->_getLocale($model);
            $locales = array($locale => $locale);
        }
    } else {
        $locale = $this->_getLocale($model);
        $locales = array($locale => $locale);
    }

    foreach($locales as $locale => $localeName) {
        $tempData = $this->runtime[$model->alias]['beforeSave'];
        $conditions = array('model' => $model->alias, 'foreign_key' => $model->id);
        $RuntimeModel =& $this->translateModel($model);

        foreach ($tempData as $field => $value) {
            unset($conditions['content']);
            $conditions['field'] = $field;
            if (is_array($value)) {
                $conditions['locale'] = array_keys($value);
            } else {
                $conditions['locale'] = $locale;
                if (is_array($locale)) {
                    $value = array($locale[0] => $value);
                } else {
                    $value = array($locale => $value);
                }
            }
            $translations = $RuntimeModel->find('list', array('conditions' => $conditions, 'fields' => array($RuntimeModel->alias . '.locale', $RuntimeModel->alias . '.id')));
            foreach ($value as $_locale => $_value) {
                $RuntimeModel->create();
                $conditions['locale'] = $_locale;
                $conditions['content'] = $_value;
                if (array_key_exists($_locale, $translations)) {
                    $RuntimeModel->save(array($RuntimeModel->alias => array_merge($conditions, array('id' => $translations[$_locale]))));
                } else {
                    $RuntimeModel->save(array($RuntimeModel->alias => $conditions));
                }
            }
        }
    }
    unset($this->runtime[$model->alias]['beforeSave']);
}

I haven’t tried it much yet, but I think it work alright. Please, let me know if there’s a better way to do it… or if you have troubles…

]]>
Sat, 01 Sep 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/09/01/CakePHP-2-2-2-release.html https://bakery.cakephp.org/2012/09/01/CakePHP-2-2-2-release.html <![CDATA[CakePHP 2.2.2 release]]> CakePHP 2.2.2 release

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.2.2[1]. This is a bugfix/maintenance release for the 2.2.x release branch. Since the release of 2.2.1, there have been over 80 commits, and 39 tickets closed.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.2.2[1]. This is a bugfix/maintenance release for the 2.2.x release branch. Since the release of 2.2.1, there have been over 80 commits, and 39 tickets closed.

A short list of the changes you can expect are:

  • Configure::load() and Configure::dump() are now more consistent, and create a new PhpReader by default.
  • Error messaging is better for when fixture creation fails.
  • Logging on windows has been improved, and log levels are more correct.
  • Generated schema files no longer contain multiple primary keys.
  • Namespaced elements work correctly in the RssHelper now.
  • ( and ) are now correctly handled by TextHelper::autoLinkUrls()
  • Applications can now define LOGS and CACHE constants.
  • Recursive errors in debug() have been fixed in 5.2 and 5.3.
  • requestAction() now more correctly simulates GET requests, when the preceding request is a POST or PUT.
  • ModelValidator state is reset when models are created/saved.
  • Additional mimetypes added for Microsoft Office document formats.
  • Validation::decimal() reworked to fix a few edge cases.
  • Virtual fields containing - are quoted more correctly now.

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP.

]]>
Sat, 01 Sep 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/08/20/User-Management-Plugin-for-cakephp-2-x-version-2-0.html https://bakery.cakephp.org/2012/08/20/User-Management-Plugin-for-cakephp-2-x-version-2-0.html <![CDATA[User Management Plugin for cakephp 2.x version 2.0]]> User Management Plugin for cakephp 2.x version 2.0

I have launched a new version(2.0) of my plugin for user management. Demo at http://umpremium.ektasoftwares.com

This plugin is Basic need of your website. Basically It gives you all features which you need on starting your website or a project in cakephp 2.x framework.

It is very helpful for Beginners because of following features-

Clean code with coding standards
Proper documentations
Newbie will learn- a. How to write code in Cakephp? b. How to use CSRF/XSS protection in cakephp c. How to use SSL/HTTPS in cakephp for whole site as well as only some pages. d. How to use Ajax Pagination in cakephp. e. How to use Ajax Form Validations with File/Image in cakephp.

and many more. For all features,Beginners please have a look on http://developers.ektasoftwares.com/docs/umpremium/beginners.html

Experts will also learn many other things. For all features http://umpremium.ektasoftwares.com

You can start your project or a website in few minutes with this plugin because this plugin has all things which you can think in starting of your project.

The main features are-

Login with Facebook, Twitter, Linkedin, Four Square, Gmail, Yahoo.
All Configurations are database driven. No need to touch php code for config setting.
No need to hard code your site URL any where.
View Online users and guest and admin can take many action on online users.
SSL support for selected pages or whole site.
Most of the things are Ajax driven.

I cannot describe all features here so please have a look on demo at http://umpremium.ektasoftwares.com here you can find all features of this plugin.

]]>
Mon, 20 Aug 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/08/10/Like-plugin.html https://bakery.cakephp.org/2012/08/10/Like-plugin.html <![CDATA[Like plugin]]> Like plugin

Add a Facebook-like ‘Like’ feature to your CakePHP 2.x powered web application.

Installation

  1. Download the plugin and place it in app/Plugin

https://github.com/aschelch/cakephp-like-plugin/zipball/master

or via Git

git submodule add git://github.com/aschelch/cakephp-like-plugin.git app/Plugin/Like

2. Load the plugin by adding at the bottom of your file Config/bootstrap.php

CakePlugin::load('Like', array('routes' => true));
  1. Create the table using the shell command :
Console/cake Like.install
  1. Attach the Likeable behavior to the Model
public Post extends AppModel{
    $actsAs = array('Like.Likeable');
}

That’s all !

Usage

In the controller

Then to use it in your controller, you can do :

Like an item

$this->Post->like($post_id, $this->Auth->user('id'));

Dislike an item

$this->Post->dislike($post_id, $this->Auth->user('id'));

Find all items liked by an user

$this->Post->findLikedBy($this->Auth->user('id'));

Test if an user like an item

if($this->Post->isLikedBy($post_id, $this->Auth->user('id'))){...}

Find the most liked item

$this->Post->find('most_liked', array('limit'=>5));

In the view

Add the helper in your controller :

public PostController extends AppController{
    public $helpers = array('Like.Like');
}

And, in your view:

$this->Like->like('post', $post_id);
$this->Like->dislike('post', $post_id);
]]>
Fri, 10 Aug 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/08/09/FileStorage-plugin-with-optional-Image-Processing.html https://bakery.cakephp.org/2012/08/09/FileStorage-plugin-with-optional-Image-Processing.html <![CDATA[FileStorage plugin with optional Image Processing]]> FileStorage plugin with optional Image Processing

This plugin is giving you the possibility to store files in virtually any kind of storage backend. This plugin is wrapping the Gaufrette library (https://github.com/KnpLabs/Gaufrette) library in a CakePHP fashion and provides a simple way to use the storage adapters through the StorageManager class. Storage adapters are an unified interface that allow you to store file data to your local file system, in memory, in a database or into a zip file and remote systems. There is a database table keeping track of what you stored were.

Adapters

Included storage adapters through the Gaufrette vendor lib are

Local File System
Amazon S3
ACL Aware Amazon S3
Mogile FS
Rackspace Cloudfiles
Zip File
Ftp
Sftp
In Memory
Grid FS
Apc
Doctrine DBAL

You can always write your own adaper or extend and overload existing ones.

StorageManager::config('Local', array(
    'adapterOptions' => array(TMP, true),
    'adapterClass' => '\Gaufrette\Adapter\Local',
    'class' => '\Gaufrette\Filesystem'));

0 To configure adapters use the StorageManager::config method. First argument is the name of the config, second an array of options for that adapter B0x1A1 To invoke a new instance using a before set configuration call:

$Adapter = StorageManager::adapter('Local');

You can also call the adapter instances methods like this

StorageManager::adapter('Local')->write($key, $data);

Alternativly you can pass a config array as first argument to get an instance using these settings that is not in the configuration.

To delete configs and by this the instance from the StorageManager call

StorageManager::flush('Local');

If you want to flush all adapter configs and instances simply call it without the first argument.

How to store an uploaded file

The basic idea of this plugin is that files are always handled as separate entities and are associated to other models.

So for example let’s say you have a Report model and want to save a pdf to it, you would then create an association lile:

public $hasOne = array(
    'PdfFile' => array(
        'className' => 'FileStorage.FileStorage',
        'foreignKey' => 'foreign_key'));

In your add/edit report you would have something like:

echo $this->Form->input('Report.title');
echo $this->Form->input('PdfFile.file');
echo $this->Form->input('Report.description');

Now comes the crucial point of the whole implementation:

Because of to many different requirements and personal preferences out there the plugin is not automatically storing the file. You’ll have to customize it a little but its just a matter for a few lines.

Lets go by this scenario inside the report model, assuming there is an add() method:

$this->create()
if ($this->save($data)) {
    $key = 'your-file-name';
    if (StorageManager::adapter('Local')->write($key, file_get_contents($this->data['PdfFile']['tmp_name']))) {
        $this->data['PdfFile']['foreignKey'] = $this->getLastInsertId();
        $this->data['PdfFile']['model'] = 'Report';
        $this->data['PdfFile']['path'] = $key;
        $this->data['PdfFile']['adapter'] = 'Local';
    }
}

Later, when you want to delete the file, for example in the beforeDelete() or afterDelete() callback of your Report model, you’ll know the adapter you have used to store the attached PdfFile and can get an instance of this adapter configuration using the StorageManager. By having the path or key available you can then simply call:

StorageManager::adapter($data['PdfFile']['adapter'])->delete($data['PdfFile']['path']);

Insted of doing all of this in the model that has the files associated to it you can also simply extend the FileStorage model from the plugin and add your storage logic there and use that model for your association.

Why is it done like this?

Because every developer might want to store the file at a different point or apply other operations on the file before or after it is store. Based on different circumstances you might want to save an associated file even before you created the record its going to get attached to, in other scenarios like in this documentation you want to do it after.

The $key is also a key aspect of it: Different adapters might expect a different key. A key for the Local adapter is usally a path and a file name under which the data gets stored. Another adapter might require a UUID. That is also the reason why you use file_get_contents() instead of simply passing the tmp path as it is.

Download

You can get the plugin from https://github.com/burzum/FileStorage

I consider it as stable, I’ve used it for some time now without issue, we have it used in an internal CakeDC project without issues and I have not received a bug report yet from the 13 followers at this time.

If you find bugs or have suggestions please use the git issue tracker to report them.

]]>
Thu, 09 Aug 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/08/04/Alternate-way-to-save-HABTM-data-along-with-primary-model.html https://bakery.cakephp.org/2012/08/04/Alternate-way-to-save-HABTM-data-along-with-primary-model.html <![CDATA[Alternate way to save HABTM data along with primary model]]> Alternate way to save HABTM data along with primary model

The CakePHP documentation on saving HABTM data didn’t cover a use-case my app needed. My form submits a comma-separated list of associated- model ids to save with a user. With a little data-format massaging, I found a way to save it all with one call to Model->save(…).

My app has a schema with a User model and Equipment model that share a HABTM relationship. In other words, one or more users may be the go-to contacts for one or more pieces of equipment. Because there are already over 100 pieces of equipment, using a multi-select drop-down or checkboxes for Equipment on the User edit form might get awkward and unwieldy on what should be a simple form. So I took a different tack and used an auto-complete edit box. When the user types part of a name and selects a piece of equipment from the displayed matches, it shows that piece of equipment in the list of equipment already associated with that user along with a little “x” icon that will allow him to remove it again. Using the auto-complete box and the “x” image- links, he can add or remove equipment from the list until he is ready to submit the form.

When the user submits the form, a Javascript submit-event-handler generates an array of ids of the form “1,2,3,4…” and inserts it into a hidden field that gets submitted with the form.

So Controller->request->data will look something like this:

$data = array(
  'Equipment' => '37,97,98',
  'User' => array(
    'id' => '99',
    'username' => 'testuser1',
    'fullname' => 'Test User',
    'phone' => '222-2222',
    'email' => 'foo@bar.baz',
    'Role' => '2'
  ),
);

I need to convert that ‘Equipment’ element to this:

'Equipment' => array(37, 97, 98)

That’s easy:

$data['Equipment'] = array_split(',', $data['Equipment']);

Now I can save the User along with the list of equipment he’s related to:

$result = $this->User->save($data, array(
  'validate' => true,
  'fieldList' => null,
));

I’m taking the time to post this because I struggled with this for some time. The documentation seemed to indicate that I needed to post an array like this:

$data = array(
  'Equipment' => array(
      array('equipment_id' => 37),
      array('equipment_id' => 97),
      array('equipment_id' => 98),
  ),
  'User' => array(
    'id' => '1',
    'username' => 'testuser1',
    'fullname' => 'Test User',
    'phone' => '222-2222',
    'email' => 'foo@bar.baz',
    'Role' => '2'
  ),
);

That resulted in the Cake core generating one insert statement for equipment_id=37, followed by two update statements for id’s 97 and 98. So the final result would be that the query

select * from equipment_users where user_id = 99

would produce only

array(
(int) 0 => array(
    'equipment_users' => array(
        'equipment_id' => '98',
        'user_id' => '1'
    )
)
)

instead of the desired

array(
(int) 0 => array(
    'equipment_users' => array(
        'equipment_id' => '98',
        'user_id' => '1'
    )
),
(int) 1 => array(
    'equipment_users' => array(
        'equipment_id' => '37',
        'user_id' => '1'
    )
),
(int) 2 => array(
    'equipment_users' => array(
        'equipment_id' => '97',
        'user_id' => '1'
    )
)
)

I hope this helps someone. I also hope that one of the regular contributors to the CakePHP documentation can work with me to find a way to include this use-case in the chapter on Saving Your Data.

]]>
Sat, 04 Aug 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/07/31/Integrating-cakephp-with-OpenId.html https://bakery.cakephp.org/2012/07/31/Integrating-cakephp-with-OpenId.html <![CDATA[Integrating cakephp with OpenId]]>

Integrating cakephp with OpenId

this article tells how to integrate openid with your cake……….

Click To View Complete Tutorial

Today everyone is in a rapid hustle. So mostly internet users find registration process as very time consuming. Sometimes they might leave your web product if they just want to avoid that annoying registration process. So a very good alternative to this is using `OpenId`_. OpenId is a great way to make your authentication system even more flexible. To implement this feature we must have a basic working authentication system. Click to know how to build basic authentication system.

Prerequisites

First of all your PHP must have OpenID Library. You can download it from this here. When you are done with downloading library then extract the folder named as Auth into your web application’s /app/vendors/ folder. Note: folder is /app/vendors/ not /vendors/ which is in root of your web app besides your app folder. Second you must have OpenId plugin for Cakephp. To download this plugin follow this link. Now similarly extract this download to your /app/plugins/ folder. After extracting you will have openid folder inside your /app/plugins/.

Coding

  • First of all you need to replace that OpenId’s Auth component with cakephp’s default Auth component. To do that edit your ` appcontroller.php` file. By implementing below code will extend Auth component functionality. One thing that is very important here is that you still have power of old Auth Component. You can still use it’s variables and functions i.e ` $this->Auth->allow(“*”);`
var $components = array(
      'Openid.OpenAuth'
);
  • Now you need to edit your ` login.ctp` view file. When below form is submitted then Auth component will try to login user with username and password field. But if it failed to login with username and password then it will check whether OpenId URL is specified or not. If this happens then it will attempt to authenticate URL against OpenID server. If permission granted then OpenAuth component will add user to the session. <?php echo$this->Form->create(array(‘action’=>’login’)); echo$this->Form->input(array(‘openid’=>array(‘label’=>’OpenIDURL’))); echo$this->Form->input(‘username’); echo$this->Form->input(‘password’); echo$this->Form->end(‘Login’); ?>

Final words

This is it, after this all we have working authentication system with OpenId.

]]>
Tue, 31 Jul 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/07/31/CakeFest-2012-Only-30-days-until-CakeFest.html https://bakery.cakephp.org/2012/07/31/CakeFest-2012-Only-30-days-until-CakeFest.html <![CDATA[CakeFest 2012 - Only 30 days until CakeFest!]]> CakeFest 2012 - Only 30 days until CakeFest!

With only 30 days remaining until CakeFest 2012, now is the best time to secure your tickets and book your travel!

Organising CakeFest 2012 has been a thrilling experience. We’ve got plenty of interesting talks lined up, sponsors attending the event, and some kickass keynotes to be delivered.

On top of that, the team have been (secretly) designing a special CakePHP CakeFest 2012 T-Shirt that attendees will be able to get a peek at during the conference.

I’m always excited by the leadup to CakeFest, and this year is no different. We have talks from all over the world, and we have a great schedule lined up.

If you have not purchased your ticket for CakeFest yet, we strongly suggest doing this as soon as possible, in addition to booking any required accommodation to ensure that you don’t miss out. For those that are interested in cheaper accommodation close to the conference; the Manchester Conference Centre where the event is being hosted, offers student accommodation rooms. You don’t need to be a student to book them, they are just basic accommodation, at a cheap rate. This is tehe best way to experience CakeFest at a reduced cost. Besides, most of your time will be spent at the conference, or at the bar!

NOTE: The student rooms are listed as “Weston Hall” when making a booking.

Again, I am excited to be attending and organising this event, and I am keen to catch up with the regulars, as well as meet lots of new faces in the CakePHP community.

See you in Manchester for CakeFest 2012!

Link: CakeFest website

Link: Manchester Conference Centre

]]>
Tue, 31 Jul 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/07/28/Auth-Component-of-Cakephp-Demystified-Part-2.html https://bakery.cakephp.org/2012/07/28/Auth-Component-of-Cakephp-Demystified-Part-2.html <![CDATA[Auth Component of Cakephp Demystified Part-2]]>

Auth Component of Cakephp Demystified Part-2

Auth Component Variables Properly explained….

Jump to Auth Component of Cakephp Demystified Part-1

In our previous post, we learned how to implement a very basic but effective authentication system to make secure areas in our web application. Here the thing is that you could make complex and better authentication system, which we will be doing in our next post of this series. To do that we need to learn basic parts of our Auth component. In this post we will only cover variables and in next post we will discuss important functions.

Variables which are mostly used.

  • string $authError = null It is of string type and mainly used to provide error messages when a user attempts to access an area to which he doesn’t have the permission to access. You can set this in beforeFilter() or as arguments to Auth component. Example :
function beforeFilter()
{
        $this->Auth->authError="You don't have access to that area. Please login first.";
}
  • boolean $autoRedirect = true It determines whether AuthComponent will automatically redirect and exit if login is successful. The importance of this variable is that if you have custom code (cookies, last login) in your login() action which you want to execute then you need to set it to false, so Auth doesn’t auto redirect. If it is set to true then whatever code you have in your login() is not executed. Example :
function beforeFilter()
{
      $this->Auth->autoRedirect=false;
}

function login()
{
if($this->Auth->user()!=null)
       {
             $this->User->id=$this->Auth->user('id');
             $current = date("F j, Y, g:i a");
             $this->User->saveField('last_login',$current);
             $this->redirect(array('controller'=>'users','action'=>'profile'));
        }
}
  • array $data = array() This variable holds form data of controller. Example :
function login()
{
if($this->Auth->data['User']['username']!=null)
         {
               //your code;
           }
}
  • array $fields = array(‘username’ => ‘username’, ‘password’ => ‘password’) It allows us to tell Auth that against which fields of our Model it needs to validate users. By default it is username and password. But suppose if someone have fields in database table as email and secret_word and he wants to use these fields for authentication, then we need this variable. Example :
function beforeFilter()
{
 $this->Auth->fields=array('username'=>'email','password'=>'secret_word');
}
  • mixed $loginAction = null This variable holds login action URL, by default it is login(). But if we have some other function which is handling our login process then we need to provide path in this variable. We can set url with the help of string or using array(); Example :
function beforeFilter()
{
//using string
 $this->Auth->loginAction="/users/authenticate";
//or using array notation
 $this->Auth->loginAction=array('controller'=>'users','action'=>'authenticate');
}
  • string $loginError = null Error to display when user login fails. For security purposes, only one error is used for all login failures, so as not to expose information on why the login failed. But we can also customize it in our login system. In views to output it we need to use session helper; i.e <?phpecho$this->Session->flash(‘Auth’);?> Example :
function beforeFilter()
{
  $this->Auth->loginError="Username or password entered is incorrect. Please try again.";
}
  • mixed $loginRedirect = null Normally, if a user is redirected to the $loginAction page, the location they were redirected from will be stored in the session so that they can be redirected back after a successful login. If this session value is not set, the user will be redirected to the page specified in $loginRedirect. Example :
function beforeFilter()
{
  $this->Auth->loginRedirect=array('controller'=>'users','action'=>'profile');;
}
  • mixed $logoutRedirect = null This holds URL of default action to be invoked as soon as user is logged out of the web application. This URL will be returned from logout() of AuthComponent. Example :
function beforeFilter()
{
  $this->Auth->logoutRedirect=array('controller'=>'pages','action'=>'home');
}
  • string $userModel = ‘User’ Suppose you have saved your users in a database table named as Clients or People, then we need to specify this to Auth component so that it can validate accordingly, if we don’t give this info it will look for users table, so that is wrong. Example :
function beforeFilter()
{
  $this->Auth->userModel="clients";
}
  • array $userScope = array() This is one of the most important variable i found to use. So where this can be used… basically AuthComponent only uses username and password to validate against. But suppose if you have three fields i.e usertype, username, password then this variable is very handy to use. So let us see how it is used. Below code will only validate admin type users. Another use of this could be like checking a user is activated or not in same way as below. Just replace ` ‘User.usertype’=>”admin”` with ` ‘User.activated’=>”1”` Example :
function beforeFilter()
{
     $this->Auth->userScope = array(
                                            'User.usertype' => "admin"
                                      );
}

Final words…

In this post we surfed through different variables (although this is not the complete list of variables) which can be used to customize behavior of AuthComponent. The next post is about functions of AuthComponent.
]]>
Sat, 28 Jul 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/07/27/Social-login-with-Hybridauth.html https://bakery.cakephp.org/2012/07/27/Social-login-with-Hybridauth.html <![CDATA[Social login with Hybridauth]]> Social login with Hybridauth

HybridAuth enable developers to easily build social applications to engage websites vistors and customers on a social level by implementing social signin, social sharing, users profiles, friends list, activities stream, status updates and more. HybridAuth goal is to act as an abstract api between your application and various social apis and identities providers such as Facebook, Twitter, MySpace and Google. This article hopefully can improve Hybridauth support for CakePHP

First of all : Sorry about my English, and this is my first post so correct this article if I’m doing wrong. :)

> <h1>Social login with Hybridauth< h1> Hybridauth extend our application to use social provider authentication in our application. It can combine with Auth component without any problem. The concept is simple (as far as i know), Hybridauth will authenticate using our social provider identity (like Facebook, Twitter, Google, etc..) then return an object to our application which we can use it as we want. ><br >

How to use

1. Download Hybridauth (stable version work with this article is version 2.0.11) > 2. Place hybridauth folder into our application webroot folder (app webroot/hybridauth) > 3. In Your UsersController add:<br >

session_start();

in top most of your controller. > Note: maybe You need to place session_start() in top most of your AppController if you’re using auth component<br > > then create functions: <pre> public function loginwith($provider) { / $this->autoRender = false; require_once( WWW_ROOT . ‘hybridauth/Hybrid/Auth.php’ ); $hybridauth_config = array( “base_url” => ‘http://’ . $_SERVER[‘HTTP_HOST’] . $this->base . “/hybridauth/”, // set hybridauth path “providers” => array( “Facebook” => array( “enabled” => true, “keys” => array(“id” => “your_fb_api_key”, “secret” => “fb_api_secret”), “scope” => ‘email’, ), “Twitter” => array( “enabled” => true, “keys” => array(“key” => “twitter_api_key”, “secret” => “twitter_api_secret”) ) // for another provider refer to hybridauth documentation ) ); try { // create an instance for Hybridauth with the configuration file path as parameter $hybridauth = new Hybrid_Auth($hybridauth_config); // try to authenticate the selected $provider $adapter = $hybridauth->authenticate($provider); // grab the user profile $user_profile = $adapter->getUserProfile(); //debug($user_profile); //uncomment this to print the object //exit(); //$this->set( ‘user_profile’, $user_profile ); //login user using auth component if (!empty($user_profile)) { $user = $this->_findOrCreateUser($user_profile, $provider); // optional function if you combine with Auth component unset($user[‘password’]); $this->request->data[‘User’] = $user; if ($this->Auth->login($this->request->data[‘User’])) { $this->redirect($this->Auth->redirect()); $this->Session->setFlash(‘You are successfully logged in’); } else { $this->Session->setFlash(‘Failed to login’); } } } catch (Exception $e) { // Display the recived error switch ($e->getCode()) { case 0 : $error = “Unspecified error.”; break; case 1 : $error = “Hybriauth configuration error.”; break; case 2 : $error = “Provider not properly configured.”; break; case 3 : $error = “Unknown or disabled provider.”; break; case 4 : $error = “Missing provider application credentials.”; break; case 5 : $error = “Authentification failed. The user has canceled the authentication or the provider refused the connection.”; break; case 6 : $error = “User profile request failed. Most likely the user is not connected to the provider and he should to authenticate again.”; $adapter->logout(); break; case 7 : $error = “User not connected to the provider.”; $adapter->logout(); break; } // well, basically you should not display this to the end user, just give him a hint and move on.. $error .= “Original error message: ” . $e->getMessage(); $error .= “Trace: ” . $e->getTraceAsString(); $this->set(‘error’, $error); } } // this is optional function to create user if not already in database. you can do anything with your hybridauth object private function _findOrCreateUser($user_profile = array(), $provider=null) { if (!empty($user_profile)) { $user = $this->User->find(‘first’, array(‘conditions’ => array( ‘OR’=>array(‘User.username’ => $user_profile->identifier, ‘User.email’=>$user_profile->email)))); if (!$user) { $this->User->create(); $this->User->set(array( ‘group_id’ => 2, ‘first_name’ => $user_profile->firstName, ‘last_name’ => $user_profile->lastName, ‘email’ => $user_profile->email, ‘username’ => $user_profile->identifier, ‘password’ => AuthComponent::password($user_profile->identifier), //in case you need to save password to database ‘country’ => $user_profile->country, ‘city’ => $user_profile->city, ‘address’ => $user_profile->address, //add another fields you want )); if ($this->User->save()) { $this->User->recursive = -1; $user = $this->User->read(null, $this->User->getLastInsertId()); return $user[‘User’]; } } else { return $user[‘User’]; } } } 4. In your view (ex. login.ctp) add: > <code><span style=”color: #000000”> <br ><divclass=”login-button- div”> <ahref=”loginwith/facebook”class=”zocialfacebook”>LoginwithFacebook</a > <ahref=”loginwith/twitter”class=”zocialtwitter”>LoginwithTwitter</a> </div> that’s all. > Beside this article you can find <a href=”http: /hybridauth.sourceforge.net/download.html#index”> sample cakephp2 application using Hybridauth here. This article is based on the sample application with very little modification and the credit of this article is for them who create hybridauth and cakephp sample app using hybridauth ><br > Happy baking..

]]>
Fri, 27 Jul 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/07/27/Auth-Component-of-Cakephp-Demystified-Part-1.html https://bakery.cakephp.org/2012/07/27/Auth-Component-of-Cakephp-Demystified-Part-1.html <![CDATA[Auth Component of Cakephp Demystified Part-1]]>

Auth Component of Cakephp Demystified Part-1

how to setup basic authentication system. Complete Toutorial In today’s Internet era most of the web developers tries to provide a log in/signup based feature for web clients in their web applications. Mostly this type of feature is needed only when you want to categories your users a very common example is Guest users and Registered Users. Guest users can access less content on web app while registered users enjoys more privileges. In cakephp this attribute is implemented mostly with the Auth component of this framework. Auth component is a very powerful, robust and can be customized as par the needs of web application. Auth component allows you to quickly set up secure areas in your app. In this series we will be building a complex authentication system. As this is part 1 and starting of this series, in this part we will implement a very basic but fully working authentication scheme.

Getting ready

First of all we need to create a users table in our database to store username and password (hashed version of user’s password). This hashing is done automatically by Auth component using it’s method hashPasswords() when it finds password in $data.

Run below sql to create users table.

CREATE TABLE `users` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(255) NOT NULL,
`password` CHAR(40) NOT NULL,
PRIMARY KEY(`id`)
);

List of all files we will be creating in this post.

  • AppController.php in /app/ folder
  • UsersController.php in /app/controllers/ folder
  • login.ctp in /app/views/users/ folder
  • signup.ctp in /app/views/users/ folder

> <h3>AppController.php File< h3> This file mainly contains global data which is used by all controllers of the application, in our case we have only users controller. This file will be containing below code.

<?php
class AppController extends Controller {
       var $components = array('Session','Auth');
       var $helpers=array('Session');

}
?>

Explanation :

It has two variables one is $components and other one is $helpers. $components variable holds all the components utilized by all controllers, so we specified Auth component. Session component and Session helper is basically used to set session messages and show those messages in view respectively.

UsersController.php File

This is the heart of our logic. It contains functionality of login, signup and logout. Content of this file is…

<?php
class UsersController extends AppController {

    function beforeFilter() {
            parent::beforeFilter();
            $this->Auth->allow('signup');
      }
    function login() {}

    function logout()
    {
        $this->Session->setFlash('You are logged out!');
        $this->redirect($this->Auth->logout());
    }

    function signup()
    {

        if (!empty($this->data)) {
              $this->User->create();
              if ($this->User->save($this->data)) {
              $this->Session->setFlash('User saved!');
              $this->redirect(array('action'=>'login'));
            }
       else {
               $this->Session->setFlash('User not saved! There were some errors. Please rectify them and retry.');
             }

            }

          }

}
?>

Explanation :

First of all, as it is inheriting from AppController, it will have Auth component loaded by default which will process all requests of client. Auth component only allows to access only login function, so to access signup() for adding new users we need beforeFilter() to give that instruction to Auth component to allow signup(). The main thing here to learn is that before Auth component start it’s working, beforeFilter() is invoked . In this we are invoking two beforeFilters one of users controller and other on of app controller by using ` parent::beforeFilter();`

Second function is login(), which is basically called if you put ` http://www.your_domain_name.com/users/login/` in your URL of browser or if you try to access a restricted area of application. When you submit your data by ` login.ctp` file which is view file for this login function then Auth component starts working. First of all it hashes the password field of $data and passes this $data variable to Users Model. Then Model checks and results back to controller. If a valid user is found then Auth adds it in session and grants access to all functions to which it is authorized which is checked by isAuthorized(). But if it finds invalid user, it redirects back to ` login()`.

Third function is logout(), in this function we sets a session’s flash message to let user know that he/she has been logged out. On second line of this function we calling redirect method of controller, which is taking argument from ` $this->Auth->logout()` which is a string containing url to login method.

Our last method is signup(), this is created to add new users. In this we are using create() and save() methods of User Model. Create method initializes the model for writing a new record, loading the default values for those fields that are not defined in $data, and clearing previous validation errors. Especially helpful for saving data in loops. Save method saves model data (based on white-list, if supplied) to the database. By default, validation occurs before save.

login.ctp File

It holds presentation code.Code is…

<?php

echo $this->Form->create(array('action'=>'login));
echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->end('Login');
?>

Explanation :

This view file utilizes Form Helper to create form elements.

signup.ctp File

It also holds presentation code.In this we have a form so user could submit it with data to create new user…

<?php

echo $this->Form->create(array('action'=>'signup));
echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->end('Signup');
?>
]]>
Fri, 27 Jul 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/07/15/CakeFest-2012-Schedule-posted-Get-your-tickets-now.html https://bakery.cakephp.org/2012/07/15/CakeFest-2012-Schedule-posted-Get-your-tickets-now.html <![CDATA[CakeFest 2012 - Schedule posted! Get your tickets now!]]> CakeFest 2012 - Schedule posted! Get your tickets now!

The CakeFest 2012 talks schedule has been posted on the CakeFest website. Get in and purchase your tickets today before the end of the Early-bird period!

CakeFest 2012 is getting closer every day. With only 45 days to go, now is the best time to jump in and grab your Conference and/or Workshop tickets before the end of the early-bird period.

The schedule has been posted online on the CakeFest Website. Check it out for the latest information about the schedule and talks being given!

The line up this year is spectacular! We have talent from around the world, and some big names from the CakePHP community giving talks on a huge range of topics. CakeFest is simply the best way to learn about CakePHP, to meet new people in the community and to extend your existing skill set.

We’d like to extend a special thankyou to SANIsoft and Microsoft, both of whom are sponsoring CakeFest, and have a long history of supporting CakePHP and the PHP community.

Also, a huge thanks to EngineYard, who have also sponsored the event this year. Its great to see some industry players such as EngineYard showing support for events like CakeFest, and other PHP events around the world.

Again, please checkout the latest information on tickets, and be sure to grab yours before the 21st July, when the Early-Bird period ends!

]]>
Sun, 15 Jul 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/07/14/Security-Release-CakePHP-2-1-5-2-2-1.html https://bakery.cakephp.org/2012/07/14/Security-Release-CakePHP-2-1-5-2-2-1.html <![CDATA[Security Release - CakePHP 2.1.5 & 2.2.1]]> Security Release - CakePHP 2.1.5 & 2.2.1

CakePHP 2.1.5 and 2.2.1 have just been released. If you are using CakePHP’s Xml class, you should upgrade as soon as possible.

The security issue was recently reported by Paweł Wyleciał. When accepting user provided XML it is possible to read arbitrary files using external entities. This is particularily dangerous for applications accepting XML data as part of a webservice. A possible exploit example would be:

curl -X POST -H ‘Content-Type: application/xml’ locahost/posts -d ‘<!DOCTYPE cakephp [<!ENTITY payload SYSTEM “file:///etc/passwd” >]><Post><body>&payload;</body></Post>]’

Once the XML has been processed $this->request->data[‘Post’][‘body’] will contain the contents of /etc/passwd. This issue was fixed and packaged releases for 2.1 and 2.2 have been created. This issue does not affect the 1.3 or 1.2 release series. If you are unable to upgrade, you should apply the patch as soon as possible. This issue has been assigned CVE-2012-4399 and OSVDB-84042.

Other fixes in 2.2.1

In addition to the security fix 2.2.1 contains fixes for the following issues:

  • Fixed missing urlencode on nested named parameters.
  • Fixed ANSI codes being output on windows terminals.
  • Fixed HtmlHelper::image() including the base directory twice when the fullBase option is used.
  • Console logging now respects the quiet flag for shells.
  • TranslateBehavior now saves records with only some translated fields correctly.
  • afterValidate() was made available on behaviors. This was an omission in 2.2.0.

View the complete changelog for 2.2.1 and 2.1.5. Download a packaged release.

CakeFest 2012 is around the corner and we already expect awesome talks and workshops during the best PHP conference out there. If you haven’t booked your tickets yet, it’s about time you do.

As always, thanks to the friendly CakePHP community for the patches, documentation changes and new tickets. Without you there would be no CakePHP!

]]>
Sat, 14 Jul 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/07/06/3-0-a-peek-into-CakePHP-s-future.html https://bakery.cakephp.org/2012/07/06/3-0-a-peek-into-CakePHP-s-future.html <![CDATA[3.0: a peek into CakePHP’s future]]> 3.0: a peek into CakePHP’s future

With version 2.2.0 out the team is now focusing on bringing the CakePHP community a major new version with awesome features

Since its creation, more than 7 years ago, CakePHP has grown with a life of its own. Its main goal has always been to empower developers with tools that are both easy to learn and use, leverage great libraries requiring low documentation and low dependencies too. We’ve had several big releases along these years and an ever growing community. Being one of the most popular frameworks out there and probably the first one (!) we have also gotten a lot of criticism from the developer community in general. We have, though, accepted it and learnt from our mistakes to keep building the best PHP framework there is.

CakePHP is known for having a very slow pace of adopting new stuff and it has served very well to its community. Back when we were doing version 2.0 we decided to hold on version 5.2 of PHP for multiple reasons and despite it didn’t let us innovate as much as we wished to, it was an excellent choice given the general environment regarding hosting solutions and general adoption of PHP 5.3. A look back into the past reminded us that we were big innovators in PHP, bringing features to developers that few dreamt possible to do in this language. Now, it’s time to look ahead in future and decide on staying in our comfort zone or take back our leading position as innovators.

So it is with great excitement that we announce we are putting our our efforts in bringing you the next major release of CakePHP. Version 3.0 will leverage the new features in PHP 5.4 and will include an important change in our models and database system. CakePHP 3.0 will not be ready less than 6 or 8 months and we reckon that, given the rise of cheap cloud hosting solutions and upcoming release of new operating system versions, there is no better time to jump on the most current stable version of PHP.

As you may already know, PHP 5.4 offers awesome features that would introduce useful new concepts and interesting solutions to old problems. Closure binding, traits, multibyte support are tools we see of great usefulness for properly implemented advanced framework features we’ve had in mind for a long time. Also new syntax sugar added to the language will make it more pleasant to write both small and complex applications with the framework and a always welcomed free performance increase.

We have a young but already well defined road map for what we want to accomplish in next release and you are invited to contribute and suggest what’s next:

  • Drop support for 5.2.x and support 5.4+ only

  • Add proper namespaces for all classes. This will make it easier to reuse classes outside CakePHP and to use external libraries and finally no chances of collisions between your app classes and core ones.

  • Use traits were possible and makes sense

  • Improve bootstrapping process to allow more developer control and better performance

  • Model layer rewrite:

    • Models to return objects from queries
    • Datamapper-like paradigm
    • Richer query API
    • Support for any database type
    • Support for more database drivers both PDO and native
  • Improve Router:

    • Make it faster
    • Remove named parameters
    • Add support for named routes
    • Smarter router prefixes
    • Shorter url syntax

As you may imagine most of the time will be spent or rewriting the model layer, but it will also be one of the most powerful features CakePHP 3.0 will have. It’s new architecture based on PHP 5.4 capabilities will offer an easier and more powerful set of tools to build web applications in no time.

If you are already as excited as we are this all this new stuff coming, you definitely should meet us on next CakeFest we’ll be talking about the future of CakePHP and hacking our way through to bring you a dev release as soon as possible. Wouldn’t it be lovely to attend to awesome talks, workshops and also be part of the group deciding initial architecture for next major version of the framework? Make sure you book your tickets before we run out of them!

We’re always looking for different people having a vision on software development, are you interested in helping out? There is no better time to start sending patches and become one of the core team!

]]>
Fri, 06 Jul 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/07/01/CakePHP-2-2-and-2-1-4-released.html https://bakery.cakephp.org/2012/07/01/CakePHP-2-2-and-2-1-4-released.html <![CDATA[CakePHP 2.2 and 2.1.4 released]]> CakePHP 2.2 and 2.1.4 released

The CakePHP core team is proud to announce the immediate availability of both CakePHP 2.2.0 stable and 2.1.4 which is the final bugfix release for the 2.1.x branch

The CakePHP team is proud to announce the immediate availability of CakePHP 2.2.0 stable. As mentioned in previous releases, 2.2 is a API compatible release with 2.1 and should be generally transparent when upgrading, except for a few additions you need to make in configuration files. In addition to this release we have also tagged version 2.1.4 which would be the last work we do on the 2.1.x series. Any further stability fixes will be done in 2.2 branch, so we encourage people to upgrade your apps as soon as possible.

CakePHP 2.2 comes with a great set of new features and goodies, here is a quick summary of what you can find after upgrading:

  • Dispatcher filters, a lightweight way of attaching callbacks as middleware to the dispatcher lifecycle for easier caching or faster action responses.
  • New rich api for creating and removing validation rules on the fly for models
  • Seamless pagination for custom find types
  • Support for real nested database transactions
  • Cache groups, a nice way for tagging and mass deleting cache entries using such tags
  • Improved logging support, several new utility methods were added to CakeLog
  • Configure class can now dump stored values into any persistent storage
  • AuthComponent now accepts ` contain` as a key for storing extra user information in session
  • Several improvements to CakeEmail, such as custom header charset, custom themes, setting links domain and custom helpers defined at configuration time
  • PUT and DELETE requests encoded with application/x-www-form- urlencoded will have its data placed into CakeRequest::$data
  • Set class was deprecated in favor of Hash, a faster and more reliable implementation
  • CakeTime is now timezone aware and fully capable of translating dates from one zone to the other
  • CakeTime can now also accept DateTime objects in addition to strings and timestamps
  • FormHelper now shows more reliably required fields based on validation rules
  • HtmlHelper::tableHeaders() now supports setting attributes per table cell.
  • Better web tester experience
  • Improved error handling, featuring custom fatal error templates
  • Redis support for caching
  • Added new validation methods for upload checking and natural numbers

Please make sure you read the complete migration guide available at https://book.cakephp.org/2.0/en/appendices/2-2-migration-guide.html

If you were following each release for 2.2 and 2.1, here’s a summary of the changes that made into this final iteration:

2.1

  • Fixtures will not be loaded again if associated tables exist already in database, making it possible to load fixtures as SQL
  • Better error message in MissingConnectionException when driver is not enabled
  • Better locale support for numbers in Number helper
  • Test suite to fail louder if PHPUnit was not found
  • Small improvements to debug functions
  • Fixed issues in data validation when using beforeValidate callback to change internal model data
  • Improving reliability in page numbers links for PaginatorHelper
  • Increased compatibility with CentOS servers
  • Reduced chance of cache collision in internal method cache for DboSource
  • Fixed issues with default exception renderer and custom helpers
  • Allow Set::extract() to match null.
  • Small bugfixes in XmlView
  • Fixed bugs in Translate Behavior
  • Set session.gc_maxlifetime by default.
  • Fixed bugs in sessions when using long numeric keys in arrays

2.2

  • More descriptive diffs in web test runner for failed tests
  • Complete E_STRICT compliance
  • Bug fixes for CakeTime timezone support
  • Helpers can now be defined at configuration time for sending emails.
  • Console commands are now grouped by plugin, core and app shells are always listed last.
  • Fixed small issues with ModelValidator and improved performance

View the complete changelog available for 2.2.0 [1] and 2.1.4 [2]. Download a packaged release [3]

CakeFest 2012 is around the corner and we already expect awesome talks and workshops during the best PHP conference out there. If you haven’t booked your tickets yet, it’s about time your do, don’t miss your chance as we’re still offering early bird prices!!

As always, thanks to the friendly CakePHP community for the patches, documentation changes and new tickets. Without you there would be no CakePHP!

]]>
Sun, 01 Jul 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/06/29/Active-Record-pattern-for-CakePHP.html https://bakery.cakephp.org/2012/06/29/Active-Record-pattern-for-CakePHP.html <![CDATA[Active Record pattern for CakePHP]]> Active Record pattern for CakePHP

I wanted to build a state engine with CakePHP, and I realize that I needed a kind of Active Record pattern. So I first built a behavior that allows me to retrieve objects in place of associative arrays.

Installation

To download it: go to https://github.com/boutinb/Active-Record-for-CakePHP I have tested this only with cakePHP 2.x

  • Copy the ActiveRecordBehavior.php in your Behavior folder
  • Tell your model to use it: $actsAs = array(‘ActiveRecord’ => array())
  • When you use a find(‘all’) or find(‘first) function, add the option ‘activeRecord’ => true

I chose this way, because I did not want to retrieve always objects when a find function was called. But it is possible to use it in another way: add in the constructor of the behavior the option ‘allFind’ => true, and if you do not want an object after a find add ‘activeRecord’ => false (this possibility was not yet thouroughly tested: i’m afraid that cake generates sometimes a ‘find’ call that needs associative arrays).

How to use it

When you retrieve an object record, you can use it in this way: assume that you have the following models:

  • Post (title, message) belongsTo Writer, hasMany Comments, hasAndBelongsToMany Tags
  • Writer (name) hasMany Posts, belongsTo WriterGroup
  • WriterGroup (name) hasMany Writers
  • Comment (message) belongsTo Post
  • Tag (name) hasAndBelongsToMany Posts

Call find(‘first’) of find(‘all’) to retrieve the posts and with one post you can do the following:

  • $message = $post->message : this retrieves the message of the post
  • $post->message = ‘Hallo’ : this updates the message of the post
  • $writer = $post->Writer : this retrieves the writer ActiveRecord object
  • $comments = $post->Comments : this retrieves the ActiveRecordAssociation object

The Behavior makes a difference between belongsTo/hasOne associations and hasMany/hasAndBelongsToMany associations:

  • with belongsTo and hasOne associations, the ActiveRecord object pointed by the association is retrieved, and you can use it directly: e.g. $post->Writer->WriterGroup->name

  • with hasMany and hasAndBelongsToMany associations, the ActiveRecordAssociation object is retrieved. The class of this object implements the IteratorAggregate, Countable and ArrayAccess interfaces so that you can use it as an array:

    • foreach ($post->Comments as $comment) {}
    • count($post->Comments);
    • $comments = $post->Comments; $first_comment = $comments[0];

But also, the ActiveRecordAssociation class has 3 functions:

  • $comments->add($new_comment);
  • $comments->remove($first_comment);
  • $comments->replace($first_comment, $new_comment);

In order for the developer to clearly see the difference beween the 2 kinds of associations, I advice to use a plural name for hasMany and hasAndBelongsToMany associations, and singular name for hasOne and belongsTo associations.

Extend ActiveRecord class

Per default, the object you retrieve is of the class ActiveRecord. But you can of course extend this class for one model. Per default, the behavior will look for a class in the subfolder ModelActiveRecord with name ‘AR’, e.g.: ARPost or ARComment (the prefix ‘AR’ and the subfolder name can be changed in the bahavior constructor options). In the file ARPost.php:

 `

App::import('Model\Behavior','ActiveRecord');

classARTPostextendsActiveRecord{
public$var;
publicfunctionfunc(){...}
}

`

If you need to use the constructor:

 `
publicfunction__construct(array$record,array$options=array()){
parent::__construct($record,$options);
...
}

`

Then you can use $post->var and $post->func() in your code. You can also create new object:

 `
$post=newARPost(array(
'title'=>'Mytitle',
'message'=>'OK',
'Writer'=>$writer));

`

Here it becomes to be quite nice: in place of telling that the writer_id of the post should be ` $writer->id`, you can directly say ` ‘Writer’=>$writer` You can also do:

 `
$post->Comments=array($comment);

`

This will set automatically the ` $comment->post_id` to the right one.

Useful functions

I realize that when using hasMany (or hasOne association), when you do

 `

$post->Comments->remove($comment);
or
$post->Comments=null;

`

You want not only to remove the $comment from $post, but most of the time you want to delete $comment. I thought it would be quite handy if this is done automatically. For this, if you set in the association definition ‘deleteWhenNotAssociated’ to true, the behavior will automatically delete all records that are removed from the association.

The behavior offers also the possibility to delete, refresh and undo an ActiveRecord:

 `
$post->delete();//deletethispostrecord
$post->refresh();//querythevaluesofpostinthedatabase.
$post->undo();//undoallmodificationdoneinthe$postrecord.

`

The modifications done in the active records are not sent to the database. This is done only when calling the save() method. But $post->save() will only save the modification in the post record, not in its associated records. To save all modifications you made (explicitely and implicitely), use $post->saveAll() or ActiveRecord::saveAll() method Morevover saveAll() takes care that the records are saved in the right order. For example:

 `
$comment=newARComment(array('message'=>'Newmessage'));
$post=newARPost(array('title'=>'Newtitle','message'=>'NewMessage','Writer'=>$writer));
$post->Comment=array($comment);
ActiveRecord::saveAll();

`

Then saveAll() takes care that $post is created first so that its id can be set to $comment->post_id.

What is really nice with this Active Record pattern, is that you don’t need anymore to bother about the keys and how you should construct the associated arrays to be sure that cakePHP will save correctly your data (especially with hasAndBelongsToMany associations!)

Extending even more

I needed also a possiblility to have subclasses of ActiveRecord. For example I had an Action model, but I needed to define subclasses for each kind of action. A subclass action may use a (sub) model or not. For this I told the behavior to check whether the Model has the function getActiveRecordProperties(), and if yes it calls it before it builds a new ActiveRecord. This function tells the behavior what is the real ActiveAction name it must call, with which model and with which data. Here an example:

My model Action has a column type. This column will determine which kind of ActiveRecord class it must call. Then in the Action model, I have added this function:

 `
publicfunctiongetActiveRecordProperties(&$record){
$type=$record[$this->alias]['type'];
$active_record_name='AR'.$type.'Action';
$model=$this;
App::import('Model\ActiveRecord',$active_record_name);
returnarray('active_record_name'=>$active_record_name,'record'=>$record,'model'=>$model);
}

`

My ARAction looks like this:

 `
abstractclassARActionextendsAppActiveRecord{
abstractpublicfunctionexecute(ARUserState$user_state,$parameter);
}

`

The SendEmail subaction looks like that:

 `
classARSendEmailActionextendsARAction{
publicfunctionexecute(ARUserState$user_state,$parameter){
....
}
}

`

Then if I have a record in my Action table with type ‘SendEmail’, Action->find() returns an object of Class ARSendEmailAction. When calling execute(), it will call the right one that will send an email. Here the ARSendEmailAction uses the same model as ARAction, but if needed I could have set it to another one.

]]>
Fri, 29 Jun 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/06/27/Trello-API-wrapper-plugin.html https://bakery.cakephp.org/2012/06/27/Trello-API-wrapper-plugin.html <![CDATA[Trello API wrapper plugin]]> Trello API wrapper plugin

Trello is useful tool for project management (see https://trello.com). This plugin provides model & datasource so you can comfortably search using standard CakePHP find method.

Get code from https://github.com/segy/TrelloApi. You can see a full description there.

]]>
Wed, 27 Jun 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/06/25/Simple-3rd-party-provider-authentication-with-Opauth-plugin.html https://bakery.cakephp.org/2012/06/25/Simple-3rd-party-provider-authentication-with-Opauth-plugin.html <![CDATA[Simple 3rd-party provider authentication with Opauth plugin]]>

Simple 3rd-party provider authentication with Opauth plugin

Opauth is a multi-provider authentication framework for PHP, inspired by OmniAuth for Ruby. Opauth enables PHP applications to perform user authentication across different providers with much ease & simplicity.

Implement Opauth easily on CakePHP

What is Opauth?

Opauth is a multi-provider authentication framework for PHP, inspired by OmniAuth for Ruby.

Opauth enables PHP applications to perform user authentication across different providers with much ease & simplicity.

Opauth interfaces between authentication providers’ API and your PHP applications through strategies. Strategies available for Opauth include Facebook, Google, Twitter, OpenID, and more.

Visit http://opauth.org for a quick demo.

Opauth on GitHub: uzyn/opauth Opauth as a Composer package: opauth/opauth

Opauth on CakePHP

Opauth is made even easier to be implemented on CakePHP applications through Opauth CakePHP plugin

Quick table of contents:

  • How to use this plugin (long and thorough)
  • A quick sample app (pre-configured CakePHP app, with screenshots )

How to use this plugin

  1. Download Opauth CakePHP plugin and place it at your CakePHP Plugin directory. Or via Git: Assuming ` APP` is the directory where your CakePHP app resides, it’s usually ` app/` from the base of CakePHP:

    cd APP/Plugin
    git clone git://github.com/uzyn/cakephp-opauth.git Opauth
    
    cd Opauth
    git submodule init
    git submodule update
    
  2. Add this line to the bottom of your app’s ` Config/bootstrap.php`:

    <?php
    CakePlugin::load('Opauth', array('routes' => true, 'bootstrap' => true));
    

    Overwrite any Opauth configurations you want after the above line.

  3. Load strategies onto Strategy/ directory. Append configuration for strategies at your app’s ` Config/bootstrap.php` as follows:

    <?php
    CakePlugin::load('Opauth', array('routes' => true, 'bootstrap' => true));
    
    // Using Facebook strategy as an example
    Configure::write('Opauth.Strategy.Facebook', array(
       'app_id' => 'YOUR FACEBOOK APP ID',
       'app_secret' => 'YOUR FACEBOOK APP SECRET'
    ));
    
  4. Go to http://path_to_your_cake_app/auth/facebook to authenticate with Facebook, and similarly for other strategies that you have loaded.

  5. After validation, user will be redirected to Router::url(‘/opauth-complete’) with validated auth response data retrievable available at $this->data. To route a controller to handle the response, at your app’s Config/routes.php, add a connector, for example:

    <?php
    Router::connect(
       '/opauth-complete/*',
       array('controller' => 'users', 'action' => 'opauth_complete')
    );
    

    You can then work with the authentication data at, say ` APP/Controller/UsersController.php` as follows:

    <?php // APP/Controller/UsersController.php:
    class UsersController extends AppController {
       public function opauth_complete() {
           debug($this->data);
       }
    }
    

    Note that this CakePHP Opauth plugin already does auth response validation for you with its results available as a boolean value at $this->data[‘validated’].

How about a sample?

Sure. Simply download this CakePHP app and set it up with CakePHP v2.x library.

Once it is set up, you should see: (Homepage screenshot)

After authentication, this is what you should be getting: (Callback screenshot)

More instructions on the sample app: https://github.com/uzyn/cakephp-opauth/tree/sample

Issues & questions

]]>
Mon, 25 Jun 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/06/25/Manejo-basico-Cache-FILE.html https://bakery.cakephp.org/2012/06/25/Manejo-basico-Cache-FILE.html <![CDATA[Manejo básico Cache FILE]]> Manejo básico Cache FILE

Un componente simple y corto que permite manejar las funciones básicas de caché, así veremos que nuestra aplicación tendrá un mejor rendimiento ‘File’, //[required] //’duration’=> 3600, //[optional] //’probability’=> 100, //[optional] ‘path’ => CACHE, //[optional] use system tmp directory - remember to use absolute path ‘prefix’ => ‘’, //[optional] prefix every cache file with this string ‘lock’ => false, //[optional] use file locking //’serialize’ => true, //[optional] )); Cache::write($nombre_cache, $data); return true; } function obtenerCache($nombre_cache = null){ $data = null; if(empty($nombre_cache)){ return $data; } $data = Cache::read($nombre_cache); return($data); } function borrarCache($nombre_cache = null){ if(!empty($nombre_cache)){ Cache::delete($nombre_cache); //return true; } } } ?> En el controlador var $components = array(‘Manejocache’); para borrar: $this->Manejocache->borrarCache(‘NOMBRECACHE’); para obtener cache: $this->Manejocache->obtenerCache(‘NOMBRECACHE’); para guardar cache: $this->Manejocache->guardarCache(‘NOMBRECACHE’);

]]>
Mon, 25 Jun 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/06/22/Javascript-CSS-LESS-module-loader-dependency-calculator-plugin-ResourcesController.html https://bakery.cakephp.org/2012/06/22/Javascript-CSS-LESS-module-loader-dependency-calculator-plugin-ResourcesController.html <![CDATA[Javascript/CSS/LESS module loader + dependency calculator plugin(“ResourcesController”)]]> Javascript/CSS/LESS module loader + dependency calculator plugin(“ResourcesController”)

ResourcesController is a module loader for resource files (e.g. javascript, LESS, CSS). It can handle both inter- and intra- package dependencies, as well as a variety of preprocessors (I have currently only put a LESS CSS preprocessor in, but others can be easily built using the implementable iPreprocessor interface).

(You can find it at https://github.com/gfarrell/ResourcesController - please fork it and improve it!)

I have always found it pretty frustrating when one has loads of nicely separated javascript files, each with its own class and each with its own dependencies but then you have to either run a compiler of some sort to mash them all together (like Juicer or BTMPackager) or use a client side asynchronous module loader like require.js.

ResourcesController allows you to define packages of files like CSS, LESS or Javascript files with dependencies either for the whole package or for the individual file and then when the files are requested the dependency tree is flattened and the files are packaged up, compressed and delivered.

The plugin also uses caching (otherwise this would be a really slow operation) so that if the files haven’t changed since the last cache, the cached version is served up. The best part of that is that it uses native Cake caching so whatever your chosen cache engine, it’s already using it!

At the moment it can do CSS and Javascript compression and LESS preprocessing. I wanted to include CoffeeScript but there’s no PHP version and I am loathe to use exec() commands in a generally available plugin. I wanted this to be as versatile as possible.

It’s pretty easy to extend, you can just write new preprocessor components with the iPreprocessor interface.

The documentation should be quite complete, so have a look and let me know if you use it/what you think/if you encounter bugs.

(You can find it at https://github.com/gfarrell/ResourcesController - please fork it and improve it!)

]]>
Fri, 22 Jun 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/06/20/Sending-content-to-the-layout-using-Cake-2-x.html https://bakery.cakephp.org/2012/06/20/Sending-content-to-the-layout-using-Cake-2-x.html <![CDATA[Sending content to the layout using Cake 2.x]]> Sending content to the layout using Cake 2.x

This post is based on Robert Conner’s code for CakePHP 1.x., and I made some changes to get it to work on CakePHP 2.x and add some explanations on how to use it. The original post is on https://bakery.cakephp.org/articles/rtconner/2007/08/28 /anything_for_layout-making-html-from-the-view-available-to-the-layout Maybe many people have faced the problem for sending some content to the layout on CakePHP. By saying content I mean not only a simple string but a whole a piece of HTML code. To solve this, we can create a Helper on CakePHP 2.x, according to the following steps:

1. Create the Helper

On the Views/Helpers folder, you need to create the .php file for the helper. In this case we will call it LayoutHelper.php

class LayoutHelper extends AppHelper {

 var $__blockName = null;

 function blockStart($name) {
 if (empty($name)) trigger_error('LayoutHelper::blockStart - name is a required parameter');
 if (!is_null($this->__blockName))
 trigger_error('LayoutHelper::blockStart - Blocks cannot overlap');
 $this->__blockName = $name; ob_start();
 return null;
 }

 function blockEnd(&$view) {
 $buffer = @ob_get_contents();
 @ob_end_clean();
 $out = $buffer;
 $view->viewVars[$this->__blockName . '_for_layout'] = $out; $this->__blockName = null;
}

function output($var) {
 if (isset($var) && $var != null)
 echo $var;
 }
 }

2. Setting up the content

For setting up the content that we want to send to the layout, we use the Helper

$layout = $this->Helpers->load('Layout');
$layout->blockStart('custom_content');

right after this, we specify the content that will be sent to the layout

<div>
Custom content
</div>

and we close the block

$layout->blockEnd($this);

3. Show the content

For showing the content on the layout, we add the following

$layout = $this->Helpers->load('Layout');
$layout->output($custom_content_for_layout);

As we can see, this is really simple and also very useful when trying to customize the content on the layout according to the view we are loading

]]>
Wed, 20 Jun 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/06/20/Composer-Plugin-for-CakePHP.html https://bakery.cakephp.org/2012/06/20/Composer-Plugin-for-CakePHP.html <![CDATA[Composer Plugin for CakePHP]]> Composer Plugin for CakePHP

Use Composer conveniently with your CakePHP application and get access to a vast library of reusable PHP components and packages through Packagist.

About Composer

Composer is a tool for dependency management in PHP. It allows you to declare the dependent libraries your project needs and it will install them in your project for you.

With Packagist, you get access to a vast library of reusable PHP components that will help a lot in your development work.

About this plugin

This is a CakePHP plugin to use Composer conveniently with your CakePHP 2.x project.

There is no need to pre-install Composer. This plugin will automatically download the latest version if Composer is not installed at your system.

Packages downloaded via this Composer plugin will be installed at ` APP/Vendor` as per CakePHP convention.

How to use

  1. Download the plugin and place it at ` APP/Plugin/Composer`. Or via Git:
cd APP/Plugin
git clone git://github.com/uzyn/cakephp-composer.git Composer
  1. Load the plugin by adding this line to the bottom of your app’s ` Config/bootstrap.php`:
<?php
CakePlugin::load('Composer', array('bootstrap' => true));
  1. That’s all! Composer is ready for use. ` composer.json` is located at ` APP/composer.json`. It is automatically created if it is not found. Packages are installed to ` APP/Vendor` as per CakePHP convention. Invoke Composer from command line with ` Console/cakecomposer.c`. For example, to install opauth/opauth using Composer’s ` require` command.
 cd APP
 Console/cake composer.c require opauth/opauth:0.*

To install packages defined at ` composer.json`
Console/cake composer.c install
  1. This plugin also makes use of Composer’s autoloader. Start using a Composer-loaded classes right away without needing ` require()`, ` include()` or ` App::import()`. For example, to instantiate a new Opauth object, simply instantiate Opauth from anywhere (model, controller, view, literally anywhere) in your CakePHP application:
<?php
$Opauth = new Opauth();

Issues & questions

]]>
Wed, 20 Jun 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/06/20/CakePHP-2-2-0-RC2.html https://bakery.cakephp.org/2012/06/20/CakePHP-2-2-0-RC2.html <![CDATA[CakePHP 2.2.0-RC2]]> CakePHP 2.2.0-RC2

The CakePHP team is proud to announce the immediate availability of CakePHP 2.2.0-RC2, the final Release Candidate for this branch.

A bit later than expected, but charged with new awesome features and stability, CakePHP 2.2.0-RC2 finally lands for a final test-drive before it’s marked stable. As mentioned in previous releases, 2.2.x will be an API compatible release with 2.0.x, and 2.1.x and should be generally transparent when upgrading, except for a few additions you need to make in configuration files.

We let a few new features sneak into this release as we considered them safe and useful enough to our community. A quick list of new features added in 2.2.0-RC2:

Validation

A few new methods were added to the Validation class: naturalNumber, uploadError and mimeType. Natural number validation is used in case you want a numeric validation but only for non-negative numbers. Upload related methods were added to make it easier for models to correctly validate uploaded files, specifically mimeType method will validate the correct mimetype for files without relying on file extension.

Bake

Several small enhancements were added to improve experience of baking test cases and new plugins. For instance, creating a new plugin will automatically configure it in bootstrap.php

CakeRequest

PUT and DELETE methods’ payload data will now be placed into $request->data if it is encoded correctly. This makes it easier for controllers to implement actions transparently without taking explicit actions for each of those methods.

Misc Changes

  • session.gc_maxlifetime is now set when using files for sessions. This prevents session files from being garbage collected too early.
  • cake i18n extract now has an –overwrite option to force overwriting all existing pot files.
  • App::uses() now supports namespaced classes better.
  • belongsTo and hasOne associations should generate fewer queries when recursive > 1.
  • TranslateBehavior::unbindTranslation() works as documented now.
  • HtmlHelper::tableHeaders() now accepts HTML attributes for each cell.
  • Router::setExtensions() was added to allow new extensions to be added instead of replacing all existing extensions.
  • Security::rijndael() was added and exposed to CookieComponent. This allows strong encryption to be used, and is recommended for all applications using ciphered cookies.
  • The datasource method cache is now more resistant to collisions.
  • Email templates using images now work correctly more often.
  • app/Console/cake now correctly determines the app directory in more situations.
  • PUT and DELETE requests with application/www-form-urlencoded data are now automatically parsed and set as $this->data in the request object.
  • Session cookies are now httpOnly by default.
  • All validation errors are returned when saving/validating associated models if the primary model’s validation fails.

View the complete changelog available [1]. Download a packaged release [2]

CakeFest 2012 is around the corner and we already expect awesome talks and workshops during the best PHP conference out there. If you haven’t booked your tickets yet, it’s about time your do.

As always, thanks to the friendly CakePHP community for the patches, documentation changes and new tickets. Without you there would be no CakePHP!

Links

]]>
Wed, 20 Jun 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/06/11/Email-template-management-plugin.html https://bakery.cakephp.org/2012/06/11/Email-template-management-plugin.html <![CDATA[Email template management plugin]]> Email template management plugin

Hi everyone, This is my first open source plugin. which we can use to manage email templates in cakephp

Just to provice a little breath of relief to every Cake baker out there, here is a solution for creating and updating email content as per requirement of client every time to time. The objective is to skip the amount of effort of developer from every time email content changes according to the requirement. This Plugin will help administrator to change email content as per there requirement and need, whenever it is needed,

How to use?

1) Download (https://github.com/madhavi- webonise/email_template/downloads ) or clone (https://github.com /madhavi-webonise/email_template ) the code for this plugin .

2) Add the email_template folder into your “your-app-path/app/plugins” folder.

3) Run the migration to create required table. Migration will add one dummy email template in your database table.

  1. Now check the email templates list in your application.

5) You can add more email templates from “your-app- url/email_template/email_templates/add”.

6) you can check Constants list which you can use into email content to replace by real value by clicking “Email Constants” link from add or edit page.

7) you can add more constants in “$emailconstants” array from EmailTemplateAppController with blank value. If we didn’t provide for any constant in code then it will replace with black and it will not show direct constant in email.

8) You can add same constant in “EmailTemplateController” with there one or two lines description Where and why we can use that constant.

9) Now In code where you have to use the email template fetch it from database by there slug name and Replace the constants with there valid values to how to do this check “getEmailTemplateAndReplaceConstant” action from “EmailTemplateController”.

  1. Send the email using email templates.

for any further queries or suggestions, please write me to madhavi [at] weboniselab.com.

]]>
Mon, 11 Jun 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/06/11/An-Automated-tool-for-creating-ACOs-for-CakePHP-2.html https://bakery.cakephp.org/2012/06/11/An-Automated-tool-for-creating-ACOs-for-CakePHP-2.html <![CDATA[An Automated tool for creating ACOs for CakePHP 2]]> An Automated tool for creating ACOs for CakePHP 2

There was a tool(code) for CakePHP 1.3 for creating ACOs automatically (https://book.cakephp.org/1.3/view/1549/An-Automated-tool-for-creating- ACOs). It didn’t work on 2.1 though. I made a few fixes so it seems to work fine (I haven’t tested it throughout and doubt that it’s bulletproof, but it did what I wanted it to do). Hope someone will find it useful.

function build_acl() {
    if (!Configure::read('debug')) {
        return $this->_stop();
    }
    $log = array();

    $aco = & $this->Acl->Aco;
    $root = $aco->node('controllers');
    if (!$root) {
        $aco->create(array('parent_id' => null, 'model' => null, 'alias' => 'controllers'));
        $root = $aco->save();
        $root['Aco']['id'] = $aco->id;
        $log[] = 'Created Aco node for controllers';
    } else {
        $root = $root[0];
    }

    App::uses('File', 'Utility');
    $ControllersFresh = App::objects('Controller');

    foreach ($ControllersFresh as $cnt) {
        $Controllers[] = str_replace('Controller', '', $cnt);
    }
    $appIndex = array_search('App', $Controllers);
    if ($appIndex !== false) {
        unset($Controllers[$appIndex]);
    }
    $baseMethods = get_class_methods('Controller');
    $baseMethods[] = 'build_acl';

    $appcontr = get_class_methods('AppController');

    foreach ($appcontr as $appc) {
        $baseMethods[] = $appc;
    }

    $baseMethods = array_unique($baseMethods);

    $Plugins = $this->_getPluginControllerNames();
    $Controllers = array_merge($Controllers, $Plugins);

    // look at each controller in app/controllers
    foreach ($Controllers as $ctrlName) {
        $methods = $this->_getClassMethods($this->_getPluginControllerPath($ctrlName));

        // Do all Plugins First
        if ($this->_isPlugin($ctrlName)) {
            $pluginNode = $aco->node('controllers/' . $this->_getPluginName($ctrlName));
            if (!$pluginNode) {
                $aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'alias' => $this->_getPluginName($ctrlName)));
                $pluginNode = $aco->save();
                $pluginNode['Aco']['id'] = $aco->id;
                $log[] = 'Created Aco node for ' . $this->_getPluginName($ctrlName) . ' Plugin';
            }
        }
        // find / make controller node
        $controllerNode = $aco->node('controllers/' . $ctrlName);
        if (!$controllerNode) {
            if ($this->_isPlugin($ctrlName)) {
                $pluginNode = $aco->node('controllers/' . $this->_getPluginName($ctrlName));
                $aco->create(array('parent_id' => $pluginNode['0']['Aco']['id'], 'model' => null, 'alias' => $this->_getPluginControllerName($ctrlName)));
                $controllerNode = $aco->save();
                $controllerNode['Aco']['id'] = $aco->id;
                $log[] = 'Created Aco node for ' . $this->_getPluginControllerName($ctrlName) . ' ' . $this->_getPluginName($ctrlName) . ' Plugin Controller';
            } else {
                $aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'alias' => $ctrlName));
                $controllerNode = $aco->save();
                $controllerNode['Aco']['id'] = $aco->id;
                $log[] = 'Created Aco node for ' . $ctrlName;
            }
        } else {
            $controllerNode = $controllerNode[0];
        }

        //clean the methods. to remove those in Controller and private actions.
        foreach ($methods as $k => $method) {
            if (strpos($method, '_', 0) === 0) {
                unset($methods[$k]);
                continue;
            }
            if (in_array($method, $baseMethods)) {
                unset($methods[$k]);
                continue;
            }
            $methodNode = $aco->node('controllers/' . $ctrlName . '/' . $method);
            if (!$methodNode) {
                $aco->create(array('parent_id' => $controllerNode['Aco']['id'], 'model' => null, 'alias' => $method));
                $methodNode = $aco->save();
                $log[] = 'Created Aco node for ' . $method;
            }
        }
    }
    if (count($log) > 0) {
        debug($log);
    }

    exit;
}

function _getClassMethods($ctrlName = null) {
    if($this->_isPlugin($ctrlName)){
        App::uses($this->_getPluginControllerName ($ctrlName), $this->_getPluginName ($ctrlName). 'Controller');
    }
    else
        App::uses($ctrlName . 'Controller', 'Controller');


    if (strlen(strstr($ctrlName, '.')) > 0) {
        // plugin's controller
        $ctrlName = str_replace('Controller', '', $this->_getPluginControllerName ($ctrlName));
    }
    $ctrlclass = $ctrlName . 'Controller';
    $methods = get_class_methods($ctrlclass);

    // Add scaffold defaults if scaffolds are being used
    $properties = get_class_vars($ctrlclass);
    if (array_key_exists('scaffold', $properties)) {
        if ($properties['scaffold'] == 'admin') {
            $methods = array_merge($methods, array('admin_add', 'admin_edit', 'admin_index', 'admin_view', 'admin_delete'));
        } else {
            $methods = array_merge($methods, array('add', 'edit', 'index', 'view', 'delete'));
        }
    }
    return $methods;
}

function _isPlugin($ctrlName = null) {
    $arr = String::tokenize($ctrlName, '.');
    if (count($arr) > 1) {
        return true;
    } else {
        return false;
    }
}

function _getPluginControllerPath($ctrlName = null) {
    $arr = String::tokenize($ctrlName, '/');
    if (count($arr) == 2) {
        return $arr[0] . '.' . $arr[1];
    } else {
        return $arr[0];
    }
}

function _getPluginName($ctrlName = null) {
    $arr = String::tokenize($ctrlName, '.');
    if (count($arr) == 2) {
        return $arr[0];
    } else {
        return false;
    }
}

function _getPluginControllerName($ctrlName = null) {
    $arr = String::tokenize($ctrlName, '/');
    if (count($arr) == 2) {
        return $arr[1];
    } else {
        return false;
    }
}

/**
 * Get the names of the plugin controllers ...
 *
 * This function will get an array of the plugin controller names, and
 * also makes sure the controllers are available for us to get the
 * method names by doing an App::import for each plugin controller.
 *
 * @return array of plugin names.
 *
 *
 */
function _getPluginControllerNames() {
    App::uses('Folder', 'Utility');
    $folder = & new Folder();
    $folder->cd(APP . 'Plugin');

    // Get the list of plugins
    $Plugins = $folder->read();
    $Plugins = $Plugins[0];
    $arr = array();

    // Loop through the plugins
    foreach ($Plugins as $pluginName) {
        // Change directory to the plugin
        $didCD = $folder->cd(APP . 'Plugin' . DS . $pluginName . DS . 'Controller');
        if ($didCD) {
            // Get a list of the files that have a file name that ends
            // with controller.php
            $files = $folder->findRecursive('.*Controller\.php');

            // Loop through the controllers we found in the plugins directory
            foreach ($files as $fileName) {
                // Get the base file name
                $file = basename($fileName);

                // Get the controller name
                //$file = Inflector::camelize(substr($file, 0, strlen($file) - strlen('Controller.php')));
                if (!preg_match('/^' . Inflector::humanize($pluginName) . 'App/', $file)) {
                    $file = str_replace('.php', '', $file);

                    /// Now prepend the Plugin name ...
                    // This is required to allow us to fetch the method names.
                    $arr[] = Inflector::humanize($pluginName) . "." . $file;
                }

            }
        }
    }


    return $arr;

}

]]>
Mon, 11 Jun 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/06/06/Very-helpful-plugin-for-Beginners-and-Experts.html https://bakery.cakephp.org/2012/06/06/Very-helpful-plugin-for-Beginners-and-Experts.html <![CDATA[Very helpful plugin for Beginners and Experts]]> Very helpful plugin for Beginners and Experts

I have launched a new version(1.1) of my plugin for user management. Demo at http://umpremium.ektasoftwares.com

This plugin is Basic need of your website. Basically It gives you all features which you need on starting your website or a project in cakephp 2.x framework.

It is very helpful for Beginners because of following features-

  1. Clean code with coding standards
  2. Proper documentations
  3. Newbie will learn- a. How to write code in Cakephp? b. How to use CSRF/XSS protection in cakephp c. How to use SSL/HTTPS in cakephp for whole site as well as only some pages. d. How to use Ajax Pagination in cakephp. e. How to use Ajax Form Validations with File/Image in cakephp.

and many more. For all features,Beginners please have a look on http://developers.ektasoftwares.com/docs/umpremium/beginners.html

  1. Experts will also learn many other things. For all features http://umpremium.ektasoftwares.com

You can start your project or a website in few minutes with this plugin because this plugin has all things which you can think in starting of your project.

The main features are-

  1. Login with Facebook, Twitter, Linkedin, Four Square, Gmail, Yahoo.
  2. All Configurations are database driven. No need to touch php code for config setting.
  3. No need to hard code your site URL any where.
  4. View Online users and guest and admin can take many action on online users.
  5. SSL support for selected pages or whole site.
  6. Most of the things are Ajax driven.

I cannot describe all features here so please have a look on demo at http://umpremium.ektasoftwares.com here you can find all features of this plugin.

]]>
Wed, 06 Jun 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/05/31/Jquery-search-ajax-pagination.html https://bakery.cakephp.org/2012/05/31/Jquery-search-ajax-pagination.html <![CDATA[Jquery search ajax pagination]]> Jquery search ajax pagination

This is my first article, i’ve been working on this very component to build dynamics conditions for paginates based on the data entered in a form on the index page.

The component, create file build_conditions.php

<?php
/**
 *
 * Build conditions for search
 * @author Geneller Naranjo
 * @version 1.0
 * @license This content is released under the MIT License (http://www.opensource.org/licenses/mit-license.php)
 *
 */
class BuildConditionsComponent extends Object {

    function initialize(&$controller) {
        $this->controller =& $controller;
    }

    function startup(&$controller) {    }


    /**
     *
     * Funcion que arma las condiciones para los buscadores.
     * Tener cuidado, solo usar para listados que usan el like como comparador.
     * @param Strin $modelName Modelo con las condiciones.
     */
    function buildConditions($modelName) {
        $conditions = array();
        foreach ($this->controller->data['Search'] as $field => $value) {
            if(!empty($value)) {
                if(substr($field, -3, 3) == '_id') {
                    $conditions["$modelName.$field"] = $value;
                } else {
                    $conditions[] = "$modelName.$field like '$value%'";
                }
            }
        }
        return $conditions;
    }

    /**
     *
     * Funcion que arma las condiciones para los buscadores.
     * Tener cuidado, solo usar para listados que usan el like como comparador.
     * Arma las condiciones dependiendo de los campos del formulario.
     */
    function buildComplexConditions() {
        $conditions = array();
        foreach ($this->controller->data['Search'] as $model => $fields) {
            foreach ($fields as $field => $value) {
                if(!empty($value)) {
                    if(substr($field, -3, 3) == '_id') {
                        $conditions["$model.$field"] = $value;
                    } else {
                        $conditions[] = "$model.$field like '$value%'";
                    }
                }
            }
        }
        return $conditions;
    }

}
?>

Create a file jquery.paginate_form.js under webroot/js/.

/**
 *
 * Triggers search
 * @author Geneller Naranjo
 * @version 1.0
 * @license This content is released under the MIT License (http://www.opensource.org/licenses/mit-license.php)
 *
 */
// Teclas que no deben disparar la busqueda.
var unavailableKeyCodes = [9, 13, 16, 17, 18, 19, 20, 27, 35, 36, 37, 38, 39, 40, 45, 93, 106, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 144, 145, 186, 187, 189, 190, 191, 192, 219, 220, 221, 222];

// Variables para abortar peticiones ajax.
var requesting = true;
var request = new $.ajax();
var focused = '';

function paginator(url, domId, targetDomId) {
    var ajaxDelay = 8;
    var params = {};

    function paginate(params) {
        if(requesting == true) {
            request.abort();
        }
        if(typeof(params.url) != 'undefined') {
            url = params.url;
        }
        request = $.ajax({
            data: params.data,    type: 'post',    async: true,    url: url,
            beforeSend: function() {requesting = true;    },
            complete: function(data) {
                $('#' + targetDomId).html(data.responseText);
                requesting = false;
            }
        });
    }

    setInterval(function() {
        ajaxDelay++;
        if(ajaxDelay == 8) {
            params.data = $('#' + domId).serialize();
            paginate(params);
        }}, 100);

    $('#' + domId + ' div input').keyup(function(e) {
        if(requesting == true) {
            request.abort();
        }
    });

    $('#' + domId + ' div input').keyup(function(e) {
        delete params.url;
        if(unavailableKeyCodes.indexOf(e.keyCode) == -1) {
            if(typeof(e.currentTarget.attributes[1].nodeValue) != 'undefined') {
                focused = e.currentTarget.attributes[1].nodeValue;
            }
            ajaxDelay = 1;
        }
    });

    $('#' + domId + ' div select').change(function(e) {
        params.data = $('#' + domId).serialize();
        paginate(params);
    });

    $('#' + domId + ' div input:checkbox').change(function(e) {
        params.data = $('#' + domId).serialize();
        paginate(params);
    });

    $('#' + domId).submit(function() {
        delete params.url;
        params.data = $('#' + domId).serialize();
        paginate(params);
        return false;
    });

    $('#' + targetDomId + ' .paging a').live('click', function(e) {
        e.preventDefault();
        delete params.url;
        params.data = $('#' + domId).serialize();
        var href = $(this).attr('href');
        params.url = href.replace('index/', 'index_ajax/');
        paginate(params);
    });

    $('#' + targetDomId + ' table th a').live('click', function(e) {
        e.preventDefault();
        delete params.url;
        params.data = $('#' + domId).serialize();
        var href = $(this).attr('href');
        params.url = href.replace('index/', 'index_ajax/');
        paginate(params);
    });

}

in your view (i suppose the index) put this.

<?php echo $javascript->link('jquery.paginate_form'); ?>
<script type="text/javascript">
$(function() {
    paginator('<?php echo $this->base . '/<controller>/<action>'?>', 'SearchIndexForm', 'indexAjax');

});
</script>

This is an html sample code for the index.

<div class="header">
        <h2>Carrocerías</h2>
    </div>
    <div id="hideableSearch">
        <div id="showSearchImages">
<?php
echo $html->image('Search-index.png', array('style'=>'height: 35px;'));
?>
        </div>
        <div id="searchFormDiv">
            <fieldset class="fieldset-search-index">
<?php
echo $form->create('Search', array('id'=>'SearchIndexForm', 'encoding'=>'UTF-8'));
echo $form->input('nombre', array('type'=>'text', 'size'=>10));
echo $form->input('codigo', array('type'=>'text', 'size'=>10));
echo $form->input('descripcion', array('type'=>'text', 'size'=>20));
echo $form->end();
?>
            </fieldset>
        </div>
    </div>
<div id="indexAjax">
<table cellpadding="0" cellspacing="0">
    <tr>
        <th>#</th>
        <th><?php echo $this->Paginator->sort('Nombre','nombre', array('url'=>$url));?></th>
        <th><?php echo $this->Paginator->sort('Codigo','codigo', array('url'=>$url));?></th>
        <th><?php echo $this->Paginator->sort('Descripcion','descripcion', array('url'=>$url));?></th>
        <th class="actions">Acciones</th>
    </tr>
<?php
$i = 0;
foreach ($carrocerias as $item):
    $class = null;
    if ($i++ % 2 == 0) $class = ' class="altrow"';
?>
    <tr<?php echo $class; ?> id="<?php echo $item['Carroceria']['id']?>">
        <td><?php echo $i; ?> </td>
        <td><?php echo $item['Carroceria']['nombre']; ?> </td>
        <td><?php echo $item['Carroceria']['codigo']; ?> </td>
        <td><?php echo $item['Carroceria']['descripcion']; ?> </td>
        <td class="actions">
            <?php echo $this->Html->link($html->image('Edit.png'), array('action' => 'edit', $item['Carroceria']['id']), array('escape'=>false, 'class'=>'index-actions')); ?>
        </td>
    </tr>
<?php endforeach; ?>
</table>
<p>
<?php
echo $this->Paginator->counter(array(
'format' => 'Pag %page% de %pages%, %current% registros de %count% en total, desde %start% hasta %end%'
));
?></p>
<div class="paging">
<?php
$paginator->options(array('url'=> $url));
echo $this->Paginator->prev('<< '.'Prev', array(), null, array('class'=>'disabled')).' | ';
echo $this->Paginator->numbers() .' | ';
echo $this->Paginator->next('Sig'.' >>', array(), null, array('class' => 'disabled'));
?></div>
</div>

The code in your view should be the answer you want into #indexAjax

In your controller should be something like

var $components = array('BuildConditions');

And the funcion you said in the url of the request, for this example “carrocerias/index_ajax”

function index_ajax() {
    $this->Carroceria->recursive = 0;
    $this->layout = 'ajax';
    $conditions = $this->BuildConditions->buildConditions($this->modelClass);
    $this->set('carrocerias', $this->paginate(null, $conditions));
}

for simple conditions, if you would create conditions for different models you should use “buildComplexConditions” instead of “buildConditions”.

I hope i made myself clear, please comment and let me know any issue or how to make better this component.

I hope i made myself clear, please comment and let me know how to fix any issue like the first u

]]>
Thu, 31 May 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/05/23/Markdown-plugin-for-CakePHP-2.html https://bakery.cakephp.org/2012/05/23/Markdown-plugin-for-CakePHP-2.html <![CDATA[Markdown plugin for CakePHP 2.+]]> Markdown plugin for CakePHP 2.+

Can be used to convert markdown to HTML markup. It may be useful, for example, to create a help session in a system. That way you can also put your help files on github which also has an interpreter of markdown files.

Installation

You can clone the plugin into your project (or if you want you can use as a submodule):

cd path/to/app/Plugin or /plugins
git clone https://github.com/maurymmarques/markdown-cakephp.git Markdown

Bootstrap the plugin in app/Config/bootstrap.php:

CakePlugin::load(array('Markdown' => array('bootstrap' => true)));

Usage

Enable the helper using the plugin syntax If desired, set the component to assist with the return of data from the markdown.

// in app/Controller/BakeriesController.php
class BakeriesController extends AppController {

        public $helpers = array('Markdown.Markdown');
        public $components = array('Markdown.Markdown');

        public function index() {
            $this->set('textInMarkdownFormat', $this->Markdown->getFile($pathToFile));
        }
}

In the view you can use something like:

// in app/View/Bakeries/index.ctp
echo $this->Markdown->transform($textInMarkdownFormat);
]]>
Wed, 23 May 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/05/23/CakePHP-2-1-3-2-2-0-RC1-released.html https://bakery.cakephp.org/2012/05/23/CakePHP-2-1-3-2-2-0-RC1-released.html <![CDATA[CakePHP 2.1.3 & 2.2.0-RC1 released]]> CakePHP 2.1.3 & 2.2.0-RC1 released

The CakePHP core team is proud to announce the immediate availability of both CakePHP 2.1.3 [1], and 2.2.0-RC1[2]. 2.1.3 is a bugfix release for the 2.1.x branch, while 2.2.0-RC1 is the first release candidate for 2.2.x.

The CakePHP core team is proud to announce the immediate availability of both CakePHP 2.1.3 [1], and 2.2.0-RC1[2]. 2.1.3 is a bugfix release for the 2.1.x branch, while 2.2.0-RC1 is the first release candidate for 2.2.x.

CakePHP 2.1.3

There are a number of bugfixes in 2.1.3, the most notable of these changes are:

  • ControllerTestCase no longer overwrites GET/POST when simulating requests.
  • Xml::fromArray() now properly handles out of sequence numeric keys.
  • TranslateBehavior and Model::saveAll() now correctly save translations in hasMany associations.
  • Router::queryString() now correctly handles appending to existing querystrings.
  • Model::saveMany(), saveAssociated() correctly save data that was modified in a beforeValidate() callback.
  • View now correctly re-uses the Controller event manager instance.
  • Model::saveAll() and default values now behave better.

You can download a packaged release from https://pear.cakephp.org or get a zip file from github[3].

CakePHP 2.2.0-RC1

Since the release of CakePHP 2.2.0-beta a number of new features and enhancements have been merged in:

Timezone support in CakeTime class

The $userOffset parameter has been replaced with $timezone parameter in all relevant functions. So instead of numeric offset you can now pass in a timezone string or DateTimeZone object. Passing numeric offsets for $timezone parameter is still possible for backwards compatibility.

CakeTime::timeAgoInWords() had the accuracy option added. This option allows you to specify how accurate formatted times should be.

A few new methods were added:

  • CakeTime::toServer()
  • CakeTime::timezone()
  • CakeTime::listTimezones()

The $dateString parameter in all methods now accepts a DateTime object. A new config parameter ‘Config.timezone’ is available which you can set to user’s timezone string.

Dynamically modify and create validation rules

A new object ModelValidator was added to delegate the work of validating model data, it should be transparent to the application and fully backwards compatible. It also exposes a rich API to add, modify and remove validation rules. Check docs for this object in https://book.cakephp.org/2.0/en/models/data-validation.html#dynamically-change-validation-rules

Generate config files on the fly

Configure::dump() was added. It is used to persist configuration data in durable storage like files. Both PhpReader and IniReader work with it.

CakeLog

The CakeLog class now accepts the same log levels as defined in RFC 5424. Several convenience methods have also been added in CakeLog class:

  • emergency
  • alert
  • critical
  • error
  • warning
  • notice
  • info
  • debug

Also log engines gained a scope setting to make them log only the contexts they are interested in. You need to add the following lines to your Config/bootsrap.php file:

// Add logging configuration.
CakeLog::config('debug', array(
    'engine' => 'FileLog',
    'types' => array('notice', 'info', 'debug'),
    'file' => 'debug',
));
CakeLog::config('error', array(
    'engine' => 'FileLog',
    'types' => array('warning', 'error', 'critical', 'alert', 'emergency'),
    'file' => 'error',
));

Misc changes

  • FormHelper::inputDefaults() setter/getter added.
  • Added ability for Auth login to use contain.
  • Supported Japanese legacy charset and changed to use upper case charset in Content-Type line in CakeEmail.
  • Improved doc blocks in all functions, mixed params now explicitly say which types are accepted.
]]>
Wed, 23 May 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/05/20/ZaakPay-payment-gateway-component.html https://bakery.cakephp.org/2012/05/20/ZaakPay-payment-gateway-component.html <![CDATA[ZaakPay payment gateway component]]> ZaakPay payment gateway component

This is another component that is get used for ZaakPay payment gateway.

Some info about zaak pay : http://www.zaakpay.com/ Zaak pay is the payment gateway that operate inside india. It is very easy to integrate this payment gateway with your e-commerce application. There are some steps that you need to follow,

Register to Zaakpay : https://www.zaakpay.com/sign-up
After creating account, login to the customer panel.
Here you need to provide some information about your business.
From My Account go to Integration section.
On the 1st step you can configure the

    your application URLs to get the response back from the zaakpay.
    You can get the Merchant identifier & secret key that to be configured in your application

2nd step is to configure the limits for the transaction
3rd screen : you can customize a button that you want to use on your site.
4th step : UI on zaakpay page , you can configure

    headings, logo for the payment gateway page

You can use the current account as a test account, until you provide your business details to zaak pay & zaakpay approves it.

Zaakpay provides an SDK for PHP, but we modified the SDK & created our own component for the same.

Component : This is another component that is get used for ZaakPay payment gateway.

For using this component please follow following steps,

Create a ZaakPay.php inside app/Controller/Component/
Copy paste the below code in this file
Create a controller payments.php
Create views

ZaakPay Componenet :

<?php class ZaakPayComponent extends Object { public $config;

public function initialize($controller)
{
       $this->config = array(‘SiteName’ => ‘your_site_name’, ‘ZaakSecret’ => ‘secret_key_from_zaak_pay’, ‘ZaakMerchantIdentifier’ => ‘merchant_identifier_from_zaak_pay’);
}

function startup(&$controller)
{
   $this->controller =& $controller;

}

public function beforeRender()
{
}

public function shutdown()
{
}

public function beforeRedirect()
{
}

public function getOrderId()
{
   return $this->config['SiteName'] . time();
}

public function calculateChecksum($all)
{
   $hash = hash_hmac('sha256', $all, $this->config['ZaakSecret']);
   $checksum = $hash;
   return $checksum;
}


public function getAllParams()
{
   //ksort($_POST);
   $all = '';
   foreach ($_POST as $key => $value) {
       if ($key != 'submit') {
           if ($key != 'checksum') {
               $all .= "'";
               if ($key == 'returnUrl') {
                   $all .= $this->sanitizedURL($value);
               } else {
                   $all .= $this->sanitizedParam($value);
               }
               $all .= "'";
           }
       }
   }
   return $all;
}

public function outputForm($checksum)
{
   //ksort($_POST);
   $html = '';
   foreach ($_POST as $key => $value) {
       if ($key != 'submit') {
           if ($key == 'returnUrl') {
               $html .= '<input type="hidden" name="' . $key . '" value="' . $this->sanitizedURL($value) . '" />' . "\n";
           } else {
               $html .= '<input type="hidden" name="' . $key . '" value="' . $this->sanitizedParam($value) . '" />' . "\n";
           }
       }
   }
   $html .= '<input type="hidden" name="checksum" value="' . $checksum . '" />' . "\n";

   return $html;
}

public function verifyChecksum($checksum, $all)
{
   $cal_checksum = $this->calculateChecksum($all);
   $bool = 0;
   if ($checksum == $cal_checksum) {
       $bool = 1;
   }

   return $bool;
}

public function sanitizedParam($param)
{
   $pattern[0] = "%,%";
   $pattern[1] = "%#%";
   $pattern[2] = "%\(%";
   $pattern[3] = "%\)%";
   $pattern[4] = "%\{%";
   $pattern[5] = "%\}%";
   $pattern[6] = "%<%";
   $pattern[7] = "%>%";
   $pattern[8] = "%`%";
   $pattern[9] = "%!%";
   $pattern[10] = "%\\$%";
   $pattern[11] = "%\%%";
   $pattern[12] = "%\^%";
   $pattern[13] = "%=%";
   $pattern[14] = "%\+%";
   $pattern[15] = "%\|%";
   $pattern[16] = "%\\\%";
   $pattern[17] = "%:%";
   $pattern[18] = "%'%";
   $pattern[19] = "%\"%";
   $pattern[20] = "%;%";
   $pattern[21] = "%~%";
   $pattern[22] = "%\[%";
   $pattern[23] = "%\]%";
   $pattern[24] = "%\*%";
   $pattern[25] = "%&%";
   $sanitizedParam = preg_replace($pattern, "", $param);
   return $sanitizedParam;
}

public function sanitizedURL($param)
{
   $pattern[0] = "%,%";
   $pattern[1] = "%\(%";
   $pattern[2] = "%\)%";
   $pattern[3] = "%\{%";
   $pattern[4] = "%\}%";
   $pattern[5] = "%<%";
   $pattern[6] = "%>%";
   $pattern[7] = "%`%";
   $pattern[8] = "%!%";
   $pattern[9] = "%\\$%";
   $pattern[10] = "%\%%";
   $pattern[11] = "%\^%";
   $pattern[12] = "%\+%";
   $pattern[13] = "%\|%";
   $pattern[14] = "%\\\%";
   $pattern[15] = "%'%";
   $pattern[16] = "%\"%";
   $pattern[17] = "%;%";
   $pattern[18] = "%~%";
   $pattern[19] = "%\[%";
   $pattern[20] = "%\]%";
   $pattern[21] = "%\*%";
   $sanitizedParam = preg_replace($pattern, "", $param);
   return $sanitizedParam;
}

public function outputResponse($bool)
{
   $response = '';
   foreach ($_POST as $key => $value) {
       if ($bool == 0) {
           if ($key == "responseCode") {
               $response .= '<tr><td width="50%" align="center" valign="middle">' . $key . '</td>
                   <td width="50%" align="center" valign="middle"><font color=Red>***</font></td></tr>';
           } else if ($key == "responseDescription") {
               $response .= '<tr><td width="50%" align="center" valign="middle">' . $key . '</td>
                   <td width="50%" align="center" valign="middle"><font color=Red>This response is compromised.</font></td></tr>';
           } else {
               $response .= '<tr><td width="50%" align="center" valign="middle">' . $key . '</td>
                   <td width="50%" align="center" valign="middle">' . $value . '</td></tr>';
           }
       } else {
           $response .= '<tr><td width="50%" align="center" valign="middle">' . $key . '</td>
               <td width="50%" align="center" valign="middle">' . $value . '</td></tr>';
       }
   }
   $response .= '<tr><td width="50%" align="center" valign="middle">Checksum Verified?</td>';
   if ($bool == 1) {
       $response .= '<td width="50%" align="center" valign="middle">Yes</td></tr>';
   }
   else {
       $response .= '<td width="50%" align="center" valign="middle"><font color=Red>No</font></td></tr>';
   }

   return $response;
}

public function error_codes()
{
 $transaction_errors =  array('100' => 'The transaction was completeted successfully.',
       '101' => 'Merchant not found. Please check your merchantIdentifier field.',
       '102' => 'Customer cancelled transaction.',
       '103' => 'Fraud Detected.',
       '104' => 'Customer Not Found.',
       '105' => 'Transaction details not matched.',
       '106' => 'IpAddress BlackListed.',
       '107' => 'Transaction Amount Limit Not Matched.',
       '108' => 'Validation Successful.',
       '109' => 'Validation Failed.',
       '110' => 'MerchantIdentifier field missing or blank.',
       '111' => 'MerchantIdentifier Not Valid.',
       '129' => 'OrderId field missing or blank.',
       '130' => 'OrderId received with request was not Valid.',
       '110' => 'Order Id Already Processed with this Merchant.',
       '131' => 'ReturnUrl field missing or blank.',
       '132' => 'ReturnUrl received with request was not Valid',
       '133' => 'BuyerEmail field missing or blank.',
       '189' => 'ReturnUrl does not match the registered domain.',
       '134' => 'BuyerEmail received with request was not Valid.',
       '135' => 'BuyerFirstName field missing or blank.',
       '136' => 'BuyerFirstName received with request was not Valid.',
       '137' => 'BuyerLastName field missing or blank.',
       '138' => 'BuyerLastName received with request was not Valid.', '139' => 'BuyerAddress field missing or blank.',
       '140' => 'BuyerAddress received with request was notValid.',
       '141' => 'BuyerCity field missing or blank.',
       '142' => 'BuyerCity received with request was not Valid.',
       '143' => 'BuyerState field missing or blank.',
       '144' => 'BuyerState received with request was not Valid.',
       '145' => 'BuyerCountry field missing or blank.',
       '146' => 'BuyerCountry received with request was not Valid.',
       '147' => 'Buyer PinCode field missing or blank.',
       '148' => 'BuyerPinCode received with request was not Valid.',
       '149' => 'BuyerPhoneNumber field missing or blank.',
       '150' => 'BuyerPhoneNumber received with request was not Valid.',
       '151' => 'TxnType field missing or blank.',
       '152' => 'TxnType received with request was not Valid.',
       '153' => 'ZpPayOption field missing or blank.',
       '154' => 'ZpPayOption received with request was not Valid.',
       '155' => 'Mode field missing or blank.',
       '156' => 'Mode received with request was not Valid.',
       '157' => 'Currency field missing or blank.',
       '158' => 'Currency received with request was not Valid.',
       '159' => 'Amout field missing or blank.',
       '160' => 'Amount received with request was not Valid.',
       '161' => 'BuyerIpAddressfield missing or blank.',
       '162' => 'BuyerIpAddress  received with request was not Valid.',
       '163' => 'Purposefield missing or blank.',
       '164' => 'Purpose received with request was not Valid.',
       '165' => 'ProductDescription field missing or blank.',
       '166' => 'ProductDescription received with request was not Valid.',
       '167' => 'Product1Description received with request was not Valid.',
       '168' => 'Product2Description received with request was not Valid.',
       '169' => 'Product3Description received with request was not Valid.',
       '170' => 'Product4Description received with request was not Valid.',
       '171' => 'ShipToAddress received with request was not Valid.',
       '172' => 'ShipToCity received with request was not Valid.',
       '173' => 'ShipToState received with request was not Valid.',
       '174' => 'ShipToCountry received with request was not Valid.',
       '175' => 'ShipToPincode received with request was not Valid.',
       '176' => 'ShipToPhoneNumber received with request was not Valid.',
       '177' => 'ShipToFirstname received with request was not Valid.',
       '178' => 'ShipToLastname received with request was not Valid.',
       '179' => 'Date is blank or Date received with request was not valid.',
       '180' => 'checksum received with request is not equal to what we calculated.',
       '181' => 'Merchant Data Complete.',
       '182' => 'Merchant Data Not Complete in Our Database.',
       '183' => 'Unfortunately, the transaction failed due to some unexpected reason in our system.',
       '400' => 'The transaction was declined by the issuing bank.',
       '401' => 'The transaction was rejected by the acquiring bank.');
}

Purchases Controller :

class PurchasesController extends AppController {

public  $components = array('Payments.ZaakPay');

public function beforeFilter()
{
   parent::beforeFilter();
   //$this->Auth->allow('*');
}

public function zaakpay(){

   $orderId = $this->ZaakPay->getOrderId();

   $ZaakMerchantIdentifier = $this->ZaakPay->config['ZaakMerchantIdentifier'];
   $this->set(compact('orderId','item','ZaakMerchantIdentifier'));
}

public function zaakpay_post_data(){

   if(!empty($_POST)){

       $all = $this->ZaakPay->getAllParams();

       $checksum = $this->ZaakPay->calculateChecksum($all);

       $formHtml = $this->ZaakPay->outputForm($checksum);

//create an order & save it to DB if needed

//your code goes here

$this->set(compact('formHtml'));
   }
}

public function zaakpay_response(){

   $original_response = $_POST;

   $recd_checksum = $_POST['checksum'];
   $all = $this->ZaakPay->getAllParams();

   $checksum_check = $this->ZaakPay->verifyChecksum($recd_checksum, $all);
   $response = $this->ZaakPay->outputResponse($checksum_check);

   //update transaction
   if($_POST['responseCode'] == '100'){
        //update your saved order
   }else{
       //delete order
   }

   $this->set(compact('response', 'original_response'));
}

public function zaakpay_updates(){

}

public function zaakpay_check_transaction(){

}

Views for the actions :

For action zaakpay:

<div class=”hero-unit”> <h2>Payment Process </h2>

<form action="/payments/purchases/zaakpay_post_data" method="post">
   <input type="hidden" name="merchantIdentifier" value="<?php echo $ZaakMerchantIdentifier;?>"/>
   <input type="hidden" name="orderId" value="<?php echo $orderId;?>"/>
   <input type="hidden" name="txnType" value="1"/>
   <input type="hidden" name="zpPayOption" value="1"/>
   <input type="hidden" name="mode" value="1"/>
   <input type="hidden" name="currency" value="INR"/>
   <input type="hidden" name="amount" value="item price"/>
   <input type="hidden" name="merchantIpAddress" value="<?php echo $_SERVER['SERVER_ADDR']?>"/>
   <input type="hidden" name="purpose" value="1"/>
   <input type="hidden" name="productDescription" value="product description"/>
   <input type="hidden" name="txnDate" id="txnDate" value="<?php echo date('Y-m-d');?>"/>
           <h2>Pay Now via Zaakpay.</h2>

   <table width="650px;">
       <tr>
           <td colspan="2"> </td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle">Song Name</td>
           <td width="50%" align="center" valign="middle"><?php echo $song['Song']['name'];?></td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle">Price</td>
           <td width="50%" align="center" valign="middle"><?php echo $song['Song']['price'];?> Rs</td>
       </tr>
       <tr>
           <td colspan="2"> </td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle">Buyer Email</td>
           <td width="50%" align="center" valign="middle"><input type="text" name="buyerEmail"
                                                                 value="buyer_email"/></td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle">Buyer First Name</td>
           <td width="50%" align="center" valign="middle"><input type="text" name="buyerFirstName"
                                                                 value=""/></td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle">Buyer Last Name</td>
           <td width="50%" align="center" valign="middle"><input type="text" name="buyerLastName"
                                                                 value="/></td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle">Buyer Address</td>
           <td width="50%" align="center" valign="middle"><input type="text" name="buyerAddress" value=""/></td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle">Buyer City</td>
           <td width="50%" align="center" valign="middle"><input type="text" name="buyerCity" value=""/></td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle">Buyer State</td>
           <td width="50%" align="center" valign="middle"><input type="text" name="buyerState" value=""/></td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle">Buyer Country</td>
           <td width="50%" align="center" valign="middle"><input type="text" name="buyerCountry" value=""/></td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle">Buyer Pincode</td>
           <td width="50%" align="center" valign="middle"><input type="text" name="buyerPincode" value=""/></td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle">Buyer Phone No</td>
           <td width="50%" align="center" valign="middle"><input type="text" name="buyerPhoneNumber" value=""/>
           </td>
       </tr>
       <tr>
           <td width="50%" align="right" valign="middle"> </td>
           <td width="50%" align="center" valign="middle">
               <input type="submit" name="submit" value="Pay Now"/>
           </td>
       </tr>


   </table>

</form>

</div> Post data for request creation : Above action get submitted to the Purchases controller & then zaak pay component creates a request format & post the data inside form to the payment gateway.

Action : zaak_pay_post_data()

<div class=”hero-unit”> <h2>Payment Process </h2>

<div>
   <h3>Please wait we are redirecting you to the payment gateway.....</h3>
</div>

<form action="https://api.zaakpay.com/transact" method="post" id="paymentForm">
   <?php
   echo $formHtml;
   ?>
</form>

</div>

<script type=”text/javascript”> $(document).ready(function () { $(“#paymentForm”).submit(); });</script>

Now User get redirected to the zaakpay site for payment, user completes the payment & then get returned to the action that is set inside the zaakpay control panel.

Action : zaakpay_response()

<div class=”hero-unit”> <h2><?php echo __(‘Song’); ?></h2> <table cellpadding=”0” cellspacing=”0” width=”100%” class=”table table- condensed”>

<?php
   if ($original_response['responseCode'] == '100') {
       ?>
       <tr>
           <td>
               Your transaction for Order Id <?php echo $original_response['orderId'];?> has been successfully
               completed.
           </td>
       </tr>
       <?php
   } else {
       echo $response;
   }

   ?>
</table>

</div>

This is the flow of successful transaction. We are yet to handle the errors & display them to the page. This is a basic integration, you can modify this as per your need.

Suggestions are welcome. Please contact me on kvijay@weboniselab.com

]]>
Sun, 20 May 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/05/19/Combinator-Plugin-Combine-minify-and-cache-CSS-and-JS-files-in-CakePHP-2-1.html https://bakery.cakephp.org/2012/05/19/Combinator-Plugin-Combine-minify-and-cache-CSS-and-JS-files-in-CakePHP-2-1.html <![CDATA[Download Now - GitHub]]> Combinator Plugin: Combine, minify and cache CSS and JS files in CakePHP 2.1 ===========

Easily combine, minify and cache Javascript and CSS files for faster load times.

More Info…

This plugin is based on the Cake 1.3 Combinator Article from the Bakery - https://bakery.cakephp.org/articles/st3ph/2010/09/10 /combinator-compress-and-combine-your-js-and-css-files I’ve just made it compatible with CakePHP 2.1, and packaged it as a plugin, including CSSTidy and jsmin.

The plugin is quick and easy to install, and is available (along with documentation) on GitHub: https://github.com/joshuapaling/CakePHP-Combinator-Plugin

PLEASE NOTE - this is my first CakePHP plugin, and also my first public GitHub project. As far as I know the code included is all legit and open source. Please let me know if not.

]]>
Sat, 19 May 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/05/18/Extending-HttpSocket-for-use-with-Amazon-among-other-things-for-1-3-x-and-2-x.html https://bakery.cakephp.org/2012/05/18/Extending-HttpSocket-for-use-with-Amazon-among-other-things-for-1-3-x-and-2-x.html <![CDATA[Extending HttpSocket for use with Amazon among other things for 1.3.x and 2.x]]> Extending HttpSocket for use with Amazon among other things for 1.3.x and 2.x

When trying to use the Amazon API, I read a lot about the Amazon rule of only being allowed to make 1 request a second or your web site would be refused access to Amazon if this was ignored too often. So I set about solving the issue using CakePHP and ended up with a few classes that could be of use to others. The source for this article is downloadable from Github. The Master branch is for CakePHP1.3.x and there is now a 2.x branch.

The obvious solution to the Amazon request frequency problem is to ensure your website makes no more than 1 request a second. I decided to implement this with a locked file approach that would marshall the requests being made.

The system presented here consists of 3 classes and an interface.

The interface ISocket simply outlines methods as implemented by HttpSocket in CakePHP.

interface ISocket {
    public function put($uri = null, $data = array(), $request = array());
    public function delete($uri = null, $data = array(), $request = array());
    public function get($uri=NULL, $query = array(), $request = array());
    public function post($uri = null, $data = array(), $request = array());
}

The abstract class BaseSocket wraps any ISocket implementing class and takes care of passing calls to that class.

abstract class BaseSocket implements ISocket {
    private $_socket;

    public function  __construct( ISocket $socket ) {
        $this->_socket = $socket;
    }

    public function  delete($uri = null, $data = array(), $request = array()) {
        return $this->_socket->delete($uri,$data,$request);
    }

    public function post($uri = null, $data = array(), $request = array()) {
        return $this->_socket->post($uri,$data,$request);
    }

    public function get($uri = NULL, $query = array(), $request = array()) {
        return $this->_socket->get($uri,$query,$request);
    }

    public function put($uri = null, $data = array(), $request = array()) {
        return $this->_socket->put($uri,$data,$request);
    }
}

The class NormalSocket simply extends HttpSocket and implements ISocket which enables it to be used by BaseSocket. Other than this, it is identical to HttpSocket supplied by CakePHP.

class NormalSocket extends HttpSocket implements ISocket {
    public function __construct($config = array() ) {
        parent::__construct($config);
    }
}

You could use NormalSocket just as you would use HttpSocket.

/* Create a NormalSocket which has the same usage as HttpSocket */
$ns = new NormalSocket();
/* Get content from a URI */
$response = $ns->get($uri);

ThrottledSocket throttles another ISocket implementing object which is passed in the constructor.

class ThrottledSocket extends BaseSocket implements ISocket {

    /**
     * Filename used for synchronisation
     */
    private $_filename;

    /**
     * Create a Throttled Socket.
     */
    public function __construct(ISocket $socket) {
        parent::__construct($socket);
        $this->_filename = ROOT . DIRECTORY_SEPARATOR . APP_DIR . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . 'throttle.dat';
        if (!file_exists($this->_filename)) {
            file_put_contents($this->_filename, time());
        }
    }

    /**
     * Issues a GET request to the specified URI, query, and request.
     */
    public function get($uri=NULL, $query = array(), $request = array()) {
        $delay = $this->throttle();
        if ($delay > 0) {
            sleep($delay);
        }
        return parent::get($uri, $query, $request);
    }

    /**
     * Issues a POST request to the specified URI, query, and request.
     */
    public function post($uri = null, $data = array(), $request = array()) {
        $delay = $this->throttle();
        if ($delay > 0) {
            sleep($delay);
        }
        return parent::post($uri, $query, $request);
    }

    /**
     * Introduce a delay. Requests are only allowed to be sent
     * once a second.
     */
    private function throttle() {
        $curtime = time();
        $filetime = $curtime;
        $fp = fopen($this->_filename, "r+");
        if (flock($fp, LOCK_EX)) {
            $nbr = fread($fp, filesize($this->_filename));
            $filetime = intval(trim($nbr));
            $curtime = time();
            if ($curtime > $filetime) {
                $filetime = $curtime;
            } else {
                $filetime++;
            }
            rewind($fp);
            ftruncate($fp, 0);
            fprintf($fp, "%d", $filetime);
            flock($fp, LOCK_UN);
        }
        fclose($fp);
        return $filetime - $curtime;
    }
}

You use ThrottledSocket as follows…

$ts = new ThrottledSocket(new NormalSocket());
/* Requests to Throttled socket now happen only once per second */
$response = $ts->get($uri);

CachedSocket caches another ISocket implementing object which is passed in the constructor. The class uses the standard CakePHP Cacheing mechanism to cache the responses returned by the wrapped socket.

class CachedSocket extends BaseSocket implements ISocket {

    /**
     * The cache key
     */
    private $_cacheKey;

    /**
     * The duration of the cache in seconds
     */
    private $_cacheDuration;


    /**
     * Create the object and assign a cache key.
     */
    public function __construct(ISocket $socket, $key, $duration=3600) {
        parent::__construct($socket);
        $this->_cacheKey = $key;
        $this->_cacheDuration = $duration;
    }

    /**
     * Set the number of seconds for which responses should be cached.
     */
    public function setCacheDuration($duration) {
        $this->_cacheDuration = $duration;
    }

    /**
     * Set the cache key
     */
    public function setCacheKey($key) {
        $this->_cacheKey = $key;
    }

    /**
     * GET Request a URL.
     */
    public function get($uri=NULL, $query = array(), $request = array()) {
        $response = Cache::read($this->_cacheKey);
        if ($response === false) {
            $response = parent::get($uri, $query, $request);
            if ($response) {
                Cache::set(array('duration' => '+' . $this->_cacheDuration . ' seconds'));
                Cache::write($this->_cacheKey, $response);
            }
        }
        return $response;
    }

    /**
     * POST Request a URL.
     */
    public function post($uri=NULL, $query = array(), $request = array()) {
        $response = Cache::read($this->_cacheKey);
        if ($response === false) {
            $response = parent::post($uri, $query, $request);
            if ($response) {
                Cache::set(array('duration' => '+' . $this->_cacheDuration . ' seconds'));
                Cache::write($this->_cacheKey, $response);
            }
        }
        return $response;
    }

}

You could use CachedSocket to cache responses from an HttpSocket

/* Cache the NormalSocket with the key 'CacheKey' for 1 hour */
$cs = new CachedSocket(new NormalSocket(), 'CacheKey', 3600 );
/* Requests to Cached socket now return the cached response for the next hour */
$response = $cs->get($uri);

Using this system of wrapping other ISocket implementing objects we can cache throttled requests which is ideal for accessing Amazon. Once a request is made, the response will be cached so amazon requests are only made when necessary and they will not occur more than once per second.

function GetBookByAsin( $asin ) {
    /* Throttle an HttpSocket to send requests at once a second */
    $ts = new ThrottledSocket( new NormalSocket() );
    /* Cache the throttled socket */
    $amazonSocket = new CachedSocket( $ts, 'ASIN' . $asin, 3600 );
    /* Build amazon request URL in $url */
    $response = $amazonSocket->get($url);
    /* Process XML returned by Amazon or by the Cache */
}

The first time the example function is called it will make a throttled request to amazon and cache the response. For the next hour any requests for the same item will return the cached response and not make any calls to amazon at all.

The source code is available from GitHub at the URL shown above and it is simply a matter of copying the classes into your app/libs (or app/Lib for 2.x) directory and using them. I have documented each class and provided a couple of test cases.

Another bonus of wrapping the socket classes in other classes can be seen in the test cases. It is simple to create a dummy class that implements ISocket and feed that to CachedSocket or ThrottledSocket so those classes can be tested without the need of making any actual requests.

]]>
Fri, 18 May 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/05/18/Amazon-Product-Advertising-Services-Component.html https://bakery.cakephp.org/2012/05/18/Amazon-Product-Advertising-Services-Component.html <![CDATA[Amazon Product Advertising Services Component]]> Amazon Product Advertising Services Component

A CakePHP 2.x component for using the Amazon PAS The source for this component is available from Github

I first toyed with the idea of making the official AWS/PAS libraries ( available from github in the repositories ‘aws-sdk-for-php’ and ‘cloudfusion’ ) usable by CakePHP but then went away from this as it ties you into using CURL. Personally I would rather have the choice of using Cake’s own HttpSocket to make requests if I choose to or even my own Caching and Throttled versions of HttpSocket.

So instead, I created a component whose sole purpose is to construct URL’s that can then be sent to Amazon using any method I choose in order obtain the information.

Installation, Configuration and Usage documentation are contained within the readme file and the component source so there is little need to repeat it here.

I hope it is of use to someone other than myself !!!

]]>
Fri, 18 May 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/05/08/CakeFest-2012.html https://bakery.cakephp.org/2012/05/08/CakeFest-2012.html <![CDATA[CakeFest 2012]]> CakeFest 2012

CakeFest 2012 will be in Manchester, UK. With the huge success of last year, combined with the low cost accommodation and great location for travellers, we couldn’t pass up bringing it to Manchester for another year!

CakeFest is the annual CakePHP Conference. It brings together developers, users, and interested parties from all over the world for a four day event filled with workshops, talks, dinners, social events and plenty of fun!

If you are interested in giving a talk at CakeFest, we still have submissions open! Just head over to the CakeFest, sign up and submit your talk proposal via your account page! We’re open to anyone for submissions, and we’d love to hear your ideas!

Tickets are on sale now! Head over to the CakeFest website for ticketing information.

Do you work for or own a business that would benefit from the unique exposure that comes from being a CakeFest Conference Sponsor? We’re currently seeking sponsors for CakeFest 2012, to help us realise a great event and continue the tradition of the awesome CakeFest conference experience. We need the help of the community to spread awareness of the event, and seek out sponsors to support our annual conference. Please email sponsors@cakefest.org for more details.

CakeFest is organised into two sections; the first two days are for workshops, in which CakePHP core contributors conduct lesson style courses where attendees learn about CakePHP at either a beginner or intermediate to advanced level. This selective in-person training is a great way to learn CakePHP, refresh your skills, or to learn new techniques and advanced approaches to boost your development. Taking training at CakeFest is a unique experience, and attendees are rewarded with a certificate issued by the Cake Software Foundation upon completion.

The second part of CakeFest is the conference. This is comprised of a series of talks given by the core developers, community members, and mixed in with lightning talks which enable anyone attending to jump up and talk about a topic! We also conduct a Core Panel discussion, in which you can talk directly to the core developers, and we challenge their knowledge in a public arena!

In amongst all the days of serious (fun) learning, we have social events organised to keep you busy and to provide a great way to network with fellow developers and make new friends!

Check out the CakeFest website, and don’t miss out on tickets!

]]>
Tue, 08 May 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/30/CakePHP-2-1-2-2-2-0-beta-released.html https://bakery.cakephp.org/2012/04/30/CakePHP-2-1-2-2-2-0-beta-released.html <![CDATA[CakePHP 2.1.2 & 2.2.0-beta released]]> CakePHP 2.1.2 & 2.2.0-beta released

The CakePHP core team is proud to announce the immediate availability of both CakePHP 2.1.2 [1], and 2.2.0-beta [2]. 2.1.2 is a bugfix release for the 2.1.x branch, while 2.2.0-beta is the first release for 2.2.x.

The CakePHP core team is proud to announce the immediate availability of both CakePHP 2.1.2 [1], and 2.2.0-beta [2]. 2.1.2 is a bugfix release for the 2.1.x branch, while 2.2.0-beta is the first release for 2.2.x.

CakePHP 2.1.2

There are a number of bugfixes in 2.1.2, the most notable of those changes is:

  • Set::insert() now overwrites values that were previously string values.
  • AuthComponent now uses loginRedirect as the default redirect location, should the session be empty.
  • CakeNumber::format() now supports multiple bytes for thousands/decimals when using PHP lower than PHP 5.4
  • A change to CakeSession was reverted to help solve issues with IE8 and sessions being lost.
  • Fixed an issue with SQLServer + boolean columns.
  • DboSource::buildJoinStatement() does not add the schema when the table is a subquery.
  • SessionComponent::id() always returns the sessionid. It will auto- start the session if necessary.
  • Method checking in Model for expression() and calculate() is only done when required now.
  • The testsuite now always uses the test datasource. Previously, if you did not include any fixtures and ran tests that required the database, the default connection was used.
  • URL fragments are no longer urlencoded. This caused issues with client side frameworks like backbone.
  • The return of L10n::get() consistently returns the language.
  • HTML escaping for string urls on css() and script() was fixed.
  • Warnings from saveAll() with an empty hasMany data set are fixed.
  • Validation::decimal() accepts values like 10 and 10.0 .
  • FormHelper::postButton() no longer makes invisible buttons.
  • The $_FILES array is now recursively reformatted. This fixes issues when file inputs are deeply nested.
  • EmailComponent no longer double encodes addresses containing UTF-8 characters.
  • File::create() no longer juggles umask. This was a workaround for file caching which is no longer needed.

CakePHP 2.2.0-beta

Following hot on the heels of 2.1.0, the CakePHP team is proud to announce the beta release for 2.2.0. 2.2.x will be an API compatible release with 2.0.x, and 2.1.x. All of the changes mentioned in the 2.1.2 release, are also be present in 2.2.0-beta. We’ve decided to skip the standard ` -dev` and ` -alpha` releases, as we think the new features are relatively stable, and should be generally transparent when upgrading. A quick list of new features added in 2.2.0-beta:

Timezone support for CakeTime utility

  • Added “Config.timezone” param to configure global timezone for the application.
  • CakeTime functions can now use timezone string or DateTimeZone object for user offsets
  • The $userOffset parameter has been replaced with $timezone parameter in all relevant functions.
  • Passing numeric offsets for $timezone parameter is still possible for backwards compatibility.
  • New methods added: CakeTime::toServer() and CakeTime::timezone()`

Support pagination for complex custom finders

Model ` findCount()` will now pass ` $query[‘operation’]=’count’` for more flexibility.

In many cases custom finds already return correct counts for pagination, but ‘operation’ key allows more flexibility to build other queries, or drop joins which are required for the custom finder itself. As the pagination of custom find methods never worked quite well it required workarounds for this in the model level, which are now no longer needed

ACL methods now part of Permission model

Now the Permission model has available all methods exposed in the AclComponent for easier permissions check in the model layer.

New Hash class

A new utility library ` Hash` was added. It is intended as a replacement for the Set class featuring improved performance, and a more consistent API. All internal calls to Set were replaced and Set has been deprecated and will be removed in the next major version.

Also added were Set::expand() and Hash::expand() to convert a plain list of dot separated keys into a nested array.

Helper Lazy Loading

Helpers located in the app folder can now be lazy loaded, there is no need to declare helpers anymore in the ` $helpers` controller property if they are located in the app folder and you do not rely on them triggering any callback.

Redis cache engine

A new cache engine was added to interface with a Redis server, which is similar to Memcache

Cache groups

It is now possible to tag or label cache keys under groups. This makes it simpler to mass-delete cache entries associated to the same label. Groups are declared at configuration time when creating the cache engine

Fatal error & console error handlers

You can now configure separate error handlers for console and fatal errors. If you leave these configurations undefined the defaults will be used. If you are using a custom error handler, it will now receive fatal error codes, in addition to the other types.

Nested transaction support

Dbo datasources now supports real nested transactions. If you need to use this feature in your application, enable it using ` ConnectionMana ger::getDataSource(‘default’)->useNestedTransactions=true;`

Dispatcher filters

Event listeners can now be attached to the dispatcher calls, those will have the ability to change the request information or the response before it is sent to the client. ` app/Config/bootstrap.php` should be changed to add configuration related to Dispatcher filters. If your application relies on assets in themes or plugins being dispatched, or if your are using the full page caching feature you must copy the relevant configuration to your bootstrap file. You need to add the following:

<?php
Configure::write('Dispatcher.filters', array(
    'AssetDispatcher',
    'CacheDispatcher'
));

Additionally, the new AssetDispatcher filter will return a 304 code if it can detect the browser has the asset cached already

Other Changes

  • Add charset() / headerCharset() methods to CakeEmail class
  • Travis CI support
  • Added support for ‘on’ validation key in FormHelper. This will set the required class accordingly depending on the type of operation (create or update)

Following the beta of 2.2.0, the core team will be focusing on solidifying 2.2.x towards a final release, and beginning inital work on the next release of CakePHP.

As always, thanks to the friendly CakePHP community for the patches, documentation changes and new tickets. Without you there would be no CakePHP!

]]>
Mon, 30 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/24/AWS-SES-component-for-CakePHP2-0.html https://bakery.cakephp.org/2012/04/24/AWS-SES-component-for-CakePHP2-0.html <![CDATA[AWS SES component for CakePHP2.0 +]]> AWS SES component for CakePHP2.0 +

This is an Amazon SES component. Developed to help developers to move & integrate faster the AWS services. In future we will come up with the aws plugin with all the services

We use Amazon services for our day today applications & we use their SDK & write normal code to required controllers, So we planned to create a component for AWS service.

Amazon Simple Email Service (Amazon SES) is a very popular email SMTP service by Amazon. It has lots of advantages like,

Easy to use
Good documentation
Good fault tolerance
Easy to integrate with existing architecture
Detailed reporting about email deliveries
Highly scalable

Once you go with AWS services, it is advised to use their services throughout your application. like EC2 for hosting your application, SES for sending email via authenticated & trusted SMTP server. You can use AWS SES service alone also.

So for using Amazon Simple Email Service (Amazon SES) service use following steps, 1. You need an AWS account. http://aws.amazon.com/ 2. Login to the account & go to the SES dashboard. 3. Add email address to verify. Which can be used in From header of outgoing emails. 4. After adding email, AWS sends an verification email to the email address. You need to verify this email address. Then it will appear in the verified email list.

http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/InitialSetup.EmailVerification.html

By default in the 1st go AWS gives you a sandbox testing account. In this mode it will only send emails to & from the verified email addresses only.

For using SES with your application you need production access. So first up all request to activate the production mode. It will take one business day to activate. After this activation you can send emails through your application.

Now there is a Verified email address section in the SES dashboard. These email addresses you can use in the From header of your outgoing email. If the email address is not verified you can not use that email address.

Now the Implementation part comes in the picture with CakePHP app. It’s very easy to integrate SES with the application.

Download the SDK (PHP) from AWS. http://aws.amazon.com/code
Extract the sdk to your ‘app/Vendor’ directory.
Rename it as ‘aws’ from ‘aws-sdk’
Create a component file in the components directory. name : AWSSESComponent.php
Copy paste the code to this file
Add the line to Appcontroller :

include_once(APP.DS.’Vendor’.DS.’aws/sdk.class.php’); or App::import(‘Vendor’, ‘aws/sdk.class’);

Add ‘AWSSES’ in the public $components = array('AWSSES');
Now you can use this in any controller. If you want to use this controller specific then in every controller you can add the component array.

Currently this component only supports the HTML email formats, but we are going to improve this further. This is the inspiration from Swiftmailer component & SES:

<?php App::import('Vendor', 'aws/sdk.class.php');
App::import('Vendor', 'aws/services/ses.class.php');

class AWSSESComponent extends Object {

    public $ses;
    public $emailViewPath = '/Emails';
    public $emailLayouts = 'Emails';
    public $htmlMessage;
    public $from = 'from_email_address';
    public $to;

    public function initialize($controller)
    {

    }


    function startup(&$controller)
    {
       $this->controller =& $controller;

       $this->ses = new AmazonSES(array('certificate_authority' => false,
           'key' => 'AWS_Key',
           'secret' => 'AWS_secrete'));

    }

    public function beforeRender()
    {
    }

    public function shutdown()
    {
    }

    public function beforeRedirect()
    {
    }

    public function _aws_ses($viewTemplate, $mailContent = null)
    {
           if(!empty($this->controller->request->data) && $mailContent == null){
           $mailContent = $this->controller->request->data[$this->controller->modelClass];
       }

       $mail = $this->email_templates($viewTemplate);

       $destination = array(
           'ToAddresses' => explode(',', $this->to)
       );
       $message = array(
           'Subject' => array(
               'Data' => $mail['Subject']
           ),
           'Body' => array()
       );


       $this->controller->set('data', $mailContent);

       $this->htmlMessage = $this->_getHTMLBodyFromEmailViews($mail['ctp']);

       if ($this->htmlMessage != NULL) {
           $message['Body']['Html'] = array(
               'Data' => $this->htmlMessage
           );
       }

       $response = $this->ses->send_email($this->from, $destination, $message);

       $ok = $response->isOK();

       if (!$ok) {
           $this->log('Error sending email from AWS SES: ' . $response->body->asXML(), 'debug');
       }
       return $ok;
    }

    public function email_templates($name)
    {
       $this->templates = array('email_name' => array(
           'ctp' => 'ctp_file_name', 'Subject' => 'email_subject'
       ),'email_name' => array('ctp' => 'reset_passwordctp_file_name 'Subject' => 'email_subject'));

       return $this->templates[$name];
    }

    public function _getHTMLBodyFromEmailViews($view)
    {
       $currentLayout = $this->controller->layout;
       $currentAction = $this->controller->action;
       $currentView = $this->controller->view;
       $currentOutput = $this->controller->output;

       ob_start();
       $this->controller->output = null;

       $viewPath = $this->emailViewPath . DS . 'html' . DS . $view;
       $layoutPath = $this->emailLayouts . DS . 'html' . DS . 'default';

       $bodyHtml = $this->controller->render($viewPath, $layoutPath);

       ob_end_clean();

       $this->controller->layout = $currentLayout;
       $this->controller->action = $currentAction;
       $this->controller->view = $currentView;
       $this->controller->output = $currentOutput;

       return $bodyHtml;
    }

}

So CakePHP 2.0 + uses an Email views to store all the email templates. You can change the location & you can use your own too.

Template views from View/Emails/html/email.ctp’ as defined in the component : $emailViewPath Layouts from your ‘View/Layouts/Emails/default.ctp’ as defined in the component : $emailLayouts

This component catches the post data itself & you can use that data in your emails. If you don’t want to capture the data from post request & you want to set your data that is also possible, only add the second param as array & you can get that in your email view as ‘$data’ array.

How to use n controller :<?php //email to //you can send comma separated email addresses if you want to send email to multiple people.

$this->AWSSES->to = $this->request->data[‘User’][‘username’];

if ($this->AWSSES->_aws_ses(‘email tempate name’, ‘optional param’)) { //optional param : can be an array of the data that you want to access in email view.

//your code } ?>

]]>
Tue, 24 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/23/GoogleChart-helper.html https://bakery.cakephp.org/2012/04/23/GoogleChart-helper.html <![CDATA[GoogleChart helper]]> GoogleChart helper

GoogleChart is a helper class for easy generating image charts using Google Chart API.

I needed simple access to Google Chart API for generating images. Please see examples below and method comments in source file to see how it works.

This plugin is for CakePHP 2.x

Example: ` //Controller: public$helpers=array(‘GoogleChart.GoogleChart’); `

` //View: //exampleofbarchart echo$this->GoogleChart->create() ->setType(‘bar’,array(‘horizontal’,’grouped’)) ->setSize(500,400) ->setMargins(5,5,5,5) ->addData(array(1200.48,432.3,647.21,635.2)) ->addMarker(‘value’,array(‘format’=>’f1’,’placement’=>’c’)) ->addData(array(20,42.3,65.21,95.2)) ->addMarker(‘value’,array(‘size’=>14,’color’=>‘000000’)) ->addAxis(‘x’,array(‘labels’=>array(‘jan2012’,’feb2012’))) ->addAxis(‘y’,array(‘axis_or_tick’=>’l’,’size’=>12));

//exampleofpiechart echo$this->GoogleChart->create() ->setTitle(‘CHARTTITLE’,array(‘size’=>14,’color’=>‘000000’)) ->setType(‘pie’,array(‘3d’)) ->setSize(600,300) ->setMargins(10,10,10,10) ->addData(array(20,35,50,10)) ->setPieChartLabels(array(‘first’,’second’,’third’,’andsoon…’)); ` Download the code from https://github.com/segy/GoogleChart

]]>
Mon, 23 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/23/Breadcrumbs-trail-for-unordered-pages.html https://bakery.cakephp.org/2012/04/23/Breadcrumbs-trail-for-unordered-pages.html <![CDATA[Breadcrumbs trail for unordered pages]]> Breadcrumbs trail for unordered pages

The Idea is to create a trail of visited pages, allowing you to always jump back and to alway see last visited pages. This can be helpful if breadcrumbs can not be used, since there is no clean hierachical structure with parent/child defined. Furthermore, this Component / Helper is only included once for the appController itself and once in your layout. No need to manually add the code to each and every page.

I also played with $referer variable, back button usage and javascript back-functions but in the end the trac was always getting kind of mixed up by functions / methods like save, edit, etc. This Component/Helper pack will allow you to customize methods and controllers to be ignored and to display a nice, clickable trail in the form of

Component ( index ) > Component ( view) > Component2 ( index ) >

This bundle consists of a Component - which may be called from appController itself only once or from each controller by itself - and of a Helper, which is called within your view or in the layout directly. If called from the Layout, make sure to add the Helper to your app_controller as described in step 3 of the Installation how to.

=== Component ===

<?php
/**
 * NavigationComponent
 **
 *
 * @author  Rene Weber
 * @website http://www.webrene.com
 * @modified by Rene Weber, 23.04.2012
 * @version 1.0
 * @cakephp 1.3
 *
 **
 * Purpose
 * ---------
 * Track your way and allow Backwards movement.
 * The Idea is to create a trail of visited pages, allowing you always jump back.
 * This can help if a breadcrumb logical can not be used, since there is no clean hierachical structure
 * with parent/child structure
 * I also played with referer variable, back button usage and javascript back but in the end the trac was
 * always getting messed by functions / methods like save, edit, etc.
 *
 * This Component/Helper pack will allow you to customize methods and controllers to be ignored and to
 * display a nice, linked trail in the form of
 * Component ( index ) > Component ( view) > Component2 ( index ) >
 *
 *
 * What does it constis of
 * -------------------------
 * 1. NavigationComponent ( this file )
 *    The component constists of 4 Functions:
 *    - process: The main function to be called from appController: Stores current page,
 *                                                                                                                                    handles clicks on links,
 *                                                                                                                                    keeps trail short
 *    - storeTrail : Stroes current trail to session ussing $sessionVarName
 *        - walkBack   : If a Link was clicked in our trail, remove all visited pages behind this link
 *                                 This only happens for links passing $navpointUrl and the index.
 *                                     See corresponding NavigationHelper to created correct links
 *    - shrinkTrail: Shift trail until it's length reaches $maxItems or the given length
 *    - cleanTrail: Call this on logout in order to remove trail variable
 *
 * 2. NavigationHelper
 *         Meant to create correct Links to jump back in time. These links also include the index in our trail
 *    and therefor the trail will be adjusted after clicking such a link.
 *
 *
 * Installation
 * ----------------
 *
 * 1. Add Component to app/controllers/components/
 * 2. Add Helper to app/views/helpers/
 * 3. Add Helper to AppController ( nessecary to use in layout) in app/app_controller.php:
 *
 *           var $helpers = array(...       , 'Navigation');
 *             --> If $helpers was not defined yet, you will have to add all used helpers like 'Html' etc.
 *
 * 4. Call 'process' in app_controller.php directly at the beginning of beforeFilter and set variable
 *
 *             $this->Navigation->Process( $this );
 *            $this->set('trail', $this->Navigation->trail );
 *
 * 5. In your Layout or in your desired View, call the trail creator or only read the link:
 *
 *            $this->Navigation->printBacklinks( $trail, 8 )
 *            or
 *            echo $this->Html->link("Back", $this->Navigation->getBacklinkForView( $trail ) );
 *
 * 6. Possibly you want to enclose 'printBacklinks' into a div and adjust its hover and look.
 *    i.e.
 *    <div class='crumb'>$this->Navigation->printBacklinks( $trail, 8 )</div>
 *    and
 *    .crumbs {    color: #999; }
 *        .crumbs a { color: #aaa;    font: 0.9em arial; }
 *    .crumbs a:hover { font-size: 1em; color: #000; font-weight: bold; }
 *
 *
 *
 */

class NavigationComponent extends Object {

    /************************************** GLOBAL VARIABLES MAY BE ADJUSTED ***************************************/


        /**
     * Methods that shall not be stored. I.e. going from Index to View to Edit to Save
     * forwarding you to View again, a back button should ignore the Edit but push you back to Index.
     */

    var $ignoreMethods     = array( 'edit', 'save' );
    var $ignoreControllers = array( 'CakeError', 'Users' );


    /**
     * Keyname to store session variable in
     */

       var $sessionVarName        = 'Navigation';


       /**
        * This is the key we will use in URL to pass the index to our component.
        * Default is 'navpoint' and MUST BE THE SAME IN HELPER!
        * i.e. http://myhost/posts/123?navpoint=3  -> Will jump to 3rd point and delete the rest behind
        */

       var $navpointUrl            = 'navpoint';



       /**
        *  Maximum entries in our trail variable. Default: 8
        */

       var $maxItems = 8;




       /******************************** END OF GLOBAL VARIABLES. DO NOT CHANGE BELOW ***********************************/



       /**
        *  Array holding the Trail we are Moving in
        */

       var $trail = array();




       /**
         * Write Trail to Session
        */

       function storeTrail(){

           $this->Session->write( $this->sessionVarName, $this->trail );

       }


       var $components = array('RequestHandler', 'Session');



       /**
         * If a navigation click brought us here, let's clean all other items
         * This happens if we came here via helper. This can be parsed from the params.
         * e.g. /posts/view/1/navpoint/3  --> Navpoint = 3, clean everything behind
         * It will be next value behind navpoint
        */

       function walkBack( &$controller ){

           if( isset( $controller->params['url'][$this->navpointUrl] ) ){

               for ( $i=sizeof($this->trail); $i>$controller->params['url'][$this->navpointUrl]; $i-- ){
                   unset( $this->trail[$i] );
               }

           }

       }



       function process( &$controller ) {


           $skipThis = 0;

           $controllerName     = $controller->name;


           /* Restore from Session if exists */
           if( ( $sessionVar = $this->Session->read( $this->sessionVarName ) ) )
               $this->trail = $sessionVar;


           /* Check if one of our crumbs was clicked ( will be passed via URL ) */
           $this->walkBack( $controller );


           /* Check if current Method is included in our Ignore List */

           if( in_array( $controller->params['action'], $this->ignoreMethods ) )
               $skipThis = 1;

           /* Check if current Controller is included in our Ignore List */
           if( in_array( $controller->name, $this->ignoreControllers ) )
               $skipThis = 1;


            /* Ignore reload of same controller and same action */

           if( sizeof( $this->trail ) > 0 ){

               $lastElement = $this->trail[sizeof( $this->trail ) -1 ];

               if ( !empty( $lastElement['url'] ) &&
                       $lastElement['url'] == $controller->params['url']['url'] ) {

                           $skipThis = 1;
               }
           }


           /* Add current Page to trail */
           if( $skipThis != 1 )
                $this->trail[] = array(  'url'                 =>    $controller->params['url']['url'],
                                                                    'action'         => $controller->params['action'],
                                                                    'controller' => $controllerName,
                                                            );


           /* Shorten Trail to maximum lenght */
           $this->shrinkTrail();

           /* Store trail to session */
           $this->storeTrail();

       }


        function shrinkTrail( $length=-1 ){

          if( $length == -1 ){
              $length = $this->maxItems;
          }

          while( sizeof( $this->trail ) > $length ){
              array_shift( $this->trail);
          }

      }



       function cleanTrail() {

              $this->trail = array();
               $this->Session->delete( $this->sessionVarName );

       }



}

=== Helper ===

<?php
/**
 * NavigationHelper
 **
 *
 * @author  Rene Weber
 * @website http://www.webrene.com
 * @modified by Rene Weber, 23.04.2012
 * @version 1.0
 * @cakephp 1.3
 *
 **
 *
 * Purpose
 * ---------
 * Create Links for jumping back in trail and add Information for NavigationComponent to adjust its trail
 *
 *
 * Which files are needed?
 * -------------------------
 * 1. NavigationHelper ( This file )
 *         Meant to create correct Links to jump back in time. These links also include the index in our trail
 *    and therefor the trail will be adjusted after clicking such a link.
 *    - printBackLinks:            Need trail variable and length
 *                                                    Will print length amount of the last visited pages with links in one row seperated
 *                                                    by $this->seperator ( see global variables )
 *        - getBacklinkForView:    Yes, this is a long function name. It will return only an URL to be used.
 *
 * 2. NavigationComponent
 *    The component constists of 4 Functions:
 *    - process: The main function to be called from appController: Stores current page,
 *                                                                                                                                    handles clicks on links,
 *                                                                                                                                    keeps trail short
 *    - storeTrail : Stroes current trail to session ussing $sessionVarName
 *        - walkBack   : If a Link was clicked in our trail, remove all visited pages behind this link
 *                                 This only happens for links passing $navpointUrl and the index.
 *                                     See corresponding NavigationHelper to created correct links
 *    - shrinkTrail: Shift trail until it's length reaches $maxItems or the given length
 *
 *
 *
 *
 * Installation
 * ----------------
 *
 * See Component!
 *
 **
 * @author  Rene Weber
 * @website http://www.webrene.com
 * @modified by Rene Weber, 23.04.2012
 * @version 1.0
 * @cakephp 1.3
 *
 */


class NavigationHelper extends AppHelper {



    /************************************** GLOBAL VARIABLES MAY BE ADJUSTED ***************************************/


    /**
     * This array allows you to define aliases for printBackLinks function. Simple example:
     * Without aliases:  Posts ( indexEditor ) > Messages( indexNoNews ) > ...
     * With aliases:         Posts ( Mine )              > Messages( Read )              >...
     */

    var $actionAliases        = array(    'indexSelection'     => 'Type Selection',
                                                                    'indexGrouped'       => 'Grouped',
                                                                    'indexEditor'             => 'My Edits',
                                                                    'index'                        => '',
                                                                    'indexNoNews'            => 'No News',
                                                                    'indexOldVersion' => 'Old Version',
                                                                );

    /**
     * Seperator for function printBackLinks
     */

    var $seperator = "   >   ";


  /**
     * This is the key we will use in URL to pass the index to our component.
     * Default is 'navpoint' and MUST BE THE SAME IN HELPER!
     * i.e. http://myhost/posts/123?navpoint=3  -> Will jump to 3rd point and delete the rest behind
     */

    var $navpointUrl                = 'navpoint';


    /******************************** END OF GLOBAL VARIABLES. DO NOT CHANGE BELOW ***********************************/


    var $helpers                         = array( 'Html' );
    var $controllerAliases     = array();


    function printBackLinks( $trail, $count = 1 ) {


        for ( $i=$count; $i>0; $i-- ){

            if( sizeof( $trail ) < $i )
                continue;

                $lastElement = $trail[sizeof( $trail ) - $i ];

                $displayController     = $lastElement['controller'];
                $displayAction             = $lastElement['action'];

                if( isset( $this->actionAliases[ $lastElement['action'] ] ) )
                    $displayAction         = $this->actionAliases[ $lastElement['action']];

                if( isset( $this->controllerAliases[ $lastElement['controller'] ] ) )
                    $displayController = $this->controllerAliases[ $lastElement['controller'] ];

                if( !empty( $displayAction ) )
                    $displayAction = '( '.$displayAction.' )';

                $url = '/'.$lastElement['url'].'?'.$this->navpointUrl.'='.(sizeof( $trail ) - $i);
                echo $this->Html->Link( $displayController.$displayAction, $url );
                echo $this->seperator;
            }

        }



        function getBacklinkForView( $trail ) {

            $url = '';

            if( isset( $trail[sizeof( $trail ) - 2 ] ) ){
                $lastElement = $trail[sizeof( $trail ) - 2 ];

                $url = '/'.$lastElement['url'].'?'.$this->navpointUrl.'='.(sizeof( $trail ) - 2);
            }

            return $url;


        }






}

?>
]]>
Mon, 23 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/22/from-Cake-to-Bake.html https://bakery.cakephp.org/2012/04/22/from-Cake-to-Bake.html <![CDATA[from Cake to Bake]]> from Cake to Bake

I will explain how i got CakePHP working from start (Download) to finish (Bake). This tutorial is for PHP/MYSQL on Mint 12/Ubuntu users. I assume that you have installed PHP/MYSQL and apache configured already, you can find many tutorials for doing that, hence i will focus on CakePHP. I also assume that you have created atleast one table in your database by following naming conventions in CakePHP which is pretty easy task :)

  1. Download the latest version of Cake from https://cakephp.org/
  2. Go to your Download folder (or where ever you downloaded your folder), Extract the folder in the same location.
  3. Move the folder to your application root. (In my case /var/www/ )if you face permission denied while copy/paste, use “gksu nautilus” to open the target location.
  4. Rename the folder, MyCake
  5. Use this to change permissions, “sudo chmod -R 777 /var/www/MyCake/”
  6. Delete the folder named “app” from /var/www/MyCake/ , we will be using folder that will be created by bake
  7. So far you have downloaded and set up Cake, now lets install cake bake utility. Run this in your terminal to install cake, ” sudo apt- get install cakephp-scripts ” this will help in baking later. This will also create new folder in “/usr/share/php” named cake

Important: Use sudo gedit /etc/apache2/sites-available/default to edit the contents to follow:

<Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory>

  1. Run this in your terminal. This command will create a folder named app in your MyCake folder cake bake -app /var/www/MyCake/app/ This will ask you below:

What is the full path for this app including the app directory name? Example:/var/www/MyCake/app/myapp [/var/www/My-CakePHP/aapp/myapp] >

You must give it path to where you want app folder created, in this case type below:

/var/www/MyCake/app/

This will create new folder named app and new files under it.

  1. Again run the same command, this time we want to use its CRUD functionality called Bake.

after running this command below: cake bake -app /var/www/MyCake/app/

it might tell you that your database.php file cannot be found and that if you want to create the same, tell it yes and provide all the details, do not modify first option ($default), this is a variable that should be left untouched.

or it will ask you what you want to do?

Welcome to CakePHP v1.3.7 Console

App : app Path: /var/www/My-CakePHP/app B0x1A0 Interactive Bake Shell B0x1A0 [D]atabase Configuration [M]odel [V]iew [C]ontroller [P]roject [F]ixture [T]est case [Q]uit What would you like to Bake? (D/M/V/C/P/F/T/Q) >

tell it that you want to create Model by typing M

Bake Model Path: /var/www/My-CakePHP/app/models/ B0x1A0 Use Database Config: (default/database) [default] >

enter “database”

and so on….

Rest is very intutive and help you create controllers and view.

You can then access your site using http://localhost/MyCake/ or if you created controller by the name, posts, use http://localhost/MyCake/posts.

]]>
Sun, 22 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/20/Prevent-render-layout-elements-with-the-render-of-some-views.html https://bakery.cakephp.org/2012/04/20/Prevent-render-layout-elements-with-the-render-of-some-views.html <![CDATA[Prevent render layout elements with the render of some views!]]> Prevent render layout elements with the render of some views!

This snippet is meant by the situation in-which you want to prevent some elements in the layout from render while some views is rendered.

Consider the following example, there is an element that displays the top searched keywords and it is named top_searches.ctp. This element is placed in the layout to be rendered under the search box element.

Suppose now, we have an index view that lists all searched keywords and we don’t want to make the top_searches elements to be rendered while we call the index view.

We should add the following code snippet into the most upper line of top_searches, i.e line 1.

<?php
$e = explode('views/elements/',__FILE__);
$e[1] = str_replace('.ctp', '', $e[1]);
if (isset($this->preventElement) && $e[1] == $this->preventElement[$e[1]]) return false;
?>

Simply the above code extracts the path and name of the element’s ctp file relative to the elements directory, then, it asks for an array property of the View object called preventElement, if it find the name of the element is set as a key valued by its name too, it will return false to prevent the rest of the element to be rendered.

Now in the index.ctp we should add the following code:

<?php $this->preventElement['top_searches'] = 'top_searches';?>

I placed the above line of code on the first line too, it is, obviously, that we defined the preventElement property and we set the name of the element we want to stop or prevent its render.

There is a working example of this snippet at:http://quran.2index.net You will see a list for top searched keywords, you will see the last item is red button that linked to the full index of all searched keywords, at this linked page, you will not see the to searched keywords list. Notice: The working example website in Arabic language.

]]>
Fri, 20 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/20/Fixing-and-improving-the-TextHelper.html https://bakery.cakephp.org/2012/04/20/Fixing-and-improving-the-TextHelper.html <![CDATA[Fixing and improving the TextHelper]]> Fixing and improving the TextHelper

The TextHelper is a really useful utility in CakePHP. But some functions behave strangely and others are missing. That’s why I extended it as follows. General I created a new helper which the following file in “/app/view/helpers/Text2Helper.php”:

<?php
App::import('Helper', 'Text');

class Text2Helper extends TextHelper {
    public function function_name($parameters) {
            // some code

            // if you want to extend functionality, maybe you want
            // to call the parent function
            parent::function_name($parameters);
    }
}
?>

You can overwrite and create new functions in this file. (See: https://ask.cakephp.org/questions/view/how_can_i_extend_the_core_helpers)

Note that you can not use the helper with adding “Text2” to the $helpers array inside a controller. Unfortunately you cannot globally specify to always use the Text2Helper instead of the TextHelper! The only thing you can do is to add the following to your view:

$this->Text = $this->Text2;

I would like to see a functionality to alias helpers! This would make the job easier and prettier. (http://cakebaker.42dh.com/2008/10/18/dont-abuse-the-apphelper-to-extend-the-core-helpers/#comment-110649)

So let’s start with my modifications:

1.) Increasing toList() functionality I added the functionality to specify who each item should be displayed (some sourrounding code and so on). Therefore I added the parameter $phrase. _key_ will be replaced by the current element’s key and _item_ will be replaced by the current element’s value.

<?php
    public function toList($list, $and = 'and', $separator = ', ', $phrase = '_item_') {
            foreach($list as $key => &$item)
                    $item = str_replace(array('_key_', '_item_'), array($key, $item), $phrase);
            return parent::toList($list, $and, $separator);
    }
?>

2.) Fixing truncate() Currently the truncate() function only breaks on spaces. So when you only have newline characters or tabs, the code won’t break. That’s why even very long strings may result in “…”. Therefore I added 3 fixes.

2.1.) Fixing punctuation Some people don’t add spaces after dots, commas and so on. That’s why I added exactly one space after each of these characters:

<?php
    // 1. fix punctuation
    if ($options['fix_punctuation']) {
            $punctuation = ',.;:';
            $text = preg_replace('/(['.$punctuation.'])[\s]*/', '\1 ', $text);
    }
?>

2.2.) Fixing spaces All possible space symbols (like newline, tab, …) are replaced by one space character:

<?php
    // 2. fix spaces
    if ($options['fix_spaces']) {
            //$spaces = " \t\r\n";          // use preg_replace() or str_replace() or strtr()
            $text = preg_replace('/[[:space:]]+/', ' ', $text);             // [:space:] equal \s
    }
?>

2.3.) Switch to cut instead of clear When the returned string is still only ‘…’ then set ‘exact’ => true (cutting instead of searching for spaces):

<?php
    // get truncated string
    $result = parent::truncate($text, $length, $options);

    // 3. fix long strings: cut instead of clear
    if ($options['fix_longStr']) {
            if ($result === $options['ending']) {
                    $options['exact'] = true;
                    $result = parent::truncate($text, $length, $options);
            }
    }
?>

So here is the whole code of my truncate function:

<?php
    public function truncate($text, $length = 100, $options = array()) {
            $default = array(
                    'fix_punctuation' => true,
                    'fix_spaces' => true,
                    'fix_longStr' => true, 'ending' => '...'
            );
            $options = array_merge($default, $options);

            // 1. fix punctuation
            if ($options['fix_punctuation']) {
                    $punctuation = ',.;:';
                    $text = preg_replace('/(['.$punctuation.'])[\s]*/', '\1 ', $text);
            }

            // 2. fix spaces
            if ($options['fix_spaces']) {
                    //$spaces = " \t\r\n";          // use preg_replace() or str_replace() or strtr()
                    $text = preg_replace('/[[:space:]]+/', ' ', $text);             // [:space:] equal \s
            }

            // get truncated string
            $result = parent::truncate($text, $length, $options);

            // 3. fix long strings: cut instead of clear
            if ($options['fix_longStr']) {
                    if ($result === $options['ending']) {
                            $options['exact'] = true;
                            $result = parent::truncate($text, $length, $options);
                    }
            }

            // return truncated string
            return $result;
    }
?>

3.) Add wordwrap() This function automatically inserts a newline after a maximum number or characters. Please not that this mostly only useful when you have “text-align: justify;” in your css style. Otherwise it’s often better to set “word-wrap: break-word;” in your css to let the browser do the work. That’s because of the different widths for the different characters for most fonts.

So here is my code:

<?php
/**
 * Splits string in lines of given length.
 * Note: Perhaps it's better to set the following css option: "word-wrap: break-word;"
 *           because it handles the different widths of the characters correctly
 *
 * @param string $text String to wrap.
 * @param integer $length Maximum length (number of characters) of returned lines.
 * @param bool $cut If the cut is set to TRUE, the string is always wrapped at or before the specified width. So only if you have a word that is larger than the given width, it is broken apart.
 * @param bool $htmlBreak Inserts '<br />' on every newline.
 * @return string Wrapped string.
 */
    public function wordwrap($text, $length = 100, $cut = true, $htmlBreak = true) {
            $text = wordwrap($text, $length, "\n", $cut);
            return (($htmlBreak)?nl2br($text):$text);
    }
?>

I hope you find this information useful. When you are of the CakePHP team, consider implementing these fixes into the original TextHelper ;)

]]>
Fri, 20 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/19/Prevent-render-layout-elements-with-the-render-of-some-views.html https://bakery.cakephp.org/2012/04/19/Prevent-render-layout-elements-with-the-render-of-some-views.html <![CDATA[Prevent render layout elements with the render of some views!]]> Prevent render layout elements with the render of some views!

This snippet is meant by the situation in-which you want to prevent some elements in the layout from render while some views is rendered.

> ### Updated ###

> In the conditional statement:

>

if (isset($this->preventElement)...

> $this->preventElement becomes $this->preventElement[$e[1]], to solve missing index error generated when using this snippet with more than one element in the layout.

Consider the following example, there is an element that displays the top searched keywords and it is named top_searches.ctp. This element is placed in the layout to be rendered under the search box element.

Suppose now, we have an index view that lists all searched keywords and we don’t want to make the top_searches elements to be rendered while we call the index view.

We should add the following code snippet into the most upper line of top_searches, i.e line 1.

<?php
$e = explode('views/elements/',__FILE__);
$e[1] = str_replace('.ctp', '', $e[1]);
if (isset($this->preventElement[$e[1]]) && $e[1] == $this->preventElement[$e[1]]) return false;
?>

Simply the above code extracts the path and name of the element’s ctp file relative to the elements directory, then, it asks for an array property of the View object called preventElement, if it find the name of the element is set as a key valued by its name too, it will return false to prevent the rest of the element to be rendered.

Now in the index.ctp we should add the following code:

<?php $this->preventElement['top_searches'] = 'top_searches';?>

I placed the above line of code on the first line too, it is, obviously, that we defined the preventElement property and we set the name of the element we want to stop or prevent its render.

]]>
Thu, 19 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/14/SELECT-FOR-UPDATE-hack-kind-of-ugly-but-it-works-PostgreSQL-and-MySql.html https://bakery.cakephp.org/2012/04/14/SELECT-FOR-UPDATE-hack-kind-of-ugly-but-it-works-PostgreSQL-and-MySql.html <![CDATA[SELECT FOR UPDATE (hack) (kind of ugly but it works) (PostgreSQL and MySql)]]> SELECT FOR UPDATE (hack) (kind of ugly but it works) (PostgreSQL and MySql)

Sometimes one needs to do a SELECT … FOR UPDATE in order to preserve the integrity of our transactions. This isn’t at the moment supported by CakePHP model find operations. Here is a use-at-you-own-discretion ‘hack’, which saves coding time if you are in a hurry (like me at the moment) or don’t mind writing a useful behaviour for all of us.

Sometimes one needs to do a SELECT … FOR UPDATE in order to preserve the integrity of our transactions. The problem can be seen easily with the following example:

Suppose we have a user, an account table with the account.available_money field on it. Suppose the user has initially $100.

The problem arrives if the hacker manages to concurrently run two processes (only the relevant generated queries by find() and save() are shown) :

One process does:

BEGIN
SELECT available_money from account where user_id = '1' ; -- $money = $100
UPDATE account SET available_money = 0 where user_id = '1'; -- the user buy $100 and depletes his account
COMMIT

While another concurrent process does

-- php process _also_ finds $100 money so the user can user can use the $100 again it _again_
BEGIN
SELECT available_money from account  where user_id = '1'; // $money = $100
UPDATE account SET available_money = 0 where user_id = '1'; //the user buys _again_ $100 and he depletes his account
COMMIT

If this happens, then the user could use more money than he is entitled to. SELECT FOR UPDATE comes to the rescue. Following the previous example

One process does:

BEGIN
SELECT available_money from account  where user_id = '1' FOR UPDATE; // $money = $100
UPDATE account SET available_money = 0 where user_id = '1';
COMMIT

While another concurrent process does

BEGIN
SELECT available_money from account where user_id = '1'; // now this second process must wait the first process to finish, so $money = $0
-- the user doest not have money to buy anything
COMMIT

Now, how to achieve this using CakePHP ?

CakePHP’s dbo doesn’t currently support FOR UPDATE syntax. BUT there is a litlle quick and dirty (maybe too dirty for some) hack you can do without doing any modifications to the core …

Since in the dbo_source, in the SELECT`statement, the `LIMIT clause gets parsed at last (see line 1497 from cake/libs/models/dbo_source.php):

switch (strtolower($type)) {
    case 'select':
        return "SELECT {$fields} FROM {$table} {$alias} {$joins} {$conditions} {$group} {$order} {$limit}";
    break;
    //...

If in a need, and if using PostgreSQL (mysql later), you could do

$transac = $this->AccountModel->find('all', array(
    'conditions' => array(
        'user_id' =>$id
    ),
    'fields' => array('available_money'),
    'limit' => 'ALL FOR UPDATE'
));`

… and this would generate the SELECT available_money from account where user_id = ‘1’ FOR UPDATE clause we are looking for… The trick is in the ‘limit’ => ‘ALL FOR UPDATE’. This selects ALL records that match the conditions FOR UPDATE.

For MySql you would have to do something a lot uglier. Since MySql doesn’t support LIMIT ALL, you would have to use LIMIT 0,18446744073709551615. This is pretty horrible , I know… The other options are to code a behavior for all of us : )

Just remember to put you find inside a transaction !

Watch out , there is a little (but important) catch… You can’t do find(‘first), since the LIMIT clause would be overwritten by Cake as LIMIT 1, instead you can do find(‘all’, … ‘limit’ => ‘1 FOR UPDATE’ …)

]]>
Sat, 14 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/13/Zhen-CRM-open-source-CakePHP-CRM-application.html https://bakery.cakephp.org/2012/04/13/Zhen-CRM-open-source-CakePHP-CRM-application.html <![CDATA[Zhen CRM: open-source CakePHP CRM application]]> Zhen CRM: open-source CakePHP CRM application

A simple CRM built on CakePHP 2.x

We are pleased to announce the release of Zhen CRM, an open source CRM solution built on CakePHP.

Project page: https://telerim.github.com/Zhen-CRM/ GitHub project: https://github.com/telerim/Zhen-CRM

While this does not have the complicated features of enterprise CRMs, it has the basic features that most small businesses could use - such as contacts, tasks, “deals” and a calendar.

In contrast to the many other commercial CRM solutions available on the market, this is free, simple and can be installed on one’s own servers or shared hosts.

]]>
Fri, 13 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/13/CakeApp-with-TwitterBootstrap.html https://bakery.cakephp.org/2012/04/13/CakeApp-with-TwitterBootstrap.html <![CDATA[CakeApp with TwitterBootstrap]]> CakeApp with TwitterBootstrap

CakeApp is a preconfigured app with TwitterBootstrap and Jquery installed and ready to go.

Twitter Bootstrap appears to be a very successful CSS framework, and I must agree. There is a js library that you can include which will help you get TB (Twitter Bootstrap) setup, but I wanted to take it one step further.

I created “CakeApp” Which is a CakeApp with some niceties already added in there for you. Including Jquery and a pre-configured TB, which should have everything as of 4/13/12. Also, the homepage has been updated to use TB, so you are running right out of the gate.

Here is a link to that: https://github.com/alairock/CakeApp

Enjoy, and fork if you want to contribute! -alairock

]]>
Fri, 13 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/11/Helper-TinyMCE-for-CakePHP-2.html https://bakery.cakephp.org/2012/04/11/Helper-TinyMCE-for-CakePHP-2.html <![CDATA[Helper TinyMCE for CakePHP 2]]> Helper TinyMCE for CakePHP 2

Helper TinyMCE for CakePHP 2 with preset fuction.

TinyMCE

  1. Download TinyMCE : http://www.tinymce.com/download/download.php
  2. Copy /tinymce/jscripts/ tiny_mce folder to /app/webroot/js (like : /app/webroot/js/tiny_mce).

Controller

public $helpers = array('Tinymce');

Helper code

app/View/Helper/TinymceHelper.php

<?php
App::uses('AppHelper', 'View/Helper');

class TinymceHelper extends AppHelper {

    // Take advantage of other helpers
    public $helpers = array('Js', 'Html', 'Form');

    // Check if the tiny_mce.js file has been added or not
    public $_script = false;

    /**
    * Adds the tiny_mce.js file and constructs the options
    *
    * @param string $fieldName Name of a field, like this "Modelname.fieldname"
    * @param array $tinyoptions Array of TinyMCE attributes for this textarea
    * @return string JavaScript code to initialise the TinyMCE area
    */
    function _build($fieldName, $tinyoptions = array()){
        if(!$this->_script){
            // We don't want to add this every time, it's only needed once
            $this->_script = true;
            $this->Html->script('tiny_mce/tiny_mce', array('inline' => false));
        }

        // Ties the options to the field
        $tinyoptions['mode'] = 'exact';
        $tinyoptions['elements'] = $this->domId($fieldName);

        // List the keys having a function
        $value_arr = array();
        $replace_keys = array();
        foreach($tinyoptions as $key => &$value){
            // Checks if the value starts with 'function ('
            if(strpos($value, 'function(') === 0){
                $value_arr[] = $value;
                $value = '%' . $key . '%';
                $replace_keys[] = '"' . $value . '"';
            }
        }

        // Encode the array in json
        $json = $this->Js->object($tinyoptions);

        // Replace the functions
        $json = str_replace($replace_keys, $value_arr, $json);
        $this->Html->scriptStart(array('inline' => false));
        echo 'tinyMCE.init(' . $json . ');';
        $this->Html->scriptEnd();
    }

    /**
    * Creates a TinyMCE textarea.
    *
    * @param string $fieldName Name of a field, like this "Modelname.fieldname"
    * @param array $options Array of HTML attributes.
    * @param array $tinyoptions Array of TinyMCE attributes for this textarea
    * @param string $preset
    * @return string An HTML textarea element with TinyMCE
    */
    function textarea($fieldName, $options = array(), $tinyoptions = array(), $preset = null){
        // If a preset is defined
        if(!empty($preset)){
            $preset_options = $this->preset($preset);

            // If $preset_options && $tinyoptions are an array
            if(is_array($preset_options) && is_array($tinyoptions)){
                $tinyoptions = array_merge($preset_options, $tinyoptions);
            }else{
                $tinyoptions = $preset_options;
            }
        }
        return $this->Form->textarea($fieldName, $options) . $this->_build($fieldName, $tinyoptions);
    }

    /**
    * Creates a TinyMCE textarea.
    *
    * @param string $fieldName Name of a field, like this "Modelname.fieldname"
    * @param array $options Array of HTML attributes.
    * @param array $tinyoptions Array of TinyMCE attributes for this textarea
    * @return string An HTML textarea element with TinyMCE
    */
    function input($fieldName, $options = array(), $tinyoptions = array(), $preset = null){
        // If a preset is defined
        if(!empty($preset)){
            $preset_options = $this->preset($preset);

            // If $preset_options && $tinyoptions are an array
            if(is_array($preset_options) && is_array($tinyoptions)){
                $tinyoptions = array_merge($preset_options, $tinyoptions);
            }else{
                $tinyoptions = $preset_options;
            }
        }
        $options['type'] = 'textarea';
        return $this->Form->input($fieldName, $options) . $this->_build($fieldName, $tinyoptions);
    }

    /**
    * Creates a preset for TinyOptions
    *
    * @param string $name
    * @return array
    */
    private function preset($name){
        // Full Feature
        if($name == 'full'){
            return array(
                'theme' => 'advanced',
                'plugins' => 'safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template',
                'theme_advanced_buttons1' => 'save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect',
                'theme_advanced_buttons2' => 'cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor',
                'theme_advanced_buttons3' => 'tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen',
                'theme_advanced_buttons4' => 'insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak',
                'theme_advanced_toolbar_location' => 'top',
                'theme_advanced_toolbar_align' => 'left',
                'theme_advanced_statusbar_location' => 'bottom',
                'theme_advanced_resizing' => true,
                'theme_advanced_resize_horizontal' => false,
                'convert_fonts_to_spans' => true,
                'file_browser_callback' => 'ckfinder_for_tiny_mce'
            );
        }

        // Basic
        if($name == 'basic'){
            return array(
                'theme' => 'advanced',
                'plugins' => 'safari,advlink,paste',
                'theme_advanced_buttons1' => 'code,|,copy,pastetext,|,bold,italic,underline,|,link,unlink,|,bullist,numlist',
                'theme_advanced_buttons2' => '',
                'theme_advanced_buttons3' => '',
                'theme_advanced_toolbar_location' => 'top',
                'theme_advanced_toolbar_align' => 'center',
                'theme_advanced_statusbar_location' => 'none',
                'theme_advanced_resizing' => false,
                'theme_advanced_resize_horizontal' => false,
                'convert_fonts_to_spans' => false
            );
        }

        // Simple
        if($name == 'simple'){
            return array(
                'theme' => 'simple',
            );
        }

        // BBCode
        if($name == 'bbcode'){
            return array(
                'theme' => 'advanced',
                'plugins' => 'bbcode',
                'theme_advanced_buttons1' => 'bold,italic,underline,undo,redo,link,unlink,image,forecolor,styleselect,removeformat,cleanup,code',
                'theme_advanced_buttons2' => '',
                'theme_advanced_buttons3' => '',
                'theme_advanced_toolbar_location' => 'top',
                'theme_advanced_toolbar_align' => 'left',
                'theme_advanced_styles' => 'Code=codeStyle;Quote=quoteStyle',
                'theme_advanced_statusbar_location' => 'bottom',
                'theme_advanced_resizing' => true,
                'theme_advanced_resize_horizontal' => false,
                'entity_encoding' => 'raw',
                'add_unload_trigger' => false,
                'remove_linebreaks' => false,
                'inline_styles' => false
            );
        }
        return null;
    }
}

Behavior

$this->Tinymce->input($Model.fieldName, $options = array(), $tinyoptions = array(), $preset = null)

Example

<div class="posts form">
<?php echo $this->Form->create('Post');?>
    <fieldset>
            <legend><?php echo __('Add Post'); ?></legend>
    <?php
            echo $this->Form->input('title');
            echo $this->Tinymce->input('Post.content', array(
                    'label' => 'Content'
                    ),array(
                            'language'=>'en'
                    ),
                    'bbcode'
        );
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Submit'));?>
</div>
]]>
Wed, 11 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/11/Custom-Fields-Plugin-for-CakePHP-2-x.html https://bakery.cakephp.org/2012/04/11/Custom-Fields-Plugin-for-CakePHP-2-x.html <![CDATA[Custom Fields Plugin for CakePHP 2.x]]>

Custom Fields Plugin for CakePHP 2.x

A custom fields plugin for CakePHP 2.x. Now you can add custom fields to your CakePHP app and individual models/controllers without having to worry about database changes.

GitHub page: https://github.com/srs81/CakePHP-CustomFields

CustomFields Plugin for CakePHP

A custom fields plugin for CakePHP 2.x. Now you can add custom fields to your CakePHP app and individual models/controllers without having to worry about database changes.

How to Use

Download or checkout

You can either download the ZIP file:https://github.com/srs81/CakePHP-CustomFields/zipball/master

or checkout the code (leave the Password field blank):

git clone https://srs81@github.com/srs81/CakePHP-CustomFields.git

Put it in the Plugin/ directory

Unzip or move the contents of this to “Plugin/CustomFields” under the app root.

Add to bootstrap.php load

Open Config/bootstrap.php and add this line:

`php CakePlugin::load('CustomFields'); `

This will allow the plugin to load all the files that it needs.

Add the custom fields for the models

Add the custom fields for the model(s) that you want to add. For instance, say you want to add the fields “author” and “publish_at” to your “Blog” model and a “date_of_birth” to a “User” model, you would add this:

`php Configure::write('CustomFields', array( 'Blog' => 'author, publish_at', 'User' => 'date_of_birth' )); ` You can add this to either APP/Config/bootstrap.php or APP/Plugin/CustomFields/Config/bootstrap.php .

Create file directory

Make sure to create the correct files upload directory if it doesn’t exist already:<pre> cd cake-app-root mkdir webroot/files/custom_fields chmod -R 777 webroot/files/custom_fields</pre>

The default upload directory is “files/custom_fields” under /webroot - but this can be changed (see FAQ below.)

You don’t have to give it a 777 permission - just make sure the web server user can write to this directory.

Add to controller

Add to Controller/AppController.php for use in all controllers, or in just your specific controller where you will use it as below:

`php var $helpers = array('CustomFields.Field'); var $components = array('CustomFields.Field'); `

And to your add() / edit() functions, just after the ->save() function:

`php $this->Field->save("Blog", $this->request->data); `

Add to views

Let’s say you had a “blogs” table with a “id” primary key.

Add this to your View/Blogs/view.ctp:

`php echo $this->Field->view('Blog', $blog['Blog']['id']); `

and this to your View/Blogs/edit.ctp:

`php echo $this->Field->edit('Blog', $this->Form->fields['Blog.id']); `

FAQ

Dude! No database/table schema changes?

Nope. :) Just drop this plugin in the right Plugin/ directory and add the code to the controller and views. Make sure the “files/custom_fields” directory under webroot is created and writable, otherwise custom fields won’t save.

No tables/database changes are needed since the plugin uses a directory structure based on the model name and id to save the appropriate files for the model.

Change directory

Are you stuck to the “files/custom_fields” directory under webroot? Nope.

Open up Config/bootstrap.php under the Plugin/CustomFields directory and change the “CF.directory” setting.

ChangeLog

Version 1.0.0: April 10, 2012

Future Work

I would like to eventually store the custom data into the database instead of a file, but that would involve more CakePHP complexity, as well as an initiliaztion script from the developer to set up the plugin-specific DB table. But it would help with analytics/reporting and pulling bulk custom data easily (for reporting, etc.)

Support

If you find this plugin useful, please consider a donation to Shen Yun Performing Arts to support traditional and historic Chinese culture.

]]>
Wed, 11 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/07/Auth-inline-authorization-the-easy-way.html https://bakery.cakephp.org/2012/04/07/Auth-inline-authorization-the-easy-way.html <![CDATA[Auth – inline authorization the easy way]]> Auth – inline authorization the easy way

I wrote a wrapper class to make inline authorization easier. Often times you want to check on certain roles inside an action or view and depending on the result display specific content or execute specific code. As an example we only want to display the “admin infos” box on the home screen for an admin. All other users should not see this box.

Auth.User.Role (with Role being an array of role ids)

3 We would need to check the session manually against the roles we want to grant access to. This can get pretty hairy with more than one role allowed (if admins and moderators are allowed to see this box for example).

Preparations

We first need to make the class usable by putting this in our /Config/bootstrap.php:

// these IDs match the role_ids in the DB
define('ROLE_SUPERADMIN', '1');
define('ROLE_ADMIN', '2');
define('ROLE_MOD', '3');
define('ROLE_USER', '4');

// enable the Auth class
App::uses('Auth', 'Tools.Lib');

I like to use constants as they are shorter than Configure::read(‘admin’) etc. But Configure would work just as fine.

Then we need to decide whether we use single role (cake default) or multi role Authorization. I usually always use multi-roles. Therefore the default case for the Auth class is exactly this. The session then contains: B0x1A1 If you use single roles, you’re Session array should look like this:

Auth.User.role_id (with role_id being the single role we want to check against)

In this case you should set the following constant manually in your bootstrap:

define('USER_ROLE_KEY', 'role_id');

“Former” usage

For comparison I will outline the manual and “outdated” way of authorization first:

// we want to make sure that piece is only visible to admins and moderators
if ($this->Session->read('Auth.User.role_id') == ROLE_ADMIN || $this->Session->read('Auth.User.role_id') == ROLE_MOD) {}

// or with multi-role
if (in_array(ROLE_ADMIN, (array)$this->Session->read('Auth.User.Role')) || in_array(ROLE_MOD, (array)$this->Session->read('Auth.User.Role'))) {}

Quite a lot to write…

Note: This also only works in controller/component and view/helper scope. You would have to use the static CakeSession::read() in order to make this work in the model/behavior one etc.

Usage

Now the fun part. The wrapper class can be found in the [Tools Plugin](https://github.com/dereuromark/tools/blob/2.0/Lib/Auth.php).

// Same thing as above
if (Auth::hasRoles(array(ROLE_ADMIN, ROLE_MOD)) {}

Now isn’t that nicer to write and read?

The default case is that if one of the roles is matched it will return true right away. If you want to connect them with AND instead of OR, you need to make the second param false:

// This only passed if the user has both roles!
if (Auth::hasRoles(array(ROLE_ADMIN, ROLE_MOD), false) {}

If we only want to check against a single role we could also use the shorthand:

if (Auth::hasRole(ROLE_MOD) {}

Advanced usage

You can also pass in the roles you want to check against. This can be useful if you want to check somebody else’s roles (and not your session roles). This can come in handy in CLI (command line / shell) environment and also in the admin backend.

if (Auth::hasRole(ROLE_MOD, $rolesOfThisUser) {}

And

if (Auth::hasRoles(array(ROLE_MOD, ROLE_USER), true, $rolesOfThisUser) {}

And there is more

There are also some convenience methods available. Instead of $uid = $this->Session->read(‘Auth.User.id’) you can just write

$uid = Auth::id(); // anywhere in your application

The roles can be fetched like this:

$myRoles = Auth::roles(); // string in single-role and array in multi-role context

Last but not least the user data:

$user = Auth::user(); // complete user array
$username = Auth::user('username'); // string: current username
...

Details

[Read the full article here][article]. [article]: http://www.dereuromark.de/2012/04/07/auth-inline-authorization-the-easy-way/

]]>
Sat, 07 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/06/AddressFinderHelper-a-widget-for-cakephp-2-x-forms.html https://bakery.cakephp.org/2012/04/06/AddressFinderHelper-a-widget-for-cakephp-2-x-forms.html <![CDATA[AddressFinderHelper, a widget for cakephp 2.x forms]]> AddressFinderHelper, a widget for cakephp 2.x forms

This helper encapsulates a nice javascript, providing client side address autocomplete from google maps, geocoding, and reverse geocoding while drag’n’dropping the marker on the map.

The helper is based on http://tech.cibul.net/geocode-with-google-maps-api-v3/ - most of the credit goes to their script.

The code and usage instructions on Github:https://github.com/stefanomanfredini/AddressFinder-Helper—Plugin-for-cakephp-2

I started using cakephp 2.x quite recently - this is my first helper for cakephp 2.x.. suggestions are welcome!

]]>
Fri, 06 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/04/Minify-plugin-for-CakePHP-2-0.html https://bakery.cakephp.org/2012/04/04/Minify-plugin-for-CakePHP-2-0.html <![CDATA[Minify plugin for CakePHP 2.0+]]> Minify plugin for CakePHP 2.0+

Minify is an application that combines multiple CSS or Javascript files, removes unnecessary whitespace and comments, and serves them with gzip encoding and optimal client-side cache headers. More info: https://code.google.com/p/minify For this plugin, the application Minify is inside Vendor

Installation

You can clone the plugin into your project (or if you want you can use as a submodule)

cd path/to/app/Plugin or /plugins
git clone https://github.com/maurymmarques/minify-cakephp.git Minify

Bootstrap the plugin in app/Config/bootstrap.php:

CakePlugin::load(array('Minify' => array('routes' => true)));

Configuration

Set the configuration file in your app/Config/core.php

Configure::write('MinifyAsset', true);

If you do not want to use compression, set false. Create a folder called “minify” in app/tmp/cache and give permission to read and write.

Usage

Enable the helper using the plugin syntax

class BakeriesController extends AppController {
    public $helpers = array('Minify.Minify');
}

This plugin uses HtmlHelper, and works virtually the same. In the view you can use something like:

echo $this->Minify->css(array('default', 'global'));
echo $this->Minify->script(array('jquery', 'interface'));

Observation

Minify is designed for efficiency, but, for very high traffic sites, Minify may serve files slower than your HTTPd due to the CGI overhead of PHP. See the FAQ and CookBook for more info. You can check the performance results using the networking tools of the Google Chrome or Mozilla Firefox with Firebug and YSlow

GitHub

Any criticism or suggestion is welcome on https://github.com/maurymmarques/minify-cakephp.

]]>
Wed, 04 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/02/PhpExcel-helper-for-generating-excel-files.html https://bakery.cakephp.org/2012/04/02/PhpExcel-helper-for-generating-excel-files.html <![CDATA[PhpExcel helper for generating excel files]]> PhpExcel helper for generating excel files

PhpExcel consists only from one helper class that uses PHPExcel project (located in vendors) to generate excel files.

PHPExcel is a great library that can create XLS files. For more information see PHPExcel project homepage.

I added method for setting font and for easy table data adding (see example).

This plugin is for CakePHP 2.x

Short example: ` //Controller: public$helpers=array(‘PhpExcel.PhpExcel’); `

` //View: $this->PhpExcel->createWorksheet(); $this->PhpExcel->setDefaultFont(‘Calibri’,12);

//definetablecells $table=array( array(‘label’=>__(‘User’),’width’=>’auto’,’filter’=>true), array(‘label’=>__(‘Type’),’width’=>’auto’,’filter’=>true), array(‘label’=>__(‘Date’),’width’=>’auto’), array(‘label’=>__(‘Description’),’width’=>50,’wrap’=>true), array(‘label’=>__(‘Modified’),’width’=>’auto’) );

//heading $this->PhpExcel->addTableHeader($table,array(‘name’=>’Cambria’,’bold’= >true));

//data foreach($dataas$d){ $this->PhpExcel->addTableRow(array( $d[‘User’][‘name’], $d[‘Type’][‘name’], $d[‘User’][‘date’], $d[‘User’][‘description’], $d[‘User’][‘modified’] )); }

$this->PhpExcel->addTableFooter(); $this->PhpExcel->output(); ` Download the code from https://github.com/segy/PhpExcel

]]>
Mon, 02 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/04/01/CakeHtmlHelper-speed-up-your-site-enabling-html-cache-Cakephp-2-x.html https://bakery.cakephp.org/2012/04/01/CakeHtmlHelper-speed-up-your-site-enabling-html-cache-Cakephp-2-x.html <![CDATA[CakeHtmlHelper speed up your site enabling html cache - Cakephp 2.x]]> CakeHtmlHelper speed up your site enabling html cache - Cakephp 2.x

I have rewrite the Matt Curry Html Cache Plugin. Taken from https://github.com/mcurry/html_cache – Cake’s core cache helper is great, but the files it outputs are PHP files, so it will never be as fast as straight HTML files. This HTML Cache Helper writes out pure HTML, meaning the web server doesnt have to touch PHP when a request is made. Okey, first you must have mod_rewrite enable to make the html cache working;

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_METHOD} ^GET$
    RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f
    RewriteRule ^(.*)$ /cache/$1/index.html [L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
</IfModule>

Now create the helper in the file View/Helper/CacheHtmlHelper.php

<?php
// Original idea from Matt Curry, rewritten by Eugenio Fage
App::uses('AppHelper', 'View/Helper');

App::uses('Folder', 'Utility');
App::uses('File', 'Utility');

class CacheHtmlHelper extends AppHelper {
    private $CacheHtmlStrategy=null;

    public function __construct(View $view, $settings = array()) {
        parent::__construct($view, $settings);
        $defaults=array('CacheHtmlStrategy'=>'CacheHtmlStrategy');
        $settings=array_merge($settings,$defaults);

        if(!class_exists($settings['CacheHtmlStrategy'])) $settings['CacheHtmlStrategy']='CacheHtmlStrategy';
        $this->CacheStrategy=new $settings['CacheHtmlStrategy']();
    }

    public function afterLayout($viewFile) {
            $this->CacheStrategy->save($this->request,$this->_View->output);
    }
}


class CacheHtmlStrategy{
    public function save($request,$content){
            $File = new File($this->url2file($request->url), true);
            $File->write($content);
    }

    public function url2file($url){
            $path=WWW_ROOT.'cache'.DS;
            $path.=implode(DS, array_filter(explode('/', $url))).DS;
            $path=str_replace('//','/',$path);
            return $path.'index.html';
    }

    public function rendercache($url=null){
            if(!$url){
                    if(isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO']){
                            $url=$_SERVER['PATH_INFO'];
                    }else{
                            return;
                    }
            }
            $file=cacheUrl2File($this->url2file($url));

            if(file_exists($file)){
                    $fp = fopen($file, 'r');
                    fpassthru($fp);
                    exit;
            }
    }
}

Now, each time you want to cache an action add the helper in the controller; function someaction(){ $this->helpers[]=’HtmlCache’; }

You could create your own cache strategy to save the files in diferents path or doing some crazy thing, for example: Config/Crazyhtmlcacheconfig.php

<?
class CrazyHtmlStrategy extends CacheHtmlStrategy{
    public function url2file($request){
            $path=WWW_ROOT.'cache2'.DS;
            $path.=implode(DS, array_filter(explode('/', $request->url))).DS;
            $path=str_replace('//','/',$path);
            return $path.'index.html';
    }
}

Then add in your bootstrap; config(‘Crazyhtmlcacheconfig’);

And when you add the helper

$this->helpers[‘HtmlCache’]=array(‘CacheHtmlStrategy’=>’CrazyHtmlStrat egy’);

You could also try to render the files using php instead of the .htaccess routing, just have to add this in the bootstrap;

// use CacheHtmlStrategy or the strategy that you are currently using
$cache=new CacheHtmlStrategy();
$cache->rendercache();

Cheers to all! Written by Eugenio Fage

]]>
Sun, 01 Apr 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/28/ToastyCMS-a-CMS-for-people-who-love-bread-that-is-baked-twice.html https://bakery.cakephp.org/2012/03/28/ToastyCMS-a-CMS-for-people-who-love-bread-that-is-baked-twice.html <![CDATA[ToastyCMS a CMS for people who love bread that is baked twice]]> ToastyCMS a CMS for people who love bread that is baked twice

I have been building a CMS for personal use. I call it Toasty. It is a very simple tool with very basic features. It can be found at https://github.com/icompuiz/ToastyCMS

I didn’t follow any real software process so I lack documentation. I am still working on it but I am looking for some feedback.

I have included some getting started information https://github.com/icompuiz/ToastyCMS/blob/master/README

It is built on CakePHP 2.0.1.

I am thinking about reimplementing it with cakephp 2.1.1 and using more of the cakephp conventions like plugins to support extensibility.

So far the current version being used to manage this website http://ritglobalunion.com.

Tell me what you think.

]]>
Wed, 28 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/28/Eclipse-Code-Completion-in-views-using-this.html https://bakery.cakephp.org/2012/03/28/Eclipse-Code-Completion-in-views-using-this.html <![CDATA[Eclipse Code Completion in views using $this]]> Eclipse Code Completion in views using $this

If you are having problems getting eclipse to autocomplete helpers in views. Try this Create this file ( helper_complete.php ) add to your app/View directory, refresh your project and all should work. ( it does for me anyway! ) Add in helpers as you need

PHP Snippet:

<?php
App::uses('AppHelper', 'Helper');
/**
 * this Helper
 *
 * @property Html $Html
 * @property Session $Session
 * @property Form $Form
 */
class this extends AppHelper
{
    var $Html;
    var $Session;
    var $Form;

    public function __contruct()
    {
            $this->Html = new HtmlHelper($View);
            $this->Session = new SessionHelper($View);
            $this->Form = new FormHelper($View);
    }
}

$this = new this();
?>
]]>
Wed, 28 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/27/PaginationRecall-for-CakePHP-2-x.html https://bakery.cakephp.org/2012/03/27/PaginationRecall-for-CakePHP-2-x.html <![CDATA[PaginationRecall for CakePHP 2.x]]> PaginationRecall for CakePHP 2.x

Have you used PaginationRecall component with CakePHP 1.x and wonder why it doesn’t work with CakePHP 2.x? Searching for a way to keep the page or ordering of pagination? I changed the old PaginationRecall component of mattc so that it works under CakePHP 2.x. Here’s the changes code:

 `

<?php
/*
*PaginationRecallCakePHPComponent
*Copyright(c)2008MattCurry
*www.PseudoCoder.com
*
*@authormattc<matt@pseudocoder.com>
*@version2.0
*@licenseMIT
*Changedtocakephp2.xby
*
*/

classPaginationRecallComponentextendsComponent{
var$components=array('Session');
var$Controller=null;

functioninitialize(&$controller){
$this->Controller=&$controller;

$options=array_merge($this->Controller->request->params,
$this->Controller->params['url'],
$this->Controller->passedArgs
);
$vars=array('page','sort','direction','filter');
$keys=array_keys($options);
$count=count($keys);

for($i=0;$i<$count;$i++){
if(!in_array($keys[$i],$vars)||!is_string($keys[$i])){
unset($options[$keys[$i]]);
}
}

//savetheoptionsintothesession
if($options){
if($this->Session->check("Pagination.{$this->Controller->modelClass}.options")){
$options=array_merge($this->Session->read("Pagination.{$this->Controller->modelClass}.options"),$options);
}

$this->Session->write("Pagination.{$this->Controller->modelClass}.options",$options);
}

//recallpreviousoptions
if($this->Session->check("Pagination.{$this->Controller->modelClass}.options")){
$options=$this->Session->read("Pagination.{$this->Controller->modelClass}.options");
$this->Controller->passedArgs=array_merge($this->Controller->passedArgs,$options);
$this->Controller->request->params['named']=$options;
}
}
}
?>


`
]]>
Tue, 27 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/27/Force-saving-with-when-insert-primary-key-value.html https://bakery.cakephp.org/2012/03/27/Force-saving-with-when-insert-primary-key-value.html <![CDATA[Force saving with when insert primary key value]]>

Force saving with when insert primary key value

Have you ever try to make a save when you manually set the primary key value?? > By default Cakephp perform an update query, when in the fields array there is the primary key value set. <br > If we have a DB table, where the primary key is not an AI, but is a value generated by an algoritm, we need to force cakephp to make an insert into query instead an update this workaround use the beforeSave callback. > beforeSave is called after cakephp decide in the current saving process in an insert or an update. <h1>put this code in the app_model:< h1> ` publicfunctionbeforeSave($opt){ parent::beforeSave($opt); if(isset($opt[‘id’])&&$opt[‘id’]){ if(!isset($this->data[$this->name][$this->primaryKey])){ $this->data[$this->name][$this->primaryKey]=$opt[‘id’]; } } returntrue; } ` ><br >

When you need to force the save use this:

` $this->save( array( ‘Model’=>$fields ), array( ‘id’=>$newId ) ); ` ><br > Replace $fields with the array fields to save but NOT INSERT IN IT THE PRIMARY KEY VALUE. > Replace $newId with the value of the primary key < strong> ><br >

See the magic!

]]>
Tue, 27 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/26/Force-saving-with-know-primary-key.html https://bakery.cakephp.org/2012/03/26/Force-saving-with-know-primary-key.html <![CDATA[Force saving with know primary key]]> Force saving with know primary key

At first, sorry for my bad english but i’m italian. i’m writing this article for illustrate how to force a save instead update when we insert in the save fields the model’s primary key value. this workaround use the beforeSave callback. At first time insert in the app_model this function:

> <code><span style=”color: #000000”> <br >publicfunctionbeforeSave($opt){ parent::beforeSave($opt); if(isset($opt[‘id’])&&!is_null($opt[‘id’])){ if(!isset($this->data[$this->name][$this->primaryKey])){ $this->data[$this->alias][$this->primaryKey]=$opt[‘id’]; } } returntrue; }

><br > so, when you make a save in your code use this: ><br > ` $this->save( array( ‘Model’=>$fields, ), array( ‘id’=>$newId ) ) ` ><br > replace $fields with the fields array but NOT INSERT IN IT THE PRIMARY KEY FIELD. replace $newId with the know value of the primary key. using the beforeSave validate workaround, the primary key will be set after cake has decided to perform an insert query, because there is not primary key set. So if we need to make an insert, but we want to set manually the primary key value, just using this method, avoid that cake make an update query.

]]>
Mon, 26 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/26/CakePHP-2-1-1-and-1-3-15-released.html https://bakery.cakephp.org/2012/03/26/CakePHP-2-1-1-and-1-3-15-released.html <![CDATA[CakePHP 2.1.1 and 1.3.15 released]]> CakePHP 2.1.1 and 1.3.15 released

As usual, the CakePHP team is proud to deliver another bugfix/maintenance release in a timely fashion!

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.1.1 [1] and 1.3.15 [2]. Both versions are a bugfix/maintenance releases. This is a short list of changes that can be expected in both versions:

2.1.1

  • session_cache_limiter() removed when starting a session, also remove setting P3P header
  • Updated the .htaccess files, make sure you update them in you apps as well.
  • Set::sort() now correctly sorts when using {s}.path
  • Fixed Session.cookieTimeout default behavior
  • Made Validation class more strict when checking values in list.
  • Used urldecode trailing pass arguments in the URL
  • Added missing ‘recursive’ option to DigestAuthenticate object.

1.3.15

  • Fixed an issue with find(count) and translated conditions.
  • Adding iPad and windows phone os as mobile clients.
  • Fixed Number::currency() when using custom formats and numbers between -1 and 1.
  • Fix a bug introduced when generating partial compatibility between 1.3 and 2.0 Cookies, where an empty valued key caused a PHP notice. Also, harden tests.
  • Fix header stripping in EmailComponent, it was aggressively stripping to: from text.
  • Fix EmailComponent::reset() not resetting delivery
  • Fix issues where nested HABTM associations would create duplicate content.

If you have not upgraded to 2.1.1 there is no better time than this. Our newest release is our most stable and feature-rich release yet, don’t miss out on all these yummy enhancements!

A huge thanks to all involved in terms of both contributions through commits, tickets, documentation edits, and those whom have otherwise contributed to the framework. Without you there would be no CakePHP.

Download packaged releases [3]

]]>
Mon, 26 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/15/TreeLiHelper.html https://bakery.cakephp.org/2012/03/15/TreeLiHelper.html <![CDATA[TreeLiHelper]]> TreeLiHelper

Helper para criar lista html com links nos nós sem filhos gerados por uma tree->generateTreeList() no cakephp 2.1 No controller coloque:

PHP Snippet:

<?php
public function index(){
    $this->loadModel('Model');
    $this->set('data',$this->Model->generateTreeList());
}
?>

na View:

PHP Snippet:

<?php
echo '<ul data-role="listview" data-divider-theme="a" data-inset="true">';
echo $this->TreeView->createTree($data,array('controller'=>'Categorias','action'=>'view'));
echo '</ul>';
?>

Crie um arquivo com o nome TreeLiHelper.php na pasta /app/View/Helper/ com o seguinte conteudo:

PHP Snippet:

<?php
App::uses('AppHelper', 'View/Helper');
class TreeLiHelper extends AppHelper {
    public $helpers = array('Html');
    public $link;
    public function createTree($tree,$link){
            $this->link = $link;
            $out = '';
            $count = 0;
            $buffer = null;
            foreach($tree as $id => $item){
                    $depth = strrpos($item, '_');
                    if ($depth === false) {
                            $depth = 0;
                            $clean_item = $item;
                    } else {
                            $depth = $depth + 1;
                            $clean_item = substr($item, strrpos($item, '_')+1);
                    }
                    if($buffer != null){
                            $out .= $this->makeLi($buffer,$depth,$id);
                    }
                    $buffer['item'] = $clean_item;
                    $buffer['depth'] = $depth;
            }
            $out .=$this->makeLi($buffer,0,$id);
            return $out;
    }

    protected function makeLi($buffer,$depth,$id){
            if($buffer['depth']==$depth){
                    $out = '<li>'.$this->makeLabel($buffer['item'],$id)."</li>\n";
            }elseif($buffer['depth']<$depth){
                    $out = '<li>'.$this->makeLabel($buffer['item'])."\n<ul>\n";
            }elseif($buffer['depth']>$depth){
                    $out = "<li>".$this->makeLabel($buffer['item'],$id)."</li>\n";
                    $diff = $buffer['depth']-$depth;
                    for($i=0; $i<$diff;$i++){
                            $out .= "</ul> \n </li>\n";
                    }

            }
            return $out;
    }

    protected function makeLabel($item, $id = null){
            if($id!=null){
                    $return = $this->Html->link($item, $this->mountLink($id));
            }else{
                    $return = $item;
            }
            return $return;
    }

    protected function mountLink($id){
            if(is_array($this->link)){
                    $link = $this->link;
                    $link[] = $id;
            }else{
                    $link = rtrim($this->link,'/').'/'.$id;
            }
            return $link;
    }

}
?>
]]>
Thu, 15 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/15/Redis-DataSource-for-cakePHP-2.html https://bakery.cakephp.org/2012/03/15/Redis-DataSource-for-cakePHP-2.html <![CDATA[Redis DataSource for cakePHP 2]]> Redis DataSource for cakePHP 2

Redis Datasource build for cakePHP 2 and above. If you need to connect your application with Redis database (redis.io) , I published my Connector at github. Feel free to use it and improve it as well. > <a href=”https: /github.com/nnset/Cake-PHP-2.xx-Redis-datasource”> Download from github

]]>
Thu, 15 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/15/Don-t-forget-afterFind-callback.html https://bakery.cakephp.org/2012/03/15/Don-t-forget-afterFind-callback.html <![CDATA[Don’t forget afterFind callback]]> Don’t forget afterFind callback

Many beginners like me ask something like, how could I get total comments count for a post? of course, there are many answers, but the most easier answer is ” Don’t forget afterFind callback in your Post model!

Suppose that you have Post and Comment model where Post model hasMany Comment while Comment model is belongsTo Post. Now we want to find all posts and each post’s comment count, we may do the following code in posts_controller:

function index(){
   $this->Post->unbindModel(array('hasMany' => array('Comment')), false);
   // Notice the above line
   $posts = $this->Post->find('all');
   $this->set('posts', $post);
}

We used unbindModel method to improve performance by stopping non required database queries to the Comment model. Now lets we look at the magic of afterFind in our Post model:

function afterFind($results, $primary = false) {
parent::afterFind($results, $primary);
foreach($results as $key => $val){
  if (isset($val['Post']['id'])){
    $results[$key]['Post']['commentsCount'] = $this->Comment->find('count', array('conditions' => array('Comment.post_id' => $results[$key]['Post']['id'])));
  }
}
return $results;
}

In the above code, we could able to add new key -commentsCount- to the Post result array and its value is retrieved from the Commen model. Using this solution we could able to do the following in the index view:

<?php foreach ($posts as $post): ?>
<h1><?php echo $post['Post']['title'];?></h1>
<span>There are <?php echo $post['Post']['commentsCount'];?> comments for this post</span>
<div><?php echo $post['Post']['content'];?></div>
<?php endforeach; ?>

I tested this code using CakePHP 1.2.11 and the following is the documentation link for afterFind callback:https://book.cakephp.org/1.2/en/view/681/afterFind

I hope this article to be useful for you and it is clear that it may be applied for any hasMany relations.

]]>
Thu, 15 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/12/AjaxMultiUpload-Plugin-for-Cake-2-0-x-and-2-1.html https://bakery.cakephp.org/2012/03/12/AjaxMultiUpload-Plugin-for-Cake-2-0-x-and-2-1.html <![CDATA[AjaxMultiUpload Plugin for Cake 2.0.x and 2.1]]>

AjaxMultiUpload Plugin for Cake 2.0.x and 2.1

A full-blown AJAX file uploader plugin for CakePHP 2.0.x and 2.1. Using this, you can add multiple file upload behavior to any or all of your models without having to modify the database or schema.

AjaxMultiUpload Plugin for CakePHP

A full-blown AJAX file uploader plugin for CakePHP 2.0.x and 2.1. Using this, you can add multiple file upload behaviour to any or all of your models without having to modify the database or schema.

You can click on the Upload File button, or drag-and-drop files into it. You can upload multiple files at a time without having to click on any button, and it shows you a nice progress notification during uploads.

How to Use

Download or checkout

You can either download the ZIP file:https://github.com/srs81/CakePHP-AjaxMultiUpload/zipball/master

or checkout the code (leave the Password field blank):

` git clone https://srs81@github.com/srs81/CakePHP-AjaxMultiUpload.git `

Put it in the Plugin/ directory

Unzip or move the contents of this to “Plugin/AjaxMultiUpload” under the app root.

Add to bootstrap.php load

Open Config/bootstrap.php and add this line:

`php CakePlugin::load('AjaxMultiUpload'); `

This will allow the plugin to load all the files that it needs.

Create file directory

Make sure to create the correct files upload directory if it doesn’t exist already:<pre> cd cake-app-root mkdir webroot/files chmod -R 777 webroot/files</pre>

The default upload directory is “files” under /webroot - but this can be changed (see FAQ below.)

You don’t have to give it a 777 permission - just make sure the web server user can write to this directory.

Add to controller

Add to Controller/AppController.php for use in all controllers, or in just your specific controller where you will use it as below:

`php var $helpers = array('AjaxMultiUpload.Upload'); `

Add to views

Let’s say you had a “companies” table with a “id” primary key.

Add this to your View/Companies/view.ctp:

`php echo $this->Upload->view('Company', $company['Company']['id']); `

and this to your View/Companies/edit.ctp:

`php echo $this->Upload->edit('Company', $this->Form->fields['Company.id']); `

FAQ

Dude! No database/table schema changes?

Nope. :) Just drop this plugin in the right Plugin/ directory and add the code to the controller and views. Make sure the “files” directory under webroot is writable, otherwise uploads will fail.

No tables/database changes are needed since the plugin uses a directory structure based on the model name and id to save the appropriate files for the model.

Help! I get file upload or file size error messages!

The default upload file size limit is set to a conservative 2 MB to make sure it works on all (including shared) hosting. To change this:

  • Open up Plugin/AjaxMultipUpload/Config/bootstrap.php and change the “AMU.filesizeMB” setting to whatever size in MB you like.
  • Make sure to also change the upload size setting ( upload_max_filesize and post_max_size) in your PHP settings ( php.ini) and reboot the web server!

Change directory

Are you stuck to the “files” directory under webroot? Nope.

Open up Config/bootstrap.php under the Plugin/AjaxMultiUpload directory and change the “AMU.directory” setting.

The directory will live under the app webroot directory - this is as per CakePHP conventions.

Change directory paths

Coming soon.

Future Work

  • Deleting files is not supported in this version.

Thanks

This uses the Ajax Upload script from: http://valums.com/ajax-upload/ and file icons from: http://www.splitbrain.org/projects/file_icons

Support

]]>
Mon, 12 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/05/CakePHP-2-1-0-just-landed.html https://bakery.cakephp.org/2012/03/05/CakePHP-2-1-0-just-landed.html <![CDATA[CakePHP 2.1.0 just landed]]> CakePHP 2.1.0 just landed

Checkout the new version on the popular PHP framework. Cool surprises included!

The CakePHP core team is very excited to announce the immediate availability of CakePHP 2.1.0 stable. As noted in the previous releases, this version is fully backwards compatible with 2.0.6, making it a breeze to update your apps to start taking advantage of the many improvements that made into this release. We are not going to release any new versions for the 2.0.x branch, and any future bug fix will be done into the 2.1 branch.

In total, there were over 90 commits and a few minor enhancements added to this final release, since our last candidate. A complete list of the changes can be viewed in the changelogs page [2]. This is a quick list of version 2.1 highlights.

Content Type Views

Two new view classes have been added to CakePHP. The new JsonView and XmlView allow you to more easily generate XML and JSON views.

Extending views

The View class has a new method allowing you to wrap or ‘extend’ a view/element/layout with another file.

Plugin.view

All layout/view/element names can now use Plugin.view to indicate that a plugin view should be used. The plugin option for View::element() is deprecated.

Improved errors

The debug() function output is now cleaner and more readable. We have also added interactive stack traces to exception pages.

General purpose event system

A new, generic event system has been built and it replaces the way callbacks are dispatched. You can dispatch your own events and attach callbacks to them at will.

Testing

Fixtures can be created in datasources other than $test.

A new TestShell has been added. It reduces the typing required to run unit tests, and offers a file path based UI:

::
Console/cake test app/Model/Post.php Console/cake test app/Controller/PostsController.php

Callback priorities

Callbacks for Helpers, Behaviors, and Components now support priorities, this helps more easily control the order in which callbacks are fired.

ThemeView is now deprecated

We’ve merged all the ThemeView functionality into the View class. Easier theme support!

Improved HTTP caching

Added several new methods in CakeResponse class to fine-tune options for HTTP caching. RequestHandlerComponent will now stop the view rendering process if it detects the client has a cached version of the resource.

Most helpers converted to utility libs

We have now refactored some helpers into libraries like CakeTime and CakeNumber. Importing one of those libs is as easy as App::uses(‘String’, ‘Utility’) and use it as follows String::truncate($text);

Deep saving

saveAll and friends ( saveMany, saveAssociated, validateAssociated …) now accept a new deep option param. For instance you can save the Author, Posts and related comments in just one call. You can also set the fieldList option to these methods, to provide a set of fields that are allowed to be saved.

New ACL engine

In addition to the good old database ACL engine, we have added a new one based on configuration files. This is a great alternative to the database solution for those who want to get a speedy permissions checking system when not requiring a database to dynamically manage permissions.

HtmlHelper::media()

The HtmlHelper gained a new media() method to generate HTML5 compatible audio and video tags with support for multiple alternate sources.

Other improvements and changes

  • Updated minimum PHP version requirement to 5.2.8 due to PHP bugs #44251 and #45748
  • Paginator helper now accepts an option to set the default class for the “current” page link
  • Extending non-existing views will throw an exception
  • Extending views using an absolute path (relative to the View folder) is now possible
  • Most view files in the cake core such as home.ctp and the default layout were moved into the app folder.
  • Query params are now shown in database log when using prepared statements
  • Transaction commands (BEGIN, COMMIT, ROLLBACK) are now shown in database log
  • Added Set::nest() and Set::get(). The former is used to created a nested array out of a plain one using an array key as reference. Set::get() is used to access any array value using dot notation.
  • Added Router::defaultRouteClass() to get/set the default Route class. This makes it easy to set a global default, useful for slug routes or i18n.
  • I18n::translate() now accepts a new $language param. It also now exposes methods to read .po files, useful for custom translation interfaces.`
  • Authenticate objects can now receive a ‘recursive’ option to limit data returned in queries used for finding users.
  • <!–nocache–> tags now work inside elements correctly.
  • FormHelper now omits disabled fields from the secured fields hash. This makes working with SecurityComponent and disabled inputs easier.
  • The between option when used in conjunction with radio inputs, now behaves differently. The between value is now placed between the legend and first input elements.
  • The hiddenField option with checkbox inputs can now be set to a specific value such as ‘N’ rather than just 0.
  • The for attribute for date + time inputs now reflects the first generated input. This may result in the for attribute changing for generated datetime inputs.
  • When using Media view setting the extension variable is now optional. If not provided its extracted from the id (aka filename)

One of the cool suprises we were saving for you, is the addition of a new site to the CakePHP domain. The new plugins repository site [4] aims to be the single reference and search start point for any extensions, plugins and applications done using CakePHP. Check it out at https://plugins.cakephp.org

Additionally we have done a major facelift to the CakePHP homepage [4] and the online manual [5], which among other cool things, have a fluid layout that will adapt to smaller screen sizes such as your mobiles phones or tablets. We are still working hard to get the rest of the sites done to match our new look.

For those wanting to ease deployment process of your cakephp applications, we have created our new PEAR channel [6] for the framework. This will help you keep up-to-date with new security fixes and latest enhancements. Just go to the website and follow the instructions!

As always, thanks to the friendly CakePHP community for the patches, documentation changes and new tickets. Without you there would be no CakePHP!

  • Download a packaged release [1]
  • View the changelog [2]
]]>
Mon, 05 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/03/02/CakePHP-internationalization-and-localization.html https://bakery.cakephp.org/2012/03/02/CakePHP-internationalization-and-localization.html <![CDATA[CakePHP internationalization and localization]]> CakePHP internationalization and localization

One of the best ways for your applications to reach a larger audience is to cater for multiple languages. This can often prove to be a daunting task, but the internationalization and localization features in CakePHP make it much easier and better one of the advantages of CakePHP is Internationalization and Localization with static translations in gettext style or dynamic translations of model data and It’s a good idea to serve up public content available in multiple languages from a unique url – this makes it easy for users (and search engines) to find what they’re looking for in the language they are expecting. There are several ways to do this, it can be by using language specific subdomains (en.example.com, fra.example.com, etc.), or using a prefix to the url such as is done with this application. You may also wish to glean the information from the browser’s user- agent, among other things.

First, it’s important to understand some terminology. Internationalization refers to the ability of an application to be localized. The term localization refers to the adaptation of an application to meet specific language (or culture) requirements (i.e., a “locale”).

1-Part: First of all you need to change the Security.salt value of the config/core.php to a different value, and then create the file /app/config/config.php for inserting the languages you want to display. In this article I’ll use English and Spanish, and the default language is English.

PHP Snippet:

<?php
<?php

/* add language to the file*/

$config['LANGUAGE'] = array(‘supported’ => array(‘eng’, ‘spa’),

‘default’   => ‘eng’);
?>

Internationalization and localization are often abbreviated as i18n and l10n respectively,

Why CakePHP use i18n or L10n?

because The terms are frequently abbreviated to the numeronyms i18n (where 18 stands for the number of letters between the first i and last n in internationalization, a usage coined at DEC in the 1970s or 80s) and L10n respectively, due to the length of the words. The capital L in L10n helps to distinguish it from the lowercase i in i18n.

You need to know your own language abbreviation. Here is the list of languages and the abbreviation of them:

cake/libs/l10n.php

Note:The three-character locale codes conform to the ISO 639-2 standard, although if you create regional locales (en_US, en_GB, etc.) cake will use them if appropriate.if you use The three-character locale code it will locale as a fallback if it doesn’t exist add it manually like this

$this->Session->write(‘Config.language’, ‘eng’);

For loading the configuration in your application, you need to append the following code at the end of file config/core.php

PHP Code

PHP Snippet:

<?php
<?php

Configure::load(‘config’);?>
?>

2-Part: The language files in CakePHP have either the extension .po or .mo. In this tutorial I’ll use .po files.

For getting more information you can refer to this article:

Localizing PHP Applications series Abouzekry wrote. https://phpmaster.com/localizing-php-applications-1 Note: Remember that po files are useful for short messages, if you find you want to translate long paragraphs, or even whole pages – you should consider implementing a different solution which we skip in this article

We create this folders:

app/locale/eng app/locale/spa For this tutorial, we will use translation for “messages”, so each language folder we have a sub folder names LC_MESSAGES (in uppercase).

Now we should have this:

app/locale/eng/LC_MESSAGES/default.po

app/locale/spa/LC_MESSAGES/default.po

Now that this step is finished, we can move on to the next step.

3-Part: In order to work with CakePHP’s text function (ie : __() ..etc ..) first we need to describe them , in fact The __() function identifies these strings as translatable text that will differ by language locale and uses the text within the __() function as the message ID. If we define the translations for a certain language, those translations will appear in place of these functions. If we do not define the translations for that language, the text within the __() function will display instead by default. Every word or phrase to translate is composed of a pair id-string the id is the “msgid” value and the string is the “msgstr” value.

Your Spanish PO file should look like this:

CODE

msgid “bienvenida”

msgstr ” En varios idiomas-tutorial por Alireza.”

msgid “congrat”

msgstr ” le da las gracias”

We now need to make a fake controller to switch between languages. It’s role consists of calling the AppController::beforeFilter() method when a user wants to switch languages.

Create the controller in app/controllers/switchto_controller.php using the following code:

PHP Snippet:

<?php
<?php

class SwitchtoController extends AppController {

var $uses = array();

var $name = ‘Switchto’;

function beforeFilter()

{

parent::beforeFilter();

}

}



The AppController needs some modifications; edit the controller so it looks like this:

<?php

class AppController extends Controller

{

function beforeFilter()

{

if($this->_checkLanguage())

$this->redirect($this->referer(), null, true);

}

function _checkLanguage()

{

if(!$this->Session->check(‘Config.language’) || $this->name == “Switchto”) {

$default_lang   = Configure::read(‘LANGUAGE.default’);

$supported_lang = Configure::read(‘LANGUAGE.supported’);

$lang = null;

if($this->name == “Switchto”)

$lang = $this->action;

// we need the Cookie

App::Import(‘Component’, ‘Cookie’);

$cookie = & new CookieComponent;

$cookie->time   = ‘+360 days’;

$cookie->name   = ‘MYAPP’;

$cookie->domain = ”;

$cookie->key    = ‘whatever-key-you-wish’;

$cookie->startup();

if(!class_exists(“L10n”))

uses(‘l10n’);

$l10n = & new L10n();

if(!$lang || !in_array($lang, $supported_lang))

{

if($cookie->read(‘tutolanguage.lang’) )

{

$lang = $cookie->read(‘tutolang/lang’);

if(!in_array($lang, $supported_lang))

$lang = null;

}

/* try to find a language spaom browser that we support */

if(!$lang)

{

$browserLang = split (‘[,;]‘, env(‘HTTP_ACCEPT_LANGUAGE’));

foreach($browserLang as $langKey )

{

if(isset($l10n->__l10nCatalog[$langKey]) &&

in_array($l10n->__l10nCatalog[$langKey]['locale'], $supported_lang) )

{

$lang = $l10n->__l10nCatalog[$langKey]['locale'];

break;

}

}

}

}

if(!$lang)

$lang = $language_default;

// set the language, and write in cookie

$l10n->__setLanguage($lang);

$cookie->write(array(‘tutolanguage.lang’ => $lang));

$this->Session->write(‘Config.language’,$lang);

if($this->name == “Switchto”)

return true;

}

return false;

}

}

 ?>

In order to remember the language selected by the user, we will use cookies and so I’ve imported the Cookie component. I’ve chosen to integrate the cookie this way instead of declaring it in $components in order to avoid the overhead on the component in every call.

Explanations for _checkLanguage method:

The method work in 2 cases only: “when no session language is set” and “when user wants to switch language”. This is handling by the first condition statement. We get our supported languages and the default one from the configuration. If the controller is “SwitchTo”, it’s because the user clicks on a link to change the language. Then the action will be our language chosen (see below how to set a link to handle language switching. We suppose the desired language is the action name. Next we import the Cookie component. Indeed in order to remember the language we use cookies,I have used this way to integrate the cookie instead of declaring it in the $components in order to avoid the overhead on the component in every call(I test it ). We set the cookie parameters, you may change this to your own setting. Note that the call to $cookie->startup is essential to have the expiration date properly initialized. We will use the class L10n for setting our language. We instantiate an object of this class. We verify that our desired language is supported (either the desired is null, or set by the SwitchTo action. If the language is not supported we look if we have it in the cookie. If so we still verify we support it (that can happen in case or a removal of a language). In case we did not have any language, we verify if one of the browser supported language is matching one of our supported language. If so, we will use the first one matching. Still no language defined, then we will use our application default’s language. We use the L10n _setLanguage method to set our language application wide and we set our session language (missing this will screw up the process). We write the language in the cookie. When a user comes back, he will be automatically set to the last language he was. We return true in case of a deliberated language switch in order the beforeFilter to redirect to the referrer URL. The beforerFilter is self-explanatory, we redirect to the referrer in case the user did choose another language.

4-Part: A sample main page

To test the example, I modified the cake default main page (copy from cake distribution and place it in app/views/pages/display.ctp

PHP Snippet:

<?php
<h2><?php __(” bienvenida”); ?></h2>

<br />

<ul>

<li><?php echo $html->link(‘English’, ‘/switchto/eng’);?></li>

<li><?php echo $html->link(‘Spanish’, ‘/switchto/spa’);?></li>

</ul>

<br />

<h3><?php echo __(“congrat”, true);?><h3>

 ?>

The file demonstrates two ways in which the __() function is used. In either case, the first argument is a value that matches a msgid in the default.po file. if the msgid is not found in the PO file, then the value will be returned as is. By default, the translation message (or the unmatched msgid) will be outputted to the user. But __() also supports a second optional Boolean parameter which you can use if you want to capture the output instead of sending it, perhaps to pass to another function or anything else you may need to do to it.

It’s worth noting the language files are cached into the tmp/cache/persistent/cake_core_default_xxx files (where xxx is the locale). When using cake with debug = 0, be sure to delete the cached language file in order to reflect the changes immediately.

5-Part: Summery When it comes to internationalization and localization your web application, you may have a lot of options but CakePHP will be the best choice . in fact using cookie instead of subdomain and other ways or using translations in gettext style have lots of advantages which we will find in this article and CakePHP make it rapid and more flexible to create your applicatio

]]>
Fri, 02 Mar 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/02/23/Report-Manager-Plugin-for-CakePHP-2.html https://bakery.cakephp.org/2012/02/23/Report-Manager-Plugin-for-CakePHP-2.html <![CDATA[Report Manager Plugin for CakePHP 2]]> Report Manager Plugin for CakePHP 2

The report manager plugin can help users to create reports based on application models.

Changelog for version 0.4.5

  • bugfix: delete saved report does not refresh the list properly
  • bugfix: array index errors on loading reports

Changelog for version 0.4.4

  • enhancement: JS changes to work on non-root URLs

Changelog for version 0.4.3

  • bugfix: default.js : update after renumber position

Changelog for version 0.4.2

  • bugfix: order.ctp - test if OrderBy1 and OrderBy2 are set
  • bugfix: ReportsController listReports method - handle empty array

Changelog for version 0.4

  • Load and Save reports
  • Export to XLS

Changelog for version 0.3

  • One to many reports
  • Sortable fields by drag and drop ( step 1 )
  • Click to add field change background color ( step 1 )
  • Click in model name check/uncheck all fields ( step 1 )
  • SmartWizard validation ( step 1 )
  • Datepicker for date fields ( step 2 )
  • Checkbox to enable counter option ( step 4 )
  • Check box for one to many reports : show items with no related records ( step 4 )
  • Both jquery and jquery ui libraries are loaded from google

Installation

  1. Download the plugin from github or sourceforge ( where you can see some screenshots )

https://sourceforge.net/projects/repomancakephp/

https://github.com/luisdias/CakePHP-Report-Manager-Plugin

  1. Extract the zip file on the app/Plugin folder ( the plugin folder must be named ReportManager )
  2. Add the following line to your bootstrap.php file ( located at app/Config folder )

CakePlugin::load(‘ReportManager’,array(‘bootstrap’ => true));

  1. Go to the url http://mycakeapp/report_manager/reports to see the main page listing all models

Using the plugin

The wizard interface is self explanatory.

  1. On the first tab you can select the fields and their position
  2. On the second tab you can define a filter
  3. On the third tab you can select up to two fields to sort
  4. On the last tab you can enter a name for your report and choose between 5 style options

Configuration:

Some parameters could be configured in the app/Plugin/ReportManager/Config/bootstrap.php

  • Display foreign keys
  • Ignore List for global fields ( affects all models )
  • Ignore list for models
  • Ignore list for specific model’s fields
  • Reports directory path

Notes:

It was inspired by the Report Creator Component by Gene Kelly from Nov 9th 2006.

https://bakery.cakephp.org/articles/Gkelly/2006/11/09/report-creator-component

It also uses a Jquery plugin called SmartWizard by Tech Laboratory.

http://techlaboratory.net/products.php?product=smartwizard

Since version 0.3 the Report Manager Plugin load the jQuery and jQuery UI libraries from Google

Collaborators:

Suman (USA)

Santana (Brazil)

Tamer Solieman (Egypt)

jasonchua89

Author: Luis E. S. Dias

Contact: smartbyte.systems@gmail.com

]]>
Thu, 23 Feb 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/02/21/Sphinx-Search-Behavior-for-Cake-2-0.html https://bakery.cakephp.org/2012/02/21/Sphinx-Search-Behavior-for-Cake-2-0.html <![CDATA[Sphinx Search Behavior for Cake 2.0+]]> Sphinx Search Behavior for Cake 2.0+

I’ve updated the previous CakePHP behavior to work for Cake 2.0, and also optimized it down to one query, versus two

https://github.com/nshahzad/Sphinx-CakePHP

]]>
Tue, 21 Feb 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/02/20/CakePHP-2-1-Release-Candidate-is-out.html https://bakery.cakephp.org/2012/02/20/CakePHP-2-1-Release-Candidate-is-out.html <![CDATA[CakePHP 2.1 Release Candidate is out]]> CakePHP 2.1 Release Candidate is out

The first, and hopefully only, release candidate for CakePHP 2.1 was released. If you have an application running on 2.0 or planning to migrate, this is the best moment to start checking this version out!

The CakePHP core team is proud to announce the immediate availability of the first CakePHP 2.1.0 Release Candidate [1]. As noted in the previous releases, this version is fully backwards compatible with 2.0.6, making it a breeze to update your apps to start taking advantage of the many improvements that made into this release. This will hopefully be the only release candidate for the branch, should any serious bugs arise we will keep offering release candidates until we reach stable.

In total, there were over 170 commits and over 4 new major features or enhancements added to this release candidate, in addition to the previous 2.1 beta release. A complete list of the changes can be viewed in the changelogs page [2]. This is a quick list of this version’s main highlights:

Most helpers converted to utility libs

One common feature request was to be able to use methods from the Text, Time and Number helpers outside views. Valid uses for the methods exposed in those helpers are email sending in shells, data formatting before saving in models and a few other cases in controllers. We have now refactored those helpers into libraries CakeTime and CakeNumber, while all methods found in the Text helper were placed into the String class.

Importing one of those libs is as easy as App::uses(‘String’, ‘Utility’) and use it as follows String::truncate($text);

All new libraries are composed of static methods, no need to instantiate the class. Additionally, refactored helpers will still work as usual, but they now rely in the underlying libs to function. This opens up the posibility of swapping the “engine” those helpers are using to produce the same results in views.

Deep saving

saveAll and friends ( saveMany, saveAssociated, validateAssociated …) now accept a new deep option param. If you set this param to true the it will save data as deep as it can, bringing the posibility of saving any level of data nesting you like in a single transaction. For instance you can save the Author, Posts and related comments in just one call.

The aforementioned functions also accept a fieldList option to specify which of those fields should be saved or validated. This list will apply to deep associations too.

New ACL engine

In addition to the good old database ACL engine, we have added a new one based on configuration files. This engine takes a php file containing specific variables describing AROS, ACOS and permissions to grant access to resources in your application. This is a great alternative to the database solution for those who want to get a speedy permissions checking system when not requiring a database to dynamically manage permissions.

HtmlHelper::media()

The HtmlHelper gained a new media() method to generate HTML5 compatible audio and video tags with support for multiple alternate sources.

Other improvements and changes

  • Updated minimum PHP version requirement to 5.2.8 due to PHP bugs #44251 and #45748
  • Paginator helper now accepts an option to set the default class for the “current” page link
  • Extending non-existing views will throw an exception
  • Extending views using an absolute path (relative to the View folder) is now possible
  • Most view files in the cake core such as home.ctp and the default layout were moved into the app folder.
  • Query params are now shown in database log when using prepared statements

We’re almost ready with this version and we have a couple of surprises for the community, so stay tuned! As always, thanks to the friendly CakePHP community for the patches, documentation changes and new tickets. Without you there would be no CakePHP!

  • Download a packaged release [1]
  • View the changelog [2]
]]>
Mon, 20 Feb 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/02/15/reCAPTCHA-Plugin-for-CakePHP-2.html https://bakery.cakephp.org/2012/02/15/reCAPTCHA-Plugin-for-CakePHP-2.html <![CDATA[reCAPTCHA Plugin for CakePHP 2]]>

reCAPTCHA Plugin for CakePHP 2

I have updated and improved tbsmcd’s reCAPTCHA Plugin for CakePHP2. https://github.com/Jahdrien/ReCaptcha-Plugin

1. Get reCAPTCHA key.

https://www.google.com/recaptcha

2. Setting.

Download recaptchalib.php. And put it in “Recaptcha/Vendor”. https://code.google.com/p/recaptcha/downloads/list?q=label:phplib- Latest

3. Config.

Insert keys in Recaptcha/Config/key.php . $config = array( ‘Recaptcha’ => array( ‘Public’ => ‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’, ‘Private’ => ‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’, ), );

4. Bootstrap.

if you load your plugins one by one add CakePlugin::load(‘Recaptcha’);

ReCaptcha/Config/bootstrap.php only reads your key.php config file

5. Controller.

public $components = array(‘Recaptcha.Recaptcha’); public $helpers = array(‘Recaptcha.Recaptcha’);

or inside controller action

$this->helpers[] = ‘Recaptcha.Recaptcha’; $this->Components->load(‘Recaptcha.Recaptcha’)->startup($this);

always add in your controller action or in bootstrap Configure::load(‘Recaptcha.key’);

6. View.

Inside <form> tags: echo $this->Recaptcha->show(array $options); $options : any recaptcha supported option (theme, lang, custom_translations, custom_theme_widget, tabindex) example: echo $this->Recaptcha->show(array( ‘theme’ => ‘white’, ‘lang’ => ‘fr’, ));

echo $this->Recaptcha->error();

]]>
Wed, 15 Feb 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/02/13/ThumbnailHelper-a-thumbnail-generator-with-cache-dynamic.html https://bakery.cakephp.org/2012/02/13/ThumbnailHelper-a-thumbnail-generator-with-cache-dynamic.html <![CDATA[ThumbnailHelper, a thumbnail generator with cache dynamic]]> ThumbnailHelper, a thumbnail generator with cache dynamic

A helper that generates thumbnails of images and uses a cache to store them.

On every site I’ve ever worked had the problem of image thumbnails, because we always have to have thumbnails of certain images to display them in views in cakephp was no different. I found the behavior that makes MeioUpload everywhere upload images, but it uses to generate the thumbnails phpThumb but I could not use it in any way without mentioning that it would generate the thumbnail image at the time of upload, but often need these miniatures in several different sizes and is not feasible to create several thumbnails, so I created a helper that “serves” these thumbnails according to the passed parameters such as size, height, quality and cutting method, where he serves as a miniature based on these parameters it creates a cache of the image thus forming her only once, saving resources and increasing server performance. The use of ThumbnailHelper looks like this:

//I declare the helper in
public $helpers = array('Html', 'Thumbnail');

//updated echo $this->Thumbnail->render(‘teste.jpg’, array( ‘path’ => ‘’, ‘width’ => ‘100’, ‘height’ => ‘100’, ‘resizeOption’ => ‘portrait’, ‘quality’ => ‘100’ ), array(‘id’ => ‘img-test’, ‘alt’ => ‘thumbnail test’));

To download the helper visit my github, make a clone of the repository folder inside the app/View/Helper.

https://github.com/emersonsoares/ThumbnailsHelper-for-CakePHP

]]>
Mon, 13 Feb 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/02/11/User-Management-Plugin-for-cakephp-2-x.html https://bakery.cakephp.org/2012/02/11/User-Management-Plugin-for-cakephp-2-x.html <![CDATA[User Management Plugin for cakephp 2.x]]> User Management Plugin for cakephp 2.x

Hey I have launched a new user management plugin for cakephp 2.x checkout demo Free Version http://usermgmt.ektasoftwares.com/ Premium Version http://umpremium.ektasoftwares.com/ Download from Github https://github.com/chetanvarshney/User-Management-Plugin-for- Cakephp-2.x

UserMgmt is a User Management Plugin for cakephp 2.x Plugin version 1.0 (now stable)

Hey wanna Demo???

Free Version here is http://usermgmt.ektasoftwares.com/

Premium Version here is http://umpremium.ektasoftwares.com/

Main Features- 1. Clean code with formatting 2. Login 3. Registration 4. Cookie login/ Remember me functionality 5. Add/Edit/Delete User By Admin 6. Add/Edit/Delete Group By Admin 7. Change Password 8. Forgot Password 9. Change User Password by Admin 10. List of all Users 11. List of all Groups 12. Manage site Permissions using Ajax updation, Permission caching functionality for fast checking 13. User’s Email Verification 14. User Profile View 15. User activation by Admin 16. Routing long urls to small urls

It’s based on jedt/SparkPlug plugin

checkout demo

http://usermgmt.ektasoftwares.com/

http://umpremium.ektasoftwares.com/

Download from Github https://github.com/chetanvarshney/User-Management-Plugin-for-Cakephp-2.x

]]>
Sat, 11 Feb 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/02/08/Custom-RSS-Helper-that-actually-works-with-namespaces-for-Cakphp-2-0.html https://bakery.cakephp.org/2012/02/08/Custom-RSS-Helper-that-actually-works-with-namespaces-for-Cakphp-2-0.html <![CDATA[Custom RSS-Helper that actually works with namespaces for Cakphp 2.0]]> Custom RSS-Helper that actually works with namespaces for Cakphp 2.0

I had a hard time using cakes built in rss helper to create a podcast- feed for iTunes/iTunes U, because Apple wants us to use custom tags defined in their own namespace. Namespaces don’t work with cakes rss helper (for now), so I built my own!

I’ve described my problems in this thread over in the cakephp google group.

My own solution consists of a very simple little helper class which I posted to the bin: Cakephp bRss Helper

For how to use it have a look at the official cakebook here.

But unlike there, use this layout and this view. Note how I ignore the ‘documentData’ and create the surrounding rss tag with the necessary namespace information “by hand”.

Also my helper just constructs the xml as a string without ever using php’s xml object.

I’m aware that this is by no means a good implementation, but it works for me and there will probably be a fix in the original cakephp helper at some point. But if you run into the same problems as I did, feel free to try this solution and also to improve it! You can also just comment if you have troubles running it.

]]>
Wed, 08 Feb 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/02/08/Cakephp-application-Netbeans-Remote-Access-SSH.html https://bakery.cakephp.org/2012/02/08/Cakephp-application-Netbeans-Remote-Access-SSH.html <![CDATA[Cakephp application + Netbeans + Remote Access + SSH]]> Cakephp application + Netbeans + Remote Access + SSH

How to configure Netbeans so it accesses your remote cake application and updates changes on run/on save

Just in case someone is searching for a working way of configuring remote server in Netbeans to work with cake application, here goes good tutorial:

http://www.thewebshop.ca/blog/2009/07/working-with-remote-files-in-netbeans/

Good luck!

]]>
Wed, 08 Feb 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/02/06/CakePHP-2-0-6-released.html https://bakery.cakephp.org/2012/02/06/CakePHP-2-0-6-released.html <![CDATA[CakePHP 2.0.6 released]]> CakePHP 2.0.6 released

This will hopefully be the last 2.0 release, the CakePHP will focus on getting 2.1 done and all bugfixes and security patches will go into this branch.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.0.6 [1]. This will hopefully be the last minor version released for the 2.0 branch if no important changes are needed to be done before we get version 2.1 stable. After this one all bugfixes and security patches will be done in the 2.1 branch, which is 100% compatible with this one.

In total, there were over 90 commits and 45 issues have been resolved since 2.0.5. A complete list of the changes can be viewed on the changelogs page [2], but a quick summary of changes that made it into 2.0.6:

  • Updating minimum PHP version requirement to 5.2.8 due to PHP bugs #44251 and #45748
  • Model does not call calculate() and expression() method on the datasource if it does not implements it.
  • SqlServer views can be mapped with models as you can do with normal tables.
  • Fixed issue where session would always be regenerated regardeless of configs set.
  • Not requiring a database connection for Models having $useTable = false when combined with the FormHelper
  • Not throwing errors when instantiating model classes with no constructor using the ClassRegistry
  • Fixing memory leaks in some Database drivers
  • TextHelper::excerpt() now works as documented.
  • Defaulting back to using PHP_SELF to get current url, this solves several issues in shared hosts

We are almost done with the 2.1 release and you can expect a stable release within a couple of weeks. 2.1 will be fully backwards compatible with 2.0, and add a number of useful features. For a list of what is complete, and what is planned for 2.1, see the roadmap [3] and the in-progress 2.1 migration guide [4]

Thanks once again to the excellent CakePHP community, for all of the outstanding work. Without your contributions and love there would be no CakePHP.

  • Download 2.0.6 [1] View the changelog [2]
]]>
Mon, 06 Feb 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/31/HTML-5-Multiple-File-Upload-With-Cake.html https://bakery.cakephp.org/2012/01/31/HTML-5-Multiple-File-Upload-With-Cake.html <![CDATA[HTML 5 Multiple File Upload With Cake]]> HTML 5 Multiple File Upload With Cake

A quick tutorial on how to use HTML5’s multiple file upload with CakePHP

With HTML5 comes the ability to select multiple files using a regular file input field.

It took me a little while to work out how to do this so I thought I’d post it here.

To start with we are trying to get html similar to this using the cake input helper.

<input name='uploads[]' type=file multiple>

To achieve this we need to use the Form helper as so:

<?php
echo $this->Form->create('Model', array('type' => 'file'));
echo $this->Form->input('files.', array('type' => 'file', 'multiple'));
echo $this->Form->end('Upload');
?>

From the controller inspecting the $this->data property will give us something like this:

Array
(
    [Model] => Array
        (
            [files] => Array
                (
                    [0] => Array
                        (
                            [name] => 20120112_153642.jpg
                            [type] => image/jpeg
                            [tmp_name] => E:\wamp\tmp\phpD71.tmp
                            [error] => 0
                            [size] => 1922765
                        )
                    [1] => Array
                        (
                            [name] => 20120112_153845.jpg
                            [type] => image/jpeg
                            [tmp_name] => E:\wamp\tmp\phpD81.tmp
                            [error] => 0
                            [size] => 1122957
                        )
        )
)

You can then loop through the files array and process them as usual.

]]>
Tue, 31 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/30/Running-CakePHP-using-the-Facebook-s-HipHop-compiler.html https://bakery.cakephp.org/2012/01/30/Running-CakePHP-using-the-Facebook-s-HipHop-compiler.html <![CDATA[Running CakePHP using the Facebook’s HipHop compiler]]> Running CakePHP using the Facebook’s HipHop compiler

I always had the curiosity of trying to compile CakePHP to C++ code, but never had the time. This year I decided to give it a go…

Facebook surprised the PHP community in early 2010 when announced they managed to write a compiler for PHP to produce C++ (https://developers.facebook.com/blog/post/358) code. Being PHP the most popular language for web applications, it faces a lot of competition from other languages to position themselves as the fastest language out there, buy this announcement was a real game changer as it is hard to argue against the speed of compiled machine code.

It was clear, though, that using the HipHop compiler was not for everyone. It is widely known you can very easily scale PHP for high performance applications, frameworks usually provide tools to squeeze speed and foster cache use to make your application faster, and throwing more hardware and the problems is often the cheapest and most rapid way of serving your code to more users. Nevertheless, having an almost free way of making your code twice as fast under the same hardware sounds too good to not give it a try.

echo "<?php echo 'Hello World'; ?>" > test.php
src/hphpi/hphpi test.php

1 My Main motivation to try compiling CakePHP with Facebook’s HipHop was simple curiosity: will it work? I though it was worth the shot. By the time I was having 2the idea, there were a lot of discussions in the forums and twitter about which the fastest PHP framework was, there were tons of benchmarks out there with lot of bias, and most of them portrayed CakePHP as a slow beast that only a fool would use.

Even though that was an outright lie, I thought the discussion would be over and basically turned irrelevant if one could compile the code and get awesome speed without having to change the code. So I embarked in a surprisingly simple adventure for converting CakePHP into C++ code.

Requirements

To perform my testing I used a Ubuntu 11.10 64bits virtual machine, if you are building it in your own box, or using a virtual machine, make user it is 64bits, as that is the only platform HipHop runs in. Additionally you will need:

public $default = array(
    'datasource' => 'HipHop.Database/HpMysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'root',
    'password' => 'root',
    'database' => 'cakephp',
    'prefix' => '',
    'encoding' => 'utf8',
);

2

Installation

Follow the installing instructions in this page Building and Installing on Ubuntu 11.10 (https://github.com/facebook/hiphop-php/wiki/Building-and-Installing-on-Ubuntu-11.10) do not skip any part, all libraries listed there and patches to be applied are required. There are a couple of problematic steps in the aforementioned guide when building required libs. I have created some repos in github, including a fork of HipHop itself so you can clone them and just build the sources without having to redo the work I did. These are my forks:

You can download and compile libevent without applying any custom patches. Follow the installation guide and use my forks where it tells you to download from the original source.

Once HipHop is compiled, create a simple php file and test whether it works fine. Make sure you read this guide (https://github.com/facebook/hiphop-php/wiki/Running-HipHop) before you attempt to do anything, it is crucial that you set up the environment variables HPHP_HOME and HPHP_LIB as shown in that link.

Testing your build

cd hiphop-php
export CMAKE_PREFIX_PATH=`/bin/pwd`/../
export HPHP_HOME=`/bin/pwd`
export HPHP_LIB=`/bin/pwd`/bin

I used the interpreter instead of compiling directly. This is what I did: B0x1A1 You can follow the more advanced examples for compiling your code explained at the wiki page. I would strongly recommend you feel comfortable with compiling simple examples and getting them running before proceeding with compiling CakePHP.

Compiling CakePHP

The most important part of compiling your application is getting ready for it. I used a simple blog baked from a rather simple database schema to perform my testing using CakePHP 2.1-beta, and I made an exhaustive testing of every feature using the hphpi interpreter first.

Remember that HipHop produces a single program out of every php source file your application uses. So the simplest way of compiling and testing your source is by keeping the default CakePHP folder structure (where app and lib lives under the same root folder). There are a few simple modifications we have to do in order to test the application using the interpreter.

Installing the HipHop plugin

First step is installing my HipHop plugin (https://github.com/lorenzo/HipHop), just drop it in app/Plugin and enable it using CakePlugin::load(‘HipHop’) in your app/Config/bootstrap.php file. This plugin contains several useful scripts to adapt your application for the new environment.

Keep in my that HipHop only supports Mysql and SQLite as databases for your project, but unfortunately, the PDO implementation Facebook did does not behave exactly the same as the original PHP implementation. For that reason the plugin bundles a somewhat modified Mysql source that you need to use if you expect your application to work correctly when compiled. This is a database.php example: B0x1A2

Generating the class map

HipHop does not implement any kind of automatic class loader, so we need to provide a complete list of classes to be used in your application, this is a big difference between the hphpi interpreter and the compiler. Your CakePHP application will run just fin in the interpreter, but it won’t after compiling if you are unable to tell it where your classes are. For this purpose, the plugin bundles a shell that needs to be executed before compiling your code:

app/Console/cake HipHop.ClassPath

The previous command will generate a file under app/Config named incules.php containing hard-coded include statements for all your files containing classes. It is extremely importart you have only 1 class per file, also avoid having files combining class definitions and procedural code.

Next step is to copy the file from app/Plugin/HipHop/Config/webroot/index.php to app/webroot/index.php

cp `app/Plugin/HipHop/Config/webroot/index.php app/webroot/index.php

Main difference between both files is that the one provided by the plugin includes the class map before dispatching the request. This enables the compiler to know beforehand where to find any needed class.

Test driving it

Copy the app/Plugin/HipHop/Config/config.hdf file in your application root folder, and edit it. Your will find comments inside the file of how it should look like, this is one example:

Server {
    Port = 80
    SourceRoot = /home/lorenzo/cakephp
}

VirtualHost {
    * {
        Prefix = hiphop.local
        RewriteRules {
            * {
                pattern =    ^(.*)$
                to = /app/webroot/index.php$1
                qsa = true
                    conditions {
                            * {
                                pattern = ^/(css|js|img)/*
                                negate = true
                            }
                    }
            }
            * {
                pattern = ^/(css|js|img)/(.*)$
                to = /app/webroot/$1/$2
                qsa = true
            }
        }
    }
}

Run the interpreter in server mode for the first time using your application source. Go to the root folder containing your app directory and execute the following command:

sudo ~/dev/hiphop-php/src/hphpi/hphpi -m server -c config.hdf

Change directories accordingly if you did not follow the guide and setup the folders as suggested. After running this command you will be able to access http://localhost/ and start browsing your application, you can also provide the -p option to select a different port like 8080 if you don’t want to run the interpreter as super user.

When you have tested every feature in your app, and feel comfortable with results, it is time to start compiling your source.

Compiling your application

When compiling your source expect a lot bumps in the road. Hopefully you won’t have different problems that I had, so the plugin is already bundling a solution for those. Compiling the source requires a full list of files to include in the resulting binary, as always use the plugin to produce it:

app/Plugin/HipHop/Config/scripts/generate_list

Previous command will create the files.list file. Right after generating the list, use the following command to compile your application:

~/dev/hiphop-php/src/hphp/hphp --input-list=files.list -k 1 --log=3 -v "AllDynamic=true"

Expect it to fail. It will complain about missing PDO constants. Let’s take care of it with the following command:

app/Plugin/HipHop/Config/scripts/fixconstants

It will run a search and replace function inside /tmp/hphp* (there should be only one directory matching the expression) fixing any incorrectly exported symbol. Now cd to the build folder and start the process again:

cd /tmp/hphp* && make

Be patient, it will take some time. Hopefully the compiling process will finish without errors, and it will produce a binary file named program, be ready to execute it for the first time.

Copy the program executable anywhere you like, I put it again into my application root folder. Run it for the first time:

./program -m server -v “Server.DefaultDocument=index.php” -c config.hdf

Browse your application again and make sure everything runs as it should, and be amazed at the speed and how much concurrent connections it can handle at the same time.

Conclusion

Running CakePHP using HipHop is arguably simple one you automate the process, I’m still far from it, but I have created script for most steps. I’m really looking forward trying the new HipHop branch featuring a new virtual machine and a just in time compiler.

I’m pretty confident there are no hidden bugs when running CakePHP using HipHop, but I can be very wrong on this one. Want to help me find those bugs and fixing them? Will you compile your own applications? Leave your thoughts in the comments section!

]]>
Mon, 30 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/30/Datetime-formatter-behavior.html https://bakery.cakephp.org/2012/01/30/Datetime-formatter-behavior.html <![CDATA[Datetime formatter behavior]]> Datetime formatter behavior

Taking the idea from previous post, I have made a Behavior that formats date and datetime fields.

I took the idea from Rikkin post:https://bakery.cakephp.org/articles/rikkin/2012/01/26/formatos_de_fechas

Give thanks to him, I only put his idea into a behavior.

Here’s the code: (pasted here: https://bin.cakephp.org/saved/72238)

<?php

class DatetimeFormatterBehavior extends ModelBehavior {

    private $__defaultSettings = array(
        'date_format' => '%d/%m/%Y',
        'date_suffix' => '_d',
        'datetime_suffix' => '_dt',
        'datetime_format' => '%d/%m/%Y %H:%i:%s',
        'fields' => true,
    );

    function setup(&$model, $config = array()) {
        $this->settings[$model->alias] = $config + $this->__defaultSettings;
        $this->addDefaultVirtualFields($model);
    }

    function addDefaultVirtualFields($model) {
        extract($this->settings[$model->alias], EXTR_SKIP);
        $colTypes = $model->getColumnTypes();
        foreach($colTypes as $field => $type){
            if($fields === true || in_array($field, $fields)){
                if($type === 'date' || $type === 'datetime'){
                    $model->virtualFields[$field . $date_suffix] = "date_format($model->alias.$field, '" . $date_format . "')";
                    $model->virtualFields[$field . $datetime_suffix] = "date_format($model->alias.$field, '" . $datetime_format . "')";
                }
            }
        }
    }

}

// Usage:
class User extends AppModel {

    var $actsAs = array('DatetimeFormatter');

}

// Test (take a look to output):
debug($this->User->find('first'));
]]>
Mon, 30 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/30/960-Fluid-Grid-System-Bake-Templates-CakePHP-2-1.html https://bakery.cakephp.org/2012/01/30/960-Fluid-Grid-System-Bake-Templates-CakePHP-2-1.html <![CDATA[960 Fluid Grid System Bake Templates CakePHP 2.1]]> 960 Fluid Grid System Bake Templates CakePHP 2.1

I found this project and made some changes to it and published it on Github. All the credits go to the original poster (Tom_M https://bakery.cakephp.org/users/view/tom_m), all I did was make it available on Github and a few changes for CakePHP 2.1. You can get the ‘new’ version at https://github.com/snelweg/CakePHP-960-fluid

Want to use 960 grid system in your baked app? Ever see this “fluid” template that uses it? http://www.designinfluences.com/fluid960gs - I put it into some bake templates. It’s not that I don’t like the default baked views, but I wanted something more generic and flexible. This template is extremely fast to work with too. You can add more boxes and other content very easily as opposed to the default bake templates.

If you are unfamiliar with the 960 Fluid Grid System template created by Stephen Bau, then check out the link in the intro. It’s a very clean and basic gray/black/white layout with some nice collapsible divs and accordions and such. The page even says, “templates for rapid interactive prototyping.” Sounds like a perfect match for a rapid framework like CakePHP.

You can download the file from my server: http://www.shift8creative.com/files/960-fluid-cakephp-bake-template.tar.gz

Not to take you away from the Bakery or anything, but if you were so inclined, you can see some screenshots on my site: http://www.shift8creative.com/project/960-fluid-grid-system-cakephp-bake-templates

How do you use it? Look at the README in the zip file, but basically you’ll want to copy/merge the files in the same structure to your app. Then when you go to bake your view templates you should have a numbered option with “default” and “960grid” to choose from. Maybe others too if you have more bake templates. Anyway, choose “960grid” and that’s it. You should be set.

Check out the manual for more information: https://book.cakephp.org/view/789/Modify-default-HTML-produced-by-baked-templates

New version

You can get the ‘new’ version at https://github.com/snelweg/CakePHP-960-fluid

]]>
Mon, 30 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/29/Emogrifier-Plugin-for-rendering-HTML-formatted-email.html https://bakery.cakephp.org/2012/01/29/Emogrifier-Plugin-for-rendering-HTML-formatted-email.html <![CDATA[Emogrifier Plugin for rendering HTML formatted email]]> Emogrifier Plugin for rendering HTML formatted email

CakephpEmogrifierPlugin is a CakePHP 2.0x Plugin that makes of using Emogrify on your HTML output easy.

Wondering what Emogrify is? Emogrifier is a great library from Pelago that deals with much of the hassle involved with HTML formatted email messages:-

This Plugin is a wrapper around Emogrifier making it easy to use in CakePHP 2.0x

Step 1

Download the Plugin here:-https://github.com/ndejong/CakephpEmogrifierPlugin

Step 2

Copy or symlink CakephpEmogrifierPlugin into a path named Emogrifier in your Plugin path like this:-

app/Plugin/Emogrifier

Take careful note of the Plugin pathname, the name is “Emogrifier”, not EmogrifierPlugin or CakephpEmogrifierPlugin, it’s just Emogrifier. I spell this out because it’s an easy thing to trip up on especially if your pulling this down from github or unpacking from a tarball.

Step 3

Be sure to load the plugin in your bootstrap.php or core.php, like this:-

CakePlugin::load('Emogrifier');

Step 4

Tell your controller to render your view with Emogrifier like this:-

$this->viewClass = 'Emogrifier.Emogrifier';

Questions and Answers

Q: Pelago’s Emogrifier class requires you to pass in the CSS but this plugin does not, what’s going on? A: We parse the HTML from the View->output attribute looking for CSS from link and style elements then stich the whole thing together - it makes using this a little easier.

Q: I’m using Emogrifier before rendering to webpages and I can’t see any difference A: Take a look at the HTML source, you should notice that all your CSS styles are now inline element style attributes.

Q: Why does this Plugin have no Tests? A: Because call me daft, I just can’t work out how to write a PHPUnit test for output from a Plugin View - let me know if you do!

]]>
Sun, 29 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/27/Attach-Plugin.html https://bakery.cakephp.org/2012/01/27/Attach-Plugin.html <![CDATA[Attach Plugin]]> Attach Plugin

Attach Plugin, is easy upload in CakePHP 2. For several projects I have used the MeioUpload plugin and he was really good for me, but for some new projects I`d like to use polymorphic model for mine attachments, and the new and good Imagine library for generate thumbs, and manipulate images. So I decided to start one plugin, that is called Attach. To use it’s really simple:

Installation

Usage

In a model that needs uploading, replace the class declaration with something similar to the following:

It’s important to remember that your model class can have your own fields, and it will have a extra relation with Attachment model with the fields that are upload.

App::uses('AppModel', 'Model');

class Media extends AppModel {

    public $validate = array(
        'image' => array(
            'extension' => array(
                'rule' => array(
                    'extension', array(
                        'jpg',
                        'jpeg',
                        'bmp',
                        'gif',
                        'png',
                        'jpg'
                    )
                ),
                'message' => 'File extension is not supported',
                'on' => 'create'
            ),
            'mime' => array(
                'rule' => array('mime', array(
                    'image/jpeg',
                    'image/pjpeg',
                    'image/bmp',
                    'image/x-ms-bmp',
                    'image/gif',
                    'image/png'
                )),
                'on' => 'create'
            ),
            'size' => array(
                'rule' => array('size', 2097152),
                'on' => 'create'
            )
        ),
        'swf' => array(
            'extension' => array(
                'rule' => array(
                    'extension', array(
                        'swf',
                    )
                ),
                'message' => 'File extension is not supported',
                'on' => 'create'
            ),
            'mime' => array(
                'rule' => array('mime', array(
                    'application/x-shockwave-flash',
                )),
                'on' => 'create'
            ),
            'size' => array(
                'rule' => array('size', 53687091200),
                'on' => 'create'
            )
        ),
        'zip' => array(
            'extension' => array(
                'rule' => array(
                    'extension', array(
                        'zip',
                    )
                ),
                'message' => 'File extension is not supported',
                'on' => 'create'
            ),
            'mime' => array(
                'rule' => array('mime', array(
                    'application/zip',
                    'multipart/x-zip'
                )),
                'on' => 'create'
            ),
            'size' => array(
                'rule' => array('size', 53687091200),
                'on' => 'create'
            )
        ),
    );

    public $actsAs = array(
        'Attach.Upload' => array(
            'swf' => array(
                'dir' => 'webroot{DS}uploads{DS}media{DS}swf'
            ),
            'image' => array(
                'dir' => 'webroot{DS}uploads{DS}media{DS}image',
                'thumbs' => array(
                    'thumb' => array(
                        'w' => 190,
                        'h' => 158,
                        'crop' => true,
                    ),
                ),
            ),
            'zip' => array(
                'dir' => 'webroot{DS}uploads{DS}media{DS}zip'
            ),
        ),
    );

You also need to specify the fields in your database like so

CREATE TABLE  `attachments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `filename` varchar(150) NOT NULL,
  `model` varchar(150) NOT NULL,
  `foreign_key` int(11) NOT NULL,
  `type` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Create your upload view, make sure it’s a multipart/form-data form, and the filename field is of type ‘file’:

echo $this->Form->create('Media', array('type' => 'file'));
echo $this->Form->input('name');
echo $this->Form->input('image', array('type' => 'file'));
echo $this->Form->input('swf', array('type' => 'file'));
echo $this->Form->input('zip', array('type' => 'file'));
echo $this->Form->input('status');
echo $this->Form->end(__('Submit'));

Attach creates automatic for you the relationship with the model Attachment, for each type that you define:

var_dump($this->Media->AttachmentImage);
var_dump($this->Media->AttachmentSwf);
var_dump($this->Media->AttachmentZip);

It will be always “Attachment” plus the type! So that’s it the Attach plugin will handle your files, you can keep uptodate with the changes at the plugin at github: https://github.com/krolow/Attach

]]>
Fri, 27 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/26/Dateformatter.html https://bakery.cakephp.org/2012/01/26/Dateformatter.html <![CDATA[Dateformatter]]> Dateformatter

Hi!, Im new on the bakery, this is my first article, I hope this will be helpfull. This is a behaviors for dateformat, I was looking for something like this, but I never could get one that indulge my needs. so, here it goes. A simple Dateformat behaviors. (lo publique en español tambien)

<?php class DateformatBehavior extends ModelBehavior {

//Our  format
var $dateFormat = 'd.m.Y';
//datebase Format
var $databaseFormat = 'Y-m-d';

function setup(&$model) {
    $this->model = $model;
}

function _changeDateFormat($date = null,$dateFormat){
    return date($dateFormat, strtotime($date));
}

//This function search an array to get a date or datetime field.
function _changeDate($queryDataConditions , $dateFormat){
    foreach($queryDataConditions as $key => $value){
        if(is_array($value)){
            $queryDataConditions[$key] = $this->_changeDate($value,$dateFormat);
        } else {
            $columns = $this->model->getColumnTypes();
            //sacamos las columnas que no queremos
            foreach($columns as $column => $type){
                if(($type != 'date') && ($type != 'datetime')) unset($columns[$column]);
            }
            //we look for date or datetime fields on database model
            foreach($columns as $column => $type){
                if(strstr($key,$column)){
                    if($type == 'datetime') $queryDataConditions[$key] = $this->_changeDateFormat($value,$dateFormat.' H:i:s ');
                    if($type == 'date') $queryDataConditions[$key] = $this->_changeDateFormat($value,$dateFormat);
                }
            }

        }
    }
    return $queryDataConditions;
}

function beforeFind($model, $queryData){
    $queryData['conditions'] = $this->_changeDate($queryData['conditions'] , $this->databaseFormat);
    return $queryData;
}

function afterFind(&$model, $results){
    $results = $this->_changeDate($results, $this->dateFormat);
    return $results;
}

function beforeSave($model) {
    $model->data = $this->_changeDate($model->data, $this->databaseFormat);
    return true;
}

} ?>

]]>
Thu, 26 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/23/CakePHP-2-1-beta-Hot-and-fresh.html https://bakery.cakephp.org/2012/01/23/CakePHP-2-1-beta-Hot-and-fresh.html <![CDATA[CakePHP 2.1 beta Hot and fresh]]> CakePHP 2.1 beta Hot and fresh

Following the release of 2.1.0-alpha two weeks ago, the CakePHP core team is excited to annonce the immediate availability of 2.1.0-beta.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.1.0 beta [1]. As noted in previous release, this version is fully backwards compatible with 2.0.5, making it a breeze to update your apps to start taking advantage of the many improvements that made into this release.

In total, there were over 100 commits and 5 new features or enhancements added to this beta version, in addition to the initial 2.1 alpha release. A complete list of the changes can be viewed in the changelogs page [2]. This is a quick list of this version’s main highlights:

ThemeView is now deprecated

We realized that having to use a separate class and add more configuration to the controller class was not the ideal solution. We’ve merged all the ThemeView functionality into the View class. Easier theme support!

Improved HTTP caching

One of the major differences between 2.0 and 1.3 is the response class with which you can set response headers more easily. This change has helped a lot people who set cache headers to take advantage of reverse proxies such as Varnish. We have taken this one step further and provided several new methods in CakeResponse class to fine-tune options for HTTP caching.

RequestHandlerComponent will now stop the view rendering process if it detects the client has a cached version of the resource. This means reduced response times, and less CPU cycles per request. In order to take advantage of this you need to use the modified() or etag() methods provided in the CakeResponse class. The CakePHP book has some examples to help you understand this new feature.

Miscellaneous Changes

  • Transaction commands (BEGIN, COMMIT, ROLLBACK) are now shown in database log
  • Added Set::nest() and Set::get(). The former is used to created a nested array out of a plain one using an array key as reference. Set::get() is used to access any array value using dot notation.
  • Added Router::defaultRouteClass() to get/set the default Route class. This makes it easy to set a global default, useful for slug routes or i18n.
  • I18n::translate() now accepts a new $language param. It also now exposes methods to read .po files, useful for custom translation interfaces.`
  • Authenticate objects can now receive a ‘recursive’ option to limit data returned in queries used for finding users.

We have decided to keep a single book for the whole 2.x branch. You can read changes related to the 2.1 version in the current book. We are working towards having a new api site for this new version as soon as possible. As always, thanks to the friendly CakePHP community for the patches, documentation changes and new tickets. Without you there would be no CakePHP!

  • Download a packaged release [1]
  • View the changelog [2]
]]>
Mon, 23 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/22/NiceAuth-User-Management-Plugin-with-OpenID.html https://bakery.cakephp.org/2012/01/22/NiceAuth-User-Management-Plugin-with-OpenID.html <![CDATA[NiceAuth - User Management Plugin with OpenID]]> NiceAuth - User Management Plugin with OpenID

NiceAuth is a user management and authorization plugin that uses CakePHP’s Acl Component to manage users and permissions via a database. This plugin allows for permissions per controller or action for users and/or groups.

Features

  • ACL Database - Allows you to control access to controllers and actions for each user or group
  • User Registration - Easy to use form for user signup
  • OpenID - Allows users to signup with a single click using their OpenID account (eg. Google, Yahoo, etc.)
  • Password Reset Function - Users can enter there email address and a temporary password will be sent to them
  • Installation Script - Database tables are created and filled by using a CakePHP script in one easy step
  • Admin Dashboard - Allows for easy user management, group creation and permissions settings

Demo available at: http://niceauth.rsmartin.me

For more information and downloads: https://github.com/rsmartin/NiceAuth

]]>
Sun, 22 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/22/Mozilla-BrowserID-authentication-plugin.html https://bakery.cakephp.org/2012/01/22/Mozilla-BrowserID-authentication-plugin.html <![CDATA[Mozilla BrowserID authentication plugin]]> Mozilla BrowserID authentication plugin

I just stumbled on Mozilla’s new OpenID competitor (http://browserid.org ) and liked it. I figured I would be albe to implement it on my currently existing user database without any changes, so I started a simple cake plugin for it. The result is a simple way to enable your users to login to your cake application using only their email address.

Please let me know what you think of my first plugin. Github page is https://github.com/OverFlow636/ofbid

Prerequisites

  1. Your application should already have an authentication method setup, this plugin is simply designed to augment it.
  2. Your AppController needs to use the Auth and Session components
  3. Your server needs to support curl and ssl

To Install B0x1A0

  1. Clone ` https://github.com/OverFlow636/Ofbid.git ` into /Plugin/Ofbid
  2. Load the plugin in your bootstrap.php with the bootstrap option true ex. CakePlugin::load(array(‘Ofbid’=>array(‘bootstrap’=>true)));
  3. In your AppController or in the controller you would like to use the button add the following helper Ofbid.Ofbid
  4. In the login view call $this->Ofbid->loginButton() to print the BrowserID login button

Configuration B0x1A0

  • Default settings will work for many applications, but there are many options to customize if you require
  • All session redirect messages
  • All redirect locations
  • Optional CakeEventListener can be configured to perform user login logic, without having to change plugin code
  • To configure any of theese options checkout the plugins bootstrap.php for the Configure keys, and write them in your applications config
]]>
Sun, 22 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/22/Adding-multilingualism-to-single-language-site-without-i18n-and-or-TranslateBehaviour.html https://bakery.cakephp.org/2012/01/22/Adding-multilingualism-to-single-language-site-without-i18n-and-or-TranslateBehaviour.html <![CDATA[Notice!]]> Adding multilingualism to single language site without i18n and/or TranslateBehaviour ==================

I’m currently working on a site that requires multiple languages. As I didn’t know this at the start of the project, I didn’t prepare to use CakePHP integrated facilities for translation. So I decided to put a little something of my own…

Notice!

This tutorial is for CakePHP 2.x!

Basic premises

In CakePHP you have wonderful things like i18n and l10n, and TranslateBehaviour. Problem is this is only useful if you design your app from the beginning to do the translation as you go on. This presumes having separate tables for translated content and so on. But what if you want to use your contents table for all language content, your news table for all the news in all the languages and so on. Then, what you do is just add language_id to all the tables from where you pull content, and have a languages table for mapping your languages to names, and of course for adding new languages.

DB/Model setup

First you should create your content table, containing a language_id field. And of course the languages table. Like so: ` CREATETABLE`contents`( id`int(11)NOTNULLAUTO_INCREMENT, `title`varchar(50)DEFAULTNULL, `body`varchar(250)DEFAULTNULL, `language_id`int(11)DEFAULTNULL, PRIMARYKEY(`id) )ENGINE=MyISAMDEFAULTCHARSET=utf8AUTO_INCREMENT=1;

CREATETABLE`languages`( id`int(11)NOTNULLAUTO_INCREMENT, `value`varchar(20)NOTNULL, PRIMARYKEY(`id), UNIQUEKEY`value`(value) )ENGINE=MyISAMAUTO_INCREMENT=5DEFAULTCHARSET=utf8AUTO_INCREMENT=5; ` Create a model and the associations like. Content > belongsTo > Language / Language > hasMany > Content. Example below.

Content.php

` classContentextendsAppModel{

public$displayField=’title’; public$validate=array( ‘title’=>array( ‘notempty’=>array( ‘rule’=>array(‘notempty’), ), ), ‘body’=>array( ‘notempty’=>array( ‘rule’=>array(‘notempty’), ), ), );

public$belongsTo=array( ‘Language’=>array( ‘className’=>’Language’, ‘foreignKey’=>’language_id’, ‘conditions’=>’‘, ‘fields’=>’‘, ‘order’=>’’ ) ); } `

Language.php

` classLanguageextendsAppModel{

public$displayField=’value’;

public$hasMany=array( ‘Content’=>array( ‘className’=>’Content’, ‘foreignKey’=>’language_id’, ‘dependent’=>false) );

} <code> <p>Wellthattakescareofdb/modelpart,letsgoontoController.</p>

<h2>Controllersetup</h2>

<p>Thecontrollersetupisprettyeasy,butdependsonhowisyoursiteconfigured. IdoallmyfrontendcontentfromPagesControllercoupledwithextensiveuseofele ments,andofcourseroutingtovariousactionsdefined.ForeaseofuseI’llbaseth isonthebasicPagesControlleryougetwhenyoudownload/unpackCakePHP.ButI’mg ettingaheadofmyself.Thereisonethingyoumustconfigurebeforeyoudoanything .YoumustconfigureyourapptouseSessioncomponent.Thisisparamountasthisall isbasedonaverysimpletrickusingsessions:)

So,let’sgo…InAppControlleryousimplyaddthefollowingcode

<code> <?php classAppControllerextendsController{ public$components=array(‘Session’); } ` That’s it, yes. Only that, a bit more code is contained in the controller that serves the front page where you put the selectors for the language. Basically links to controller actions only. I put the links in default.ctp layout file because the top menu is the same for all the pages. So let’s look at how to config PagesController to make the language switching possible. ` <?php classPagesControllerextendsAppController{ publicfunctiondisplay(){ $path=func_get_args(); $count=count($path); if(!$count){ $this->redirect(‘/’); } $page=$subpage=$title_for_layout=null;

if(!empty($path[0])){ $page=$path[0]; } if(!empty($path[1])){ $subpage=$path[1]; } if(!empty($path[$count-1])){ $title_for_layout=Inflector::humanize($path[$count-1]); } $this->set(compact(‘page’,’subpage’,’title_for_layout’)); $this->render(implode(‘/’,$path)); } publicfunctionsetLangEng(){ $this->Session->write(‘lang’,‘2’); $this->redirect(array(‘controller’=>’pages’,’action’=>’display’,’home’ )); } publicfunctionsetLangGer(){ $this->Session->write(‘lang’,‘1’); $this->redirect(array(‘controller’=>’pages’,’action’=>’display’,’home’ )); } } ` The only custom code here is setLangEng() and setLangGer() method that only write a session variable for the language used. And of course you have to configure the routes for those actions to map correctly. That goes in your routes.php, and goes something like this. ` //restoftheroutes.phpyouleavealone,justaddthesetwolinesafter //Router::connect(‘/eng’,array(‘controller’=>’pages’,’action’=>’displa y’,’home’));

Router::connect(‘/eng’,array(‘controller’=>’pages’,’action’=>’setLangE ng’)); Router::connect(‘/ger’,array(‘controller’=>’pages’,’action’=>’setLangG er’)); ` And the last, but not the least piece of magic happens in ContentsController where you set the content to get for each language based on language_id (‘lang’ session variable) you set in the PagesController.php. So you open the ContentsController.php, and add a few methods of your own, like so… ` <?php classContentsControllerextendsAppController{ //basicindex,add,view,edit… publicfunctiongetcont(){ if($this->Session->read(‘lang’)==1) { $this->paginate=array( ‘conditions’=>array(‘Content.language_id’=>1), ‘limit’=>3, ‘fields’=>array(‘News.body’) ); $content=$this->paginate(‘Content’); return$content; } if($this->Session->read(‘lang’)==2) { $this->paginate=array( ‘conditions’=>array(‘Content.language_id’=>2), ‘limit’=>3, ‘fields’=>array(‘News.body’) ); $content=$this->paginate(‘Content’); return$content; } } `

Finishing it up

All you have to do now is to setup links for the language selection, and of course, get the content. I do so in elements. But first the links… Open your /app/View/Layouts/default.ctp and put the following in in the place you want the language selection menu to be. ` <ahref=”/ger”>Ger</a> <ahref=”/eng”>Eng</a> ` As you see i used plain HTML links, but that is because I like it more that way, because the designer that works on the front end can then find their way around more easily.

The last thing is to call up the content in the view. Because of the way it is set up it will be the same view for every language, just the content (or whatever you set up this way) will change depending on the session variable ‘lang’. So the view would look something like this (I’ll use the requestAction because I’m calling it from a different controller). ` //restofyourviewcode <divclass=”content-boxsix-cols”> <?php$contents=$this->requestAction(‘/contents/getcont’);?> <?phpforeach($contentsas$content):?> <h2><?phpecho$content[‘Content’][‘title’];?></h2> <p><?phpecho$content[‘Content’][‘body’];?></p> <?phpendforeach;?> </div> ` So, this is about it… This is my first CakePHP writeup, all before were, how do I do this, or how do I do that. All the other solutions I’ve come accross for adding multiple languages had meant I had to do massive refactoring, so I settled for this solution. It works just fine. So if you like it, shout :)

]]>
Sun, 22 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/19/Mpdf-component-for-generating-PDF-files-from-HTML.html https://bakery.cakephp.org/2012/01/19/Mpdf-component-for-generating-PDF-files-from-HTML.html <![CDATA[Mpdf component for generating PDF files from HTML]]> Mpdf component for generating PDF files from HTML

Mpdf consists only from one component class that uses mPDF class (located in vendors) to generate PDF file instead of standard output.

mPDF is a great class that can create PDF files from HTML. For more information see mPDF homepage.

I wrote this component to easily use mPDF with cake views. You just need to initialize Mpdf component, set desired layout (view) and instead of standard output the PDF file will be generated.

Short example in controller: ` public$components=array(‘Mpdf.Mpdf’);

publicfunctiontestpdf(){ $this->Mpdf->init(); $this->Mpdf->setFilename(‘file.pdf’); $this->Mpdf->setOutput(‘D’); //cancallanymPDFmethodvia$this->Mpdf->pdf $this->Mpdf->pdf->SetWatermarkText(“Draft”); } ` Download the code from https://github.com/segy/Mpdf

]]>
Thu, 19 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/19/Cakephp-V2-without-a-database-Fixed.html https://bakery.cakephp.org/2012/01/19/Cakephp-V2-without-a-database-Fixed.html <![CDATA[Cakephp V2 without a database (Fixed)]]> Cakephp V2 without a database (Fixed)

This bug has now been fixed https://github.com/cakephp/cakephp/commit/ 6aa08b5f52955d15fb7e44ed28efcd8156c958d2

A very simple explanation on how to get around the topical bug in CakePHP V2 and use it without a database.

When you want to use CakePHP without a database create the file /app/Model/Datasource/DummySource.php with the following content

class DummySource extends DataSource {

    function connect() {
        $this->connected = true;
        return $this->connected;
    }

    function disconnect() {
        $this->connected = false;
        return !$this->connected;
    }

    function isConnected() {

        return true;
    }

}

Next update your /app/Config/database.php file altering the ‘default’ array to include a datasource that reads

'datasource' => 'DummySource'

Don’t forget, for every model you create include the property

$useTable = false

That’s all folks.

]]>
Thu, 19 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/13/SOPA-Blackout-component.html https://bakery.cakephp.org/2012/01/13/SOPA-Blackout-component.html <![CDATA[SOPA Blackout component]]> SOPA Blackout component

On the Tuesday 24th January 2012, the US Senate will vote on the internet censorship bill. Whilst it is an American law, it has far reaching repurcusions for the web as a whole. Sites such as Reddit have said that on January 18th they are going to go dark between 8am and 8pm. This component will let you join the cause. On 18th January your site will display a customisable page. Search engine rankings will not be affected as the plugin sends a 503 status.

On the Tuesday 24th January 2012, the US Senate will vote on the internet censorship bill.

Whilst it is an American law, it has far reaching repurcusions for the web as a whole. Sites such as Reddit have said that on January 18th they are going to go dark between 8am and 8pm.

This component will let you join the cause. On 18th January your site will display a customisable page.

Search engine rankings will not be affected as the plugin sends a 503 status.

It’s not very ‘Cake-y’ - I tried using plugin first, then thought about an error page with the component, but I wanted just one file people could download and then use if they wished.

Suggestions welcomed…

<?php
    class SopaBlackoutComponent extends Object {


        var $sopa_blackout_page_title = 'Supporting anti-SOPA Blackout day'; // title and h1 content
        var $sopa_blackout_include_video = true; // embed the video from americancensorship.org on your site?
        var $sopa_blackout_include_form = true; // include the form from americancensorship.org on your site?
        var $sopa_blackout_message = '<p>On the Tuesday 24th January 2012, the US Senate will vote on the <a href="https://en.wikipedia.org/wiki/Stop_Online_Piracy_Act" target="_blank">internet censorship bill</a>.<br /><br />Whilst it is an American law, it has far reaching repurcusions for the web as a whole.<br /><br />There are many companies against SOPA, such as <a href="https://www.mattcutts.com/blog/internet-censorship-sopa/" target="_blank">Google</a>, <a href="https://blog.reddit.com/2012/01/stopped-they-must-be-on-this-all.html" target="_blank">Reddit</a>, <a href="https://news.cnet.com/8301-31921_3-57342914-281/silicon-valley-execs-blast-sopa-in-open-letter/" target="_blank">Facebook, Twitter, Wikipedia</a>, and today I am lending my weight to the argument by taking my site down for the day.<br /><br />If you think SOPA doesn\'t affect you, please think again. Watch the video below, or use the form below to force politicians to take notice.<br /><br />Thank you</p>';
        var $sopa_blackout_date = '2012-01-18'; // SOPA Blackout Day - 18th January 2012
        var $sopa_blackout_timestart = 8; // Starting at 8am or 08:00:00
        var $sopa_blackout_timeend    = 20; // Ending at 8pm or 20:00:00
        var $sopa_blackout_timezone    = null; // recommended timezones would be America/New_York or America/Los_Angeles


        //called before Controller::beforeFilter()
        function initialize(&$controller, $settings = array()) {
            // saving the controller reference for later use
            $this->controller =& $controller;
        }


        //called after Controller::beforeRender()
        function beforeRender(&$controller) {
            if($this->sopablackout_checkdate()){
            $message = '<!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>'.$this->sopa_blackout_page_title.'</title>
        <style>
            body, html {background-color:#000000; color:#ffffff;font-family:"Trebuchet MS", Myriad, Arial;}
            div.sopablackout_padding {padding:24px;}
            #container {width:1000px; margin:40px auto;}
            p, div.sopablackout_padding { font-size:14px; line-height:140%;}
        </style>
    </head>
    <body>
        <div id="container">
            <h1>'.$this->sopa_blackout_page_title.'</h1>
            <div class="sopablackout_padding">
                '.$this->sopa_blackout_message.'
            </div>';
            if($this->sopa_blackout_include_video===true){
                $message .='
                <div class="sopablackout_padding">
                    <iframe src="https://player.vimeo.com/video/31100268" width="600" height="338" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
                </div>';
            }
            if($this->sopa_blackout_include_form===true){
                $message .='
                <div class="sopablackout_padding">
                    <iframe src="https://americancensorship.org/callwidget" width="588" height="625" border="0"></iframe>
                </div>';
            }
            $message .='
        </div>
    </body>
    </html>';
            header('HTTP/1.1 503 Service Temporarily Unavailable');
            header('Retry-After: ' . HOUR);
            echo $message;
            exit();
            }
        }

        function sopablackout_checkdate(){
            $toreturn = false;
            if(date('Y-m-d')==$this->sopa_blackout_date){
                if($this->sopa_blackout_timezone){
                    date_default_timezone_set($this->sopa_blackout_timezone);
                }
                if(date('H')>=$this->sopa_blackout_timestart && date('H')<$this->sopa_blackout_timeend){
                    $toreturn = true;
                }
            }
            return $toreturn;
        }

    }

?>

]]>
Fri, 13 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/12/jQuery-Multi-input-for-CakePHP.html https://bakery.cakephp.org/2012/01/12/jQuery-Multi-input-for-CakePHP.html <![CDATA[jQuery Multi-input for CakePHP]]> jQuery Multi-input for CakePHP

I apologize for my English! This plugin helps you create are automatically added inputs. They can be used by adding a few pages of the book. men__1@mail.ru for any questions

Code for view:

<?php
echo $this->Html->script('jquery-1.7.1.min');
echo $this->Html->script('jquery.multinput');
echo $this->Form->create();
echo $this->Form->input('User.name');
?>
<div id="multi-input">
    <?php
    echo $this->Form->input('User.Children.multi_i.name');
    echo $this->Form->input('User.Children.multi_i.age');
    ?>
</div>
<?php
echo $this->Form->end('test');
?>
<script>
$(function() {
    $("#multi-input").multinput();
});
</script>

Options for plugin:

  • myPag - Object for paginator. If not passed, the paginator will be posted after the current object.
  • iterator - The string to be replaced by an array index
  • addText - The text for the button to add input
  • hideOld - Hide the new inputs or no

Code for jQuery plugin:

jQuery.fn.multinput = function(options) {
    var options = jQuery.extend({
        myPag: false,
        iterator: "multi_i",
        addText: "Add",
        hideOld: true
    }, options);

    var deffContent;
    var count = 1;
    return this.each(function(){
        var thisM = this;
        deffContent = jQuery(thisM).clone();
        var tmpContent = deffContent.clone();
        tmpContent.find("input").each(function() {
            jQuery(this).attr("name", jQuery(this).attr("name").replace(options.iterator, count));
        });
        jQuery(thisM).html("<div multi_i='" + count + "'>" + tmpContent.html() + "</div>");
        if(options.myPag == false) {
            jQuery(thisM).after("<div id='multi-paginator'></div>");
            var paginator = jQuery("#multi-paginator");
        } else {
            var paginator = options.myPag;
        }
        paginator.html("<ul><li><a class='multi-add' href='#'>" + options.addText + "</a></li><li class='active'><a href='#'>" + count + "</a></li></ul>");
        if(options.hideOld) {
            paginator.find("ul li a").live("click", function() {
                if(!jQuery(this).hasClass("multi-add")) {
                    var id = $(this).text();
                    jQuery(thisM).children().each(function() {
                        if($(this).attr("multi_i") == id) {
                            $(this).show();
                        } else {
                            $(this).hide();
                        }
                    });
                }
            });
        }
        paginator.find("ul li a.multi-add").click(function() {
            count++;
            paginator.find("ul li").removeClass("active").parent().append("<li class='active'><a href='#'>" + count + "</a></li>");
            var tmpContent = deffContent.clone();
            tmpContent.find("input").each(function() {
                jQuery(this).attr("name", jQuery(this).attr("name").replace(options.iterator, count));
            });
            if(options.hideOld) {jQuery(thisM).children().hide();};
            jQuery(thisM).append("<div multi_i='" + count + "'>" + tmpContent.html() + "</div>");
        });
    });
};

Result

Array
(
    [User] => Array
        (
            [name] => menOne
            [Children] => Array
                (
                    [1] => Array
                        (
                            [name] => Max
                            [age] => 34
                        )

                    [2] => Array
                        (
                            [name] => Jon
                            [age] => 23
                        )

                    [3] => Array
                        (
                            [name] => Frad
                            [age] => 5
                        )

                )

        )

)

men__1@mail.ru for any questions

]]>
Thu, 12 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/12/CakePHP-2-and-launchd-on-Mac-OS-X-10-6.html https://bakery.cakephp.org/2012/01/12/CakePHP-2-and-launchd-on-Mac-OS-X-10-6.html <![CDATA[CakePHP 2 and launchd on Mac OS X 10.6]]>

CakePHP 2 and launchd on Mac OS X 10.6

To run i.e. maintenance jobs on a regular basis CakePHP provides the availability to write shells which should then be called by cron. Yet on recent Mac OS systems, cron is not the way to go anymore. Instead, there’s “launchd”. I want to show how to use launchd to run a custom shell on a regular time interval.

The shell

The shell itself can be any shell you want and/or have already written. For details on this refer to the cake book, section Creating a Shell.

The command to run the script

In the cakebook in a section close to the one linked above, the writers propose a short shell script which makes sure the paths are set right – however, we don’t need that on our shiny Mac OS systems. Instead, we just call the shell directly using the provided “cake” program: /path/to/your/cake/app/Console/cake yourshell

The launchd stuff

Launchd wants us to create a .plist file with informations about the program we want to run, when we want to run it and so on. I’ve posted an example plist file here, because the bakery doesn’t allow me to post code here…

Since we can give a working directory (in the WorkingDirectory key), we don’t need to use the cakeshell.sh as proposed in the book.

In the StartInterval key we give the time interval after which the program execution should repeat.

To have everything running on boot, save this file to /Library/LaunchDaemons/ – this seems to be an appropriate place since we programmed some sort of server daemon here. It’s probably a good idea to give the file the same name as you label it in the plist file (only that you add .plist as ending…). Alternatively you can also save the file somewhere else and manually load it by calling launchctl load /path/to/your/com.foo.bar.plist, but you’ll have to repeat that after each reboot to have it constantly running.

Feel free to post any questions in the comments, although I probably won’t be able to answer many of them since I’m certainly not an expert on any of those areas! :-)

]]>
Thu, 12 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/11/HABTM-Add-Delete-Behavior-for-CakePHP-2-0.html https://bakery.cakephp.org/2012/01/11/HABTM-Add-Delete-Behavior-for-CakePHP-2-0.html <![CDATA[HABTM Add & Delete Behavior for CakePHP 2.0]]> HABTM Add & Delete Behavior for CakePHP 2.0

The easy way to incrementally add|delete an HABTM association records is to use this Behavior, written by Brandon Parise: HABTM Add and Delete Behavior (posted May 9th 2007) But since it was written by the age of CakePHP v1.2, it seems to malfunction with the current head version of CakePHP Framework, which is 2.0.x - so I’ve came up with a little fixation here.

Updated Version of ExtendAssociationsBehavior for CakePHP 2.0.x

Patch|Diff

$ diff -u old new
--- Vendor/Model/Behavior/ExtendAssociationsBehavior.php    2012-01-10 23:31:14.000000000 +0900
+++ Vendor/Model/Behavior/ExtendAssociations2Behavior.php   2012-01-10 23:33:57.000000000 +0900
@@ -1,5 +1,6 @@
 <?php
-class ExtendAssociationsBehavior extends ModelBehavior {
+App::uses('ModelBehavior', 'Model');
+class ExtendAssociations2Behavior extends ModelBehavior {
     /**
      * Model-specific settings
      * @var array
@@ -44,7 +45,7 @@
             // important to use array_unique() since merging will add
             // non-unique values to the array.
             $data[$assoc][$assoc] = array_unique(am($data[$assoc][$assoc], $assoc_ids));
-            return $model->save($data);
+            return $model->save($data, array('fieldList'=>array($assoc)));
         }

         // association doesn't exist, return false
@@ -82,7 +83,7 @@
                 // which is the ones we want to re-save.
                 $data[$assoc][$assoc] = array_diff($data[$assoc][$assoc], $assoc_ids);
             }
-            return $model->save($data);
+            return $model->save($data, array('fieldList'=>array($assoc)));
         }

         // association doesn't exist, return false
@@ -122,7 +123,7 @@

         // unbind all models except the habtm association
         $this->unbindAll($model, array('hasAndBelongsToMany' => array($assoc)));
-        $data = $model->find(array($model->name.'.'.$model->primaryKey => $id));
+        $data = $model->findById($id);

         $model->recursive = $tmp_recursive;
         $model->cacheQueries = $tmp_cacheQueries;
@@ -149,8 +150,8 @@
      */
     function unbindAll(&$model, $exceptions = array()) {
         $unbind = array();
-        foreach($model->__associations as $type) {
-            foreach($model->{$type} as $assoc=>$assocData) {
+        foreach($model->_associations as $type) {
+            foreach($model->$type as $assoc=>$assocData) {
                 // if the assoc is NOT in the exceptions list then
                 // add it to the list of models to be unbound.
                 if(@!in_array($assoc, $exceptions[$type])) {
@@ -164,3 +165,4 @@
         }
     }
 }
+

Usage

There’s no change in usage/method API:

## add
$model->habtmAdd($assoc_name, $from_id, array($to_id1, $to_id2, ...));
e.g. $this->Post->habtmAdd('PostsTag', 1, array(2, 3));

## delete
$model->habtmDelete($assoc_name, $from_id, array($to_id1, $to_id2, ...));
e.g. $this->Post->habtmAdd('PostsTag', 1, array(3));

## delete all
$model->habtmDeleteAll($assoc_name, $from_id);

Well thats it for now, and thanks Brian for sharing such cool behavior.

]]>
Wed, 11 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/09/CakePHP-2-1-alpha-just-baked.html https://bakery.cakephp.org/2012/01/09/CakePHP-2-1-alpha-just-baked.html <![CDATA[CakePHP 2.1-alpha just baked]]> CakePHP 2.1-alpha just baked

We are excited to announce the that the next version of CakePHP just hit alpha state. This version adds several useful features that make CakePHP one of the easiest and more fun to work with frameworks out there. Check it out to enjoy content type specific pages, improved error messages, view blocks and a new callbacks system.

The CakePHP core team is proud to announce the immediate availability of CakePHP 2.1.0 alpha [1]. Version 2.1 is fully backwards compatible with 2.0.x release. This means that if you have an app already working in 2.0 or plan to upgrade one to it, you can safely start using 2.1 right away and expect no additional work in upgrading. We are very excited about several enhancements that are part of 2.1 and are working hard to get the few remaining improvements completed.

In total, there were over 230 commits and over 15 new features or enhancements added to CakePHP 2.1. A complete list of the changes can be viewed in the changelogs page [2]. This is a quick list of this version’s main highlights:

Content Type Views

Two new view classes have been added to CakePHP. The new JsonView and XmlView allow you to more easily generate XML and JSON views.

By enabling RequestHandlerComponent in your application, and enabling support for the xml and or json extensions, you can automatically leverage the new view classes. There are two ways you can generate data views. The first is by using the _serialize key, and the second is by creating normal view files.

This makes it super easy to create content-type specific pages and automatic error responses in the correct mime-types.

Extending views

The View class has a new method allowing you to wrap or ‘extend’ a view/element/layout with another file. This introduces the ideas of “sub-layouts” making your views more flexible than ever, this was implemented using ViewBlocks.

View blocks are a flexible way to create slots or blocks in your views. Blocks replace $scripts_for_layout and $content_for_layout with a more robust and flexible API.

For example blocks are ideal for implementing things such as sidebars, or regions to load assets at the bottom/top of the layout.

Plugin.view

All layout/view/element names can now use Plugin.view to indicate that a plugin view should be used. The plugin option for View::element() is deprecated.

Improved errors

The debug() function output is now cleaner and more readable. We have also added interactive stack traces to exception pages. You can click on each point of the trace to take a peek at the variable state for that point. Also, as mentioned earlier, CakePHP can now respond with content-type specific error pages.

General purpose event system

A new, generic event system has been built and it replaces the way callbacks are dispatched. This should not result in any changes to your code though. You can dispatch your own events and attach callbacks to them at will. This is useful for inter-plugin communication and decoupling of your classes through events.

Testing

Fixtures can be created in datasources other than $test. Models loaded using the ClassRegistry and using another datasource will get their datasource name prepended with test_ (e.g datasource master will try to use test_master in the testsuite)

A new TestShell has been added. It reduces the typing required to run unit tests, and offers a file path based UI:

::
Console/cake test app/Model/Post.php Console/cake test app/Controller/PostsController.php

Helpers

  • <!–nocache–> tags now work inside elements correctly.
  • FormHelper now omits disabled fields from the secured fields hash. This makes working with SecurityComponent and disabled inputs easier.
  • The between option when used in conjunction with radio inputs, now behaves differently. The between value is now placed between the legend and first input elements.
  • The hiddenField option with checkbox inputs can now be set to a specific value such as ‘N’ rather than just 0.
  • The for attribute for date + time inputs now reflects the first generated input. This may result in the for attribute changing for generated datetime inputs.

Callback priorities

Callbacks for Helpers, Behaviors, and Components now support priorities, this helps more easily control the order in which callbacks are fired.

We are working towards making the 2.1 book online in the next few hours and plan to finish the remaining features very soon. Thanks to the ever-growing CakePHP community for the patches, documentation changes and new tickets. Without you there would be no CakePHP!

  • Download a packaged release [1]
  • View the changelog [2]
]]>
Mon, 09 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/05/Layout-Component.html https://bakery.cakephp.org/2012/01/05/Layout-Component.html <![CDATA[Layout Component]]> Layout Component

Configurable Layouts for themes I am using Cake 2.0 (beta - havent upgraded properlly yet)

Using themes and redering different view files based on theme, I cam across a limitation which locks you into using the same layouts for view files in each theme. I had a need to change the layout in a new theme so did not want to load the same layout file in app/views/layouts which is dictated by the controller.

So I came up with a configurable approach to loading layouts which removes hardcoding in individual controllers

It involves installing a custom Layout component. This component uses Controller and Action mappings to advise which layout should be loaded and centralises the configuration of layouts in app/config/core.php

The Layout Component class is here

<?php
class LayoutComponent extends Object {

    public function beforeRedirect(&$controller, $url, $status = null, $exit = true){}
    public function beforeRender(&$controller){}
    public function initialize(&$controller, $settings = array())
    {
        $this->controller = &$controller;
        if (is_array(Configure::read('App.controller.layouts'))) {
            $layoutMap = Configure::read('App.controller.layouts');
            foreach ($layoutMap as $key => $value) {
                if ($key == $this->controller->name) {
                    if (is_array($value['action'])) {
                        // many action mappings apply but maybe not all
                        if (in_array($$this->controller->action, $value['action'])) {
                            if (isset($value['layout'])) {
                                $this->controller->layout = $value['layout'];
                            }
                        }
                    } else if (isset($value['action']) && $value['action'] == '*') {
                        // All actions mappings apply
                        if (isset($value['layout'])) {
                            $this->controller->layout = $value['layout'];
                        }
                    }
                }
            }
        }
    }
    public function shutdown(&$controller){}
    public function startup(&$controller){}
}

To use it simply load it into your controller or AppController’s component array

eg:

public $components = array(
        'Layout'
    );

To configure layouts here is the setting to place in your core.php file

Configure::write('App.controller.layouts', array(
    'Pages' => array('action' => '*', 'layout' => 'my_layout')
    ));

The above configuration says load a layout file called ‘my_layout’ if the controller requested is called ‘Pages’ and do this for any of ‘Pages’ actions

You can also single out actions in your configuration like so

Configure::write('App.controller.layouts', array(
    'Pages' => array('action' => array('home'), 'layout' => 'my_layout')
    ));

The above configuration says load the ‘my_layout’ file only when the requested controller name is ‘Pages’ and the action of this controller is ‘home’. All other actions will use the default layout still.

You can list as many controllers as required in the configuration like so;

Configure::write('App.controller.layouts', array(
    'Pages' => array('action' => '*', 'layout' => 'my_layout'),
    'Searches' => array('action' => array('index'), 'layout' => 'search_layout')
    ));

This may be useful to you and keeps your controllers cleaner and more configurable.

]]>
Thu, 05 Jan 2012 00:00:00 +0000
https://bakery.cakephp.org/2012/01/04/Adding-a-TinyMCE-image-browser-to-CakePHP-2.html https://bakery.cakephp.org/2012/01/04/Adding-a-TinyMCE-image-browser-to-CakePHP-2.html <![CDATA[Adding a TinyMCE image browser to CakePHP 2.+]]> Adding a TinyMCE image browser to CakePHP 2.+

This is just and update to Adding a TinyMCE image browser the CakePHP way as applicable to the 2.+ versions of Cake. Nothing major, just following with the api changes to make this work smoothly. Here is the updated Model code: ` <?php App::uses(‘Folder’,’Utility’); App::uses(‘File’,’Utility’);

classImageuploadextendsAppModel{

var$name=’Imageupload’;

var$validate=array( ‘imageupload’=>array( ‘rule’=>array( ‘validFile’, array( ‘required’=>true, ‘extensions’=>array( ‘jpg’, ‘jpeg’, ‘gif’, ‘png’ ) ) ) ) );

var$useTable=false;

functionreadFolder($folderName=null){ $folder=newFolder($folderName); $images=$folder->read( true, array( ‘.’, ‘..’, ‘Thumbs.db’ ), true ); $images=$images[1];//Weareonlyinterestedinfiles

//Getmoreinfosabouttheimages $retVal=array(); foreach($imagesas$the_image) { $the_image=newFile($the_image); $retVal[]=array_merge( $the_image->info(), array( ‘size’=>$the_image->size(), ‘last_changed’=>$the_image->lastChange() ) ); }

return$retVal; }

functionupload($data=null){ $this->set($data);

if(empty($this->data)){ returnfalse; }

//Validation if(!$this->validates()){ returnfalse; } //print_r($this->data); //Movethefiletotheuploadsfolder if(!move_uploaded_file($this->data[‘Imageupload’][‘Image’][‘image’][‘t mp_name’],WWW_ROOT.DS.’uploads’.DS.$this->data[‘Imageupload’][‘Image’] [‘image’][‘name’])){ returnfalse; }

returntrue; }

functionvalidFile($check,$settings){ $_default=array( ‘required’=>false, ‘extensions’=>array( ‘jpg’, ‘jpeg’, ‘gif’, ‘png’ ) );

$_settings=array_merge( $_default, ife( is_array($settings), $settings, array() ) );

//RemovefirstlevelofArray $_check=array_shift($check);

if($_settings[‘required’]==false&&$_check[‘size’]==0){ returntrue; }

//Nofileuploaded. if($_settings[‘required’]&&$_check[‘size’]==0){ returnfalse; }

//CheckforBasicPHPfileerrors. if($_check[‘error’]!==0){ returnfalse; }

//UsePHPsownfilevalidationmethod. if(is_uploaded_file($_check[‘tmp_name’])==false){ returnfalse; }

//Validextension returnValidation::extension( $_check, $_settings[‘extensions’] ); } } ?> ` You’ll notice a couple of small changes, mainly addin the App:uses functionality before the class declaration, and also i renamed it to Imageuploads, as Images redirected to the webroot/images folders.

And here is the updated Controller code:

<?php
classImageuploadsControllerextendsAppController{

var$name='Imageuploads';

var$uses=array('Imageupload');

var$helpers=array(
'Html',
'Form',
'Js',
'Number'//Usedtoshowreadablefilesizes
);

functionadmin_index(){
$this->layout='admin';
$this->set(
'images',
$this->Imageupload->readFolder(WWW_ROOT.DS.'uploads')
);
}

functionadmin_upload(){
//Uploadanimage
if(!empty($this->data)){
//Validateandmovethefile
if($this->Imageupload->upload($this->data)){
$this->Session->setFlash('Theimagewassuccessfullyuploaded.');
}else{
$this->Session->setFlash('Therewasanerrorwiththeuploadedfile.');
}

$this->redirect(
array(
'action'=>'index'
)
);
}else{
$this->redirect(
array(
'action'=>'index'
)
);
}
}
}
?>
<p>Iaddedtheadmin_partbecausethisfunctionalityisbehindanauthsystemandI
wantedconsistentURI'sbutthatisuptotoyou.</p>
<p>Hereisthetinymce.ctpcode</p>
<?phpecho$this->Html->script("tiny_mce/tiny_mce.js");?>

<?php
echo$this->Html->scriptBlock(
"functionfileBrowserCallBack(field_name,url,type,win){
browserField=field_name;
browserWin=win;
window.open('".Helper::url(array('controller'=>'imageuploads'))."','br
owserWindow','modal,width=600,height=400,scrollbars=yes');
}"
);
?>

<?php
echo$this->Html->scriptBlock(
"tinyMCE.init({
mode:'textareas',
theme:'advanced',
theme_advanced_buttons1:'forecolor,bold,italic,underline,|,justifyleft
,justifycenter,justifyright,justifyfull,|,bullist,numlist,|,undo,redo,
|,link,unlink,|,image,emotions,code',
theme_advanced_buttons2:'',
theme_advanced_buttons3:'',
theme_advanced_toolbar_location:'top',
theme_advanced_toolbar_align:'left',
theme_advanced_path_location:'bottom',
extended_valid_elements:'a[name|href|target|title|onclick],img[class|s
rc|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onm
ouseout|name],hr[class|width|size|noshade],font[face|size|color|style]
,span[class|align|style]',
file_browser_callback:'fileBrowserCallBack',
width:'620',
height:'480',
relative_urls:false
});"
);
?>

And lastly the the index (or admin_index in my case) view located in View/imageuploads/:

<?php
echo$this->Html->scriptBlock(
"functionselectURL(url){
if(url=='')returnfalse;

url='".Helper::url('/uploads/')."'+url;

field=window.top.opener.browserWin.document.forms[0].elements[window.t
op.opener.browserField];
field.value=url;
if(field.onchange!=null)field.onchange();
window.top.close();
window.top.opener.browserWin.focus();
}"
);
?>

<?php
echo$this->Form->create(
null,
array(
'type'=>'file',
'url'=>array(
'action'=>'upload'
)
)
);
echo$this->Form->label(
'Image.image',
'Uploadimage'
);
echo$this->Form->file(
'Image.image'
);
echo$this->Form->end('Upload');
?>

<?phpif(isset($images[0])){
$tableCells=array();

foreach($imagesAs$the_image){
$tableCells[]=array(
$this->Html->link(
$the_image['basename'],
'#',
array(
'onclick'=>'selectURL("'.$the_image['basename'].'");'
)
),
$this->Number->toReadableSize($the_image['size']),
date('m/d/YH:i',$the_image['last_changed'])
);
}

echo$this->Html->tag(
'table',
$this->Html->tableHeaders(
array(
'Filename',
'Size',
'Datecreated'
)
).$this->Html->tableCells(
$tableCells
)
);
}?>

You’ll notice a few small differences, like $this->Html->scriptBlock

Finally just make sure you add Element(‘tinymce’); ?> to the form you want to add this to. Cheers!

]]>
Wed, 04 Jan 2012 00:00:00 +0000