From 78f4f5c565d5a99d8f40010a912b7b22ecbeb2ce Mon Sep 17 00:00:00 2001 From: Aleksa-Savic Date: Fri, 31 Jan 2014 18:41:29 +0100 Subject: [PATCH 1/4] Added Serbian skeleton --- sr/_static/img/basic_mvc.png | Bin 0 -> 30422 bytes sr/_static/img/code-coverage.png | Bin 0 -> 82337 bytes sr/_static/img/typical-cake-request.png | Bin 0 -> 19786 bytes sr/appendices.rst | 71 + sr/appendices/2-0-migration-guide.rst | 1292 ++++++++++++ sr/appendices/2-1-migration-guide.rst | 363 ++++ sr/appendices/2-2-migration-guide.rst | 327 +++ sr/appendices/2-3-migration-guide.rst | 326 +++ sr/appendices/2-4-migration-guide.rst | 294 +++ sr/appendices/cakephp-development-process.rst | 56 + sr/appendices/glossary.rst | 70 + .../migrating-from-cakephp-1-2-to-1-3.rst | 778 ++++++++ sr/appendices/new-features-in-cakephp-1-3.rst | 544 +++++ sr/appendices/new-features-in-cakephp-2-0.rst | 296 +++ sr/appendices/new-features-in-cakephp-2-1.rst | 213 ++ sr/appendices/phpunit-migration-hints.rst | 200 ++ sr/cakephp-overview.rst | 24 + .../understanding-model-view-controller.rst | 108 + .../what-is-cakephp-why-use-it.rst | 62 + sr/cakephp-overview/where-to-get-help.rst | 102 + sr/console-and-shells.rst | 1008 ++++++++++ sr/console-and-shells/acl-shell.rst | 81 + .../code-generation-with-bake.rst | 233 +++ sr/console-and-shells/cron-jobs.rst | 23 + sr/console-and-shells/i18n-shell.rst | 101 + .../schema-management-and-migrations.rst | 193 ++ sr/console-and-shells/testsuite-shell.rst | 17 + sr/console-and-shells/upgrade-shell.rst | 81 + sr/contributing.rst | 19 + .../cakephp-coding-conventions.rst | 430 ++++ sr/contributing/code.rst | 141 ++ sr/contributing/documentation.rst | 376 ++++ sr/contributing/tickets.rst | 54 + sr/controllers.rst | 821 ++++++++ sr/controllers/components.rst | 303 +++ sr/controllers/pages-controller.rst | 28 + sr/controllers/request-response.rst | 832 ++++++++ sr/controllers/scaffolding.rst | 139 ++ sr/core-libraries.rst | 75 + sr/core-libraries/behaviors/acl.rst | 120 ++ sr/core-libraries/behaviors/containable.rst | 442 +++++ sr/core-libraries/behaviors/translate.rst | 357 ++++ sr/core-libraries/behaviors/tree.rst | 819 ++++++++ sr/core-libraries/caching.rst | 419 ++++ sr/core-libraries/collections.rst | 170 ++ .../components/access-control-lists.rst | 869 ++++++++ .../components/authentication.rst | 979 +++++++++ sr/core-libraries/components/cookie.rst | 181 ++ sr/core-libraries/components/email.rst | 52 + sr/core-libraries/components/pagination.rst | 359 ++++ .../components/request-handling.rst | 315 +++ .../components/security-component.rst | 332 ++++ sr/core-libraries/components/sessions.rst | 172 ++ sr/core-libraries/events.rst | 459 +++++ .../global-constants-and-functions.rst | 328 +++ sr/core-libraries/helpers/cache.rst | 150 ++ sr/core-libraries/helpers/form.rst | 1762 +++++++++++++++++ sr/core-libraries/helpers/html.rst | 1108 +++++++++++ sr/core-libraries/helpers/js.rst | 881 +++++++++ sr/core-libraries/helpers/number.rst | 31 + sr/core-libraries/helpers/paginator.rst | 592 ++++++ sr/core-libraries/helpers/rss.rst | 278 +++ sr/core-libraries/helpers/session.rst | 125 ++ sr/core-libraries/helpers/text.rst | 95 + sr/core-libraries/helpers/time.rst | 55 + .../internationalization-and-localization.rst | 244 +++ sr/core-libraries/logging.rst | 405 ++++ sr/core-libraries/toc-behaviors.rst | 17 + sr/core-libraries/toc-components.rst | 17 + sr/core-libraries/toc-general-purpose.rst | 10 + sr/core-libraries/toc-helpers.rst | 24 + sr/core-libraries/toc-utilities.rst | 22 + sr/core-utility-libraries/app.rst | 404 ++++ sr/core-utility-libraries/email.rst | 423 ++++ sr/core-utility-libraries/file-folder.rst | 564 ++++++ sr/core-utility-libraries/hash.rst | 868 ++++++++ sr/core-utility-libraries/httpsocket.rst | 384 ++++ sr/core-utility-libraries/inflector.rst | 76 + sr/core-utility-libraries/number.rst | 364 ++++ sr/core-utility-libraries/router.rst | 16 + sr/core-utility-libraries/sanitize.rst | 30 + sr/core-utility-libraries/security.rst | 134 ++ sr/core-utility-libraries/set.rst | 1596 +++++++++++++++ sr/core-utility-libraries/string.rst | 297 +++ sr/core-utility-libraries/time.rst | 436 ++++ sr/core-utility-libraries/xml.rst | 336 ++++ sr/deployment.rst | 80 + sr/development.rst | 26 + sr/development/configuration.rst | 833 ++++++++ sr/development/debugging.rst | 205 ++ sr/development/dispatch-filters.rst | 229 +++ sr/development/errors.rst | 131 ++ sr/development/exceptions.rst | 448 +++++ sr/development/rest.rst | 214 ++ sr/development/routing.rst | 1110 +++++++++++ sr/development/sessions.rst | 327 +++ sr/development/testing.rst | 1327 +++++++++++++ sr/development/vendor-packages.rst | 17 + sr/getting-started.rst | 35 + .../a-typical-cakephp-request.rst | 56 + sr/getting-started/cakephp-conventions.rst | 202 ++ .../cakephp-folder-structure.rst | 89 + sr/getting-started/cakephp-structure.rst | 109 + sr/installation.rst | 216 ++ sr/installation/advanced-installation.rst | 183 ++ sr/installation/url-rewriting.rst | 270 +++ sr/models.rst | 136 ++ .../additional-methods-and-properties.rst | 114 ++ .../associations-linking-models-together.rst | 1130 +++++++++++ sr/models/behaviors.rst | 344 ++++ sr/models/callback-methods.rst | 231 +++ sr/models/data-validation.rst | 1267 ++++++++++++ .../validating-data-from-the-controller.rst | 81 + sr/models/datasources.rst | 319 +++ sr/models/deleting-data.rst | 73 + sr/models/model-attributes.rst | 254 +++ sr/models/retrieving-your-data.rst | 1100 ++++++++++ sr/models/saving-your-data.rst | 972 +++++++++ sr/models/transactions.rst | 63 + sr/models/virtual-fields.rst | 216 ++ sr/pdf-contents.rst | 26 + sr/plugins.rst | 445 +++++ sr/tutorials-and-examples.rst | 25 + .../blog-auth-example/auth.rst | 411 ++++ sr/tutorials-and-examples/blog/blog.rst | 204 ++ sr/tutorials-and-examples/blog/part-two.rst | 721 +++++++ .../part-two.rst | 199 ++ .../simple-acl-controlled-application.rst | 405 ++++ sr/views.rst | 807 ++++++++ sr/views/helpers.rst | 304 +++ sr/views/json-and-xml-views.rst | 131 ++ sr/views/media-view.rst | 97 + sr/views/themes.rst | 87 + 133 files changed, 44467 insertions(+) create mode 100644 sr/_static/img/basic_mvc.png create mode 100644 sr/_static/img/code-coverage.png create mode 100644 sr/_static/img/typical-cake-request.png create mode 100644 sr/appendices.rst create mode 100644 sr/appendices/2-0-migration-guide.rst create mode 100644 sr/appendices/2-1-migration-guide.rst create mode 100644 sr/appendices/2-2-migration-guide.rst create mode 100644 sr/appendices/2-3-migration-guide.rst create mode 100644 sr/appendices/2-4-migration-guide.rst create mode 100644 sr/appendices/cakephp-development-process.rst create mode 100644 sr/appendices/glossary.rst create mode 100644 sr/appendices/migrating-from-cakephp-1-2-to-1-3.rst create mode 100644 sr/appendices/new-features-in-cakephp-1-3.rst create mode 100644 sr/appendices/new-features-in-cakephp-2-0.rst create mode 100644 sr/appendices/new-features-in-cakephp-2-1.rst create mode 100644 sr/appendices/phpunit-migration-hints.rst create mode 100644 sr/cakephp-overview.rst create mode 100644 sr/cakephp-overview/understanding-model-view-controller.rst create mode 100644 sr/cakephp-overview/what-is-cakephp-why-use-it.rst create mode 100644 sr/cakephp-overview/where-to-get-help.rst create mode 100644 sr/console-and-shells.rst create mode 100644 sr/console-and-shells/acl-shell.rst create mode 100644 sr/console-and-shells/code-generation-with-bake.rst create mode 100644 sr/console-and-shells/cron-jobs.rst create mode 100644 sr/console-and-shells/i18n-shell.rst create mode 100644 sr/console-and-shells/schema-management-and-migrations.rst create mode 100644 sr/console-and-shells/testsuite-shell.rst create mode 100644 sr/console-and-shells/upgrade-shell.rst create mode 100644 sr/contributing.rst create mode 100644 sr/contributing/cakephp-coding-conventions.rst create mode 100644 sr/contributing/code.rst create mode 100644 sr/contributing/documentation.rst create mode 100644 sr/contributing/tickets.rst create mode 100644 sr/controllers.rst create mode 100644 sr/controllers/components.rst create mode 100644 sr/controllers/pages-controller.rst create mode 100644 sr/controllers/request-response.rst create mode 100644 sr/controllers/scaffolding.rst create mode 100644 sr/core-libraries.rst create mode 100644 sr/core-libraries/behaviors/acl.rst create mode 100644 sr/core-libraries/behaviors/containable.rst create mode 100644 sr/core-libraries/behaviors/translate.rst create mode 100644 sr/core-libraries/behaviors/tree.rst create mode 100644 sr/core-libraries/caching.rst create mode 100644 sr/core-libraries/collections.rst create mode 100644 sr/core-libraries/components/access-control-lists.rst create mode 100644 sr/core-libraries/components/authentication.rst create mode 100644 sr/core-libraries/components/cookie.rst create mode 100644 sr/core-libraries/components/email.rst create mode 100644 sr/core-libraries/components/pagination.rst create mode 100644 sr/core-libraries/components/request-handling.rst create mode 100644 sr/core-libraries/components/security-component.rst create mode 100644 sr/core-libraries/components/sessions.rst create mode 100644 sr/core-libraries/events.rst create mode 100644 sr/core-libraries/global-constants-and-functions.rst create mode 100644 sr/core-libraries/helpers/cache.rst create mode 100644 sr/core-libraries/helpers/form.rst create mode 100644 sr/core-libraries/helpers/html.rst create mode 100644 sr/core-libraries/helpers/js.rst create mode 100644 sr/core-libraries/helpers/number.rst create mode 100644 sr/core-libraries/helpers/paginator.rst create mode 100644 sr/core-libraries/helpers/rss.rst create mode 100644 sr/core-libraries/helpers/session.rst create mode 100644 sr/core-libraries/helpers/text.rst create mode 100644 sr/core-libraries/helpers/time.rst create mode 100644 sr/core-libraries/internationalization-and-localization.rst create mode 100644 sr/core-libraries/logging.rst create mode 100644 sr/core-libraries/toc-behaviors.rst create mode 100644 sr/core-libraries/toc-components.rst create mode 100644 sr/core-libraries/toc-general-purpose.rst create mode 100644 sr/core-libraries/toc-helpers.rst create mode 100644 sr/core-libraries/toc-utilities.rst create mode 100644 sr/core-utility-libraries/app.rst create mode 100644 sr/core-utility-libraries/email.rst create mode 100644 sr/core-utility-libraries/file-folder.rst create mode 100644 sr/core-utility-libraries/hash.rst create mode 100644 sr/core-utility-libraries/httpsocket.rst create mode 100644 sr/core-utility-libraries/inflector.rst create mode 100644 sr/core-utility-libraries/number.rst create mode 100644 sr/core-utility-libraries/router.rst create mode 100644 sr/core-utility-libraries/sanitize.rst create mode 100644 sr/core-utility-libraries/security.rst create mode 100644 sr/core-utility-libraries/set.rst create mode 100644 sr/core-utility-libraries/string.rst create mode 100644 sr/core-utility-libraries/time.rst create mode 100644 sr/core-utility-libraries/xml.rst create mode 100644 sr/deployment.rst create mode 100644 sr/development.rst create mode 100644 sr/development/configuration.rst create mode 100644 sr/development/debugging.rst create mode 100644 sr/development/dispatch-filters.rst create mode 100644 sr/development/errors.rst create mode 100644 sr/development/exceptions.rst create mode 100644 sr/development/rest.rst create mode 100644 sr/development/routing.rst create mode 100644 sr/development/sessions.rst create mode 100644 sr/development/testing.rst create mode 100644 sr/development/vendor-packages.rst create mode 100644 sr/getting-started.rst create mode 100644 sr/getting-started/a-typical-cakephp-request.rst create mode 100644 sr/getting-started/cakephp-conventions.rst create mode 100644 sr/getting-started/cakephp-folder-structure.rst create mode 100644 sr/getting-started/cakephp-structure.rst create mode 100644 sr/installation.rst create mode 100644 sr/installation/advanced-installation.rst create mode 100644 sr/installation/url-rewriting.rst create mode 100644 sr/models.rst create mode 100644 sr/models/additional-methods-and-properties.rst create mode 100644 sr/models/associations-linking-models-together.rst create mode 100644 sr/models/behaviors.rst create mode 100644 sr/models/callback-methods.rst create mode 100644 sr/models/data-validation.rst create mode 100644 sr/models/data-validation/validating-data-from-the-controller.rst create mode 100644 sr/models/datasources.rst create mode 100644 sr/models/deleting-data.rst create mode 100644 sr/models/model-attributes.rst create mode 100644 sr/models/retrieving-your-data.rst create mode 100644 sr/models/saving-your-data.rst create mode 100644 sr/models/transactions.rst create mode 100644 sr/models/virtual-fields.rst create mode 100644 sr/pdf-contents.rst create mode 100644 sr/plugins.rst create mode 100644 sr/tutorials-and-examples.rst create mode 100644 sr/tutorials-and-examples/blog-auth-example/auth.rst create mode 100644 sr/tutorials-and-examples/blog/blog.rst create mode 100644 sr/tutorials-and-examples/blog/part-two.rst create mode 100644 sr/tutorials-and-examples/simple-acl-controlled-application/part-two.rst create mode 100644 sr/tutorials-and-examples/simple-acl-controlled-application/simple-acl-controlled-application.rst create mode 100644 sr/views.rst create mode 100644 sr/views/helpers.rst create mode 100644 sr/views/json-and-xml-views.rst create mode 100644 sr/views/media-view.rst create mode 100644 sr/views/themes.rst diff --git a/sr/_static/img/basic_mvc.png b/sr/_static/img/basic_mvc.png new file mode 100644 index 0000000000000000000000000000000000000000..099d13461e324b0239c37102694b1804f5f432d1 GIT binary patch literal 30422 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 KG#;zjhW!ujz^||X literal 0 HcmV?d00001 diff --git a/sr/_static/img/code-coverage.png b/sr/_static/img/code-coverage.png new file mode 100644 index 0000000000000000000000000000000000000000..5eff05469abfca7ffb505e5ee2812708ce5105a9 GIT binary patch literal 82337 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 literal 0 HcmV?d00001 diff --git a/sr/appendices.rst b/sr/appendices.rst new file mode 100644 index 0000000000..fa818df38c --- /dev/null +++ b/sr/appendices.rst @@ -0,0 +1,71 @@ +Appendices +########## + +Appendices contain information regarding the new features +introduced in 2.x, and the migration path from 1.3 to 2.0. + +2.4 Migration Guide +=================== + +.. toctree:: + :maxdepth: 1 + + appendices/2-4-migration-guide + +2.3 Migration Guide +=================== + +.. toctree:: + :maxdepth: 1 + + appendices/2-3-migration-guide + +2.2 Migration Guide +=================== + +.. toctree:: + :maxdepth: 1 + + appendices/2-2-migration-guide + +2.1 Migration Guide +=================== + +.. toctree:: + :maxdepth: 1 + + appendices/2-1-migration-guide + appendices/new-features-in-cakephp-2-1 + +2.0 Migration Guide +=================== + +.. toctree:: + :maxdepth: 1 + + appendices/2-0-migration-guide + appendices/new-features-in-cakephp-2-0 + appendices/phpunit-migration-hints + +Migration from 1.2 to 1.3 +========================= + +.. toctree:: + :maxdepth: 1 + + appendices/migrating-from-cakephp-1-2-to-1-3 + appendices/new-features-in-cakephp-1-3 + +General Information +=================== + +.. toctree:: + :maxdepth: 1 + + appendices/cakephp-development-process + appendices/glossary + + +.. meta:: + :title lang=en: Appendices + :keywords lang=en: migration guide,migration path,new features,glossary diff --git a/sr/appendices/2-0-migration-guide.rst b/sr/appendices/2-0-migration-guide.rst new file mode 100644 index 0000000000..4e079c23f8 --- /dev/null +++ b/sr/appendices/2-0-migration-guide.rst @@ -0,0 +1,1292 @@ +2.0 Migration Guide +################### + +This page summarizes the changes from CakePHP 1.3 that will assist in a project +migration to 2.0, as well as for a developer reference to get up to date with +the changes made to the core since the CakePHP 1.3 branch. Be sure to read the +other pages in this guide for all the new features and API changes. + +.. tip:: + + Be sure to checkout the :ref:`upgrade-shell` included in the 2.0 core to help you + migrate your 1.3 code to 2.0. + +PHP Version Support +=================== + +CakePHP 2.x supports PHP Version 5.2.8 and above. PHP4 support has been dropped. +For developers that are still working with production PHP4 environments, the +CakePHP 1.x versions continue to support PHP4 for the lifetime of their +development and support lifetime. + +The move to PHP 5 means all methods and properties have been updated with +visibility keywords. If your code is attempting access to private or protected +methods from a public scope, you will encounter errors. + +While this does not really constitute a large framework change, it means that +access to tighter visibility methods and variables is now not possible. + +File and Folder naming +====================== + +In CakePHP 2.0 we rethought the way we are structuring our files and folders. +Given that PHP 5.3 is supporting namespaces we decided to prepare our code base +for adopting in a near future this PHP version, so we adopted the +https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md. At first +we glanced at the internal structure of CakePHP 1.3 and realized that after all +these years there was no clear organization in the files, nor did the directory +structure really hint where each file should be located. With this change we +would be allowed to experiment a little with (almost) automatic class loading +for increasing the overall framework performance. + +Biggest roadblock for achieving this was maintaining some sort of backwards +compatibility in the way the classes are loaded right now, and we definitely did +not want to become a framework of huge class prefixes, having class names like +``My_Huge_Class_Name_In_Package``. We decided adopting a strategy of keeping simple +class names while offering a very intuitive way of declaring class locations and +clear migration path for future PHP 5.3 version of CakePHP. First let's +highlight the main changes in file naming standard we adopted: + +File names +---------- + +All files containing classes should be named after the class it contains. No +file should contain more than one class. So, no more lowercasing and +underscoring your file names. Here are some examples: + +* ``my_things_controller.php`` becomes ``MyThingsController.php`` +* ``form.php`` (a Helper) becomes ``FormHelper.php`` +* ``session.php`` (a Component) becomes ``SessionComponent.php`` + +This makes file naming a lot more clear and consistent across applications, +and also avoids a few edge cases where the file loader would get confused in the +past and load files it should not. + +Folder Names +------------ + +Most folders should be also CamelCased, especially when containing classes. +Think of namespaces, each folder represents a level in the namespacing +hierarchy, folders that do not contain classes, or do not constitute a +namespace on themselves, should be lowercased. + +CamelCased Folders: + +* Config +* Console +* Controller +* Controller/Component +* Lib +* Locale +* Model +* Model/Behavior +* Plugin +* Test +* Vendor +* View +* View/Helper + +lowercased Folders: + +* tmp +* webroot + +htaccess (URL Rewriting) +=============================================== +In your ``app/webroot/.htaccess`` replace line ``RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]`` with ``RewriteRule ^(.*)$ index.php [QSA,L]`` + +AppController / AppModel / AppHelper / AppShell +=============================================== + +The ``app/app_controller.php``, ``app/app_model.php``, ``app/app_helper.php`` are now located and +named as ``app/Controller/AppController.php``, ``app/Model/AppModel.php`` and ``app/View/Helper/AppHelper.php`` respectively. + +Also all shell/task now extend AppShell. You can have your custom AppShell.php at ``app/Console/Command/AppShell.php`` + +Internationalization / Localization +=================================== + +:php:func:`__()` (Double underscore shortcut function) always returns the translation +(not echo anymore). + +If you want to echo the result of the translation, use:: + + echo __('My Message'); + +This change includes all shortcut translation methods:: + + __() + __n() + __d() + __dn() + __dc() + __dcn() + __c() + +Alongside this, if you pass additional parameters, the translation will call +`sprintf `_ with these +parameters before returning. For example:: + + // Will return something like "Called: MyClass:myMethod" + echo __('Called: %s:%s', $className, $methodName); + +It is valid for all shortcut translation methods. + +More information about the specifiers, you can see in +`sprintf `_ function. + + +Class location and constants changed +==================================== + +The constants ``APP`` and ``CORE_PATH`` +have consistent values between the web and console environments. In previous +versions of CakePHP these values changed depending on your environment. + +Basics.php +========== + +- ``getMicrotime()`` has been removed. Use the native ``microtime(true)`` + instead. +- ``e()`` was removed. Use ``echo``. +- ``r()`` was removed. Use ``str_replace``. +- ``a()`` was removed. ``Use array()`` +- ``aa()`` was removed. Use ``array()`` +- ``up()`` was removed. Use ``strtoupper()`` +- ``low()`` was removed. Use ``strtolower()`` +- ``params()`` was removed. It was not used anywhere in CakePHP. +- ``ife()`` was removed. Use a ternary operator. +- ``uses()`` was removed. Use ``App::import()`` instead. +- Compatibility functions for PHP4 have been removed. +- PHP5 constant has been removed. +- Global var called ``$TIME_START`` was removed use the constant + ``TIME_START`` or ``$_SERVER['REQUEST_TIME']`` instead. + +Removed Constants +----------------- + +A number of constants were removed, as they were no longer accurate, or +duplicated. + +* APP_PATH +* BEHAVIORS +* COMPONENTS +* CONFIGS +* CONSOLE_LIBS +* CONTROLLERS +* CONTROLLER_TESTS +* ELEMENTS +* HELPERS +* HELPER_TESTS +* LAYOUTS +* LIB_TESTS +* LIBS +* MODELS +* MODEL_TESTS +* SCRIPTS +* VIEWS + +CakeRequest +=========== + +This new class encapsulates the parameters and functions related to an incoming +request. It replaces many features inside ``Dispatcher``, +``RequestHandlerComponent`` and Controller. It also replaces +``$this->params`` array in all places. ``CakeRequest`` implements +``ArrayAccess`` so many interactions with the old params array do not need to +change. See the CakeRequest new features for more information. + +Request handling, $_GET['url'] and .htaccess files +================================================== + +CakePHP no longer uses ``$_GET['url']`` for handling application request paths. +Instead it uses ``$_SERVER['PATH_INFO']``. This provides a more uniform way of +handling requests between servers with URL rewriting and those without. Because +of these changes, you'll need to update your .htaccess files and +``app/webroot/index.php``, as these files were changed to accommodate the +changes. Additionally ``$this->params['url']['url']`` no longer exists. Instead +you should be using $this->request->url to access the same value. +This attribute now contains the url without the leading slash ``/`` prepended. + +Note: For the homepage itself (``http://domain/``) $this->request->url now returns +boolean ``false`` instead of ``/``. Make sure you check on that accordingly:: + + if (!$this->request->url) {} // instead of $this->request->url === '/' + +Components +========== + +Component is now the required base class for all components. You should update +your components and their constructors, as both have changed:: + + class PrgComponent extends Component { + public function __construct(ComponentCollection $collection, + $settings = array()) { + parent::__construct($collection, $settings); + } + } + +As with helpers it is important to call ``parent::__construct()`` in components with +overridden constructors. Settings for a component are also passed into the +constructor now, and not the ``initialize()`` callback. This makes getting well +constructed objects easier, and allows the base class to handle setting the +properties up. + +Since settings have been moved to the component constructor, the +``initialize()`` callback no longer receives ``$settings`` as its 2nd parameter. +You should update your components to use the following method signature:: + + public function initialize(Controller $controller) { } + +Additionally, the initialize() method is only called on components that are +enabled. This usually means components that are directly attached to the +controller object. + +Deprecated callbacks removed +---------------------------- + +All the deprecated callbacks in Component have not been transferred to +ComponentCollection. Instead you should use the `trigger()` method to interact +with callbacks. If you need to trigger a callback you could do so by calling:: + + $this->Components->trigger('someCallback', array(&$this)); + +Changes in disabling components +------------------------------- + +In the past you were able to disable components via `$this->Auth->enabled = +false;` for example. In CakePHP 2.0 you should use the ComponentCollection's +disable method, `$this->Components->disable('Auth');`. Using the enabled +property will not work. + +AclComponent +------------ + +- ``AclComponent`` implementations are now required to implement + ``AclInterface``. +- ``AclComponent::adapter()`` has been added to allow runtime modification of + the ``ACL`` implementation the component uses. +- ``AclComponent::grant()`` has been deprecated, it will be removed in a future + version. Use ``AclComponent::allow()`` instead. +- ``AclComponent::revoke()`` has been deprecated, it will be removed in a + future version. Use AclComponent::deny() instead. + +RequestHandlerComponent +----------------------- + +Many of RequestHandlerComponent's methods are just proxies for ``CakeRequest`` +methods. The following methods have been deprecated and will be removed in +future versions: + +- ``isSsl()`` +- ``isAjax()`` +- ``isPost()`` +- ``isPut()`` +- ``isFlash()`` +- ``isDelete()`` +- ``getReferer()`` +- ``getClientIp()`` +- ``accepts()``, ``prefers()``, ``requestedWith()`` All deal in mapped content + types now. They no longer work with mime-types. You can use + ``RequestHandler::setContent()`` to create new content types. +- ``RequestHandler::setContent()`` no longer accepts an array as a single + argument, you must supply both arguments. + +SecurityComponent +----------------- + +SecurityComponent no longer handles Basic and Digest Authentication. These are +both handled by the new AuthComponent. The following methods have been removed +from SecurityComponent: + +- requireLogin() +- generateDigestResponseHash() +- loginCredentials() +- loginRequest() +- parseDigestAuthData() + +In addition the following properties were removed: + +- $loginUsers +- $requireLogin + +Moving these features to AuthComponent was done to provide a single place for +all types of authentication and to streamline the roles of each component. + +AuthComponent +------------- + +The AuthComponent was entirely re-factored for 2.0, this was done to help reduce +developer confusion and frustration. In addition, AuthComponent was made more +flexible and extensible. You can find out more in +the :doc:`/core-libraries/components/authentication` guide. + +EmailComponent +-------------- + +The EmailComponent has been deprecated and has created a new library class to +send e-mails. See :doc:`/core-utility-libraries/email` Email changes for more details. + +SessionComponent +---------------- + +Session component has lost the following methods. + +* activate() +* active() +* __start() + +cakeError removed +================= + +The ``cakeError()`` method has been removed. It's recommended that you switch all +uses of ``cakeError`` to use exceptions. ``cakeError`` was removed because it +was simulating exceptions. Instead of simulation, real exceptions are used in +CakePHP 2.0. + +Error handling +============== + +The error handling implementation has dramatically changed in 2.0. Exceptions +have been introduced throughout the framework, and error handling has been +updated to offer more control and flexibility. You can read more in the +:doc:`/development/exceptions` and :doc:`/development/errors` section. + +Lib classes +=========== + +App +--- + +The API for ``App::build()`` has changed to ``App::build($paths, $mode).`` It +now allows you to either append, prepend or reset/replace existing paths. The +$mode param can take any of the following 3 values: App::APPEND, +App::PREPEND, ``App::RESET``. The default behavior of the function remains the +same (ie. Prepending new paths to existing list). + +App::path() +~~~~~~~~~~~ + +* Now supports plugins, App::path('Controller', 'Users') will return the folder + location of the controllers in the Users plugin. +* Won't merge core paths anymore, it will + only return paths defined in App::build() or default ones in app (or + corresponding plugin). + +App::build() +~~~~~~~~~~~~ + +* Will not merge app path with core paths anymore. + +App::objects() +~~~~~~~~~~~~~~ + +* Now supports plugins, App::objects('Users.Model') will return the models in + plugin Users. +* Returns array() instead of false for empty results or invalid types. +* Does not return core objects anymore, App::objects('core') will return array(). +* Returns the complete class name. + +App class lost the following properties, use method App::path() to access their value + +* App::$models +* App::$behaviors +* App::$controllers +* App::$components +* App::$datasources +* App::$libs +* App::$views +* App::$helpers +* App::$plugins +* App::$vendors +* App::$locales +* App::$shells + +App::import() +~~~~~~~~~~~~~ + +* No longer looks for classes recursively, it strictly uses the values for the + paths defined in App::build(). +* Will not be able to load App::import('Component', 'Component') use + App::uses('Component', 'Controller'); +* Using App::import('Lib', 'CoreClass') to load core classes is no longer + possible. +* Importing a non-existent file, supplying a wrong type or package name, or null + values for $name and $file parameters will result in a false return value. +* App::import('Core', 'CoreClass') is no longer supported, use App::uses() + instead and let the class autoloading do the rest. +* Loading Vendor files does not look recursively in the vendors folder, it will + also no longer convert the file to underscored as it did in the past. + +App::core() +~~~~~~~~~~~ + +* First parameter is no longer optional, it will always return one path +* It can't be used anymore to get the vendors paths +* It will only accept new style package names + +Class loading with App::uses() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Although there has been a huge refactoring in how the classes are loaded, in very +few occasions you will need to change your application code to respect the way you were +used to doing it. The biggest change is the introduction of a new method:: + + App::uses('AuthComponent', 'Controller/Component'); + +We decided the function name should emulate PHP 5.3's ``use`` keyword, just as a way +of declaring where a class name should be located. The first parameter of +:php:meth:`App::uses()` is the complete name of the class you intend to load, +and the second one, the package name (or namespace) where it belongs to. The +main difference with CakePHP 1.3's :php:meth:`App::import()` is that the former +won't actually import the class, it will just setup the system so when the class +is used for the first time it will be located. + +Some examples on using :php:meth:`App::uses()` when migrating from +:php:meth:`App::import()`:: + + App::import('Controller', 'Pages'); + // becomes + App::uses('PagesController', 'Controller'); + + App::import('Component', 'Auth'); + // becomes + App::uses('AuthComponent', 'Controller/Component'); + + App::import('View', 'Media'); + // becomes + App::uses('MediaView', 'View'); + + App::import('Core', 'Xml'); + // becomes + App::uses('Xml', 'Utility'); + + App::import('Datasource', 'MongoDb.MongoDbSource'); + // becomes + App::uses('MongoDbSource', 'MongoDb.Model/Datasource'); + +All classes that were loaded in the past using ``App::import('Core', $class);`` +will need to be loaded using ``App::uses()`` referring to the correct package. +See the API to locate the classes in their new folders. Some examples:: + + App::import('Core', 'CakeRoute'); + // becomes + App::uses('CakeRoute', 'Routing/Route'); + + App::import('Core', 'Sanitize'); + // becomes + App::uses('Sanitize', 'Utility'); + + App::import('Core', 'HttpSocket'); + // becomes + App::uses('HttpSocket', 'Network/Http'); + +In contrast to how :php:meth:`App::import()` worked in the past, the new class +loader will not locate classes recursively. This led to an impressive +performance gain even on develop mode, at the cost of some seldom used features +that always caused side effects. To be clear again, the class loader will only +fetch the class in the exact package in which you told it to find it. + +App::build() and core paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:php:meth:`App::build()` will not merge app paths with core paths anymore. + +Examples:: + + App::build(array('controllers' => array('/full/path/to/controllers'))); + //becomes + App::build(array('Controller' => array('/full/path/to/Controller'))); + + App::build(array('helpers' => array('/full/path/to/controllers'))); + //becomes + App::build(array('View/Helper' => array('/full/path/to/View/Helper'))); + +CakeLog +------- + +- Log streams now need to implement :php:class:`CakeLogInterface`. Exceptions will be raised + if a configured logger does not. + +Cache +----- + +- :php:class:`Cache` is now a static class, it no longer has a getInstance() method. +- CacheEngine is now an abstract class. You cannot directly create instances of + it anymore. +- CacheEngine implementations must extend CacheEngine, exceptions will be + raised if a configured class does not. +- FileCache now requires trailing slashes to be added to the path setting when + you are modifying a cache configuration. +- Cache no longer retains the name of the last configured cache engine. This + means that operations you want to occur on a specific engine need to have the + $config parameter equal to the config name you want the operation to occur + on. + +:: + + Cache::config('something'); + Cache::write('key', $value); + + // would become + Cache::write('key', $value, 'something'); + +Router +------ + +- You can no longer modify named parameter settings with + ``Router::setRequestInfo()``. You should use ``Router::connectNamed()`` to + configure how named parameters are handled. +- Router no longer has a ``getInstance()`` method. It is a static class, call + its methods and properties statically. +- ``Router::getNamedExpressions()`` is deprecated. Use the new router + constants. ``Router::ACTION``, ``Router::YEAR``, ``Router::MONTH``, + ``Router::DAY``, ``Router::ID``, and ``Router::UUID`` instead. +- ``Router::defaults()`` has been removed. Delete the core routes file + inclusion from your applications routes.php file to disable default routing. + Conversely if you want default routing, you will have to add an include to + ``Cake/Config/routes.php`` in your routes file. +- When using Router::parseExtensions() the extension parameter is no longer + under ``$this->params['url']['ext']``. Instead it is available at + ``$this->request->params['ext']``. +- Default plugin routes have changed. Plugin short routes are no longer built + in for any actions other than index. Previously ``/users`` and ``/users/add`` + would map to the UsersController in the Users plugin. In 2.0, only the + ``index`` action is given a short route. If you wish to continue using short + routes, you can add a route like:: + + Router::connect( + '/users/:action', + array('controller' => 'users', 'plugin' => 'users') + ); + + To your routes file for each plugin you need short routes on. + +Your app/Config/routes.php file needs to be updated adding this line at the bottom of the file:: + + require CAKE . 'Config' . DS . 'routes.php'; + +This is needed in order to generate the default routes for your application. If you do not wish to have such routes, +or want to implement your own standard you can include your own file with custom router rules. + +Dispatcher +---------- + +- Dispatcher has been moved inside of cake/libs, you will have to update your + ``app/webroot/index.php`` file. +- ``Dispatcher::dispatch()`` now takes two parameters. The request and + response objects. These should be instances of ``CakeRequest`` & + ``CakeResponse`` or a subclass thereof. +- ``Dispatcher::parseParams()`` now only accepts a ``CakeRequest`` object. +- ``Dispatcher::baseUrl()`` has been removed. +- ``Dispatcher::getUrl()`` has been removed. +- ``Dispatcher::uri()`` has been removed. +- ``Dispatcher::$here`` has been removed. + +Configure +--------- + +- ``Configure::read()`` with no parameter no longer returns the value of + 'debug' instead it returns all values in Configure. Use + ``Configure::read('debug');`` if you want the value of debug. +- ``Configure::load()`` now requires a ConfigReader to be setup. Read + :ref:`loading-configuration-files` for more information. +- ``Configure::store()`` now writes values to a given Cache configuration. Read + :ref:`loading-configuration-files` for more information. + +Scaffold +-------- + +- Scaffold 'edit' views should be renamed to 'form'. This was done to make + scaffold and bake templates consistent. + + - ``views/scaffolds/edit.ctp`` -> ``View/Scaffolds/form.ctp`` + - ``views/posts/scaffold.edit.ctp`` -> ``View/Posts/scaffold.form.ctp`` + +Xml +--- + +- The class Xml was completely re-factored. Now this class does not manipulate + data anymore, and it is a wrapper to SimpleXMLElement. You can use the following + methods: + + - ``Xml::build()``: static method that you can pass an xml string, array, path + to file or url. The result will be a SimpleXMLElement instance or an + exception will be thrown in case of error. + - ``Xml::fromArray():`` static method that returns a SimpleXMLElement from an + array. + - ``Xml::toArray()``: static method that returns an array from + SimpleXMLElement. + +You should see the :php:class:`Xml` documentation for more information on the changes made to +the Xml class. + +Inflector +--------- + +- Inflector no longer has a ``getInstance()`` method. +- ``Inflector::slug()`` no longer supports the $map argument. Use + ``Inflector::rules()`` to define transliteration rules. + +CakeSession +----------- + +CakeSession is now a fully static class, both ``SessionHelper`` and +``SessionComponent`` are wrappers and sugar for it. It can now easily be used +in models or other contexts. All of its methods are called statically. + +Session configuration has also changed :doc:`see the session section for more +information ` + +HttpSocket +---------- + +- HttpSocket doesn't change the header keys. Following other places in core, + the HttpSocket does not change the headers. :rfc:`2616` says that headers are case + insensitive, and HttpSocket preserves the values the remote host sends. +- HttpSocket returns responses as objects now. Instead of arrays, HttpSocket + returns instances of HttpResponse. See the :php:class:`HttpSocket` + documentation for more information. +- Cookies are stored internally by host, not per instance. This means that, if + you make two requests to different servers, cookies from domain1 won't be sent + to domain2. This was done to avoid possible security problems. + + +Helpers +======= + +Constructor changed +------------------- + +In order to accommodate View being removed from the ClassRegistry, the signature +of Helper::__construct() was changed. You should update any subclasses to use +the following:: + + public function __construct(View $View, $settings = array()) + +When overriding the constructor you should always call `parent::__construct` as +well. `Helper::__construct` stores the view instance at `$this->_View` for +later reference. The settings are not handled by the parent constructor. + +HelperCollection added +---------------------- + +After examining the responsibilities of each class involved in the View layer, +it became clear that View was handling much more than a single task. The +responsibility of creating helpers is not central to what View does, and was +moved into HelperCollection. HelperCollection is responsible for loading and +constructing helpers, as well as triggering callbacks on helpers. By default, +View creates a HelperCollection in its constructor, and uses it for subsequent +operations. The HelperCollection for a view can be found at `$this->Helpers` + +The motivations for refactoring this functionality came from a few issues. + +* View being registered in ClassRegistry could cause registry poisoning issues + when requestAction or the EmailComponent were used. +* View being accessible as a global symbol invited abuse. +* Helpers were not self contained. After constructing a helper, you had to + manually construct several other objects in order to get a functioning object. + +You can read more about HelperCollection in the +:doc:`/core-libraries/collections` documentation. + +Deprecated properties +--------------------- + +The following properties on helpers are deprecated, you should use the request +object properties or Helper methods instead of directly accessing these +properties as they will be removed in a future release. + +- ``Helper::$webroot`` is deprecated, use the request object's webroot + property. +- ``Helper::$base`` is deprecated, use the request object's base property. +- ``Helper::$here`` is deprecated, use the request object's here property. +- ``Helper::$data`` is deprecated, use the request object's data property. +- ``Helper::$params`` is deprecated, use the ``$this->request`` instead. + +XmlHelper, AjaxHelper and JavascriptHelper removed +-------------------------------------------------- + +The AjaxHelper and JavascriptHelper have been removed as they were deprecated in +version 1.3. The XmlHelper was removed, as it was made obsolete and redundant +with the improvements to :php:class:`Xml`. The ``Xml`` class should be used to +replace previous usage of XmlHelper. + +The AjaxHelper, and JavascriptHelper are replaced with the JsHelper and HtmlHelper. + +JsHelper +-------- + +- ``JsBaseEngineHelper`` is now abstract, you will need to implement all the + methods that previously generated errors. + +PaginatorHelper +--------------- + +- ``PaginatorHelper::sort()`` now takes the title and key arguments in the + reverse order. $key will always be first now. This was done to prevent + needing to swap arguments when adding a second one. +- PaginatorHelper had a number of changes to the paging params used internally. + The default key has been removed. +- PaginatorHelper now supports generating links with paging parameters in the + querystring. + +There have been a few improvements to pagination in general. For more +information on that you should read the new pagination features page. + +FormHelper +---------- + +$selected parameter removed +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``$selected`` parameter was removed from several methods in ``FormHelper``. +All methods now support a ``$attributes['value']`` key now which should be used +in place of ``$selected``. This change simplifies the ``FormHelper`` methods, +reducing the number of arguments, and reduces the duplication that ``$selected`` +created. The effected methods are: + +- FormHelper::select() +- FormHelper::dateTime() +- FormHelper::year() +- FormHelper::month() +- FormHelper::day() +- FormHelper::hour() +- FormHelper::minute() +- FormHelper::meridian() + +Default URLs on forms is the current action +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The default url for all forms, is now the current url including passed, named, +and querystring parameters. You can override this default by supplying +``$options['url']`` in the second parameter of ``$this->Form->create()``. + +FormHelper::hidden() +~~~~~~~~~~~~~~~~~~~~ + +Hidden fields no longer remove the class attribute. This means that if there are +validation errors on hidden fields, the ``error-field`` class name will be +applied. + +CacheHelper +----------- + +CacheHelper has been fully decoupled from View, and uses helper callbacks to +generate caches. You should remember to place CacheHelper after other helpers +that modify content in their ``afterRender`` and ``afterLayout`` callbacks. If +you don't some changes will not be part of the cached content. + +CacheHelper also no longer uses ```` to indicate un-cached +regions. Instead it uses special HTML/XML comments. ```` and +````. This helps CacheHelper generate valid markup and still +perform the same functions as before. You can read more CacheHelper and View +changes. + +Helper Attribute format more flexible +------------------------------------- + +The Helper class has more 3 protected attributes: + +* ``Helper::_minimizedAttributes``: array with minimized attributes (ie: + ``array('checked', 'selected', ...)``); +* ``Helper::_attributeFormat``: how attributes will be generated (ie: + ``%s="%s"``); +* ``Helper::_minimizedAttributeFormat``: how minimized attributes will be + generated: (ie ``%s="%s"``) + +By default the values used in CakePHP 1.3 were not changed. But now you can +use boolean attributes from HTML, like ````. To +this, just change ``$_minimizedAttributeFormat`` in your AppHelper to ``%s``. + +To use with Html/Form helpers and others, you can write:: + + $this->Form->checkbox('field', array('checked' => true, 'value' => 'some_value')); + +Other facility is that minimized attributes can be passed as item and not as +key. For example:: + + $this->Form->checkbox('field', array('checked', 'value' => 'some_value')); + +Note that ``checked`` have a numeric key. + +Controller +========== + +- Controller's constructor now takes two parameters. A CakeRequest, and + CakeResponse objects. These objects are used to populate several deprecated + properties and will be set to $request and $response inside the controller. +- ``Controller::$webroot`` is deprecated, use the request object's webroot + property. +- ``Controller::$base`` is deprecated, use the request object's base property. +- ``Controller::$here`` is deprecated, use the request object's here property. +- ``Controller::$data`` is deprecated, use the request object's data property. +- ``Controller::$params`` is deprecated, use the ``$this->request`` instead. +- ``Controller::$Component`` has been moved to ``Controller::$Components``. See + the :doc:`/core-libraries/collections` documentation for more information. +- ``Controller::$view`` has been renamed to ``Controller::$viewClass``. + ``Controller::$view`` is now used to change which view file is rendered. +- ``Controller::render()`` now returns a CakeResponse object. + +The deprecated properties on Controller will be accessible through a ``__get()`` +method. This method will be removed in future versions, so it's recommended that +you update your application. + +Controller now defines a maxLimit for pagination. This maximum limit is set to +100, but can be overridden in the $paginate options. + + +Pagination +---------- + +Pagination has traditionally been a single method in Controller, this created a +number of problems though. Pagination was hard to extend, replace, or modify. For +2.0 pagination has been extracted into a component. :php:meth:`Controller::paginate()` still +exists, and serves as a convenience method for loading and using the +:php:class:`PaginatorComponent`. + +For more information on the new features offered by pagination in 2.0, see the +:doc:`/core-libraries/components/pagination` documentation. + +View +==== + +View no longer registered in ClassRegistry +------------------------------------------ + +The view being registered ClassRegistry invited abuse and affectively created a +global symbol. In 2.0 each Helper receives the current `View` instance in its +constructor. This allows helpers access to the view in a similar fashion as in +the past, without creating global symbols. You can access the view instance at +`$this->_View` in any helper. + +Deprecated properties +--------------------- + +- ``View::$webroot`` is deprecated, use the request object's webroot property. +- ``View::$base`` is deprecated, use the request object's base property. +- ``View::$here`` is deprecated, use the request object's here property. +- ``View::$data`` is deprecated, use the request object's data property. +- ``View::$params`` is deprecated, use the ``$this->request`` instead. +- ``View::$loaded`` has been removed. Use the ``HelperCollection`` to access + loaded helpers. +- ``View::$model`` has been removed. This behavior is now on :php:class:`Helper` +- ``View::$modelId`` has been removed. This behavior is now on + :php:class:`Helper` +- ``View::$association`` has been removed. This behavior is now on + :php:class:`Helper` +- ``View::$fieldSuffix`` has been removed. This behavior is now on + :php:class:`Helper` +- ``View::entity()`` has been removed. This behavior is now on + :php:class:`Helper` +- ``View::_loadHelpers()`` has been removed, used ``View::loadHelpers()`` + instead. +- How ``View::element()`` uses caching has changed, see below for more + information. +- View callbacks have been shifted around, see below for more information +- API for ``View::element()`` has changed. Read here for more info. + +The deprecated properties on View will be accessible through a ``__get()`` +method. This method will be removed in future versions, so it's recommended that +you update your application. + +Removed methods +--------------- + +* ``View::_triggerHelpers()`` Use ``$this->Helpers->trigger()`` instead. +* ``View::_loadHelpers()`` Use ``$this->loadHelpers()`` instead. Helpers now lazy + load their own helpers. + +Added methods +------------- + +* ``View::loadHelper($name, $settings = array());`` Load a single helper. +* ``View::loadHelpers()`` Loads all the helpers indicated in ``View::$helpers``. + +View->Helpers +------------- + +By default View objects contain a :php:class:`HelperCollection` at ``$this->Helpers``. + +Themes +------ + +To use themes in your Controller you no longer set ``public $view = 'Theme';``. +Use ``public $viewClass = 'Theme';`` instead. + +Callback positioning changes +---------------------------- + +beforeLayout used to fire after scripts_for_layout and content_for_layout were +prepared. In 2.0, beforeLayout is fired before any of the special variables are +prepared, allowing you to manipulate them before they are passed to the layout. +The same was done for beforeRender. It is now fired well before any view +variables are manipulated. In addition to these changes, helper callbacks always +receive the name of the file about to be rendered. This combined with helpers +being able to access the view through ``$this->_View`` and the current view +content through ``$this->_View->output`` gives you more power than ever before. + +Helper callback signature changes +--------------------------------- + +Helper callbacks now always get one argument passed in. For beforeRender and +afterRender it is the view file being rendered. For beforeLayout and afterLayout +it is the layout file being rendered. Your helpers function signatures should +look like:: + + public function beforeRender($viewFile) { + + } + + public function afterRender($viewFile) { + + } + + public function beforeLayout($layoutFile) { + + } + + public function afterLayout($layoutFile) { + + } + + +Element caching, and view callbacks have been changed in 2.0 to help provide you +with more flexibility and consistency. :doc:`Read more about those +changes `. + +CacheHelper decoupled +--------------------- + +In previous versions there was a tight coupling between :php:class:`CacheHelper` +and :php:class:`View`. For 2.0 this coupling has been removed and CacheHelper +just uses callbacks like other helpers to generate full page caches. + + +CacheHelper ```` tags changed +------------------------------------------- + +In previous versions, CacheHelper used a special ```` tag as +markers for output that should not be part of the full page cache. These tags +were not part of any XML schema, and were not possible to validate in HTML or +XML documents. For 2.0, these tags have been replaced with HTML/XML comments:: + + becomes + becomes + +The internal code for full page view caches has also changed, so be sure to +clear out view cache files when updating. + +MediaView changes +----------------- + +:php:func:`MediaView::render()` now forces download of unknown file types +instead of just returning false. If you want you provide an alternate download +filename you now specify the full name including extension using key 'name' in +the array parameter passed to the function. + + +PHPUnit instead of SimpleTest +============================= + +All of the core test cases and supporting infrastructure have been ported to use +PHPUnit 3.5. Of course you can continue to use SimpleTest in your application by +replacing the related files. No further support will be given for SimpleTest and +it is recommended that you migrate to PHPUnit as well. For some additional +information on how to migrate your tests see PHPUnit migration hints. + +No more group tests +------------------- + +PHPUnit does not differentiate between group tests and single test cases in the +runner. Because of this, the group test options, and support for old style group +tests has been removed. It is recommended that GroupTests be ported to +``PHPUnit_Framework_Testsuite`` subclasses. You can find several examples of this +in CakePHP's test suite. Group test related methods on ``TestManager`` have also +been removed. + +Testsuite shell +--------------- + +The testsuite shell has had its invocation simplified and expanded. You no +longer need to differentiate between ``case`` and ``group``. It is assumed that +all tests are cases. In the past you would have done +``cake testsuite app case models/post`` you can now do ``cake testsuite app +Model/Post``. + + +The testsuite shell has been refactored to use the PHPUnit cli tool. It now +supports all the command line options supported by PHPUnit. +``cake testsuite help`` will show you a list of all possible modifiers. + +Models +====== + +Model relationships are now lazy loaded. You can run into a situation where +assigning a value to a nonexistent model property will throw errors:: + + $Post->inexistentProperty[] = 'value'; + +will throw the error "Notice: Indirect modification of overloaded property +$inexistentProperty has no effect". Assigning an initial value to the property +solves the issue:: + + $Post->nonexistentProperty = array(); + $Post->nonexistentProperty[] = 'value'; + +Or just declare the property in the model class:: + + class Post { + public $nonexistentProperty = array(); + } + +Either of these approaches will solve the notice errors. + +The notation of ``find()`` in CakePHP 1.2 is no longer supported. Finds should use +notation ``$model->find('type', array(PARAMS))`` in CakePHP 1.3. + +- ``Model::$_findMethods`` is now ``Model::$findMethods``. This property is now + public and can be modified by behaviors. + + + +Database objects +---------------- + +CakePHP 2.0 introduces some changes to Database objects that should not greatly +affect backwards compatibility. The biggest one is the adoption of PDO for +handling database connections. If you are using a vanilla installation of PHP 5 +you will already have installed the needed extensions, but you may need to +activate individual extensions for each driver you wish to use. + +Using PDO across all DBOs let us homogenize the code for each one and provide +more reliable and predictable behavior for all drivers. It also allowed us to +write more portable and accurate tests for database related code. + +The first thing users will probably miss is the "affected rows" and "total rows" +statistics, as they are not reported due to the more performant and lazy design +of PDO, there are ways to overcome this issue but very specific to each +database. Those statistics are not gone, though, but could be missing or even +inaccurate for some drivers. + +A nice feature added after the PDO adoption is the ability to use prepared +statements with query placeholders using the native driver if available. + +List of Changes +~~~~~~~~~~~~~~~ + +* DboMysqli was removed, we will support DboMysql only. +* API for DboSource::execute has changed, it will now take an array of query + values as second parameter:: + + public function execute($sql, $params = array(), $options = array()) + + became:: + + public function execute($sql, $options = array(), $params = array()) + + third parameter is meant to receive options for logging, currently it only + understands the "log" option. + +* DboSource::value() looses its third parameter, it was not used anyways +* DboSource::fetchAll() now accepts an array as second parameter, to pass values + to be bound to the query, third parameter was dropped. Example:: + + $db->fetchAll( + 'SELECT + * from users + WHERE + username = ? + AND + password = ?', + array('jhon', '12345') + ); + $db->fetchAll( + 'SELECT + * from users + WHERE + username = :username + AND + password = :password', + array('username' => 'jhon', 'password' => '12345') + ); + +The PDO driver will automatically escape those values for you. + +* Database statistics are collected only if the "fullDebug" property of the + corresponding DBO is set to true. +* New method DboSource::getConnection() will return the PDO object in case you + need to talk to the driver directly. +* Treatment of boolean values changed a bit to make it more cross-database + friendly, you may need to change your test cases. +* Postgresql support was immensely improved, it now correctly creates schemas, + truncate tables, and is easier to write tests using it. +* DboSource::insertMulti() will no longer accept sql string, just pass an array + of fields and a nested array of values to insert them all at once +* TranslateBehavior was refactored to use model virtualFields, this makes the + implementation more portable. +* All tests cases with Mysql related stuff were moved to the corresponding + driver test case. This left the DboSourceTest file a bit skinny. +* Transaction nesting support. Now it is possible to start a transaction several + times. It will only be committed if the commit method is called the same + amount of times. +* Sqlite support was greatly improved. The major difference with cake 1.3 is + that it will only support Sqlite 3.x . It is a great alternative for + development apps, and quick at running test cases. +* Boolean column values will be casted to php native boolean type automatically, + so make sure you update your test cases and code if you were expecting the + returned value to be a string or an integer: If you had a "published" column in + the past using mysql all values returned from a find would be numeric in the + past, now they are strict boolean values. + +Behaviors +========= + +BehaviorCollection +------------------ + +- ``BehaviorCollection`` no longer ``strtolower()'s`` mappedMethods. Behavior + mappedMethods are now case sensitive. + +AclBehavior and TreeBehavior +---------------------------- + +- No longer supports strings as configuration. Example:: + + public $actsAs = array( + 'Acl' => 'Controlled', + 'Tree' => 'nested' + ); + + became:: + + public $actsAs = array( + 'Acl' => array('type' => 'Controlled'), + 'Tree' => array('type' => 'nested') + ); + + +Plugins +======= + +Plugins no longer magically append their plugin prefix to components, helpers +and models used within them. You must be explicit with the components, models, +and helpers you wish to use. In the past:: + + public $components = array('Session', 'Comments'); + +Would look in the controller's plugin before checking app/core components. It +will now only look in the app/core components. If you wish to use objects from a +plugin you must put the plugin name:: + + public $components = array('Session', 'Comment.Comments'); + +This was done to reduce hard to debug issues caused by magic misfiring. It also +improves consistency in an application, as objects have one authoritative way to +reference them. + +Plugin App Controller and Plugin App Model +------------------------------------------ + +The plugin AppController and AppModel are no longer located directly in the +plugin folder. They are now placed into the plugin's Controller and Model +folders as such:: + + /app + /Plugin + /Comment + /Controller + CommentAppController.php + /Model + CommentAppModel.php + +Console +======= + +Much of the console framework was rebuilt for 2.0 to address many of the +following issues: + +- Tightly coupled. +- It was difficult to make help text for shells. +- Parameters for shells were tedious to validate. +- Plugin tasks were not reachable. +- Objects with too many responsibilities. + +Backwards incompatible Shell API changes +---------------------------------------- + +- ``Shell`` no longer has an ``AppModel`` instance. This ``AppModel`` instance + was not correctly built and was problematic. +- ``Shell::_loadDbConfig()`` has been removed. It was not generic enough to + stay in Shell. You can use the ``DbConfigTask`` if you need to ask the user + to create a db config. +- Shells no longer use ``$this->Dispatcher`` to access stdin, stdout, and + stderr. They have ``ConsoleOutput`` and ``ConsoleInput`` objects to handle + that now. +- Shells lazy load tasks, and use ``TaskCollection`` to provide an interface + similar to that used for Helpers, Components, and Behaviors for on the fly + loading of tasks. +- ``Shell::$shell`` has been removed. +- ``Shell::_checkArgs()`` has been removed. Configure a ``ConsoleOptionParser`` +- Shells no longer have direct access to ``ShellDispatcher``. You should use + the ``ConsoleInput``, and ``ConsoleOutput`` objects instead. If you need to + dispatch other shells, see the section on 'Invoking other shells from your + shell'. + +Backwards incompatible ShellDispatcher API changes +-------------------------------------------------- + +- ``ShellDispatcher`` no longer has stdout, stdin, stderr file handles. +- ``ShellDispatcher::$shell`` has been removed. +- ``ShellDispatcher::$shellClass`` has been removed. +- ``ShellDispatcher::$shellName`` has been removed. +- ``ShellDispatcher::$shellCommand`` has been removed. +- ``ShellDispatcher::$shellPaths`` has been removed, use + ``App::path('shells');`` instead. +- ``ShellDispatcher`` no longer uses 'help' as a magic method that has special + status. Instead use the ``--help/-h`` options, and an option parser. + +Backwards incompatible Shell Changes +------------------------------------ + +- Bake's ControllerTask no longer takes ``public`` and ``admin`` as passed + arguments. They are now options, indicated like ``--admin`` and ``--public``. + +It's recommended that you use the help on shells you use to see what if any +parameters have changed. It's also recommended that you read the console new +features for more information on new APIs that are available. + +Debugging +========= + +The ``debug()`` function now defaults to outputting HTML safe strings. This is +disabled if being used in the console. The ``$showHtml`` option for ``debug()`` +can be set to false to disable HTML-safe output from debug. + +ConnectionManager +================= + +``ConnectionManager::enumConnectionObjects()`` will now return the current +configuration for each connection created, instead of an array with filename, +class name and plugin, which wasn't really useful. + +When defining database connections you will need to make some changes to the way +configs were defined in the past. Basically in the database configuration class, +the key "driver" is not accepted anymore, only "datasource", in order to make it +more consistent. Also, as the datasources have been moved to packages you will +need to pass the package they are located in. Example:: + + public $default = array( + 'datasource' => 'Database/Mysql', + 'persistent' => false, + 'host' => 'localhost', + 'login' => 'root', + 'password' => 'root', + 'database' => 'cake', + ); + + +.. meta:: + :title lang=en: 2.0 Migration Guide + :description lang=en: This page summarizes the changes from CakePHP 1.3 that will assist in a project migration to 2.0, as well as for a developer reference to get up to date with the changes made to the core since the CakePHP 1.3 branch. + :keywords lang=en: cakephp upgrade,cakephp migration,migration guide,1.3 to 2.0,update cakephp,backwards compatibility,api changes,x versions,directory structure,new features diff --git a/sr/appendices/2-1-migration-guide.rst b/sr/appendices/2-1-migration-guide.rst new file mode 100644 index 0000000000..759be4a36c --- /dev/null +++ b/sr/appendices/2-1-migration-guide.rst @@ -0,0 +1,363 @@ +2.1 Migration Guide +################### + +CakePHP 2.1 is a fully API compatible upgrade from 2.0. This page outlines the +changes and improvements made for 2.1. + +AppController, AppHelper, AppModel and AppShell +=============================================== + +These classes are now required to be part of the app directory, as they were +removed from the CakePHP core. If you do not already have these classes, you +can use the following while upgrading:: + + // app/View/Helper/AppHelper.php + App::uses('Helper', 'View'); + class AppHelper extends Helper { + } + + // app/Model/AppModel.php + App::uses('Model', 'Model'); + class AppModel extends Model { + } + + // app/Controller/AppController.php + App::uses('Controller', 'Controller'); + class AppController extends Controller { + } + + // app/Console/Command/AppShell.php + App::uses('Shell', 'Console'); + class AppShell extends Shell { + } + +If your application already has these files/classes you don't need to do +anything. +Additionally if you were using the core PagesController, you would need to copy +this to your app/Controller directory as well. + +.htaccess files +=============== + +The default ``.htaccess`` files have changed, you should remember to update them +or update your webservers URL re-writing scheme to match the changes done in +``.htaccess`` + + +Models +====== + +- The ``beforeDelete`` callback will be fired before behaviors beforeDelete callbacks. + This makes it consistent with the rest of the events triggered in the model layer. +- ``Model::find('threaded')`` now accepts ``$options['parent']`` if using other field + then ``parent_id``. Also if the model has TreeBehavior attached and set up with other + parent field, the threaded find will by default use that. +- Parameters for queries using prepared statements will now be part of the SQL + dump. +- Validation arrays can now be more specific with when a field is required. + The ``required`` key now accepts ``create`` and ``update``. These values will + make a field required when creating or updating. +- Model now has a ``schemaName`` property. If your application switches + datasources by modifying :php:attr:`Model::$useDbConfig` you should also + modify ``schemaName`` or use :php:meth:`Model::setDataSource()` method which + handles this for you. + +CakeSession +----------- + +.. versionchanged:: 2.1.1 + CakeSession no longer sets the P3P header, as this is the responsibility of your application. + More info see ticket `#2515 `_ in lighthouse + +Behaviors +========= + +TranslateBehavior +----------------- + +- :php:class:`I18nModel` has been moved into a separate file. + +Exceptions +========== + +The default exception rendering now includes more detailed stack traces +including file excerpts and argument dumps for all functions in the stack. + + +Utility +======= + +Debugger +-------- + +- :php:func:`Debugger::getType()` has been added. It can be used to get the type of + variables. +- :php:func:`Debugger::exportVar()` has been modified to create more readable + and useful output. + +debug() +------- + +`debug()` now uses :php:class:`Debugger` internally. This makes it consistent +with Debugger, and takes advantage of improvements made there. + +Set +--- + +- :php:func:`Set::nest()` has been added. It takes in a flat array and returns a nested array + +File +---- + +- :php:meth:`File::info()` includes filesize & mimetype information. +- :php:meth:`File::mime()` was added. + +Cache +----- + +- :php:class:`CacheEngine` has been moved into a separate file. + +Configure +--------- + +- :php:class:`ConfigReaderInterface` has been moved into a separate file. + +App +--- + +- :php:meth:`App::build()` now has the ability to register new packages using + ``App::REGISTER``. See :ref:`app-build-register` for more information. +- Classes that could not be found on configured paths will be searched inside + ``APP`` as a fallback path. This makes autoloading nested directories in + ``app/Vendor`` easier. + +Console +======= + +Test Shell +---------- + +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 + ./Console/cake test app Controller/PostsController + ./Console/cake test Plugin View/Helper/MyHelper + +The old testsuite shell and its syntax are still available. + +General +------- + +- Generated files no longer contain timestamps with the generation datetime. + +Routing +======= + +Router +------ + +- Routes can now use a special ``/**`` syntax to include all trailing arguments + as a single passed argument. See the section on :ref:`connecting-routes` for + more information. +- :php:meth:`Router::resourceMap()` was added. +- :php:meth:`Router::defaultRouteClass()` was added. This method allows you to + set the default route class used for all future routes that are connected. + +Network +======= + +CakeRequest +----------- + +- Added ``is('requested')`` and ``isRequested()`` for detecting requestAction. + +CakeResponse +------------ + +- Added :php:meth:`CakeResponse::cookie()` for setting cookies. +- Added a number of methods for :ref:`cake-response-caching` + +Controller +========== + +Controller +---------- + +- :php:attr:`Controller::$uses` was modified the default value is now ``true`` + instead of false. Additionally different values are handled slightly + differently, but will behave the same in most cases. + + - ``true`` Will load the default model and merge with AppController. + - An array will load those models and merge with AppController. + - An empty array will not load any models other than those declared in the + base class. + - ``false`` will not load any models, and will not merge with the base class + either. + + +Components +========== + +AuthComponent +------------- + +- :php:meth:`AuthComponent::allow()` no longer accepts ``allow('*')`` as a wildcard + for all actions. Just use ``allow()``. This unifies the API between allow() + and deny(). +- ``recursive`` option was added to all authentication adapters. Allows you to + more easily control the associations stored in the session. + + +AclComponent +------------ + +- :php:class:`AclComponent` no longer lowercases and inflects the class name used for + ``Acl.classname``. Instead it uses the provided value as is. +- Acl backend implementations should now be put in ``Controller/Component/Acl``. +- Acl implementations should be moved into the Component/Acl directory from + Component. For example if your Acl class was called ``CustomAclComponent``, + and was in ``Controller/Component/CustomAclComponent.php``. + It should be moved into ``Controller/Component/Acl/CustomAcl.php``, and be + named ``CustomAcl``. +- :php:class:`DbAcl` has been moved into a separate file. +- :php:class:`IniAcl` has been moved into a separate file. +- :php:class:`AclInterface` has been moved into a separate file. + +Helpers +======= + +TextHelper +---------- + +- :php:meth:`TextHelper::autoLink()`, :php:meth:`TextHelper::autoLinkUrls()`, + :php:meth:`TextHelper::autoLinkEmails()` now HTML escape their input by + default. You can control this with the ``escape`` option. + +HtmlHelper +---------- + +- :php:meth:`HtmlHelper::script()` had a ``block`` option added. +- :php:meth:`HtmlHelper::scriptBlock()` had a ``block`` option added. +- :php:meth:`HtmlHelper::css()` had a ``block`` option added. +- :php:meth:`HtmlHelper::meta()` had a ``block`` option added. +- The ``$startText`` parameter of :php:meth:`HtmlHelper::getCrumbs()` can now be + an array. This gives more control and flexibility over the first crumb link. +- :php:meth:`HtmlHelper::docType()` now defaults to HTML5. +- :php:meth:`HtmlHelper::image()` now has a ``fullBase`` option. +- :php:meth:`HtmlHelper::media()` has been added. You can use this method to + create HTML5 audio/video elements. +- :term:`plugin syntax` support has been added for + :php:meth:`HtmlHelper::script()`, :php:meth:`HtmlHelper::css()`, :php:meth:`HtmlHelper::image()`. + You can now easily link to plugin assets using ``Plugin.asset``. +- :php:meth:`HtmlHelper::getCrumbList()` had the ``$startText`` parameter added. + + +View +==== + +- :php:attr:`View::$output` is deprecated. +- ``$content_for_layout`` is deprecated. Use ``$this->fetch('content');`` + instead. +- ``$scripts_for_layout`` is deprecated. Use the following instead:: + + echo $this->fetch('meta'); + echo $this->fetch('css'); + echo $this->fetch('script'); + + ``$scripts_for_layout`` is still available, but the :ref:`view blocks ` API + gives a more extensible & flexible replacement. +- The ``Plugin.view`` syntax is now available everywhere. You can use this + syntax anywhere you reference the name of a view, layout or element. +- The ``$options['plugin']`` option for :php:meth:`~View::element()` is + deprecated. You should use ``Plugin.element_name`` instead. + +Content type views +------------------ + +Two new view classes have been added to CakePHP. A new :php:class:`JsonView` +and :php:class:`XmlView` allow you to easily generate XML and JSON views. You +can learn more about these classes in the section on +:doc:`/views/json-and-xml-views` + +Extending views +--------------- + +:php:class:`View` has a new method allowing you to wrap or 'extend' a +view/element/layout with another file. See the section on +:ref:`extending-views` for more information on this feature. + +Themes +------ + +The ``ThemeView`` class is deprecated in favor of the ``View`` class. Simply +setting ``$this->theme = 'MyTheme'`` will enable theme support, and all custom +View classes which extend from ``ThemeView`` should extend ``View``. + +View blocks +----------- + +View blocks are a flexible way to create slots or blocks in your views. Blocks +replace ``$scripts_for_layout`` with a more robust and flexible API. See the +section on :ref:`view-blocks` for more information. + + +Helpers +======= + +New callbacks +------------- + +Two new callbacks have been added to Helpers. +:php:meth:`Helper::beforeRenderFile()` and :php:meth:`Helper::afterRenderFile()` +these new callbacks are fired before/after every view fragment is rendered. +This includes elements, layouts and views. + +CacheHelper +----------- + +- ```` tags now work inside elements correctly. + +FormHelper +---------- + +- FormHelper now omits disabled fields from the secured fields hash. This makes + working with :php:class:`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. +- The ``type`` attribute for :php:meth:`FormHelper::button()` can be removed now. It still + defaults to 'submit'. +- :php:meth:`FormHelper::radio()` now allows you to disable all options. + You can do this by setting either ``'disabled' => true`` or ``'disabled' => 'disabled'`` + in the ``$attributes`` array. + +PaginatorHelper +--------------- + +- :php:meth:`PaginatorHelper::numbers()` now has a ``currentClass`` option. + + +Testing +======= + +- Web test runner now displays the PHPUnit version number. +- Web test runner now defaults to displaying app tests. +- Fixtures can be created in different 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) +- Test cases are generated with class specific setup methods. + +Events +====== + +- A new generic events system has been built and it replaced the way callbacks + were dispatched. This should not represent any change to your code. +- You can dispatch your own events and attach callbacks to them at will, useful + for inter-plugin communication and easier decoupling of your classes. diff --git a/sr/appendices/2-2-migration-guide.rst b/sr/appendices/2-2-migration-guide.rst new file mode 100644 index 0000000000..441eb6cfe9 --- /dev/null +++ b/sr/appendices/2-2-migration-guide.rst @@ -0,0 +1,327 @@ +2.2 Migration Guide +################### + +CakePHP 2.2 is a fully API compatible upgrade from 2.0/2.1. This page outlines the +changes and improvements made for 2.2. + +.. _required-steps-to-upgrade-2-2: + +Required steps to upgrade +========================= + +When upgrading to CakePHP 2.2 its important to add a few new configuration +values to ``app/Config/bootstrap.php``. Adding these will ensure consistent +behavior with 2.1.x:: + + // Enable the Dispatcher filters for plugin assets, and + // CacheHelper. + Configure::write('Dispatcher.filters', array( + 'AssetDispatcher', + 'CacheDispatcher' + )); + + // 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', + )); + +You will also need to modify ``app/Config/core.php``. Change the value of +:php:const:`LOG_ERROR` to :php:const:`LOG_ERR`:: + + define('LOG_ERROR', LOG_ERR); + +When using ``Model::validateAssociated()`` or ``Model::saveAssociated()`` and +primary model validation fails, the validation errors of associated models are no longer wiped out. +``Model::$validationErrors`` will now always show all the errors. +You might need to update your test cases to reflect this change. + +Console +======= + +I18N extract shell +------------------ + +- An option was added to overwrite existing POT files by default:: + + ./Console/cake i18n extract --overwrite + + +Models +====== + +- ``Model::find('count')`` will now call the custom find methods with + ``$state = 'before'`` and ``$queryData['operation'] = 'count'``. + 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. +- ``Model::find('first')`` will now return an empty array when no records are found. + +Datasources +=========== + +- Dbo datasources now supports real nested transactions. If you need to use this + feature in your application, enable it using + ``ConnectionManager::getDataSource('default')->useNestedTransactions = true;`` + +Testing +======= + +- The webrunner now includes links to re-run a test with debug output. +- Generated test cases for Controller now subclass + :php:class:`ControllerTestCase`. + + +Error Handling +============== + +- When repeat exceptions, or exception are raised when rendering error pages, + the new ``error`` layout will be used. It's recommended to not use additional + helpers in this layout as its intended for development level errors only. This + fixes issues with fatal errors in rendering error pages due to helper usage in + the ``default`` layout. +- It is important to copy the ``app/View/Layouts/error.ctp`` into your app + directory. Failing to do so will make error page rendering fail. +- You can now configure application specific console error handling. By setting + ``Error.consoleHandler``, and ``Exception.consoleHandler`` you can define the + callback that will handle errors/exceptions raised in console applications. +- The handler configured in ``Error.handler`` and ``Error.consoleHandler`` will + receive fatal error codes (ie. ``E_ERROR``, ``E_PARSE``, ``E_USER_ERROR``). + +Exceptions +---------- + +- The :php:class:`NotImplementedException` was added. + + +Core +==== + +Configure +--------- + +- :php:meth:`Configure::dump()` was added. It is used to persist configuration + data in durable storage like files. Both :php:class:`PhpReader` and + :php:class:`IniReader` work with it. +- A new config parameter 'Config.timezone' is available in which you can set + users' timezone string. eg. You can do ``Configure::write('Config.timezone', + 'Europe/Paris')``. If a method of ``CakeTime`` class is called with + ``$timezone`` parameter as null and 'Config.timezone' is set, then the value + of 'Config.timezone' will be used. This feature allows you to set users' + timezone just once instead of passing it each time in function calls. + + +Controller +========== + +AuthComponent +------------- + +- The options for adapters defined in :php:attr:`AuthComponent::$authenticate` + now accepts a ``contain`` option. This is used to set containable options for + when user records are loaded. + +CookieComponent +--------------- + +- You can now encrypt cookie values with the rijndael cipher. This requires + the `mcrypt `_ extension to be installed. Using + rijndael gives cookie values actual encryption, and is recommended in place of + the XOR cipher available in previous releases. The XOR cipher is still the + default cipher scheme to maintain compatibility with previous releases. You + can read more in the :php:meth:`Security::rijndael()` documentation. + +Pagination +========== + +- Paginating custom finders will now return correct counts, see Model changes + for more info. + + +Network +======= + +CakeEmail +--------- + +- :php:meth:`CakeEmail::charset()` and :php:meth:`CakeEmail::headerCharset()` + were added. +- Legacy Japanese encodings are now handled correctly. ``ISO-2202-JP`` is used + when the encoding is ``ISO-2202-JP-MS`` which works around a number of issues + in mail clients when dealing with the CP932 and Shift_JIS encodings. +- :php:meth:`CakeEmail::theme()` was added. +- :php:meth:`CakeEmail::domain()` was added. You can use this method to set the + domain name used when sending email from a CLI script or if you want to + control the hostname used to send email. +- You can now define ``theme`` and ``helpers`` in your EmailConfig class. + +CakeRequest +----------- + +- CakeRequest will now automatically decode + ``application/x-www-form-urlencoded`` request bodies on ``PUT`` and ``DELETE`` + requests. This data will be available as ``$this->data`` just like POST data + is. + +Utility +======= + +Set +--- + +- The :php:class:`Set` class is now deprecated, and replaced by the :php:class:`Hash` class. + Set will not be removed until 3.0. +- :php:meth:`Set::expand()` was added. + +Hash +---- + +The :php:class:`Hash` class was added in 2.2. It replaced Set providing a more +consistent, reliable and performant API to doing many of the same tasks Set +does. See the :doc:`/core-utility-libraries/hash` page for more detail. + +CakeTime +-------- + +- 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. +- :php:meth:`CakeTime::timeAgoInWords()` had the ``accuracy`` option added. + This option allows you to specify how accurate formatted times should be. + +- New methods added: + + * :php:meth:`CakeTime::toServer()` + * :php:meth:`CakeTime::timezone()` + * :php:meth:`CakeTime::listTimezones()` + +- The ``$dateString`` parameter in all methods now accepts a DateTime object. + + +Helpers +======= + +FormHelper +---------- + +- FormHelper now better handles adding required classes to inputs. It now + honors the ``on`` key. +- :php:meth:`FormHelper::radio()` now supports an ``empty`` which works similar + to the empty option on ``select()``. +- Added :php:meth:`FormHelper::inputDefaults()` to set common properties for + each of the inputs generated by the helper + +TimeHelper +---------- + +- Since 2.1, TimeHelper uses the CakeTime class for all its relevant methods. + The ``$userOffset`` parameter has been replaced with ``$timezone`` parameter. +- :php:meth:`TimeHelper::timeAgoInWords()` has the ``element`` option added. + This allows you to specify an HTML element to wrap the formatted time. + +HtmlHelper +---------- + +- :php:meth:`HtmlHelper::tableHeaders()` now supports setting attributes per + table cell. + + +Routing +======= + +Dispatcher +---------- + +- 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. Check the full documentation for this new features in + :doc:`/development/dispatch-filters` +- With the addition of :doc:`/development/dispatch-filters` you'll need to + update ``app/Config/bootstrap.php``. See + :ref:`required-steps-to-upgrade-2-2`. + +Router +------ + +- :php:meth:`Router::setExtensions()` has been added. With the new method you can + now add more extensions to be parsed, for example within a plugin routes file. + +Cache +===== + +Redis Engine +------------ + +A new caching engine was added using the `phpredis extension +`_ it is configured similarly to the +Memcache engine. + +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:: + + Cache::config(array( + 'engine' => 'Redis', + ... + 'groups' => array('post', 'comment', 'user') + )); + +You can have as many groups as you like, but keep in mind they cannot be +dynamically modified. + +The :php:meth:`Cache::clearGroup()` class method was added. It takes the group +name and deletes all entries labeled with the same string. + +Log +=== + +Changes in :php:class:`CakeLog` now require, some additional configuration in +your ``app/Config/bootstrap.php``. See :ref:`required-steps-to-upgrade-2-2`, +and :doc:`/core-libraries/logging`. + +- The :php:class:`CakeLog` class now accepts the same log levels as defined in + `RFC 5424 `_. Several convenience + methods have also been added: + + * :php:meth:`CakeLog::emergency($message, $scope = array())` + * :php:meth:`CakeLog::alert($message, $scope = array())` + * :php:meth:`CakeLog::critical($message, $scope = array())` + * :php:meth:`CakeLog::error($message, $scope = array())` + * :php:meth:`CakeLog::warning($message, $scope = array())` + * :php:meth:`CakeLog::notice($message, $scope = array())` + * :php:meth:`CakeLog::info($message, $scope = array())` + * :php:meth:`CakeLog::debug($message, $scope = array())` + +- A third argument ``$scope`` has been added to :php:meth:`CakeLog::write`. + See :ref:`logging-scopes`. +- A new log engine: :php:class:`ConsoleLog` has been added. + +Model Validation +================ + +- 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 :doc:`/models/data-validation`. + +- Custom validation functions in your models need to have "public" visibility + so that they are accessible by ``ModelValidator``. + +- New validation rules added: + + * :php:meth:`Validation::naturalNumber()` + * :php:meth:`Validation::mimeType()` + * :php:meth:`Validation::uploadError()` + diff --git a/sr/appendices/2-3-migration-guide.rst b/sr/appendices/2-3-migration-guide.rst new file mode 100644 index 0000000000..2c47db0d9c --- /dev/null +++ b/sr/appendices/2-3-migration-guide.rst @@ -0,0 +1,326 @@ +2.3 Migration Guide +################### + +CakePHP 2.3 is a fully API compatible upgrade from 2.2. This page outlines +the changes and improvements made in 2.3. + +Constants +========= + +An application can now easily define :php:const:`CACHE` and :php:const:`LOGS`, +as they are conditionally defined by CakePHP now. + +Caching +======= + +- FileEngine is always the default cache engine. In the past a number of people + had difficulty setting up and deploying APC correctly both in cli + web. + Using files should make setting up CakePHP simpler for new developers. + +- `Configure::write('Cache.viewPrefix', 'YOURPREFIX');` has been added to `core.php` + to allow multiple domains/languages per setup. + +Component +========= + +AuthComponent +------------- +- A new property ``AuthComponent::$unauthorizedRedirect`` has been added. + + - For default ``true`` value user is redirected to referrer URL upon authorization failure. + - If set to a string or array user is redirected to that URL. + - If set to false a ForbiddenException exception is thrown instead of redirecting. + +- 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. + +- :php:meth:`AuthComponent::redirect()` has been deprecated. + Use :php:meth:`AuthComponent::redirectUrl()` instead. + +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. + +- PaginatorComponent now throws a `NotFoundException` when trying to access a page + which is out of range (i.e. requested page is greater than total page count). + +SecurityComponent +----------------- + +- SecurityComponent now supports the ``unlockedActions`` option. This can be used to + disable all security checks for any actions listed in this option. + +RequestHandlerComponent +----------------------- + +- :php:meth:`RequestHandlerComponent::viewClassMap()` has been added, which is used to map a type + to view class name. You can add ``$settings['viewClassMap']`` for automatically setting + the correct viewClass based on extension/content type. + +CookieComponent +--------------- + +- :php:meth:`CookieComponent::check()` was added. This method works the same as + :php:meth:`CakeSession::check()` does. + +Console +======= + +- The ``server`` shell was added. You can use this to start the PHP5.4 + webserver for your CakePHP application. +- Baking a new project now sets the application's cache prefix to the name of + the application. + +I18n +==== + +L10n +---- + +- ``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. + +Core +==== + +CakePlugin +---------- + +- :php:meth:`CakePlugin::load()` can now take a new ``ignoreMissing`` option. Setting it to true will + prevent file include errors when you try to load routes or bootstrap but they don't exist for a plugin. + So essentially you can now use the following statement which will load all plugins and their routes and + bootstrap for whatever plugin it can find:: + ``CakePlugin::loadAll(array(array('routes' => true, 'bootstrap' => true, 'ignoreMissing' => true)))`` + + +Configure +--------- + +- :php:meth:`Configure::check()` was added. This method works the same as + :php:meth:`CakeSession::check()` does. + +- :php:meth:`ConfigReaderInterface::dump()` was added. Please ensure any custom readers you have now + implement a ``dump()`` method. + +- The ``$key`` parameter of :php:meth:`IniReader::dump()` now supports keys like `PluginName.keyname` + similar to ``PhpReader::dump()``. + +Error +===== + +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 Exceptions don't reuse any response instance. + +Model +===== + +- Support for the biginteger type was added to all core datasources, and + fixtures. +- Support for ``FULLTEXT`` indexes was added for the MySQL driver. + + +Models +------ + +- ``Model::find('list')`` now sets the ``recursive`` based on the max + containment depth or recursive value. When list is used with + ContainableBehavior. +- ``Model::find('first')`` will now return an empty array when no records are found. + +Validation +---------- + +- Missing validation methods will **always** trigger errors now instead of + only in development mode. + +Network +======= + +SmtpTransport +------------- + +- TLS/SSL support was added for SMTP connections. + +CakeRequest +----------- + +- :php:meth:`CakeRequest::onlyAllow()` was added. +- :php:meth:`CakeRequest::query()` was added. + +CakeResponse +------------ + +- :php:meth:`CakeResponse::file()` was added. +- The content types `application/javascript`, `application/xml`, + `application/rss+xml` now also send the application charset. + +CakeEmail +--------- + +- The ``contentDisposition`` option was added to + :php:meth:`CakeEmail::attachments()`. This allows you to disable the + Content-Disposition header added to attached files. + +HttpSocket +---------- + +- :php:class:`HttpSocket` now verifies SSL certificates by default. If you are + using self-signed certificates or connecting through proxies you may need to + use some of the new options to augment this behavior. See + :ref:`http-socket-ssl-options` for more information. +- ``HttpResponse`` was renamed to ``HttpSocketResponse``. This + avoids a common issue with the HTTP PECL extension. There is an + ``HttpResponse`` class provided as well for compatibility reasons. + +Routing +======= + +Router +------ + +- Support for ``tel:``, ``sms:`` were added to :php:meth:`Router::url()`. + +View +==== + +- MediaView is deprecated, and you can use new features in + :php:class:`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 view templates. +- :php:meth:`View::fetch()` now has a ``$default`` argument. This argument can + be used to provide a default value should a block be empty. +- :php:meth:`View::prepend()` has been added to allow prepending content to + existing block. +- :php:class:`XmlView` now uses the ``_rootNode`` view variable to customize the + top level XML node. +- :php:meth:`View::elementExists()` was added. You can use this method to check + if elements exist before using them. +- :php:meth:`View::element()` had the ``ignoreMissing`` option added. You can + use this to suppress the errors triggered by missing view elements. +- :php:meth:`View::startIfEmpty()` was added. + +Layout +------ + +- The doctype for layout files in the app folder and the bake templates in the + cake package has been changed from XHTML to HTML5. + +Helpers +======= + +- New property ``Helper::$settings`` has been added for your helper setting. The + ``$settings`` parameter of ``Helper::__construct()`` is merged with + ``Helper::$settings``. + +FormHelper +---------- + +- :php:meth:`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. +- :php:meth:`FormHelper::postLink()` now accepts a ``method`` key. This allows + you to create link forms using HTTP methods other than POST. +- When creating inputs with :php:meth:`FormHelper::input()` you can now set the + ``errorMessage`` option to false. This will disable the error message display, + but leave the error class names intact. +- The FormHelper now also adds the HTML5 ``required`` attribute to your input + elements based on validation rules for a field. If you have a "Cancel" button + in your form which submits the form then you should add ``'formnovalidate' => true`` + to your button options to prevent the triggering of validation in HTML. You + can also prevent the validation triggering for the whole form by adding + ``'novalidate' => true`` in your FormHelper::create() options. +- :php:meth:`FormHelper::input()` now generates input elements of type ``tel`` + and ``email`` based on field names if ``type`` option is not specified. + +HtmlHelper +---------- + +- :php:meth:`HtmlHelper::getCrumbList()` now has the ``separator``, + ``firstClass`` and ``lastClass`` options. These allow you to better control + the HTML this method generates. + +TextHelper +---------- + +- :php:meth:`TextHelper::tail()` was added to truncate text starting from the end. +- `ending` in :php:meth:`TextHelper::truncate()` is deprecated in favor of `ellipsis` + +PaginatorHelper +--------------- + +- :php:meth:`PaginatorHelper::numbers()` now has a new option ``currentTag`` to + allow specifying extra tag for wrapping current page number. +- For methods: :php:meth:`PaginatorHelper::prev()` and :php:meth:`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. + + +Testing +======= + +- A core fixture for the default ``cake_sessions`` table was added. You can use + it by adding ``core.cake_sessions`` to your fixture list. +- :php:meth:`CakeTestCase::getMockForModel()` was added. This simplifies getting + mock objects for models. + +Utility +======= + +CakeNumber +---------- + +- :php:meth:`CakeNumber::fromReadableSize()` was added. +- :php:meth:`CakeNumber::formatDelta()` was added. +- :php:meth:`CakeNumber::defaultCurrency()` was added. + +Folder +------ + +- :php:meth:`Folder::copy()` and :php:meth:`Folder::move()` now support the + ability to merge the target and source directories in addition to + skip/overwrite. + + +String +------ + +- :php:meth:`String::tail()` was added to truncate text starting from the end. +- `ending` in :php:meth:`String::truncate()` is deprecated in favor of `ellipsis` + +Debugger +-------- + +- :php:meth:`Debugger::exportVar()` now outputs private and protected properties + in PHP >= 5.3.0. + +Security +-------- + +- Support for `bcrypt `_ + was added. See the :php:class:`Security::hash()` documentation for more + information on how to use bcrypt. + +Validation +---------- + +- :php:meth:`Validation::fileSize()` was added. + +ObjectCollection +---------------- + +- :php:meth:`ObjectCollection::attached()` was deprecated in favor of the new + method :php:meth:`ObjectCollection::loaded()`. This unifies the access to the + ObjectCollection as load()/unload() already replaced attach()/detach(). diff --git a/sr/appendices/2-4-migration-guide.rst b/sr/appendices/2-4-migration-guide.rst new file mode 100644 index 0000000000..73094f212a --- /dev/null +++ b/sr/appendices/2-4-migration-guide.rst @@ -0,0 +1,294 @@ +2.4 Migration Guide +################### + +CakePHP 2.4 is a fully API compatible upgrade from 2.3. This page outlines +the changes and improvements made in 2.4. + +Console +======= + +- Logged notice messages will now be colourized in terminals that support + colours. +- ConsoleShell is now deprecated. + +SchemaShell +----------- + +- ``cake schema generate`` now supports the ``--exclude`` parameter. +- The constant ``CAKEPHP_SHELL`` is now deprecated and will be removed in CakePHP 3.0. + +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. +- ``cake bake`` for views, models, controllers, tests and fixtures now supports a ``-f`` or ``--force`` parameter to + force overwriting of files. +- Tasks in core can now be aliased in the same way you would Helpers, Components and Behaviors + +FixtureTask +----------- + +- ``cake bake fixture`` now supports a ``--schema`` parameter to allow baking all fixtures with noninteractive "all" + while using schema import. + +Core +==== + +Constants +--------- + +- Constants ``IMAGES_URL``, ``JS_URL``, ``CSS_URL`` have been deprecated and + replaced with config variables ``App.imageBaseUrl``, ``App.jsBaseUrl``, + ``App.cssBaseUrl`` respectively. + +- Constants ``IMAGES``, ``JS``, ``CSS`` have been deprecated. + +Object +------ + +- :php:meth:`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 :php:attr:`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 :php:class:`AuthComponent` page. +- Property :php:attr:`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. See :ref:`hashing-passwords` for more info. + +DbAcl +----- + +- DbAcl now uses ``INNER`` joins instead of ``LEFT`` joins. This improves + performance for some database vendors. + +Model +===== + +Models +------ + +- :php:meth:`Model::save()`, :php:meth:`Model::saveField()`, :php:meth:`Model::saveAll()`, + :php:meth:`Model::saveAssociated()`, :php:meth:`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. +- :php:meth:`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. +- Mysql driver now supports SSL options. + + +View +==== + +JsonView +-------- + +- JSONP support has been added to :php:class:`JsonView`. +- The ``_serialize`` key now supports renaming serialized variables. +- When debug > 0 JSON will be pretty printed. + +XmlView +------- + +- The ``_serialize`` key now supports renaming serialized variables. +- When debug > 0 XML will be pretty printed. + +HtmlHelper +---------- + +- The API for :php:meth:`HtmlHelper::css()` has been been simplified. You can + now provide an array of options as the second argument. When you do, the + ``rel`` attribute defaults to 'stylesheet'. +- New option ``escapeTitle`` added to :php:meth:`HtmlHelper::link()` to control + escaping of only link title and not attributes. + +TextHelper +---------- + +- :php:meth:`TextHelper::autoParagraph()` has been added. It allows to + automatically convert text into HTML paragraphs. + +PaginatorHelper +--------------- + +- :php:meth:`PaginatorHelper::param()` has been added. +- The first page no longer contains ``/page:1`` or ``?page=1`` in the URL. This helps prevent + duplicate content issues where you would need to use canonical or noindex otherwise. + +FormHelper +---------- + +- The ``round`` option was added to :php:meth:`FormHelper::dateTime()`. Can be set to ``up`` or ``down`` + to force rounding in either direction. Defaults to null which rounds half up according to ``interval``. + +Network +======= + +CakeRequest +----------- + +- :php:meth:`CakeRequest::param()` has been added. +- :php:meth:`CakeRequest::is()` has been modified to support an array of types and will return true if the request matches any type. +- :php:meth:`CakeRequest::isAll()` has been added to check that a request matches all the given types. + +CakeResponse +------------ + +- :php:meth:`CakeResponse::location()` has been added to get or set the redirect location header. + +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. +- :php:meth:`CakeEmail::emailPattern()` was added. This method can be used to + relax email validation rules. This is useful when dealing with certain + Japanese hosts that allow non-compliant addresses to be used. +- :php:meth:`CakeEmail::attachments()` now allows you to provide the file + contents directly using the ``data`` key. +- Configuration data is now correctly merged with transport classes. + +HttpSocket +---------- + +- :php:meth:`HttpSocket::patch()` has been added. + + +I18n +==== + +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. +- The constant ``DEFAULT_LANGUAGE`` has been deprecated in favor of Configure value ``Config.language``. + +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 to + use a suffix ``Log`` for your class name you 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 :ref:`FileLog ` engine. +- In debug mode missing directories will now be automatically created to avoid unnecessary errors thrown. + +SyslogLog +--------- + +- The new logging engine :ref:`SyslogLog ` was added to stream messages to syslog. + +Cache +===== + +FileEngine +---------- + +- In debug mode missing directories will now be automatically created to avoid unnecessary errors thrown. + +Utility +======= + +General +------- + +- :php:func:`pr()` no longer outputs HTML when running in cli mode. + +Sanitize +-------- + +- ``Sanitize`` class has been deprecated. + +Validation +---------- + +- :php:meth:`Validation::date()` now supports the ``y`` and ``ym`` formats. +- The country code of :php:meth:`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 (``£`` and ``€``) before you use those currencies. +- The ``fractionExponent`` option was added to + :php:meth:`CakeNumber::currency()`. + +CakeTime +-------- + +- :php:meth:`CakeTime::isPast()` and :php:meth:`CakeTime::isFuture()` were + added. +- :php:meth:`CakeTime::timeAgoInWords()` has two new options to customize the output strings: + ``relativeString`` (defaults to ``%s ago``) and ``absoluteString`` (defaults to ``on %s``). +- :php:meth:`CakeTime::timeAgoInWords()` uses fuzzy terms when time is below thresholds. + + +Xml +--- + +- New option ``pretty`` has been added to :php:meth:`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('Exception.skipLog', array('NotFoundException', 'ForbiddenException'));`` + will avoid these exceptions and the ones extending them to be be logged when + ``'Exception.log'`` config is ``true`` + +Routing +======= + +Router +------ + +- :php:meth:`Router::fullBaseUrl()` was added together with ``App.fullBaseUrl`` Configure value. They replace + :php:const:`FULL_BASE_URL` which is now deprecated. +- :php:meth:`Router::parse()` now parses query string arguments. + + diff --git a/sr/appendices/cakephp-development-process.rst b/sr/appendices/cakephp-development-process.rst new file mode 100644 index 0000000000..a2fc2f09b9 --- /dev/null +++ b/sr/appendices/cakephp-development-process.rst @@ -0,0 +1,56 @@ +CakePHP Development Process +########################### + +Here we attempt to explain the process we use when developing the +CakePHP framework. We rely heavily on community interaction through +tickets and IRC chat. IRC is the best place to find members of the +`development team `_ and discuss +ideas, the latest code, and make general comments. If something more +formal needs to be proposed or there is a problem with a release, the +ticket system is the best place to share your thoughts. + +We currently maintain 4 versions of CakePHP. + +- **stable** : Tagged releases intended for production where stability + is more important than features. Issues filed against these releases + will be fixed in the related branch, and be part of the next release. +- **maintenance branch** : Development branches become maintenance + branches once a stable release point has been reached. Maintenance + branches are where all bugfixes are committed before making their way + into a stable release. Maintenance branches have the same name as the + major version they are for example *1.2*. If you are using a stable + release and need fixes that haven't made their way into a stable + release check here. +- **development branches** : Development branches contain leading edge + fixes and features. They are named after the version number they are + for example *1.3*. Once development branches have reached a stable + release point they become maintenance branches, and no further new + features are introduced unless absolutely necessary. +- **feature branches** : Feature branches contain unfinished or + possibly unstable features and are recommended only for power users + interested in the most advanced feature set and willing to contribute + back to the community. Feature branches are named with the following + convention *version-feature*. An example would be *1.3-router* Which + would contain new features for the Router for 1.3. + +Hopefully this will help you understand what version is right for you. +Once you pick your version you may feel compelled to contribute a bug +report or make general comments on the code. + +- If you are using a stable version or maintenance branch, please submit + tickets or discuss with us on IRC. +- If you are using the development branch or feature branch, the first + place to go is IRC. If you have a comment and cannot reach us in IRC + after a day or two, please submit a ticket. + +If you find an issue, the best answer is to write a test. The best +advice we can offer in writing tests is to look at the ones included in +the core. + +As always, if you have any questions or comments, visit us at #cakephp +on irc.freenode.net. + + +.. meta:: + :title lang=en: CakePHP Development Process + :keywords lang=en: maintenance branch,community interaction,community feature,necessary feature,stable release,ticket system,advanced feature,power users,feature set,chat irc,leading edge,router,new features,members,attempt,development branches,branch development diff --git a/sr/appendices/glossary.rst b/sr/appendices/glossary.rst new file mode 100644 index 0000000000..80ff5cefc1 --- /dev/null +++ b/sr/appendices/glossary.rst @@ -0,0 +1,70 @@ +Glossary +######## + +.. glossary:: + + routing array + An array of attributes that are passed to :php:meth:`Router::url()`. + They typically look like:: + + array('controller' => 'posts', 'action' => 'view', 5) + + HTML attributes + An array of key => values that are composed into HTML attributes. For example:: + + // Given + array('class' => 'my-class', 'target' => '_blank') + + // Would generate + class="my-class" target="_blank" + + If an option can be minimized or accepts it's name as the value, then ``true`` + can be used:: + + // Given + array('checked' => true) + + // Would generate + checked="checked" + + plugin syntax + Plugin syntax refers to the dot separated class name indicating classes + are part of a plugin. E.g. ``DebugKit.Toolbar`` The plugin is DebugKit, + and the class name is Toolbar. + + dot notation + Dot notation defines an array path, by separating nested levels with ``.`` + For example:: + + Asset.filter.css + + Would point to the following value:: + + array( + 'Asset' => array( + 'filter' => array( + 'css' => 'got me' + ) + ) + ) + + CSRF + Cross Site Request Forgery. Prevents replay attacks, double + submissions and forged requests from other domains. + + routes.php + A file in APP/Config that contains routing configuration. + This file is included before each request is processed. + It should connect all the routes your application needs so + requests can be routed to the correct controller + action. + + DRY + Don't repeat yourself. Is a principle of software development aimed at + reducing repetition of information of all kinds. In CakePHP DRY is used + to allow you to code things once and re-use them across your + application. + + +.. meta:: + :title lang=en: Glossary + :keywords lang=en: html attributes,array class,array controller,glossary glossary,target blank,dot notation,routing configuration,forgery,replay,router,syntax,config,submissions diff --git a/sr/appendices/migrating-from-cakephp-1-2-to-1-3.rst b/sr/appendices/migrating-from-cakephp-1-2-to-1-3.rst new file mode 100644 index 0000000000..5c49c43bd8 --- /dev/null +++ b/sr/appendices/migrating-from-cakephp-1-2-to-1-3.rst @@ -0,0 +1,778 @@ +Migrating from CakePHP 1.2 to 1.3 +################################# + +This guide summarizes many of the changes necessary when migrating +from a 1.2 to 1.3 CakePHP core. Each section contains relevant +information for the modifications made to existing methods as well +as any methods that have been removed/renamed. + +**App File Replacements (important)** + + +- webroot/index.php: Must be replaced due to changes in + bootstrapping process. +- config/core.php: Additional settings have been put in place + which are required for PHP 5.3. +- webroot/test.php: Replace if you want to run unit tests. + +Removed Constants +~~~~~~~~~~~~~~~~~ + +The following constants have been removed from CakePHP. If your +application depends on them you must define them in +``app/config/bootstrap.php`` + + +- ``CIPHER_SEED`` - It has been replaced with Configure class var + ``Security.cipherSeed`` which should be changed in + ``app/config/core.php`` +- ``PEAR`` +- ``INFLECTIONS`` +- ``VALID_NOT_EMPTY`` +- ``VALID_EMAIL`` +- ``VALID_NUMBER`` +- ``VALID_YEAR`` + +Configuration and application bootstrapping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Bootstrapping Additional Paths.** + +In your app/config/bootstrap.php you may have variables like +``$pluginPaths`` or ``$controllerPaths``. +There is a new way to add those paths. As of 1.3 RC1 the +``$pluginPaths`` variables will no longer work. You must use +``App::build()`` to modify paths. + +:: + + App::build(array( + 'plugins' => array( + '/full/path/to/plugins/', + '/next/full/path/to/plugins/' + ), + 'models' => array( + '/full/path/to/models/', + '/next/full/path/to/models/' + ), + 'views' => array( + '/full/path/to/views/', + '/next/full/path/to/views/' + ), + 'controllers' => array( + '/full/path/to/controllers/', + '/next/full/path/to/controllers/' + ), + 'datasources' => array( + '/full/path/to/datasources/', + '/next/full/path/to/datasources/' + ), + 'behaviors' => array( + '/full/path/to/behaviors/', + '/next/full/path/to/behaviors/' + ), + 'components' => array( + '/full/path/to/components/', + '/next/full/path/to/components/' + ), + 'helpers' => array( + '/full/path/to/helpers/', + '/next/full/path/to/helpers/' + ), + 'vendors' => array( + '/full/path/to/vendors/', + '/next/full/path/to/vendors/' + ), + 'shells' => array( + '/full/path/to/shells/', + '/next/full/path/to/shells/' + ), + 'locales' => array( + '/full/path/to/locale/', + '/next/full/path/to/locale/' + ), + 'libs' => array( + '/full/path/to/libs/', + '/next/full/path/to/libs/' + ) + )); + +Also changed is the order in which bootstrapping occurs. In the +past ``app/config/core.php`` was loaded **after** +``app/config/bootstrap.php``. This caused any ``App::import()`` in +an application bootstrap to be un-cached and considerably slower +than a cached include. In 1.3 core.php is loaded and the core cache +configs are created **before** bootstrap.php is loaded. + +**Loading custom inflections** + +``inflections.php`` has been removed, it was an unnecessary file +hit, and the related features have been refactored into a method to +increase their flexibility. You now use ``Inflector::rules()`` to +load custom inflections:: + + Inflector::rules('singular', array( + 'rules' => array( + '/^(bil)er$/i' => '\1', + '/^(inflec|contribu)tors$/i' => '\1ta' + ), + 'uninflected' => array('singulars'), + 'irregular' => array('spins' => 'spinor') + )); + +Will merge the supplied rules into the infection sets, with the +added rules taking precedence over the core rules. + +File renames and internal changes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Library Renames** + +Core libraries of libs/session.php, libs/socket.php, +libs/model/schema.php and libs/model/behavior.php have been renamed +so that there is a better mapping between filenames and main +classes contained within (as well as dealing with some name-spacing +issues): + + +- session.php -> cake\_session.php + + + - App::import('Core', 'Session') -> App::import('Core', + 'CakeSession') + +- socket.php -> cake\_socket.php + + + - App::import('Core', 'Socket') -> App::import('Core', + 'CakeSocket') + +- schema.php -> cake\_schema.php + + + - App::import('Model', 'Schema') -> App::import('Model', + 'CakeSchema') + +- behavior.php -> model\_behavior.php + + + - App::import('Core', 'Behavior') -> App::import('Core', + 'ModelBehavior') + + +In most cases, the above renaming will not affect userland code. + +**Inheritance from Object** + +The following classes no longer extend Object: + + +- Router +- Set +- Inflector +- Cache +- CacheEngine + +If you were using Object methods from these classes, you will need +to not use those methods. + +Controller & Components +~~~~~~~~~~~~~~~~~~~~~~~ + +**Controller** + + +- ``Controller::set()`` no longer changes variables from + ``$var_name`` to ``$varName``. Variables always appear in the view + exactly as you set them. + +- ``Controller::set('title', $var)`` no longer sets + ``$title_for_layout`` when rendering the layout. + ``$title_for_layout`` is still populated by default. But if you + want to customize it, use + ``$this->set('title_for_layout', $var)``. + +- ``Controller::$pageTitle`` has been removed. Use + ``$this->set('title_for_layout', $var);`` instead. + +- Controller has two new methods ``startupProcess`` and + ``shutdownProcess``. These methods are responsible for handling the + controller startup and shutdown processes. + +**Component** + + +- ``Component::triggerCallback`` has been added. It is a generic + hook into the component callback process. It supplants + ``Component::startup()``, ``Component::shutdown()`` and + ``Component::beforeRender()`` as the preferred way to trigger + callbacks. + +**CookieComponent** + + +- ``del`` is deprecated use ``delete`` + +**AclComponent + DbAcl** + +Node reference checks done with paths are now less greedy and will +no longer consume intermediary nodes when doing searches. In the +past given the structure: + +:: + + ROOT/ + Users/ + Users/ + edit + +The path ``ROOT/Users`` would match the last Users node instead of +the first. In 1.3, if you were expecting to get the last node you +would need to use the path ``ROOT/Users/Users`` + +**RequestHandlerComponent** + + +- ``getReferrer`` is deprecated use ``getReferer`` + +**SessionComponent & SessionHelper** + + +- ``del`` is deprecated use ``delete`` + +``SessionComponent::setFlash()`` second param used to be used for +setting the layout and accordingly rendered a layout file. This has +been modified to use an element. If you specified custom session +flash layouts in your applications you will need to make the +following changes. + + +#. Move the required layout files into app/views/elements +#. Rename the $content\_for\_layout variable to $message +#. Make sure you have ``echo $session->flash();`` in your layout + +``SessionComponent`` and ``SessionHelper`` are not automatically +loaded. +Both ``SessionComponent`` and ``SessionHelper`` are no longer +automatically included without you asking for them. SessionHelper +and SessionComponent now act like every other component and must be +declared like any other helper/component. You should update +``AppController::$components`` and ``AppController::$helpers`` to +include these classes to retain existing behavior:: + + var $components = array('Session', 'Auth', ...); + var $helpers = array('Session', 'Html', 'Form' ...); + +These change were done to make CakePHP more explicit and +declarative in what classes you the application developer want to +use. In the past there was no way to avoid loading the Session +classes without modifying core files. Which is something we want +you to be able to avoid. In addition Session classes were the only +magical component and helper. This change helps unify and normalize +behavior amongst all classes. + +Library Classes +~~~~~~~~~~~~~~~ + +**CakeSession** + + +- ``del`` is deprecated use ``delete`` + +**SessionComponent** + + +- ``SessionComponent::setFlash()`` now uses an *element* instead + of a *layout* as its second parameter. Be sure to move any flash + layouts from app/views/layouts to app/views/elements and change + instances of $content\_for\_layout to $message. + +**Folder** + + +- ``mkdir`` is deprecated use ``create`` +- ``mv`` is deprecated use ``move`` +- ``ls`` is deprecated use ``read`` +- ``cp`` is deprecated use ``copy`` +- ``rm`` is deprecated use ``delete`` + +**Set** + + +- ``isEqual`` is deprecated. Use == or ===. + +**String** + + +- ``getInstance`` is deprecated, call String methods statically. + +**Router** + +``Routing.admin`` is deprecated. It provided an inconsistent +behavior with other prefix style routes in that it was treated +differently. Instead you should use ``Routing.prefixes``. Prefix +routes in 1.3 do not require additional routes to be declared +manually. All prefix routes will be generated automatically. To +update simply change your core.php:: + + //from: + Configure::write('Routing.admin', 'admin'); + + //to: + Configure::write('Routing.prefixes', array('admin')); + +See the New features guide for more information on using prefix +routes. A small change has also been done to routing params. Routed +params should now only consist of alphanumeric chars, - and \_ or +``/[A-Z0-9-_+]+/``:: + + Router::connect('/:$%@#param/:action/*', array(...)); // BAD + Router::connect('/:can/:anybody/:see/:m-3/*', array(...)); //Acceptable + +For 1.3 the internals of the Router were heavily refactored to +increase performance and reduce code clutter. The side effect of +this is two seldom used features were removed, as they were +problematic and buggy even with the existing code base. First path +segments using full regular expressions was removed. You can no +longer create routes like:: + + Router::connect( + '/([0-9]+)-p-(.*)/', + array('controller' => 'products', 'action' => 'show') + ); + +These routes complicated route compilation and impossible to +reverse route. If you need routes like this, it is recommended that +you use route parameters with capture patterns. Next mid-route +greedy star support has been removed. It was previously possible to +use a greedy star in the middle of a route:: + + Router::connect( + '/pages/*/:event', + array('controller' => 'pages', 'action' => 'display'), + array('event' => '[a-z0-9_-]+') + ); + +This is no longer supported as mid-route greedy stars behaved +erratically, and complicated route compiling. Outside of these two +edge-case features and the above changes the router behaves exactly +as it did in 1.2 + +Also, people using the 'id' key in array-form URLs will notice that +Router::url() now treats this as a named parameter. If you +previously used this approach for passing the ID parameter to +actions, you will need to rewrite all your $html->link() and +$this->redirect() calls to reflect this change. + +:: + + // old format: + $url = array('controller' => 'posts', 'action' => 'view', 'id' => $id); + // use cases: + Router::url($url); + $html->link($url); + $this->redirect($url); + // 1.2 result: + /posts/view/123 + // 1.3 result: + /posts/view/id:123 + // correct format: + $url = array('controller' => 'posts', 'action' => 'view', $id); + +**Dispatcher** + +``Dispatcher`` is no longer capable of setting a controller's +layout/viewPath with request parameters. Control of these +properties should be handled by the Controller, not the Dispatcher. +This feature was also undocumented, and untested. + +**Debugger** + + +- ``Debugger::checkSessionKey()`` has been renamed to + ``Debugger::checkSecurityKeys()`` +- Calling ``Debugger::output("text")`` no longer works. Use + ``Debugger::output("txt")``. + +**Object** + + +- ``Object::$_log`` has been removed. ``CakeLog::write`` is now + called statically. See :doc:`/core-libraries/logging` + for more information on changes made to logging. + +**Sanitize** + + +- ``Sanitize::html()`` now actually always returns escaped + strings. In the past using the ``$remove`` parameter would skip + entity encoding, returning possibly dangerous content. +- ``Sanitize::clean()`` now has a ``remove_html`` option. This + will trigger the ``strip_tags`` feature of ``Sanitize::html()``, + and must be used in conjunction with the ``encode`` parameter. + +**Configure and App** + + +- Configure::listObjects() replaced by App::objects() +- Configure::corePaths() replaced by App::core() +- Configure::buildPaths() replaced by App::build() +- Configure no longer manages paths. +- Configure::write('modelPaths', array...) replaced by + App::build(array('models' => array...)) +- Configure::read('modelPaths') replaced by App::path('models') +- There is no longer a debug = 3. The controller dumps generated + by this setting often caused memory consumption issues making it an + impractical and unusable setting. The ``$cakeDebug`` variable has + also been removed from ``View::renderLayout`` You should remove + this variable reference to avoid errors. +- ``Configure::load()`` can now load configuration files from + plugins. Use ``Configure::load('plugin.file');`` to load + configuration files from plugins. Any configuration files in your + application that use ``.`` in the name should be updated to use + ``_`` + +**Cache** + +In addition to being able to load CacheEngines from app/libs or +plugins, Cache underwent some refactoring for CakePHP1.3. These +refactorings focused around reducing the number and frequency of +method calls. The end result was a significant performance +improvement with only a few minor API changes which are detailed +below. + +The changes in Cache removed the singletons used for each Engine +type, and instead an engine instance is made for each unique key +created with ``Cache::config()``. Since engines are not singletons +anymore, ``Cache::engine()`` was not needed and was removed. In +addition ``Cache::isInitialized()`` now checks cache +*configuration names*, not cache *engine names*. You can still use +``Cache::set()`` or ``Cache::engine()`` to modify cache +configurations. Also checkout the +:doc:`/appendices/new-features-in-cakephp-1-3` for +more information on the additional methods added to ``Cache``. + +It should be noted that using an app/libs or plugin cache engine +for the default cache config can cause performance issues as the +import that loads these classes will always be uncached. It is +recommended that you either use one of the core cache engines for +your ``default`` configuration, or manually include the cache +engine class before configuring it. Furthermore any non-core cache +engine configurations should be done in +``app/config/bootstrap.php`` for the same reasons detailed above. + +Model Databases and Datasources +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Model** + + +- ``Model::del()`` and ``Model::remove()`` have been removed in + favor of ``Model::delete()``, which is now the canonical delete + method. +- ``Model::findAll``, findCount, findNeighbours, removed. +- Dynamic calling of setTablePrefix() has been removed. + tableprefix should be with the ``$tablePrefix`` property, and any + other custom construction behavior should be done in an overridden + ``Model::__construct()``. +- ``DboSource::query()`` now throws warnings for un-handled model + methods, instead of trying to run them as queries. This means, + people starting transactions improperly via the + ``$this->Model->begin()`` syntax will need to update their code so + that it accesses the model's DataSource object directly. +- Missing validation methods will now trigger errors in + development mode. +- Missing behaviors will now trigger a cakeError. +- ``Model::find(first)`` will no longer use the id property for + default conditions if no conditions are supplied and id is not + empty. Instead no conditions will be used +- For Model::saveAll() the default value for option 'validate' is + now 'first' instead of true + +**Datasources** + + +- DataSource::exists() has been refactored to be more consistent + with non-database backed datasources. Previously, if you set + ``var $useTable = false; var $useDbConfig = 'custom';``, it was + impossible for ``Model::exists()`` to return anything but false. + This prevented custom datasources from using ``create()`` or + ``update()`` correctly without some ugly hacks. If you have custom + datasources that implement ``create()``, ``update()``, and + ``read()`` (since ``Model::exists()`` will make a call to + ``Model::find('count')``, which is passed to + ``DataSource::read()``), make sure to re-run your unit tests on + 1.3. + +**Databases** + +Most database configurations no longer support the 'connect' key +(which has been deprecated since pre-1.2). Instead, set +``'persistent' => true`` or false to determine whether or not a +persistent database connection should be used + +**SQL log dumping** + +A commonly asked question is how can one disable or remove the SQL +log dump at the bottom of the page?. In previous versions the HTML +SQL log generation was buried inside DboSource. For 1.3 there is a +new core element called ``sql_dump``. ``DboSource`` no longer +automatically outputs SQL logs. If you want to output SQL logs in +1.3, do the following: + +:: + + echo $this->element('sql_dump'); + +You can place this element anywhere in your layout or view. The +``sql_dump`` element will only generate output when +``Configure::read('debug')`` is equal to 2. You can of course +customize or override this element in your app by creating +``app/views/elements/sql_dump.ctp``. + +View and Helpers +~~~~~~~~~~~~~~~~ + +**View** + + +- ``View::renderElement`` removed. Use ``View::element()`` + instead. +- Automagic support for ``.thtml`` view file extension has been + removed either declare ``$this->ext = 'thtml';`` in your + controllers, or rename your views to use ``.ctp`` +- ``View::set('title', $var)`` no longer sets + ``$title_for_layout`` when rendering the layout. + ``$title_for_layout`` is still populated by default. But if you + want to customize it, use ``$this->set('title_for_layout', $var)``. +- ``View::$pageTitle`` has been removed. Use + ``$this->set('title_for_layout', $var);`` instead. +- The ``$cakeDebug`` layout variable associated with debug = 3 has + been removed. Remove it from your layouts as it will cause errors. + Also see the notes related to SQL log dumping and Configure for + more information. + +All core helpers no longer use ``Helper::output()``. The method was +inconsistently used and caused output issues with many of +FormHelper's methods. If you previously overrode +``AppHelper::output()`` to force helpers to auto-echo you will need +to update your view files to manually echo helper output. + +**TextHelper** + + +- ``TextHelper::trim()`` is deprecated, used ``truncate()`` + instead. +- ``TextHelper::highlight()`` no longer has: +- an ``$highlighter`` parameter. Use ``$options['format']`` + instead. +- an ``$considerHtml``parameter. Use ``$options['html']`` instead. +- ``TextHelper::truncate()`` no longer has: +- an ``$ending`` parameter. Use ``$options['ending']`` instead. +- an ``$exact`` parameter. Use ``$options['exact']`` instead. +- an ``$considerHtml``parameter. Use ``$options['html']`` + instead. + +**PaginatorHelper** + +PaginatorHelper has had a number of enhancements applied to make +styling easier. +``prev()``, ``next()``, ``first()`` and ``last()`` + +The disabled state of these methods now defaults to ```` tags +instead of ``
`` tags. + +passedArgs are now auto merged with URL options in paginator. + +``sort()``, ``prev()``, ``next()`` now add additional class names +to the generated html. ``prev()`` adds a class of prev. ``next()`` +adds a class of next. ``sort()`` will add the direction currently +being sorted, either asc or desc. + +**FormHelper** + + +- ``FormHelper::dateTime()`` no longer has a ``$showEmpty`` + parameter. Use ``$attributes['empty']`` instead. +- ``FormHelper::year()`` no longer has a ``$showEmpty`` parameter. + Use ``$attributes['empty']`` instead. +- ``FormHelper::month()`` no longer has a ``$showEmpty`` + parameter. Use ``$attributes['empty']`` instead. +- ``FormHelper::day()`` no longer has a ``$showEmpty`` parameter. + Use ``$attributes['empty']`` instead. +- ``FormHelper::minute()`` no longer has a ``$showEmpty`` + parameter. Use ``$attributes['empty']`` instead. +- ``FormHelper::meridian()`` no longer has a ``$showEmpty`` + parameter. Use ``$attributes['empty']`` instead. +- ``FormHelper::select()`` no longer has a ``$showEmpty`` + parameter. Use ``$attributes['empty']`` instead. +- Default URLs generated by form helper no longer contain 'id' + parameter. This makes default URLs more consistent with documented + userland routes. Also enables reverse routing to work in a more + intuitive fashion with default FormHelper URLs. +- ``FormHelper::submit()`` Can now create other types of inputs + other than type=submit. Use the type option to control the type of + input generated. +- ``FormHelper::button()`` Now creates `` + + + + + + The ``button`` input type supports the ``escape`` option, which accepts a + bool and determines whether to HTML entity encode the $title of the button. + Defaults to false:: + + echo $this->Form->button('Submit Form', array( + 'type' => 'submit', + 'escape' => true + )); + +.. php:method:: postButton(string $title, mixed $url, array $options = array ()) + + Create a ``