diff --git a/apps/advanced/environments/dev/frontend/www/index.php b/apps/advanced/environments/dev/frontend/www/index.php index 9a2ffaa..b1fc4c2 100644 --- a/apps/advanced/environments/dev/frontend/www/index.php +++ b/apps/advanced/environments/dev/frontend/www/index.php @@ -5,6 +5,7 @@ defined('YII_DEBUG') or define('YII_DEBUG', true); require(__DIR__ . '/../../vendor/yiisoft/yii2/yii/Yii.php'); require(__DIR__ . '/../../vendor/autoload.php'); +Yii::importNamespaces(require(__DIR__ . '/../../vendor/composer/autoload_namespaces.php')); $config = yii\helpers\ArrayHelper::merge( require(__DIR__ . '/../config/main.php'), diff --git a/apps/advanced/environments/dev/yii b/apps/advanced/environments/dev/yii index b81fc10..b2c9288 100644 --- a/apps/advanced/environments/dev/yii +++ b/apps/advanced/environments/dev/yii @@ -15,6 +15,7 @@ defined('STDIN') or define('STDIN', fopen('php://stdin', 'r')); require(__DIR__ . '/vendor/yiisoft/yii2/yii/Yii.php'); require(__DIR__ . '/vendor/autoload.php'); +Yii::importNamespaces(require(__DIR__ . '/vendor/composer/autoload_namespaces.php')); $config = yii\helpers\ArrayHelper::merge( require(__DIR__ . '/console/config/main.php'), diff --git a/apps/advanced/environments/prod/frontend/www/index.php b/apps/advanced/environments/prod/frontend/www/index.php index e797bf0..b21ce0a 100644 --- a/apps/advanced/environments/prod/frontend/www/index.php +++ b/apps/advanced/environments/prod/frontend/www/index.php @@ -5,6 +5,7 @@ defined('YII_DEBUG') or define('YII_DEBUG', false); require(__DIR__ . '/../../vendor/yiisoft/yii2/yii/Yii.php'); require(__DIR__ . '/../../vendor/autoload.php'); +Yii::importNamespaces(require(__DIR__ . '/../../vendor/composer/autoload_namespaces.php')); $config = yii\helpers\ArrayHelper::merge( require(__DIR__ . '/../config/main.php'), diff --git a/apps/advanced/environments/prod/yii b/apps/advanced/environments/prod/yii index 0d4ebe2..9ce1630 100644 --- a/apps/advanced/environments/prod/yii +++ b/apps/advanced/environments/prod/yii @@ -15,6 +15,7 @@ defined('STDIN') or define('STDIN', fopen('php://stdin', 'r')); require(__DIR__ . '/vendor/yiisoft/yii2/yii/Yii.php'); require(__DIR__ . '/vendor/autoload.php'); +Yii::importNamespaces(require(__DIR__ . '/vendor/composer/autoload_namespaces.php')); $config = yii\helpers\ArrayHelper::merge( require(__DIR__ . '/console/config/main.php'), diff --git a/apps/basic/www/index-test.php b/apps/basic/www/index-test.php index 4a00b37..80d0953 100644 --- a/apps/basic/www/index-test.php +++ b/apps/basic/www/index-test.php @@ -10,6 +10,7 @@ defined('YII_ENV') or define('YII_ENV', 'test'); require_once(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php'); require_once(__DIR__ . '/../vendor/autoload.php'); +Yii::importNamespaces(require(__DIR__ . '/../vendor/composer/autoload_namespaces.php')); $config = require(__DIR__ . '/../config/web-test.php'); diff --git a/apps/basic/www/index.php b/apps/basic/www/index.php index 9bc1565..fb66386 100644 --- a/apps/basic/www/index.php +++ b/apps/basic/www/index.php @@ -6,6 +6,7 @@ defined('YII_ENV') or define('YII_ENV', 'dev'); require(__DIR__ . '/../vendor/yiisoft/yii2/yii/Yii.php'); require(__DIR__ . '/../vendor/autoload.php'); +Yii::importNamespaces(require(__DIR__ . '/../vendor/composer/autoload_namespaces.php')); $config = require(__DIR__ . '/../config/web.php'); diff --git a/apps/basic/yii b/apps/basic/yii index c874ce0..73968c1 100755 --- a/apps/basic/yii +++ b/apps/basic/yii @@ -15,6 +15,7 @@ defined('STDIN') or define('STDIN', fopen('php://stdin', 'r')); require(__DIR__ . '/vendor/yiisoft/yii2/yii/Yii.php'); require(__DIR__ . '/vendor/autoload.php'); +Yii::importNamespaces(require(__DIR__ . '/vendor/composer/autoload_namespaces.php')); $config = require(__DIR__ . '/config/console.php'); diff --git a/build/build b/build/build index 45f15bd..a6c7cc8 100755 --- a/build/build +++ b/build/build @@ -13,8 +13,9 @@ defined('STDIN') or define('STDIN', fopen('php://stdin', 'r')); require(__DIR__ . '/../framework/yii/Yii.php'); -$id = 'yii-build'; -$basePath = __DIR__; - -$application = new yii\console\Application(array('id' => $id, 'basePath' => $basePath)); +$application = new yii\console\Application(array( + 'id' => 'yii-build', + 'basePath' => __DIR__, + 'controllerNamespace' => 'yii\build\controllers', +)); $application->run(); diff --git a/build/controllers/ClassmapController.php b/build/controllers/ClassmapController.php new file mode 100644 index 0000000..f9b9a85 --- /dev/null +++ b/build/controllers/ClassmapController.php @@ -0,0 +1,89 @@ + + * @since 2.0 + */ +class ClassmapController extends Controller +{ + public $defaultAction = 'create'; + + /** + * Creates a class map for the core Yii classes. + * @param string $root the root path of Yii framework. Defaults to YII_PATH. + * @param string $mapFile the file to contain the class map. Defaults to YII_PATH . '/classes.php'. + */ + public function actionCreate($root = null, $mapFile = null) + { + if ($root === null) { + $root = YII_PATH; + } + $root = FileHelper::normalizePath($root); + if ($mapFile === null) { + $mapFile = YII_PATH . '/classes.php'; + } + $options = array( + 'filter' => function($path) { + if (is_file($path)) { + $file = basename($path); + if ($file[0] < 'A' || $file[0] > 'Z') { + return false; + } + } + return null; + }, + 'only' => array('.php'), + 'except' => array( + 'Yii.php', + 'YiiBase.php', + '/debug/', + '/console/', + '/test/', + ), + ); + $files = FileHelper::findFiles($root, $options); + $map = array(); + foreach ($files as $file) { + if (($pos = strpos($file, $root)) !== 0) { + die("Something wrong: $file"); + } + $path = str_replace('\\', '/', substr($file, strlen($root))); + $map[] = "\t'yii" . substr(str_replace('/', '\\', $path), 0, -4) . "' => YII_PATH . '$path',"; + } + $map = implode("\n", $map); + $output = << 'mysql:host=localhost;dbname=testdb', 'username' => 'demo', 'password' => 'demo', - // turn on schema caching to improve performance + // turn on schema caching to improve performance in production mode // 'schemaCacheDuration' => 3600, ), ), ); ``` -Check [Database basics](database-basics.md) section in order to learn more on how to configure and use database -connections. +Please read the [Database basics](database-basics.md) section to learn more on how to configure +and use database connections. + Getting Data from Database -------------------------- -There are two ActiveRecord methods for getting data: +There are two ActiveRecord methods for getting data from database: - [[find()]] - [[findBySql()]] -They both return an [[ActiveQuery]] instance. Coupled with the various customization and query methods -provided by [[ActiveQuery]], ActiveRecord supports very flexible and powerful data retrieval approaches. +They both return an [[ActiveQuery]] instance. Coupled with various query methods provided +by [[ActiveQuery]], ActiveRecord supports very flexible and powerful data retrieval approaches. The followings are some examples, @@ -83,13 +84,13 @@ $customers = Customer::find() ->all(); // to return a single customer whose ID is 1: +$customer = Customer::find(1); + +// the above code is equivalent to the following: $customer = Customer::find() ->where(array('id' => 1)) ->one(); -// or use the following shortcut approach: -$customer = Customer::find(1); - // to retrieve customers using a raw SQL statement: $sql = 'SELECT * FROM tbl_customer'; $customers = Customer::findBySql($sql)->all(); @@ -132,10 +133,10 @@ $values = $customer->attributes; ``` -Persisting Data to Database ---------------------------- +Saving Data to Database +----------------------- -ActiveRecord provides the following methods to insert, update and delete data: +ActiveRecord provides the following methods to insert, update and delete data in the database: - [[save()]] - [[insert()]] @@ -206,9 +207,9 @@ a one-many relationship. For example, a customer has many orders. And the [[hasO method declares a many-one or one-one relationship. For example, an order has one customer. Both methods take two parameters: -- `$class`: the name of the class related models should use. If specified without - a namespace, the namespace will be taken from the declaring class. -- `$link`: the association between columns from two tables. This should be given as an array. +- `$class`: the name of the class of the related model(s). If specified without + a namespace, the namespace of the related model class will be taken from the declaring class. +- `$link`: the association between columns from the two tables. This should be given as an array. The keys of the array are the names of the columns from the table associated with `$class`, while the values of the array are the names of the columns from the declaring class. It is a good practice to define relationships based on table foreign keys. @@ -262,8 +263,8 @@ class Order extends \yii\db\ActiveRecord ``` [[ActiveRelation::via()]] method is similar to [[ActiveRelation::viaTable()]] except that -the first parameter of [[ActiveRelation::via()]] takes a relation name declared in the ActiveRecord class. -For example, the above `items` relation can be equivalently declared as follows: +the first parameter of [[ActiveRelation::via()]] takes a relation name declared in the ActiveRecord class +instead of the pivot table name. For example, the above `items` relation can be equivalently declared as follows: ```php class Order extends \yii\db\ActiveRecord @@ -314,7 +315,7 @@ How many SQL queries will be performed in the above code, assuming there are mor the database? 101! The first SQL query brings back 100 customers. Then for each customer, a SQL query is performed to bring back the customer's orders. -To solve the above performance problem, you can use the so-called *eager loading* by calling [[ActiveQuery::with()]]: +To solve the above performance problem, you can use the so-called *eager loading* approach by calling [[ActiveQuery::with()]]: ```php // SQL executed: SELECT * FROM tbl_customer LIMIT 100 @@ -472,7 +473,7 @@ TODO: FIXME: WIP, TBD, https://github.com/yiisoft/yii2/issues/226 Imagine situation where you have to save something related to the main model in [[beforeSave()]], [[afterSave()]], [[beforeDelete()]] and/or [[afterDelete()]] life cycle methods. Developer may come -to solution of overriding ActiveRecord [[save()]] method with database transaction wrapping or +to the solution of overriding ActiveRecord [[save()]] method with database transaction wrapping or even using transaction in controller action, which is strictly speaking doesn't seems to be a good practice (recall skinny-controller fat-model fundamental rule). diff --git a/docs/guide/migration.md b/docs/guide/migration.md index a90df7c..ed06605 100644 --- a/docs/guide/migration.md +++ b/docs/guide/migration.md @@ -82,7 +82,7 @@ class m101129_185401_create_news_table extends \yii\db\Migration { public function up() { - $this->db->createCommand()->createTable('tbl_news, array( + $this->db->createCommand()->createTable('tbl_news', array( 'id' => 'pk', 'title' => 'string(128) NOT NULL', 'content' => 'text', @@ -128,7 +128,7 @@ class m101129_185401_create_news_table extends \yii\db\Migration $transaction=$this->getDbConnection()->beginTransaction(); try { - $this->db->createCommand()->createTable('tbl_news, array( + $this->db->createCommand()->createTable('tbl_news', array( 'id' => 'pk', 'title' => 'string NOT NULL', 'content' => 'text', diff --git a/extensions/composer/LICENSE.md b/extensions/composer/LICENSE.md new file mode 100644 index 0000000..0bb1a8d --- /dev/null +++ b/extensions/composer/LICENSE.md @@ -0,0 +1,32 @@ +The Yii framework is free software. It is released under the terms of +the following BSD License. + +Copyright © 2008-2013 by Yii Software LLC (http://www.yiisoft.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Yii Software LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/extensions/composer/README.md b/extensions/composer/README.md new file mode 100644 index 0000000..871d1e3 --- /dev/null +++ b/extensions/composer/README.md @@ -0,0 +1,45 @@ +Yii 2.0 Public Preview - Composer Installer +====================== + +Thank you for choosing Yii - a high-performance component-based PHP framework. + +If you are looking for a production-ready PHP framework, please use +[Yii v1.1](https://github.com/yiisoft/yii). + +Yii 2.0 is still under heavy development. We may make significant changes +without prior notices. **Yii 2.0 is not ready for production use yet.** + +[![Build Status](https://secure.travis-ci.org/yiisoft/yii2.png)](http://travis-ci.org/yiisoft/yii2) + +This is the yii2 composer installer. + +Installation +---------------- + +This extension offers you enhanced composer handling for your yii2-project. It will therefor require you to use composer. + +` +php composer.phar require yiisoft/yii2-composer * +` + +*Note: You might have to run `php composer.phar selfupdate` before using this extension.* + + +Usage & Documentation +----------- +This extensions allows you to hook to certain composer events and prepare your yii2-app for usage. + +After the package is installed, the composer.json file has to be modified to enable this extension. + +To see it in action take a look at the example apps in the repository: + +[Basic](https://github.com/suralc/yii2/blob/master/apps/basic/composer.json#L27) +[Advanced](https://github.com/suralc/yii2/blob/extensions-readme/apps/advanced/composer.json) + +However it might be useful to read through the official composer [documentation](http://getcomposer.org/doc/articles/scripts.md) to understand what this extension can to for you and what it can't. + +You can also use this as an template to create your own composer additions to ease development and deployment of your app. + + + + diff --git a/extensions/jui/LICENSE.md b/extensions/jui/LICENSE.md new file mode 100644 index 0000000..0bb1a8d --- /dev/null +++ b/extensions/jui/LICENSE.md @@ -0,0 +1,32 @@ +The Yii framework is free software. It is released under the terms of +the following BSD License. + +Copyright © 2008-2013 by Yii Software LLC (http://www.yiisoft.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Yii Software LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/extensions/jui/README.md b/extensions/jui/README.md new file mode 100644 index 0000000..6025ac4 --- /dev/null +++ b/extensions/jui/README.md @@ -0,0 +1,55 @@ +Yii 2.0 Public Preview - JUI Extension +====================== + +Thank you for choosing Yii - a high-performance component-based PHP framework. + +If you are looking for a production-ready PHP framework, please use +[Yii v1.1](https://github.com/yiisoft/yii). + +Yii 2.0 is still under heavy development. We may make significant changes +without prior notices. **Yii 2.0 is not ready for production use yet.** + +[![Build Status](https://secure.travis-ci.org/yiisoft/yii2.png)](http://travis-ci.org/yiisoft/yii2) + +This is the yii2-jui extension. + +Installation +---------------- +The preferred way to install this extension is [composer](http://getcomposer.org/download/). + +Either run +``` +php composer.phar require yiisoft/yii2-jui* +``` + +or add +``` +"yiisoft/yii2-jui": "*" +``` +to the require section of your composer.json. + + +*Note: You might have to run `php composer.phar selfupdate`* + + +Usage & Documentation +----------- + +This extension provides multiple widgets to work with jquery.ui, as well as a set of compatible jquery.ui files. + +You can use these widgets in your view files after you have registered the corresponding assets. + +Example: +----------- +```php +echo ProgressBar::widget(array( + 'clientOptions' => array( + 'value' => 75, + ), +)); + +For further instructions refer to the guide (once it is finished) + + + + diff --git a/extensions/mutex/LICENSE.md b/extensions/mutex/LICENSE.md new file mode 100644 index 0000000..0bb1a8d --- /dev/null +++ b/extensions/mutex/LICENSE.md @@ -0,0 +1,32 @@ +The Yii framework is free software. It is released under the terms of +the following BSD License. + +Copyright © 2008-2013 by Yii Software LLC (http://www.yiisoft.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Yii Software LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/extensions/mutex/README.md b/extensions/mutex/README.md new file mode 100644 index 0000000..e3a697d --- /dev/null +++ b/extensions/mutex/README.md @@ -0,0 +1,44 @@ +Yii 2.0 Public Preview - Mutex Extension +====================== + +Thank you for choosing Yii - a high-performance component-based PHP framework. + +If you are looking for a production-ready PHP framework, please use +[Yii v1.1](https://github.com/yiisoft/yii). + +Yii 2.0 is still under heavy development. We may make significant changes +without prior notices. **Yii 2.0 is not ready for production use yet.** + +[![Build Status](https://secure.travis-ci.org/yiisoft/yii2.png)](http://travis-ci.org/yiisoft/yii2) + +This is the yii2-mutex extension. + +Installation +---------------- +The prefered way to install this extension is through [composer](http://getcomposer.org/download/). + +Either run +``` +php composer.phar require yiisoft/yii2-mutex * +``` + +or add +``` +"yiisoft/yii2-mutex": "*" +``` +to the require section of your composer.json. + + +*Note: You might have to run `php composer.phar selfupdate`* + + +Usage & Documentation +----------- + +This component can be used to perform actions similar to the concept of [mutual exclusion](http://en.wikipedia.org/wiki/Mutual_exclusion). + +For concrete examples and advanced usage refer to the guide. + + + + diff --git a/extensions/smarty/LICENSE.md b/extensions/smarty/LICENSE.md new file mode 100644 index 0000000..0bb1a8d --- /dev/null +++ b/extensions/smarty/LICENSE.md @@ -0,0 +1,32 @@ +The Yii framework is free software. It is released under the terms of +the following BSD License. + +Copyright © 2008-2013 by Yii Software LLC (http://www.yiisoft.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Yii Software LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/extensions/smarty/README.md b/extensions/smarty/README.md new file mode 100644 index 0000000..45115ef --- /dev/null +++ b/extensions/smarty/README.md @@ -0,0 +1,65 @@ +Yii 2.0 Public Preview - Smarty View Renderer +====================== + +Thank you for choosing Yii - a high-performance component-based PHP framework. + +If you are looking for a production-ready PHP framework, please use +[Yii v1.1](https://github.com/yiisoft/yii). + +Yii 2.0 is still under heavy development. We may make significant changes +without prior notices. **Yii 2.0 is not ready for production use yet.** + +[![Build Status](https://secure.travis-ci.org/yiisoft/yii2.png)](http://travis-ci.org/yiisoft/yii2) + +This is the yii2-smarty extension. + +Installation +---------------- +The prefered way to install this extension is through [composer](http://getcomposer.org/download/). + +Either run +``` +php composer.phar require yiisoft/yii2-smarty * +``` + +or add +```json +"yiisoft/yii2-smarty": "*" +``` +to the require section of your composer.json. + + +*Note: You might have to run `php composer.phar selfupdate`* + + +Usage & Documentation +----------- + +This extension has to be registered prior to usage. +To enable this view renderer add it to the $rendereres property of your view object. + +Example: +```php + array( + 'view' => array( + 'class' => 'yii\base\View', + 'viewRenderers' => array( + 'tpl' => array( + 'class' => 'yii\smarty\ViewRenderer', + //'cachePath' => '@runtime/Smarty/cache', + ), + ), + ), + ), +); +``` + +For further instructions refer to the related section in the guide. + + + + diff --git a/extensions/twig/LICENSE.md b/extensions/twig/LICENSE.md new file mode 100644 index 0000000..0bb1a8d --- /dev/null +++ b/extensions/twig/LICENSE.md @@ -0,0 +1,32 @@ +The Yii framework is free software. It is released under the terms of +the following BSD License. + +Copyright © 2008-2013 by Yii Software LLC (http://www.yiisoft.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of Yii Software LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/extensions/twig/README.md b/extensions/twig/README.md new file mode 100644 index 0000000..037f0e9 --- /dev/null +++ b/extensions/twig/README.md @@ -0,0 +1,64 @@ +Yii 2.0 Public Preview - Twig View Renderer +====================== + +Thank you for choosing Yii - a high-performance component-based PHP framework. + +If you are looking for a production-ready PHP framework, please use +[Yii v1.1](https://github.com/yiisoft/yii). + +Yii 2.0 is still under heavy development. We may make significant changes +without prior notices. **Yii 2.0 is not ready for production use yet.** + +[![Build Status](https://secure.travis-ci.org/yiisoft/yii2.png)](http://travis-ci.org/yiisoft/yii2) + +This is the yii2-twig extension. + +Installation +---------------- +The prefered way to install this extension is through [composer](http://getcomposer.org/download/). + +Either run +``` +php composer.phar require yiisoft/yii2-twig * +``` + +or add +``` +"yiisoft/yii2-twig": "*" +``` +to the require section of your composer.json. + + +*Note: You might have to run `php composer.phar selfupdate`* + + +Usage & Documentation +----------- + +This extension has to be registered prior to usage. +To enable this view renderer add it to the $rendereres property of your view object. + +Example: +```php + array( + 'view' => array( + 'class' => 'yii\base\View', + 'viewRenderers' => array( + 'twig' => array( + 'class' => 'yii\twig\ViewRenderer', + //'cachePath' => '@runtime/Twig/cache', + //'options' => array(), /* Array of twig options */ + ), + ), + ), + ), +); +``` + +For further instructions refer to the related section in the guide. + + diff --git a/framework/yii/YiiBase.php b/framework/yii/YiiBase.php index 6384023..23e8f05 100644 --- a/framework/yii/YiiBase.php +++ b/framework/yii/YiiBase.php @@ -93,7 +93,6 @@ class YiiBase public static $objectConfig = array(); private static $_imported = array(); // alias => class name or directory - private static $_logger; /** * @return string the version of Yii framework @@ -156,6 +155,9 @@ class YiiBase foreach ($namespaces as $name => $path) { if ($name !== '') { $name = trim(strtr($name, array('\\' => '/', '_' => '/')), '/'); + if (is_array($path)) { + $path = reset($path); + } static::setAlias('@' . $name, rtrim($path, '/\\') . '/' . $name); } } diff --git a/framework/yii/classes.php b/framework/yii/classes.php index 9165ddd..5cd6e3b 100644 --- a/framework/yii/classes.php +++ b/framework/yii/classes.php @@ -1,237 +1,220 @@ YII_PATH . '/YiiBase.php', -'yii\debug\Module' => YII_PATH . '/debug/Module.php', -'yii\debug\controllers\DefaultController' => YII_PATH . '/debug/controllers/DefaultController.php', -'yii\debug\Toolbar' => YII_PATH . '/debug/Toolbar.php', -'yii\web\PageCache' => YII_PATH . '/web/PageCache.php', -'yii\web\CaptchaAction' => YII_PATH . '/web/CaptchaAction.php', -'yii\web\HttpException' => YII_PATH . '/web/HttpException.php', -'yii\web\Application' => YII_PATH . '/web/Application.php', -'yii\web\CacheSession' => YII_PATH . '/web/CacheSession.php', -'yii\web\UserEvent' => YII_PATH . '/web/UserEvent.php', -'yii\web\VerbFilter' => YII_PATH . '/web/VerbFilter.php', -'yii\web\JsExpression' => YII_PATH . '/web/JsExpression.php', -'yii\web\CookieCollection' => YII_PATH . '/web/CookieCollection.php', -'yii\web\ResponseFormatter' => YII_PATH . '/web/ResponseFormatter.php', -'yii\web\AccessRule' => YII_PATH . '/web/AccessRule.php', -'yii\web\AssetManager' => YII_PATH . '/web/AssetManager.php', -'yii\web\Session' => YII_PATH . '/web/Session.php', -'yii\web\AccessControl' => YII_PATH . '/web/AccessControl.php', -'yii\web\DbSession' => YII_PATH . '/web/DbSession.php', -'yii\web\IAssetConverter' => YII_PATH . '/web/IAssetConverter.php', -'yii\web\Identity' => YII_PATH . '/web/Identity.php', -'yii\web\Controller' => YII_PATH . '/web/Controller.php', -'yii\web\User' => YII_PATH . '/web/User.php', -'yii\web\HttpCache' => YII_PATH . '/web/HttpCache.php', -'yii\web\UrlManager' => YII_PATH . '/web/UrlManager.php', -'yii\web\Request' => YII_PATH . '/web/Request.php', -'yii\web\Cookie' => YII_PATH . '/web/Cookie.php', -'yii\web\UploadedFile' => YII_PATH . '/web/UploadedFile.php', -'yii\web\ResponseEvent' => YII_PATH . '/web/ResponseEvent.php', -'yii\web\UrlRule' => YII_PATH . '/web/UrlRule.php', -'yii\web\XmlResponseFormatter' => YII_PATH . '/web/XmlResponseFormatter.php', -'yii\web\Response' => YII_PATH . '/web/Response.php', -'yii\web\SessionIterator' => YII_PATH . '/web/SessionIterator.php', -'yii\web\AssetBundle' => YII_PATH . '/web/AssetBundle.php', -'yii\web\AssetConverter' => YII_PATH . '/web/AssetConverter.php', -'yii\web\HeaderCollection' => YII_PATH . '/web/HeaderCollection.php', -'yii\log\Target' => YII_PATH . '/log/Target.php', -'yii\log\DebugTarget' => YII_PATH . '/log/DebugTarget.php', -'yii\log\Logger' => YII_PATH . '/log/Logger.php', -'yii\log\EmailTarget' => YII_PATH . '/log/EmailTarget.php', -'yii\log\DbTarget' => YII_PATH . '/log/DbTarget.php', -'yii\log\FileTarget' => YII_PATH . '/log/FileTarget.php', -'yii\widgets\ActiveField' => YII_PATH . '/widgets/ActiveField.php', -'yii\widgets\Captcha' => YII_PATH . '/widgets/Captcha.php', -'yii\widgets\ListPager' => YII_PATH . '/widgets/ListPager.php', -'yii\widgets\LinkPager' => YII_PATH . '/widgets/LinkPager.php', -'yii\widgets\MaskedInput' => YII_PATH . '/widgets/MaskedInput.php', -'yii\widgets\InputWidget' => YII_PATH . '/widgets/InputWidget.php', -'yii\widgets\ActiveForm' => YII_PATH . '/widgets/ActiveForm.php', -'yii\widgets\ContentDecorator' => YII_PATH . '/widgets/ContentDecorator.php', -'yii\widgets\Breadcrumbs' => YII_PATH . '/widgets/Breadcrumbs.php', -'yii\widgets\Block' => YII_PATH . '/widgets/Block.php', -'yii\widgets\FragmentCache' => YII_PATH . '/widgets/FragmentCache.php', -'yii\widgets\Menu' => YII_PATH . '/widgets/Menu.php', -'yii\rbac\PhpManager' => YII_PATH . '/rbac/PhpManager.php', -'yii\rbac\Item' => YII_PATH . '/rbac/Item.php', -'yii\rbac\Manager' => YII_PATH . '/rbac/Manager.php', -'yii\rbac\Assignment' => YII_PATH . '/rbac/Assignment.php', -'yii\rbac\DbManager' => YII_PATH . '/rbac/DbManager.php', -'yii\behaviors\AutoTimestamp' => YII_PATH . '/behaviors/AutoTimestamp.php', -'yii\caching\Cache' => YII_PATH . '/caching/Cache.php', -'yii\caching\XCache' => YII_PATH . '/caching/XCache.php', -'yii\caching\DbDependency' => YII_PATH . '/caching/DbDependency.php', -'yii\caching\DbCache' => YII_PATH . '/caching/DbCache.php', -'yii\caching\Dependency' => YII_PATH . '/caching/Dependency.php', -'yii\caching\ApcCache' => YII_PATH . '/caching/ApcCache.php', -'yii\caching\MemCacheServer' => YII_PATH . '/caching/MemCacheServer.php', -'yii\caching\ZendDataCache' => YII_PATH . '/caching/ZendDataCache.php', -'yii\caching\MemCache' => YII_PATH . '/caching/MemCache.php', -'yii\caching\GroupDependency' => YII_PATH . '/caching/GroupDependency.php', -'yii\caching\ChainedDependency' => YII_PATH . '/caching/ChainedDependency.php', -'yii\caching\WinCache' => YII_PATH . '/caching/WinCache.php', -'yii\caching\FileCache' => YII_PATH . '/caching/FileCache.php', -'yii\caching\FileDependency' => YII_PATH . '/caching/FileDependency.php', -'yii\caching\ExpressionDependency' => YII_PATH . '/caching/ExpressionDependency.php', -'yii\caching\DummyCache' => YII_PATH . '/caching/DummyCache.php', -'yii\i18n\Formatter' => YII_PATH . '/i18n/Formatter.php', -'yii\i18n\GettextFile' => YII_PATH . '/i18n/GettextFile.php', -'yii\i18n\I18N' => YII_PATH . '/i18n/I18N.php', -'yii\i18n\PhpMessageSource' => YII_PATH . '/i18n/PhpMessageSource.php', -'yii\i18n\GettextPoFile' => YII_PATH . '/i18n/GettextPoFile.php', -'yii\i18n\data\plurals' => YII_PATH . '/i18n/data/plurals.php', -'yii\i18n\DbMessageSource' => YII_PATH . '/i18n/DbMessageSource.php', -'yii\i18n\GettextMessageSource' => YII_PATH . '/i18n/GettextMessageSource.php', -'yii\i18n\MessageSource' => YII_PATH . '/i18n/MessageSource.php', -'yii\i18n\MissingTranslationEvent' => YII_PATH . '/i18n/MissingTranslationEvent.php', -'yii\i18n\GettextMoFile' => YII_PATH . '/i18n/GettextMoFile.php', -'yii\data\Pagination' => YII_PATH . '/data/Pagination.php', -'yii\data\Sort' => YII_PATH . '/data/Sort.php', -'yii\validators\RequiredValidator' => YII_PATH . '/validators/RequiredValidator.php', -'yii\validators\NumberValidator' => YII_PATH . '/validators/NumberValidator.php', -'yii\validators\BooleanValidator' => YII_PATH . '/validators/BooleanValidator.php', -'yii\validators\UniqueValidator' => YII_PATH . '/validators/UniqueValidator.php', -'yii\validators\StringValidator' => YII_PATH . '/validators/StringValidator.php', -'yii\validators\UrlValidator' => YII_PATH . '/validators/UrlValidator.php', -'yii\validators\EmailValidator' => YII_PATH . '/validators/EmailValidator.php', -'yii\validators\CaptchaValidator' => YII_PATH . '/validators/CaptchaValidator.php', -'yii\validators\DefaultValueValidator' => YII_PATH . '/validators/DefaultValueValidator.php', -'yii\validators\CompareValidator' => YII_PATH . '/validators/CompareValidator.php', -'yii\validators\RangeValidator' => YII_PATH . '/validators/RangeValidator.php', -'yii\validators\Validator' => YII_PATH . '/validators/Validator.php', -'yii\validators\FilterValidator' => YII_PATH . '/validators/FilterValidator.php', -'yii\validators\FileValidator' => YII_PATH . '/validators/FileValidator.php', -'yii\validators\RegularExpressionValidator' => YII_PATH . '/validators/RegularExpressionValidator.php', -'yii\validators\InlineValidator' => YII_PATH . '/validators/InlineValidator.php', -'yii\validators\DateValidator' => YII_PATH . '/validators/DateValidator.php', -'yii\validators\ExistValidator' => YII_PATH . '/validators/ExistValidator.php', -'yii\base\Formatter' => YII_PATH . '/base/Formatter.php', -'yii\base\UnknownMethodException' => YII_PATH . '/base/UnknownMethodException.php', -'yii\base\Application' => YII_PATH . '/base/Application.php', -'yii\base\ErrorException' => YII_PATH . '/base/ErrorException.php', -'yii\base\ActionEvent' => YII_PATH . '/base/ActionEvent.php', -'yii\base\UserException' => YII_PATH . '/base/UserException.php', -'yii\base\Module' => YII_PATH . '/base/Module.php', -'yii\base\ViewEvent' => YII_PATH . '/base/ViewEvent.php', -'yii\base\Action' => YII_PATH . '/base/Action.php', -'yii\base\ViewRenderer' => YII_PATH . '/base/ViewRenderer.php', -'yii\base\ActionFilter' => YII_PATH . '/base/ActionFilter.php', -'yii\base\Theme' => YII_PATH . '/base/Theme.php', -'yii\base\Controller' => YII_PATH . '/base/Controller.php', -'yii\base\View' => YII_PATH . '/base/View.php', -'yii\base\UnknownClassException' => YII_PATH . '/base/UnknownClassException.php', -'yii\base\ErrorHandler' => YII_PATH . '/base/ErrorHandler.php', -'yii\base\Request' => YII_PATH . '/base/Request.php', -'yii\base\Object' => YII_PATH . '/base/Object.php', -'yii\base\Behavior' => YII_PATH . '/base/Behavior.php', -'yii\base\Exception' => YII_PATH . '/base/Exception.php', -'yii\base\Event' => YII_PATH . '/base/Event.php', -'yii\base\ModelEvent' => YII_PATH . '/base/ModelEvent.php', -'yii\base\InvalidConfigException' => YII_PATH . '/base/InvalidConfigException.php', -'yii\base\Component' => YII_PATH . '/base/Component.php', -'yii\base\Response' => YII_PATH . '/base/Response.php', -'yii\base\InvalidParamException' => YII_PATH . '/base/InvalidParamException.php', -'yii\base\Model' => YII_PATH . '/base/Model.php', -'yii\base\UnknownPropertyException' => YII_PATH . '/base/UnknownPropertyException.php', -'yii\base\Arrayable' => YII_PATH . '/base/Arrayable.php', -'yii\base\InvalidRouteException' => YII_PATH . '/base/InvalidRouteException.php', -'yii\base\InlineAction' => YII_PATH . '/base/InlineAction.php', -'yii\base\NotSupportedException' => YII_PATH . '/base/NotSupportedException.php', -'yii\base\Widget' => YII_PATH . '/base/Widget.php', -'yii\base\InvalidCallException' => YII_PATH . '/base/InvalidCallException.php', -'yii\helpers\VarDumper' => YII_PATH . '/helpers/VarDumper.php', -'yii\helpers\FileHelper' => YII_PATH . '/helpers/FileHelper.php', -'yii\helpers\Console' => YII_PATH . '/helpers/Console.php', -'yii\helpers\HtmlPurifier' => YII_PATH . '/helpers/HtmlPurifier.php', -'yii\helpers\SecurityHelper' => YII_PATH . '/helpers/SecurityHelper.php', -'yii\helpers\Inflector' => YII_PATH . '/helpers/Inflector.php', -'yii\helpers\Markdown' => YII_PATH . '/helpers/Markdown.php', -'yii\helpers\Html' => YII_PATH . '/helpers/Html.php', -'yii\helpers\base\VarDumper' => YII_PATH . '/helpers/base/VarDumper.php', -'yii\helpers\base\FileHelper' => YII_PATH . '/helpers/base/FileHelper.php', -'yii\helpers\base\Console' => YII_PATH . '/helpers/base/Console.php', -'yii\helpers\base\HtmlPurifier' => YII_PATH . '/helpers/base/HtmlPurifier.php', -'yii\helpers\base\SecurityHelper' => YII_PATH . '/helpers/base/SecurityHelper.php', -'yii\helpers\base\Inflector' => YII_PATH . '/helpers/base/Inflector.php', -'yii\helpers\base\Markdown' => YII_PATH . '/helpers/base/Markdown.php', -'yii\helpers\base\Html' => YII_PATH . '/helpers/base/Html.php', -'yii\helpers\base\StringHelper' => YII_PATH . '/helpers/base/StringHelper.php', -'yii\helpers\base\Json' => YII_PATH . '/helpers/base/Json.php', -'yii\helpers\base\ArrayHelper' => YII_PATH . '/helpers/base/ArrayHelper.php', -'yii\helpers\StringHelper' => YII_PATH . '/helpers/StringHelper.php', -'yii\helpers\Json' => YII_PATH . '/helpers/Json.php', -'yii\helpers\ArrayHelper' => YII_PATH . '/helpers/ArrayHelper.php', -'yii\bootstrap\Collapse' => YII_PATH . '/bootstrap/Collapse.php', -'yii\bootstrap\Progress' => YII_PATH . '/bootstrap/Progress.php', -'yii\bootstrap\Dropdown' => YII_PATH . '/bootstrap/Dropdown.php', -'yii\bootstrap\Alert' => YII_PATH . '/bootstrap/Alert.php', -'yii\bootstrap\Carousel' => YII_PATH . '/bootstrap/Carousel.php', -'yii\bootstrap\NavBar' => YII_PATH . '/bootstrap/NavBar.php', -'yii\bootstrap\Button' => YII_PATH . '/bootstrap/Button.php', -'yii\bootstrap\Modal' => YII_PATH . '/bootstrap/Modal.php', -'yii\bootstrap\TypeAhead' => YII_PATH . '/bootstrap/TypeAhead.php', -'yii\bootstrap\ButtonDropdown' => YII_PATH . '/bootstrap/ButtonDropdown.php', -'yii\bootstrap\ButtonGroup' => YII_PATH . '/bootstrap/ButtonGroup.php', -'yii\bootstrap\Nav' => YII_PATH . '/bootstrap/Nav.php', -'yii\bootstrap\Widget' => YII_PATH . '/bootstrap/Widget.php', -'yii\bootstrap\Tabs' => YII_PATH . '/bootstrap/Tabs.php', -'yii\jui\DatePicker' => YII_PATH . '/jui/DatePicker.php', -'yii\jui\Accordion' => YII_PATH . '/jui/Accordion.php', -'yii\jui\Spinner' => YII_PATH . '/jui/Spinner.php', -'yii\jui\InputWidget' => YII_PATH . '/jui/InputWidget.php', -'yii\jui\Droppable' => YII_PATH . '/jui/Droppable.php', -'yii\jui\ProgressBar' => YII_PATH . '/jui/ProgressBar.php', -'yii\jui\Draggable' => YII_PATH . '/jui/Draggable.php', -'yii\jui\AutoComplete' => YII_PATH . '/jui/AutoComplete.php', -'yii\jui\Dialog' => YII_PATH . '/jui/Dialog.php', -'yii\jui\Selectable' => YII_PATH . '/jui/Selectable.php', -'yii\jui\assets' => YII_PATH . '/jui/assets.php', -'yii\jui\Widget' => YII_PATH . '/jui/Widget.php', -'yii\jui\Sortable' => YII_PATH . '/jui/Sortable.php', -'yii\jui\Menu' => YII_PATH . '/jui/Menu.php', -'yii\jui\Resizable' => YII_PATH . '/jui/Resizable.php', -'yii\jui\Tabs' => YII_PATH . '/jui/Tabs.php', -'yii\console\Application' => YII_PATH . '/console/Application.php', -'yii\console\Controller' => YII_PATH . '/console/Controller.php', -'yii\console\Request' => YII_PATH . '/console/Request.php', -'yii\console\Exception' => YII_PATH . '/console/Exception.php', -'yii\console\controllers\AssetController' => YII_PATH . '/console/controllers/AssetController.php', -'yii\console\controllers\MessageController' => YII_PATH . '/console/controllers/MessageController.php', -'yii\console\controllers\MigrateController' => YII_PATH . '/console/controllers/MigrateController.php', -'yii\console\controllers\HelpController' => YII_PATH . '/console/controllers/HelpController.php', -'yii\console\controllers\CacheController' => YII_PATH . '/console/controllers/CacheController.php', -'yii\console\Response' => YII_PATH . '/console/Response.php', -'yii\db\StaleObjectException' => YII_PATH . '/db/StaleObjectException.php', -'yii\db\Connection' => YII_PATH . '/db/Connection.php', -'yii\db\Expression' => YII_PATH . '/db/Expression.php', -'yii\db\TableSchema' => YII_PATH . '/db/TableSchema.php', -'yii\db\Transaction' => YII_PATH . '/db/Transaction.php', -'yii\db\QueryBuilder' => YII_PATH . '/db/QueryBuilder.php', -'yii\db\Command' => YII_PATH . '/db/Command.php', -'yii\db\Schema' => YII_PATH . '/db/Schema.php', -'yii\db\ActiveRelation' => YII_PATH . '/db/ActiveRelation.php', -'yii\db\pgsql\QueryBuilder' => YII_PATH . '/db/pgsql/QueryBuilder.php', -'yii\db\pgsql\Schema' => YII_PATH . '/db/pgsql/Schema.php', -'yii\db\Exception' => YII_PATH . '/db/Exception.php', -'yii\db\sqlite\QueryBuilder' => YII_PATH . '/db/sqlite/QueryBuilder.php', -'yii\db\sqlite\Schema' => YII_PATH . '/db/sqlite/Schema.php', -'yii\db\ColumnSchema' => YII_PATH . '/db/ColumnSchema.php', -'yii\db\mysql\QueryBuilder' => YII_PATH . '/db/mysql/QueryBuilder.php', -'yii\db\mysql\Schema' => YII_PATH . '/db/mysql/Schema.php', -'yii\db\DataReader' => YII_PATH . '/db/DataReader.php', -'yii\db\ActiveQuery' => YII_PATH . '/db/ActiveQuery.php', -'yii\db\mssql\PDO' => YII_PATH . '/db/mssql/PDO.php', -'yii\db\mssql\QueryBuilder' => YII_PATH . '/db/mssql/QueryBuilder.php', -'yii\db\mssql\Schema' => YII_PATH . '/db/mssql/Schema.php', -'yii\db\mssql\SqlsrvPDO' => YII_PATH . '/db/mssql/SqlsrvPDO.php', -'yii\db\Migration' => YII_PATH . '/db/Migration.php', -'yii\db\Query' => YII_PATH . '/db/Query.php', -'yii\db\ActiveRecord' => YII_PATH . '/db/ActiveRecord.php', + 'yii\base\Action' => YII_PATH . '/base/Action.php', + 'yii\base\ActionEvent' => YII_PATH . '/base/ActionEvent.php', + 'yii\base\ActionFilter' => YII_PATH . '/base/ActionFilter.php', + 'yii\base\Application' => YII_PATH . '/base/Application.php', + 'yii\base\Arrayable' => YII_PATH . '/base/Arrayable.php', + 'yii\base\Behavior' => YII_PATH . '/base/Behavior.php', + 'yii\base\Component' => YII_PATH . '/base/Component.php', + 'yii\base\Controller' => YII_PATH . '/base/Controller.php', + 'yii\base\ErrorException' => YII_PATH . '/base/ErrorException.php', + 'yii\base\ErrorHandler' => YII_PATH . '/base/ErrorHandler.php', + 'yii\base\Event' => YII_PATH . '/base/Event.php', + 'yii\base\Exception' => YII_PATH . '/base/Exception.php', + 'yii\base\Formatter' => YII_PATH . '/base/Formatter.php', + 'yii\base\InlineAction' => YII_PATH . '/base/InlineAction.php', + 'yii\base\InvalidCallException' => YII_PATH . '/base/InvalidCallException.php', + 'yii\base\InvalidConfigException' => YII_PATH . '/base/InvalidConfigException.php', + 'yii\base\InvalidParamException' => YII_PATH . '/base/InvalidParamException.php', + 'yii\base\InvalidRouteException' => YII_PATH . '/base/InvalidRouteException.php', + 'yii\base\Model' => YII_PATH . '/base/Model.php', + 'yii\base\ModelEvent' => YII_PATH . '/base/ModelEvent.php', + 'yii\base\Module' => YII_PATH . '/base/Module.php', + 'yii\base\NotSupportedException' => YII_PATH . '/base/NotSupportedException.php', + 'yii\base\Object' => YII_PATH . '/base/Object.php', + 'yii\base\Request' => YII_PATH . '/base/Request.php', + 'yii\base\Response' => YII_PATH . '/base/Response.php', + 'yii\base\Theme' => YII_PATH . '/base/Theme.php', + 'yii\base\UnknownClassException' => YII_PATH . '/base/UnknownClassException.php', + 'yii\base\UnknownMethodException' => YII_PATH . '/base/UnknownMethodException.php', + 'yii\base\UnknownPropertyException' => YII_PATH . '/base/UnknownPropertyException.php', + 'yii\base\UserException' => YII_PATH . '/base/UserException.php', + 'yii\base\View' => YII_PATH . '/base/View.php', + 'yii\base\ViewEvent' => YII_PATH . '/base/ViewEvent.php', + 'yii\base\ViewRenderer' => YII_PATH . '/base/ViewRenderer.php', + 'yii\base\Widget' => YII_PATH . '/base/Widget.php', + 'yii\behaviors\AutoTimestamp' => YII_PATH . '/behaviors/AutoTimestamp.php', + 'yii\bootstrap\Alert' => YII_PATH . '/bootstrap/Alert.php', + 'yii\bootstrap\Button' => YII_PATH . '/bootstrap/Button.php', + 'yii\bootstrap\ButtonDropdown' => YII_PATH . '/bootstrap/ButtonDropdown.php', + 'yii\bootstrap\ButtonGroup' => YII_PATH . '/bootstrap/ButtonGroup.php', + 'yii\bootstrap\Carousel' => YII_PATH . '/bootstrap/Carousel.php', + 'yii\bootstrap\Collapse' => YII_PATH . '/bootstrap/Collapse.php', + 'yii\bootstrap\Dropdown' => YII_PATH . '/bootstrap/Dropdown.php', + 'yii\bootstrap\Modal' => YII_PATH . '/bootstrap/Modal.php', + 'yii\bootstrap\Nav' => YII_PATH . '/bootstrap/Nav.php', + 'yii\bootstrap\NavBar' => YII_PATH . '/bootstrap/NavBar.php', + 'yii\bootstrap\Progress' => YII_PATH . '/bootstrap/Progress.php', + 'yii\bootstrap\Tabs' => YII_PATH . '/bootstrap/Tabs.php', + 'yii\bootstrap\TypeAhead' => YII_PATH . '/bootstrap/TypeAhead.php', + 'yii\bootstrap\Widget' => YII_PATH . '/bootstrap/Widget.php', + 'yii\caching\ApcCache' => YII_PATH . '/caching/ApcCache.php', + 'yii\caching\Cache' => YII_PATH . '/caching/Cache.php', + 'yii\caching\ChainedDependency' => YII_PATH . '/caching/ChainedDependency.php', + 'yii\caching\DbCache' => YII_PATH . '/caching/DbCache.php', + 'yii\caching\DbDependency' => YII_PATH . '/caching/DbDependency.php', + 'yii\caching\Dependency' => YII_PATH . '/caching/Dependency.php', + 'yii\caching\DummyCache' => YII_PATH . '/caching/DummyCache.php', + 'yii\caching\ExpressionDependency' => YII_PATH . '/caching/ExpressionDependency.php', + 'yii\caching\FileCache' => YII_PATH . '/caching/FileCache.php', + 'yii\caching\FileDependency' => YII_PATH . '/caching/FileDependency.php', + 'yii\caching\GroupDependency' => YII_PATH . '/caching/GroupDependency.php', + 'yii\caching\MemCache' => YII_PATH . '/caching/MemCache.php', + 'yii\caching\MemCacheServer' => YII_PATH . '/caching/MemCacheServer.php', + 'yii\caching\WinCache' => YII_PATH . '/caching/WinCache.php', + 'yii\caching\XCache' => YII_PATH . '/caching/XCache.php', + 'yii\caching\ZendDataCache' => YII_PATH . '/caching/ZendDataCache.php', + 'yii\data\ActiveDataProvider' => YII_PATH . '/data/ActiveDataProvider.php', + 'yii\data\ArrayDataProvider' => YII_PATH . '/data/ArrayDataProvider.php', + 'yii\data\DataProvider' => YII_PATH . '/data/DataProvider.php', + 'yii\data\IDataProvider' => YII_PATH . '/data/IDataProvider.php', + 'yii\data\Pagination' => YII_PATH . '/data/Pagination.php', + 'yii\data\Sort' => YII_PATH . '/data/Sort.php', + 'yii\db\ActiveQuery' => YII_PATH . '/db/ActiveQuery.php', + 'yii\db\ActiveRecord' => YII_PATH . '/db/ActiveRecord.php', + 'yii\db\ActiveRelation' => YII_PATH . '/db/ActiveRelation.php', + 'yii\db\ColumnSchema' => YII_PATH . '/db/ColumnSchema.php', + 'yii\db\Command' => YII_PATH . '/db/Command.php', + 'yii\db\Connection' => YII_PATH . '/db/Connection.php', + 'yii\db\DataReader' => YII_PATH . '/db/DataReader.php', + 'yii\db\Exception' => YII_PATH . '/db/Exception.php', + 'yii\db\Expression' => YII_PATH . '/db/Expression.php', + 'yii\db\Migration' => YII_PATH . '/db/Migration.php', + 'yii\db\mssql\PDO' => YII_PATH . '/db/mssql/PDO.php', + 'yii\db\mssql\QueryBuilder' => YII_PATH . '/db/mssql/QueryBuilder.php', + 'yii\db\mssql\Schema' => YII_PATH . '/db/mssql/Schema.php', + 'yii\db\mssql\SqlsrvPDO' => YII_PATH . '/db/mssql/SqlsrvPDO.php', + 'yii\db\mysql\QueryBuilder' => YII_PATH . '/db/mysql/QueryBuilder.php', + 'yii\db\mysql\Schema' => YII_PATH . '/db/mysql/Schema.php', + 'yii\db\pgsql\QueryBuilder' => YII_PATH . '/db/pgsql/QueryBuilder.php', + 'yii\db\pgsql\Schema' => YII_PATH . '/db/pgsql/Schema.php', + 'yii\db\Query' => YII_PATH . '/db/Query.php', + 'yii\db\QueryBuilder' => YII_PATH . '/db/QueryBuilder.php', + 'yii\db\Schema' => YII_PATH . '/db/Schema.php', + 'yii\db\sqlite\QueryBuilder' => YII_PATH . '/db/sqlite/QueryBuilder.php', + 'yii\db\sqlite\Schema' => YII_PATH . '/db/sqlite/Schema.php', + 'yii\db\StaleObjectException' => YII_PATH . '/db/StaleObjectException.php', + 'yii\db\TableSchema' => YII_PATH . '/db/TableSchema.php', + 'yii\db\Transaction' => YII_PATH . '/db/Transaction.php', + 'yii\helpers\ArrayHelper' => YII_PATH . '/helpers/ArrayHelper.php', + 'yii\helpers\base\ArrayHelper' => YII_PATH . '/helpers/base/ArrayHelper.php', + 'yii\helpers\base\Console' => YII_PATH . '/helpers/base/Console.php', + 'yii\helpers\base\FileHelper' => YII_PATH . '/helpers/base/FileHelper.php', + 'yii\helpers\base\Html' => YII_PATH . '/helpers/base/Html.php', + 'yii\helpers\base\HtmlPurifier' => YII_PATH . '/helpers/base/HtmlPurifier.php', + 'yii\helpers\base\Inflector' => YII_PATH . '/helpers/base/Inflector.php', + 'yii\helpers\base\Json' => YII_PATH . '/helpers/base/Json.php', + 'yii\helpers\base\Markdown' => YII_PATH . '/helpers/base/Markdown.php', + 'yii\helpers\base\SecurityHelper' => YII_PATH . '/helpers/base/SecurityHelper.php', + 'yii\helpers\base\StringHelper' => YII_PATH . '/helpers/base/StringHelper.php', + 'yii\helpers\base\VarDumper' => YII_PATH . '/helpers/base/VarDumper.php', + 'yii\helpers\Console' => YII_PATH . '/helpers/Console.php', + 'yii\helpers\FileHelper' => YII_PATH . '/helpers/FileHelper.php', + 'yii\helpers\Html' => YII_PATH . '/helpers/Html.php', + 'yii\helpers\HtmlPurifier' => YII_PATH . '/helpers/HtmlPurifier.php', + 'yii\helpers\Inflector' => YII_PATH . '/helpers/Inflector.php', + 'yii\helpers\Json' => YII_PATH . '/helpers/Json.php', + 'yii\helpers\Markdown' => YII_PATH . '/helpers/Markdown.php', + 'yii\helpers\SecurityHelper' => YII_PATH . '/helpers/SecurityHelper.php', + 'yii\helpers\StringHelper' => YII_PATH . '/helpers/StringHelper.php', + 'yii\helpers\VarDumper' => YII_PATH . '/helpers/VarDumper.php', + 'yii\i18n\DbMessageSource' => YII_PATH . '/i18n/DbMessageSource.php', + 'yii\i18n\Formatter' => YII_PATH . '/i18n/Formatter.php', + 'yii\i18n\GettextFile' => YII_PATH . '/i18n/GettextFile.php', + 'yii\i18n\GettextMessageSource' => YII_PATH . '/i18n/GettextMessageSource.php', + 'yii\i18n\GettextMoFile' => YII_PATH . '/i18n/GettextMoFile.php', + 'yii\i18n\GettextPoFile' => YII_PATH . '/i18n/GettextPoFile.php', + 'yii\i18n\I18N' => YII_PATH . '/i18n/I18N.php', + 'yii\i18n\MessageSource' => YII_PATH . '/i18n/MessageSource.php', + 'yii\i18n\MissingTranslationEvent' => YII_PATH . '/i18n/MissingTranslationEvent.php', + 'yii\i18n\PhpMessageSource' => YII_PATH . '/i18n/PhpMessageSource.php', + 'yii\log\DbTarget' => YII_PATH . '/log/DbTarget.php', + 'yii\log\EmailTarget' => YII_PATH . '/log/EmailTarget.php', + 'yii\log\FileTarget' => YII_PATH . '/log/FileTarget.php', + 'yii\log\Logger' => YII_PATH . '/log/Logger.php', + 'yii\log\Target' => YII_PATH . '/log/Target.php', + 'yii\rbac\Assignment' => YII_PATH . '/rbac/Assignment.php', + 'yii\rbac\DbManager' => YII_PATH . '/rbac/DbManager.php', + 'yii\rbac\Item' => YII_PATH . '/rbac/Item.php', + 'yii\rbac\Manager' => YII_PATH . '/rbac/Manager.php', + 'yii\rbac\PhpManager' => YII_PATH . '/rbac/PhpManager.php', + 'yii\requirements\YiiRequirementChecker' => YII_PATH . '/requirements/YiiRequirementChecker.php', + 'yii\validators\BooleanValidator' => YII_PATH . '/validators/BooleanValidator.php', + 'yii\validators\CaptchaValidator' => YII_PATH . '/validators/CaptchaValidator.php', + 'yii\validators\CompareValidator' => YII_PATH . '/validators/CompareValidator.php', + 'yii\validators\DateValidator' => YII_PATH . '/validators/DateValidator.php', + 'yii\validators\DefaultValueValidator' => YII_PATH . '/validators/DefaultValueValidator.php', + 'yii\validators\EmailValidator' => YII_PATH . '/validators/EmailValidator.php', + 'yii\validators\ExistValidator' => YII_PATH . '/validators/ExistValidator.php', + 'yii\validators\FileValidator' => YII_PATH . '/validators/FileValidator.php', + 'yii\validators\FilterValidator' => YII_PATH . '/validators/FilterValidator.php', + 'yii\validators\InlineValidator' => YII_PATH . '/validators/InlineValidator.php', + 'yii\validators\NumberValidator' => YII_PATH . '/validators/NumberValidator.php', + 'yii\validators\RangeValidator' => YII_PATH . '/validators/RangeValidator.php', + 'yii\validators\RegularExpressionValidator' => YII_PATH . '/validators/RegularExpressionValidator.php', + 'yii\validators\RequiredValidator' => YII_PATH . '/validators/RequiredValidator.php', + 'yii\validators\StringValidator' => YII_PATH . '/validators/StringValidator.php', + 'yii\validators\UniqueValidator' => YII_PATH . '/validators/UniqueValidator.php', + 'yii\validators\UrlValidator' => YII_PATH . '/validators/UrlValidator.php', + 'yii\validators\Validator' => YII_PATH . '/validators/Validator.php', + 'yii\web\AccessControl' => YII_PATH . '/web/AccessControl.php', + 'yii\web\AccessRule' => YII_PATH . '/web/AccessRule.php', + 'yii\web\Application' => YII_PATH . '/web/Application.php', + 'yii\web\AssetBundle' => YII_PATH . '/web/AssetBundle.php', + 'yii\web\AssetConverter' => YII_PATH . '/web/AssetConverter.php', + 'yii\web\AssetManager' => YII_PATH . '/web/AssetManager.php', + 'yii\web\CacheSession' => YII_PATH . '/web/CacheSession.php', + 'yii\web\CaptchaAction' => YII_PATH . '/web/CaptchaAction.php', + 'yii\web\Controller' => YII_PATH . '/web/Controller.php', + 'yii\web\Cookie' => YII_PATH . '/web/Cookie.php', + 'yii\web\CookieCollection' => YII_PATH . '/web/CookieCollection.php', + 'yii\web\DbSession' => YII_PATH . '/web/DbSession.php', + 'yii\web\HeaderCollection' => YII_PATH . '/web/HeaderCollection.php', + 'yii\web\HttpCache' => YII_PATH . '/web/HttpCache.php', + 'yii\web\HttpException' => YII_PATH . '/web/HttpException.php', + 'yii\web\IAssetConverter' => YII_PATH . '/web/IAssetConverter.php', + 'yii\web\Identity' => YII_PATH . '/web/Identity.php', + 'yii\web\JsExpression' => YII_PATH . '/web/JsExpression.php', + 'yii\web\PageCache' => YII_PATH . '/web/PageCache.php', + 'yii\web\Request' => YII_PATH . '/web/Request.php', + 'yii\web\Response' => YII_PATH . '/web/Response.php', + 'yii\web\ResponseEvent' => YII_PATH . '/web/ResponseEvent.php', + 'yii\web\ResponseFormatter' => YII_PATH . '/web/ResponseFormatter.php', + 'yii\web\Session' => YII_PATH . '/web/Session.php', + 'yii\web\SessionIterator' => YII_PATH . '/web/SessionIterator.php', + 'yii\web\UploadedFile' => YII_PATH . '/web/UploadedFile.php', + 'yii\web\UrlManager' => YII_PATH . '/web/UrlManager.php', + 'yii\web\UrlRule' => YII_PATH . '/web/UrlRule.php', + 'yii\web\User' => YII_PATH . '/web/User.php', + 'yii\web\UserEvent' => YII_PATH . '/web/UserEvent.php', + 'yii\web\VerbFilter' => YII_PATH . '/web/VerbFilter.php', + 'yii\web\XmlResponseFormatter' => YII_PATH . '/web/XmlResponseFormatter.php', + 'yii\widgets\ActiveField' => YII_PATH . '/widgets/ActiveField.php', + 'yii\widgets\ActiveForm' => YII_PATH . '/widgets/ActiveForm.php', + 'yii\widgets\BaseListView' => YII_PATH . '/widgets/BaseListView.php', + 'yii\widgets\Block' => YII_PATH . '/widgets/Block.php', + 'yii\widgets\Breadcrumbs' => YII_PATH . '/widgets/Breadcrumbs.php', + 'yii\widgets\Captcha' => YII_PATH . '/widgets/Captcha.php', + 'yii\widgets\ContentDecorator' => YII_PATH . '/widgets/ContentDecorator.php', + 'yii\widgets\DetailView' => YII_PATH . '/widgets/DetailView.php', + 'yii\widgets\FragmentCache' => YII_PATH . '/widgets/FragmentCache.php', + 'yii\widgets\InputWidget' => YII_PATH . '/widgets/InputWidget.php', + 'yii\widgets\LinkPager' => YII_PATH . '/widgets/LinkPager.php', + 'yii\widgets\ListPager' => YII_PATH . '/widgets/ListPager.php', + 'yii\widgets\ListView' => YII_PATH . '/widgets/ListView.php', + 'yii\widgets\MaskedInput' => YII_PATH . '/widgets/MaskedInput.php', + 'yii\widgets\Menu' => YII_PATH . '/widgets/Menu.php', + 'yii\widgets\Spaceless' => YII_PATH . '/widgets/Spaceless.php', ); diff --git a/framework/yii/data/Pagination.php b/framework/yii/data/Pagination.php index adc3730..9496795 100644 --- a/framework/yii/data/Pagination.php +++ b/framework/yii/data/Pagination.php @@ -48,7 +48,7 @@ use yii\base\Object; * } * * // display pagination - * LinkPager::widget(array( + * echo LinkPager::widget(array( * 'pagination' => $pages, * )); * ~~~ diff --git a/framework/yii/db/Query.php b/framework/yii/db/Query.php index 74633f7..f1eb7a3 100644 --- a/framework/yii/db/Query.php +++ b/framework/yii/db/Query.php @@ -130,6 +130,13 @@ class Query extends Component * For example, `array(':name' => 'Dan', ':age' => 31)`. */ public $params; + /** + * @var string|callable $column the name of the column by which the query results should be indexed by. + * This can also be a callable (e.g. anonymous function) that returns the index value based on the given + * row data. For more details, see [[indexBy()]]. This property is only used by [[all()]]. + */ + public $indexBy; + /** * Creates a DB command that can be used to execute this query. @@ -147,6 +154,27 @@ class Query extends Component } /** + * Sets the [[indexBy]] property. + * @param string|callable $column the name of the column by which the query results should be indexed by. + * This can also be a callable (e.g. anonymous function) that returns the index value based on the given + * row data. The signature of the callable should be: + * + * ~~~ + * function ($row) + * { + * // return the index value corresponding to $row + * } + * ~~~ + * + * @return Query the query object itself + */ + public function indexBy($column) + { + $this->indexBy = $column; + return $this; + } + + /** * Executes the query and returns all results as an array. * @param Connection $db the database connection used to generate the SQL statement. * If this parameter is not given, the `db` application component will be used. @@ -154,7 +182,20 @@ class Query extends Component */ public function all($db = null) { - return $this->createCommand($db)->queryAll(); + $rows = $this->createCommand($db)->queryAll(); + if ($this->indexBy === null) { + return $rows; + } + $result = array(); + foreach ($rows as $row) { + if (is_string($this->indexBy)) { + $key = $row[$this->indexBy]; + } else { + $key = call_user_func($this->indexBy, $row); + } + $result[$key] = $row; + } + return $result; } /** diff --git a/framework/yii/helpers/base/FileHelper.php b/framework/yii/helpers/base/FileHelper.php index 499d3ce..72aa8bf 100644 --- a/framework/yii/helpers/base/FileHelper.php +++ b/framework/yii/helpers/base/FileHelper.php @@ -10,6 +10,7 @@ namespace yii\helpers\base; use Yii; +use yii\helpers\StringHelper as StringHelper2; /** * Filesystem helper @@ -133,16 +134,25 @@ class FileHelper * * - dirMode: integer, the permission to be set for newly copied directories. Defaults to 0777. * - fileMode: integer, the permission to be set for newly copied files. Defaults to the current environment setting. - * - filter: callback, a PHP callback that is called for each sub-directory or file. - * If the callback returns false, then the sub-directory or file will not be copied. - * The signature of the callback should be: `function ($path)`, where `$path` refers the full path to be copied. - * - only: array, list of patterns that the files or directories should match if they want to be copied. - * A path matches a pattern if it contains the pattern string at its end. For example, - * '/a/b' will match all files and directories ending with '/a/b'; and the '.svn' will match all files and - * directories whose name ends with '.svn'. Note, the '/' characters in a pattern matches both '/' and '\'. - * If a file/directory matches a pattern in both "only" and "except", it will NOT be copied. - * - except: array, list of patterns that the files or directories should NOT match if they want to be copied. - * For more details on how to specify the patterns, please refer to the "only" option. + * - filter: callback, a PHP callback that is called for each directory or file. + * The signature of the callback should be: `function ($path)`, where `$path` refers the full path to be filtered. + * The callback can return one of the following values: + * + * * true: the directory or file will be copied (the "only" and "except" options will be ignored) + * * false: the directory or file will NOT be copied (the "only" and "except" options will be ignored) + * * null: the "only" and "except" options will determine whether the directory or file should be copied + * + * - only: array, list of patterns that the file paths should match if they want to be copied. + * A path matches a pattern if it contains the pattern string at its end. + * For example, '.php' matches all file paths ending with '.php'. + * Note, the '/' characters in a pattern matches both '/' and '\' in the paths. + * If a file path matches a pattern in both "only" and "except", it will NOT be copied. + * - except: array, list of patterns that the files or directories should match if they want to be excluded from being copied. + * A path matches a pattern if it contains the pattern string at its end. + * Patterns ending with '/' apply to directory paths only, and patterns not ending with '/' + * apply to file paths only. For example, '/a/b' matches all file paths ending with '/a/b'; + * and '.svn/' matches directory paths ending with '.svn'. Note, the '/' characters in a pattern matches + * both '/' and '\' in the paths. * - recursive: boolean, whether the files under the subdirectories should also be copied. Defaults to true. * - afterCopy: callback, a PHP callback that is called after each sub-directory or file is successfully copied. * The signature of the callback should be: `function ($from, $to)`, where `$from` is the sub-directory or @@ -207,16 +217,25 @@ class FileHelper * @param string $dir the directory under which the files will be looked for. * @param array $options options for file searching. Valid options are: * - * - filter: callback, a PHP callback that is called for each sub-directory or file. - * If the callback returns false, then the sub-directory or file will be excluded from the returning result. + * - filter: callback, a PHP callback that is called for each directory or file. * The signature of the callback should be: `function ($path)`, where `$path` refers the full path to be filtered. - * - only: array, list of patterns that the files or directories should match if they want to be returned. - * A path matches a pattern if it contains the pattern string at its end. For example, - * '/a/b' will match all files and directories ending with '/a/b'; and the '.svn' will match all files and - * directories whose name ends with '.svn'. Note, the '/' characters in a pattern matches both '/' and '\'. - * If a file/directory matches a pattern in both in "only" and "except", it will NOT be returned. - * - except: array, list of patterns that the files or directories should NOT match if they want to be returned. - * For more details on how to specify the patterns, please refer to the "only" option. + * The callback can return one of the following values: + * + * * true: the directory or file will be returned (the "only" and "except" options will be ignored) + * * false: the directory or file will NOT be returned (the "only" and "except" options will be ignored) + * * null: the "only" and "except" options will determine whether the directory or file should be returned + * + * - only: array, list of patterns that the file paths should match if they want to be returned. + * A path matches a pattern if it contains the pattern string at its end. + * For example, '.php' matches all file paths ending with '.php'. + * Note, the '/' characters in a pattern matches both '/' and '\' in the paths. + * If a file path matches a pattern in both "only" and "except", it will NOT be returned. + * - except: array, list of patterns that the file paths or directory paths should match if they want to be excluded from the result. + * A path matches a pattern if it contains the pattern string at its end. + * Patterns ending with '/' apply to directory paths only, and patterns not ending with '/' + * apply to file paths only. For example, '/a/b' matches all file paths ending with '/a/b'; + * and '.svn/' matches directory paths ending with '.svn'. Note, the '/' characters in a pattern matches + * both '/' and '\' in the paths. * - recursive: boolean, whether the files under the subdirectories should also be looked for. Defaults to true. * @return array files found under the directory. The file list is sorted. */ @@ -250,24 +269,33 @@ class FileHelper */ public static function filterPath($path, $options) { - if (isset($options['filter']) && !call_user_func($options['filter'], $path)) { - return false; + if (isset($options['filter'])) { + $result = call_user_func($options['filter'], $path); + if (is_bool($result)) { + return $result; + } } $path = str_replace('\\', '/', $path); - $n = \yii\helpers\StringHelper::strlen($path); + if ($isDir = is_dir($path)) { + $path .= '/'; + } + $n = StringHelper2::strlen($path); + if (!empty($options['except'])) { foreach ($options['except'] as $name) { - if (\yii\helpers\StringHelper::substr($path, -\yii\helpers\StringHelper::strlen($name), $n) === $name) { + if (StringHelper2::substr($path, -StringHelper2::strlen($name), $n) === $name) { return false; } } } - if (!empty($options['only'])) { + + if (!$isDir && !empty($options['only'])) { foreach ($options['only'] as $name) { - if (\yii\helpers\StringHelper::substr($path, -\yii\helpers\StringHelper::strlen($name), $n) !== $name) { - return false; + if (StringHelper2::substr($path, -StringHelper2::strlen($name), $n) === $name) { + return true; } } + return false; } return true; }