Please wait ...
diff --git a/extensions/jui/assets/jquery.ui.datepicker-i18n.js b/extensions/jui/assets/jquery.ui.datepicker-i18n.js
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/jquery.ui.effect-all.js b/extensions/jui/assets/jquery.ui.effect-all.js
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/animated-overlay.gif b/extensions/jui/assets/theme/images/animated-overlay.gif
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-bg_flat_0_aaaaaa_40x100.png b/extensions/jui/assets/theme/images/ui-bg_flat_0_aaaaaa_40x100.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-bg_flat_75_ffffff_40x100.png b/extensions/jui/assets/theme/images/ui-bg_flat_75_ffffff_40x100.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-bg_glass_55_fbf9ee_1x400.png b/extensions/jui/assets/theme/images/ui-bg_glass_55_fbf9ee_1x400.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-bg_glass_65_ffffff_1x400.png b/extensions/jui/assets/theme/images/ui-bg_glass_65_ffffff_1x400.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-bg_glass_75_dadada_1x400.png b/extensions/jui/assets/theme/images/ui-bg_glass_75_dadada_1x400.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-bg_glass_75_e6e6e6_1x400.png b/extensions/jui/assets/theme/images/ui-bg_glass_75_e6e6e6_1x400.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-bg_glass_95_fef1ec_1x400.png b/extensions/jui/assets/theme/images/ui-bg_glass_95_fef1ec_1x400.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/extensions/jui/assets/theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-icons_222222_256x240.png b/extensions/jui/assets/theme/images/ui-icons_222222_256x240.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-icons_2e83ff_256x240.png b/extensions/jui/assets/theme/images/ui-icons_2e83ff_256x240.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-icons_454545_256x240.png b/extensions/jui/assets/theme/images/ui-icons_454545_256x240.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-icons_888888_256x240.png b/extensions/jui/assets/theme/images/ui-icons_888888_256x240.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/images/ui-icons_cd0a0a_256x240.png b/extensions/jui/assets/theme/images/ui-icons_cd0a0a_256x240.png
old mode 100755
new mode 100644
diff --git a/extensions/jui/assets/theme/jquery.ui.css b/extensions/jui/assets/theme/jquery.ui.css
old mode 100755
new mode 100644
diff --git a/extensions/mongodb/Collection.php b/extensions/mongodb/Collection.php
index 38144bc1e5..6f595f801c 100644
--- a/extensions/mongodb/Collection.php
+++ b/extensions/mongodb/Collection.php
@@ -260,7 +260,7 @@ class Collection extends Object
}
/**
- * Returns a a single document.
+ * Returns a single document.
* @param array $condition query condition
* @param array $fields fields to be selected
* @return array|null the single document. Null is returned if the query results in nothing.
@@ -271,6 +271,32 @@ class Collection extends Object
return $this->mongoCollection->findOne($this->buildCondition($condition), $fields);
}
+ /**
+ * Updates a document and returns it.
+ * @param array $condition query condition
+ * @param array $update update criteria
+ * @param array $fields fields to be returned
+ * @param array $options list of options in format: optionName => optionValue.
+ * @return array|null the original document, or the modified document when $options['new'] is set.
+ * @throws Exception on failure.
+ * @see http://www.php.net/manual/en/mongocollection.findandmodify.php
+ */
+ public function findAndModify($condition, $update, $fields = [], $options = [])
+ {
+ $condition = $this->buildCondition($condition);
+ $token = $this->composeLogToken('findAndModify', [$condition, $update, $fields, $options]);
+ Yii::info($token, __METHOD__);
+ try {
+ Yii::beginProfile($token, __METHOD__);
+ $result = $this->mongoCollection->findAndModify($condition, $update, $fields, $options);
+ Yii::endProfile($token, __METHOD__);
+ return $result;
+ } catch (\Exception $e) {
+ Yii::endProfile($token, __METHOD__);
+ throw new Exception($e->getMessage(), (int)$e->getCode(), $e);
+ }
+ }
+
/**
* Inserts new data into collection.
* @param array|object $data data to be inserted.
diff --git a/extensions/swiftmailer/Mailer.php b/extensions/swiftmailer/Mailer.php
index 891f2b56c5..8a87ba251e 100644
--- a/extensions/swiftmailer/Mailer.php
+++ b/extensions/swiftmailer/Mailer.php
@@ -19,7 +19,7 @@ use yii\mail\BaseMailer;
* ~~~
* 'components' => [
* ...
- * 'email' => [
+ * 'mail' => [
* 'class' => 'yii\swiftmailer\Mailer',
* 'transport' => [
* 'class' => 'Swift_SmtpTransport',
diff --git a/framework/BaseYii.php b/framework/BaseYii.php
index 9152afc3d3..139aca2785 100644
--- a/framework/BaseYii.php
+++ b/framework/BaseYii.php
@@ -14,37 +14,37 @@ use yii\log\Logger;
/**
* Gets the application start timestamp.
*/
-defined('YII_BEGIN_TIME') or define('YII_BEGIN_TIME', microtime(true));
+defined('YII_BEGIN_TIME') ?: define('YII_BEGIN_TIME', microtime(true));
/**
* This constant defines the framework installation directory.
*/
-defined('YII_PATH') or define('YII_PATH', __DIR__);
+defined('YII_PATH') ?: define('YII_PATH', __DIR__);
/**
* This constant defines whether the application should be in debug mode or not. Defaults to false.
*/
-defined('YII_DEBUG') or define('YII_DEBUG', false);
+defined('YII_DEBUG') ?: define('YII_DEBUG', false);
/**
* This constant defines in which environment the application is running. Defaults to 'prod', meaning production environment.
* You may define this constant in the bootstrap script. The value could be 'prod' (production), 'dev' (development), 'test', 'staging', etc.
*/
-defined('YII_ENV') or define('YII_ENV', 'prod');
+defined('YII_ENV') ?: define('YII_ENV', 'prod');
/**
* Whether the the application is running in production environment
*/
-defined('YII_ENV_PROD') or define('YII_ENV_PROD', YII_ENV === 'prod');
+defined('YII_ENV_PROD') ?: define('YII_ENV_PROD', YII_ENV === 'prod');
/**
* Whether the the application is running in development environment
*/
-defined('YII_ENV_DEV') or define('YII_ENV_DEV', YII_ENV === 'dev');
+defined('YII_ENV_DEV') ?: define('YII_ENV_DEV', YII_ENV === 'dev');
/**
* Whether the the application is running in testing environment
*/
-defined('YII_ENV_TEST') or define('YII_ENV_TEST', YII_ENV === 'test');
+defined('YII_ENV_TEST') ?: define('YII_ENV_TEST', YII_ENV === 'test');
/**
* This constant defines whether error handling should be enabled. Defaults to true.
*/
-defined('YII_ENABLE_ERROR_HANDLER') or define('YII_ENABLE_ERROR_HANDLER', true);
+defined('YII_ENABLE_ERROR_HANDLER') ?: define('YII_ENABLE_ERROR_HANDLER', true);
/**
@@ -356,7 +356,7 @@ class BaseYii
$config = array_merge(static::$objectConfig[$class], $config);
}
- if (($n = func_num_args()) > 1) {
+ if (func_num_args() > 1) {
/** @var \ReflectionClass $reflection */
if (isset($reflections[$class])) {
$reflection = $reflections[$class];
diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md
index e70581170e..776e6ef5b0 100644
--- a/framework/CHANGELOG.md
+++ b/framework/CHANGELOG.md
@@ -49,6 +49,9 @@ Yii Framework 2 Change Log
- Bug #2502: Unclear error message when `$_SERVER['DOCUMENT_ROOT']` is empty (samdark)
- Bug #2519: MessageSource removed translation messages when event handler was bound to `missingTranslation`-event (cebe)
- Bug #2527: Source language for `app` message category was always `en` no matter which application `sourceLanguage` was used (samdark)
+- Bug #2559: Going back on browser history breaks GridView filtering with `Pjax` (tonydspaniard)
+- Bug #2607: `yii message` tool wasn't updating `message` table (mitalcoi)
+- Bug #2624: Html::textArea() should respect "name" option. (qiangxue)
- Bug: Fixed `Call to a member function registerAssetFiles() on a non-object` in case of wrong `sourcePath` for an asset bundle (samdark)
- Bug: Fixed incorrect event name for `yii\jui\Spinner` (samdark)
- Bug: Json::encode() did not handle objects that implement JsonSerializable interface correctly (cebe)
diff --git a/framework/assets/pjax/jquery.pjax.js b/framework/assets/pjax/jquery.pjax.js
index 1934d808f6..7e6e642b2c 100644
--- a/framework/assets/pjax/jquery.pjax.js
+++ b/framework/assets/pjax/jquery.pjax.js
@@ -44,6 +44,8 @@
// event - "click" jQuery.Event
// options - pjax options
//
+// If the click event target has 'data-pjax="0"' attribute, the event is ignored, and no pjax call is made.
+//
// Examples
//
// $(document).on('click', 'a', $.pjax.click)
@@ -61,6 +63,10 @@
var link = event.currentTarget
+ // Ignore links with data-pjax="0"
+ if ($(link).data('pjax')==0)
+ return
+
if (link.tagName.toUpperCase() !== 'A')
throw "$.fn.pjax or $.pjax.click requires an anchor element"
diff --git a/framework/assets/yii.gridView.js b/framework/assets/yii.gridView.js
index 496e3cdea7..ca2b99a278 100644
--- a/framework/assets/yii.gridView.js
+++ b/framework/assets/yii.gridView.js
@@ -26,17 +26,18 @@
filterSelector: undefined
};
+ var gridData = {};
+
var methods = {
init: function (options) {
return this.each(function () {
var $e = $(this);
var settings = $.extend({}, defaults, options || {});
- $e.data('yiiGridView', {
- settings: settings
- });
+ gridData[$e.prop('id')] = {settings: settings};
var enterPressed = false;
- $(settings.filterSelector).on('change.yiiGridView keydown.yiiGridView', function (event) {
+ $(document).off('change.yiiGridView keydown.yiiGridView', settings.filterSelector)
+ .on('change.yiiGridView keydown.yiiGridView', settings.filterSelector, function (event) {
if (event.type === 'keydown') {
if (event.keyCode !== 13) {
return; // only react to enter key
@@ -60,7 +61,7 @@
applyFilter: function () {
var $grid = $(this);
- var settings = $grid.data('yiiGridView').settings;
+ var settings = gridData[$grid.prop('id')].settings;
var data = {};
$.each($(settings.filterSelector).serializeArray(), function () {
data[this.name] = this.value;
@@ -85,15 +86,16 @@
setSelectionColumn: function (options) {
var $grid = $(this);
- var data = $grid.data('yiiGridView');
- data.selectionColumn = options.name;
+ var id = $(this).prop('id');
+ gridData[id].selectionColumn = options.name;
if (!options.multiple) {
return;
}
- $grid.on('click.yiiGridView', "input[name='" + options.checkAll + "']", function () {
+ var inputs = "#" + id + " input[name='" + options.checkAll + "']";
+ $(document).off('click.yiiGridView', inputs).on('click.yiiGridView', inputs, function () {
$grid.find("input[name='" + options.name + "']:enabled").prop('checked', this.checked);
});
- $grid.on('click.yiiGridView', "input[name='" + options.name + "']:enabled", function () {
+ $(document).off('click.yiiGridView', inputs + ":enabled").on('click.yiiGridView', inputs + ":enabled", function () {
var all = $grid.find("input[name='" + options.name + "']").length == $grid.find("input[name='" + options.name + "']:checked").length;
$grid.find("input[name='" + options.checkAll + "']").prop('checked', all);
});
@@ -101,7 +103,7 @@
getSelectedRows: function () {
var $grid = $(this);
- var data = $grid.data('yiiGridView');
+ var data = gridData[$grid.prop('id')];
var keys = [];
if (data.selectionColumn) {
$grid.find("input[name='" + data.selectionColumn + "']:checked").each(function () {
@@ -118,8 +120,9 @@
});
},
- data: function() {
- return this.data('yiiGridView');
+ data: function () {
+ var id = $(this).prop('id');
+ return gridData[id];
}
};
})(window.jQuery);
diff --git a/framework/base/Formatter.php b/framework/base/Formatter.php
index 78fdac8cc4..80c08e1744 100644
--- a/framework/base/Formatter.php
+++ b/framework/base/Formatter.php
@@ -442,17 +442,17 @@ class Formatter extends Component
switch($position) {
case 0:
- return $verbose ? Yii::t('yii','{n, plural, =1{# byte} other{# bytes}}', $params) : Yii::t('yii', '{n} B', $params);
+ return $verbose ? Yii::t('yii', '{n, plural, =1{# byte} other{# bytes}}', $params) : Yii::t('yii', '{n} B', $params);
case 1:
- return $verbose ? Yii::t('yii','{n, plural, =1{# kilobyte} other{# kilobytes}}', $params) : Yii::t('yii','{n} KB', $params);
+ return $verbose ? Yii::t('yii', '{n, plural, =1{# kilobyte} other{# kilobytes}}', $params) : Yii::t('yii', '{n} KB', $params);
case 2:
- return $verbose ? Yii::t('yii','{n, plural, =1{# megabyte} other{# megabytes}}', $params) : Yii::t('yii','{n} MB', $params);
+ return $verbose ? Yii::t('yii', '{n, plural, =1{# megabyte} other{# megabytes}}', $params) : Yii::t('yii', '{n} MB', $params);
case 3:
- return $verbose ? Yii::t('yii','{n, plural, =1{# gigabyte} other{# gigabytes}}', $params) : Yii::t('yii','{n} GB', $params);
+ return $verbose ? Yii::t('yii', '{n, plural, =1{# gigabyte} other{# gigabytes}}', $params) : Yii::t('yii', '{n} GB', $params);
case 4:
- return $verbose ? Yii::t('yii','{n, plural, =1{# terabyte} other{# terabytes}}', $params) : Yii::t('yii','{n} TB', $params);
+ return $verbose ? Yii::t('yii', '{n, plural, =1{# terabyte} other{# terabytes}}', $params) : Yii::t('yii', '{n} TB', $params);
default:
- return $verbose ? Yii::t('yii','{n, plural, =1{# petabyte} other{# petabytes}}', $params) : Yii::t('yii','{n} PB', $params);
+ return $verbose ? Yii::t('yii', '{n, plural, =1{# petabyte} other{# petabytes}}', $params) : Yii::t('yii', '{n} PB', $params);
}
}
}
diff --git a/framework/base/Request.php b/framework/base/Request.php
index b76886ed4a..eb9f805f6d 100644
--- a/framework/base/Request.php
+++ b/framework/base/Request.php
@@ -6,6 +6,7 @@
*/
namespace yii\base;
+
use Yii;
/**
diff --git a/framework/base/Theme.php b/framework/base/Theme.php
index 01a696474b..63382ad639 100644
--- a/framework/base/Theme.php
+++ b/framework/base/Theme.php
@@ -13,7 +13,7 @@ use yii\helpers\FileHelper;
/**
* Theme represents an application theme.
*
- * When [[View]] renders a view file, it will check the [[Application::theme|active theme]]
+ * When [[View]] renders a view file, it will check the [[View::theme|active theme]]
* to see if there is a themed version of the view file exists. If so, the themed version will be rendered instead.
*
* A theme is a directory consisting of view files which are meant to replace their non-themed counterparts.
diff --git a/framework/caching/FileDependency.php b/framework/caching/FileDependency.php
index 11afde36e5..200cdde9bb 100644
--- a/framework/caching/FileDependency.php
+++ b/framework/caching/FileDependency.php
@@ -6,6 +6,7 @@
*/
namespace yii\caching;
+
use yii\base\InvalidConfigException;
/**
diff --git a/framework/caching/GroupDependency.php b/framework/caching/GroupDependency.php
index 1cf7869f27..bcac858f27 100644
--- a/framework/caching/GroupDependency.php
+++ b/framework/caching/GroupDependency.php
@@ -6,6 +6,7 @@
*/
namespace yii\caching;
+
use yii\base\InvalidConfigException;
/**
diff --git a/framework/console/controllers/FixtureController.php b/framework/console/controllers/FixtureController.php
index 858f08f165..c72efd2cda 100644
--- a/framework/console/controllers/FixtureController.php
+++ b/framework/console/controllers/FixtureController.php
@@ -64,7 +64,7 @@ class FixtureController extends Controller
public function globalOptions()
{
return array_merge(parent::globalOptions(), [
- 'namespace','globalFixtures'
+ 'namespace', 'globalFixtures'
]);
}
@@ -74,6 +74,7 @@ class FixtureController extends Controller
* whitespace between names. Note that if you are loading fixtures to storage, for example: database or nosql,
* storage will not be cleared, data will be appended to already existed.
* @param array $fixtures
+ * @param array $except
* @throws \yii\console\Exception
*/
public function actionLoad(array $fixtures, array $except = [])
@@ -99,7 +100,7 @@ class FixtureController extends Controller
}
$filtered = array_diff($foundFixtures, $except);
- $fixtures = $this->getFixturesConfig(array_merge($this->globalFixtures ,$filtered));
+ $fixtures = $this->getFixturesConfig(array_merge($this->globalFixtures, $filtered));
if (!$fixtures) {
throw new Exception('No fixtures were found in namespace: "' . $this->namespace . '"' . '');
@@ -317,5 +318,4 @@ class FixtureController extends Controller
{
return Yii::getAlias('@' . str_replace('\\', '/', $this->namespace));
}
-
}
diff --git a/framework/console/controllers/MessageController.php b/framework/console/controllers/MessageController.php
index 0345b697d8..cb34a38fcb 100644
--- a/framework/console/controllers/MessageController.php
+++ b/framework/console/controllers/MessageController.php
@@ -134,11 +134,14 @@ class MessageController extends Controller
throw new Exception('The "db" option must refer to a valid database application component.');
}
$sourceMessageTable = isset($config['sourceMessageTable']) ? $config['sourceMessageTable'] : '{{%source_message}}';
+ $messageTable = isset($config['messageTable']) ? $config['messageTable'] : '{{%message}}';
$this->saveMessagesToDb(
$messages,
$db,
$sourceMessageTable,
- $config['removeUnused']
+ $messageTable,
+ $config['removeUnused'],
+ $config['languages']
);
}
}
@@ -149,9 +152,11 @@ class MessageController extends Controller
* @param array $messages
* @param \yii\db\Connection $db
* @param string $sourceMessageTable
+ * @param string $messageTable
* @param boolean $removeUnused
+ * @param array $languages
*/
- protected function saveMessagesToDb($messages, $db, $sourceMessageTable, $removeUnused)
+ protected function saveMessagesToDb($messages, $db, $sourceMessageTable, $messageTable, $removeUnused, $languages)
{
$q = new \yii\db\Query;
$current = [];
@@ -190,12 +195,17 @@ class MessageController extends Controller
echo "Inserting new messages...";
$savedFlag = false;
- foreach ($new as $category => $msgs) {
+ foreach ($new as $category => $msgs) {
foreach ($msgs as $m) {
$savedFlag = true;
$db->createCommand()
- ->insert($sourceMessageTable, ['category' => $category, 'message' => $m])->execute();
+ ->insert($sourceMessageTable, ['category' => $category, 'message' => $m])->execute();
+ $lastId = $db->getLastInsertID();
+ foreach ($languages as $language) {
+ $db->createCommand()
+ ->insert($messageTable, ['id' => $lastId, 'language' => $language])->execute();
+ }
}
}
@@ -207,15 +217,20 @@ class MessageController extends Controller
} else {
if ($removeUnused) {
$db->createCommand()
- ->delete($sourceMessageTable, ['in', 'id', $obsolete])->execute();
- echo "deleted.\n";
+ ->delete($sourceMessageTable, ['in', 'id', $obsolete])->execute();
+ echo "deleted.\n";
} else {
+ $last_id = $db->getLastInsertID();
$db->createCommand()
- ->update(
+ ->update(
$sourceMessageTable,
['message' => new \yii\db\Expression("CONCAT('@@',message,'@@')")],
['in', 'id', $obsolete]
)->execute();
+ foreach ($languages as $language) {
+ $db->createCommand()
+ ->insert($messageTable, ['id' => $last_id, 'language' => $language])->execute();
+ }
echo "updated.\n";
}
}
@@ -268,7 +283,7 @@ class MessageController extends Controller
{
echo "Saving messages to $fileName...";
if (is_file($fileName)) {
- if($format === 'po'){
+ if ($format === 'po') {
$translated = file_get_contents($fileName);
preg_match_all('/(?<=msgid ").*(?="\n(#*)msgstr)/', $translated, $keys);
preg_match_all('/(?<=msgstr ").*(?="\n\n)/', $translated, $values);
@@ -285,7 +300,7 @@ class MessageController extends Controller
$merged = [];
$untranslated = [];
foreach ($messages as $message) {
- if($format === 'po'){
+ if ($format === 'po') {
$message = preg_replace('/\"/', '\"', $message);
}
if (array_key_exists($message, $translated) && strlen($translated[$message]) > 0) {
@@ -317,9 +332,9 @@ class MessageController extends Controller
if (false === $overwrite) {
$fileName .= '.merged';
}
- if ($format === 'po'){
+ if ($format === 'po') {
$output = '';
- foreach ($merged as $k => $v){
+ foreach ($merged as $k => $v) {
$k = preg_replace('/(\")|(\\\")/', "\\\"", $k);
$v = preg_replace('/(\")|(\\\")/', "\\\"", $v);
if (substr($v, 0, 2) === '@@' && substr($v, -2) === '@@') {
@@ -338,7 +353,7 @@ class MessageController extends Controller
if ($format === 'po') {
$merged = '';
sort($messages);
- foreach($messages as $message) {
+ foreach ($messages as $message) {
$message = preg_replace('/(\")|(\\\")/', '\\\"', $message);
$merged .= "msgid \"$message\"\n";
$merged .= "msgstr \"\"\n";
diff --git a/framework/db/ActiveQuery.php b/framework/db/ActiveQuery.php
index ee92f22670..23e7f1f3c3 100644
--- a/framework/db/ActiveQuery.php
+++ b/framework/db/ActiveQuery.php
@@ -120,7 +120,7 @@ class ActiveQuery extends Query implements ActiveQueryInterface
$this->findWith($this->with, $models);
}
if (!$this->asArray) {
- foreach($models as $model) {
+ foreach ($models as $model) {
$model->afterFind();
}
}
diff --git a/framework/db/ActiveRelationTrait.php b/framework/db/ActiveRelationTrait.php
index ab06c1646e..32f6953c89 100644
--- a/framework/db/ActiveRelationTrait.php
+++ b/framework/db/ActiveRelationTrait.php
@@ -288,7 +288,7 @@ trait ActiveRelationTrait
foreach ($primaryModels as $i => $primaryModel) {
if ($primaryModels[$i][$primaryName] instanceof ActiveRecordInterface) {
$primaryModels[$i][$primaryName]->populateRelation($name, $primaryModel);
- } elseif (!empty($primaryModels[$i][$primaryName])) {
+ } elseif (!empty($primaryModels[$i][$primaryName])) {
$primaryModels[$i][$primaryName][$name] = $primaryModel;
}
}
diff --git a/framework/db/QueryBuilder.php b/framework/db/QueryBuilder.php
index e6b6e01317..124848b757 100644
--- a/framework/db/QueryBuilder.php
+++ b/framework/db/QueryBuilder.php
@@ -599,7 +599,7 @@ class QueryBuilder extends \yii\base\Object
if (strpos($column, '(') === false) {
$column = $this->db->quoteColumnName($column);
}
- $columns[$i] = "$column AS " . $this->db->quoteColumnName($i);;
+ $columns[$i] = "$column AS " . $this->db->quoteColumnName($i);
} elseif (strpos($column, '(') === false) {
if (preg_match('/^(.*?)(?i:\s+as\s+|\s+)([\w\-_\.]+)$/', $column, $matches)) {
$columns[$i] = $this->db->quoteColumnName($matches[1]) . ' AS ' . $this->db->quoteColumnName($matches[2]);
diff --git a/framework/db/oci/Schema.php b/framework/db/oci/Schema.php
index e29a77b945..1edbf6b617 100644
--- a/framework/db/oci/Schema.php
+++ b/framework/db/oci/Schema.php
@@ -242,7 +242,7 @@ EOD;
} elseif (strpos($dbType, 'NUMBER') !== false || strpos($dbType, 'INTEGER') !== false) {
if (strpos($dbType, '(') && preg_match('/\((.*)\)/', $dbType, $matches)) {
$values = explode(',', $matches[1]);
- if (isset($values[1]) and (((int)$values[1]) > 0)) {
+ if (isset($values[1]) && (((int)$values[1]) > 0)) {
$column->type = 'double';
} else {
$column->type = 'integer';
diff --git a/framework/grid/ActionColumn.php b/framework/grid/ActionColumn.php
index ffcfe0a852..7d42becf6f 100644
--- a/framework/grid/ActionColumn.php
+++ b/framework/grid/ActionColumn.php
@@ -88,6 +88,7 @@ class ActionColumn extends Column
$this->buttons['view'] = function ($url, $model) {
return Html::a('
', $url, [
'title' => Yii::t('yii', 'View'),
+ 'data-pjax' => '0',
]);
};
}
@@ -95,6 +96,7 @@ class ActionColumn extends Column
$this->buttons['update'] = function ($url, $model) {
return Html::a('
', $url, [
'title' => Yii::t('yii', 'Update'),
+ 'data-pjax' => '0',
]);
};
}
@@ -104,6 +106,7 @@ class ActionColumn extends Column
'title' => Yii::t('yii', 'Delete'),
'data-confirm' => Yii::t('yii', 'Are you sure to delete this item?'),
'data-method' => 'post',
+ 'data-pjax' => '0',
]);
};
}
diff --git a/framework/grid/DataColumn.php b/framework/grid/DataColumn.php
index a8ef9ad528..7b0f493467 100644
--- a/framework/grid/DataColumn.php
+++ b/framework/grid/DataColumn.php
@@ -152,7 +152,7 @@ class DataColumn extends Column
return parent::getDataCellContent($model, $key, $index);
}
return $value;
- }
+ }
/**
* @inheritdoc
diff --git a/framework/helpers/BaseFileHelper.php b/framework/helpers/BaseFileHelper.php
index c544a911e4..6da4712659 100644
--- a/framework/helpers/BaseFileHelper.php
+++ b/framework/helpers/BaseFileHelper.php
@@ -147,6 +147,7 @@ class BaseFileHelper
* @param string $src the source directory
* @param string $dst the destination directory
* @param array $options options for directory copy. Valid options are:
+ * @throws \yii\base\InvalidParamException if unable to open directory
*
* - dirMode: integer, the permission to be set for newly copied directories. Defaults to 0775.
* - fileMode: integer, the permission to be set for newly copied files. Defaults to the current environment setting.
@@ -280,14 +281,14 @@ class BaseFileHelper
$options['basePath'] = realpath($dir);
// this should also be done only once
if (isset($options['except'])) {
- foreach($options['except'] as $key=>$value) {
+ foreach ($options['except'] as $key => $value) {
if (is_string($value)) {
$options['except'][$key] = static::parseExcludePattern($value);
}
}
}
if (isset($options['only'])) {
- foreach($options['only'] as $key=>$value) {
+ foreach ($options['only'] as $key => $value) {
if (is_string($value)) {
$options['only'][$key] = static::parseExcludePattern($value);
}
@@ -397,7 +398,7 @@ class BaseFileHelper
if ($pattern === $baseName) {
return true;
}
- } else if ($flags & self::PATTERN_ENDSWITH) {
+ } elseif ($flags & self::PATTERN_ENDSWITH) {
/* "*literal" matching against "fooliteral" */
$n = StringHelper::byteLength($pattern);
if (StringHelper::byteSubstr($pattern, 1, $n) === StringHelper::byteSubstr($baseName, -$n, $n)) {
@@ -472,7 +473,7 @@ class BaseFileHelper
*/
private static function lastExcludeMatchingFromList($basePath, $path, $excludes)
{
- foreach(array_reverse($excludes) as $exclude) {
+ foreach (array_reverse($excludes) as $exclude) {
if (is_string($exclude)) {
$exclude = self::parseExcludePattern($exclude);
}
@@ -508,13 +509,14 @@ class BaseFileHelper
if (!is_string($pattern)) {
throw new InvalidParamException('Exclude/include pattern must be a string.');
}
- $result = array(
+ $result = [
'pattern' => $pattern,
'flags' => 0,
'firstWildcard' => false,
- );
- if (!isset($pattern[0]))
+ ];
+ if (!isset($pattern[0])) {
return $result;
+ }
if ($pattern[0] == '!') {
$result['flags'] |= self::PATTERN_NEGATIVE;
@@ -526,11 +528,13 @@ class BaseFileHelper
$len--;
$result['flags'] |= self::PATTERN_MUSTBEDIR;
}
- if (strpos($pattern, '/') === false)
+ if (strpos($pattern, '/') === false) {
$result['flags'] |= self::PATTERN_NODIR;
+ }
$result['firstWildcard'] = self::firstWildcardInPattern($pattern);
- if ($pattern[0] == '*' && self::firstWildcardInPattern(StringHelper::byteSubstr($pattern, 1, StringHelper::byteLength($pattern))) === false)
+ if ($pattern[0] == '*' && self::firstWildcardInPattern(StringHelper::byteSubstr($pattern, 1, StringHelper::byteLength($pattern))) === false) {
$result['flags'] |= self::PATTERN_ENDSWITH;
+ }
$result['pattern'] = $pattern;
return $result;
}
@@ -542,8 +546,8 @@ class BaseFileHelper
*/
private static function firstWildcardInPattern($pattern)
{
- $wildcards = array('*','?','[','\\');
- $wildcardSearch = function($r, $c) use ($pattern) {
+ $wildcards = ['*', '?', '[', '\\'];
+ $wildcardSearch = function ($r, $c) use ($pattern) {
$p = strpos($pattern, $c);
return $r===false ? $p : ($p===false ? $r : min($r, $p));
};
diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php
index 01151ec5e2..8585c9756f 100644
--- a/framework/helpers/BaseHtml.php
+++ b/framework/helpers/BaseHtml.php
@@ -1140,12 +1140,12 @@ class BaseHtml
* about attribute expression.
* @param array $options the tag options in terms of name-value pairs. These will be rendered as
* the attributes of the resulting tag. The values will be HTML-encoded using [[encode()]].
- * See [[renderTagAttributes()]] for details on how these are beeing rendered.
+ * See [[renderTagAttributes()]] for details on how these are being rendered.
* @return string the generated textarea tag
*/
public static function activeTextarea($model, $attribute, $options = [])
{
- $name = static::getInputName($model, $attribute);
+ $name = isset($options['name']) ? $options['name'] : static::getInputName($model, $attribute);
$value = static::getAttributeValue($model, $attribute);
if (!array_key_exists('id', $options)) {
$options['id'] = static::getInputId($model, $attribute);
@@ -1579,7 +1579,7 @@ class BaseHtml
{
if (isset($options['class'])) {
$classes = ' ' . $options['class'] . ' ';
- if (($pos = strpos($classes, ' ' . $class . ' ')) === false) {
+ if (strpos($classes, ' ' . $class . ' ') === false) {
$options['class'] .= ' ' . $class;
}
} else {
diff --git a/framework/helpers/BaseMarkdown.php b/framework/helpers/BaseMarkdown.php
index a22e45ea8b..c72e07911d 100644
--- a/framework/helpers/BaseMarkdown.php
+++ b/framework/helpers/BaseMarkdown.php
@@ -86,7 +86,7 @@ class BaseMarkdown
/** @var \cebe\markdown\Markdown $parser */
if (!isset(static::$flavors[$flavor])) {
throw new InvalidParamException("Markdown flavor '$flavor' is not defined.'");
- } elseif(!is_object($config = static::$flavors[$flavor])) {
+ } elseif (!is_object($config = static::$flavors[$flavor])) {
$parser = Yii::createObject($config);
if (is_array($config)) {
foreach ($config as $name => $value) {
diff --git a/framework/helpers/BaseSecurity.php b/framework/helpers/BaseSecurity.php
index d9459d9c52..8750a54c0a 100644
--- a/framework/helpers/BaseSecurity.php
+++ b/framework/helpers/BaseSecurity.php
@@ -107,10 +107,10 @@ class BaseSecurity
*/
protected static function stripPadding($data)
{
- $end = StringHelper::byteSubstr($data, -1, NULL);
+ $end = StringHelper::byteSubstr($data, -1, null);
$last = ord($end);
$n = StringHelper::byteLength($data) - $last;
- if (StringHelper::byteSubstr($data, $n, NULL) == str_repeat($end, $last)) {
+ if (StringHelper::byteSubstr($data, $n, null) == str_repeat($end, $last)) {
return StringHelper::byteSubstr($data, 0, $n);
}
return false;
diff --git a/framework/i18n/GettextMessageSource.php b/framework/i18n/GettextMessageSource.php
index 8da8edc9ab..fc6d87fa67 100644
--- a/framework/i18n/GettextMessageSource.php
+++ b/framework/i18n/GettextMessageSource.php
@@ -70,9 +70,9 @@ class GettextMessageSource extends MessageSource
if ($messages === null && $fallbackMessages === null && $fallbackLanguage != $this->sourceLanguage) {
Yii::error("The message file for category '$category' does not exist: $messageFile Fallback file does not exist as well: $fallbackMessageFile", __METHOD__);
- } else if (empty($messages)) {
+ } elseif (empty($messages)) {
return $fallbackMessages;
- } else if (!empty($fallbackMessages)) {
+ } elseif (!empty($fallbackMessages)) {
foreach ($fallbackMessages as $key => $value) {
if (!empty($value) && empty($messages[$key])) {
$messages[$key] = $fallbackMessages[$key];
diff --git a/framework/i18n/I18N.php b/framework/i18n/I18N.php
index d0bbfcc8ec..6be3899f03 100644
--- a/framework/i18n/I18N.php
+++ b/framework/i18n/I18N.php
@@ -126,7 +126,7 @@ class I18N extends Component
}
$p = [];
- foreach($params as $name => $value) {
+ foreach ($params as $name => $value) {
$p['{' . $name . '}'] = $value;
}
return strtr($message, $p);
diff --git a/framework/i18n/MessageFormatter.php b/framework/i18n/MessageFormatter.php
index 4ea70832e9..c3d8c561bb 100644
--- a/framework/i18n/MessageFormatter.php
+++ b/framework/i18n/MessageFormatter.php
@@ -143,7 +143,7 @@ class MessageFormatter extends Component
return false;
}
$map = [];
- foreach($tokens as $i => $token) {
+ foreach ($tokens as $i => $token) {
if (is_array($token)) {
$param = trim($token[0]);
if (!isset($map[$param])) {
@@ -169,7 +169,7 @@ class MessageFormatter extends Component
return false;
} else {
$values = [];
- foreach($result as $key => $value) {
+ foreach ($result as $key => $value) {
$values[$map[$key]] = $value;
}
return $values;
@@ -190,7 +190,7 @@ class MessageFormatter extends Component
if (($tokens = self::tokenizePattern($pattern)) === false) {
return false;
}
- foreach($tokens as $i => $token) {
+ foreach ($tokens as $i => $token) {
if (!is_array($token)) {
continue;
}
@@ -210,7 +210,7 @@ class MessageFormatter extends Component
}
$type = isset($token[1]) ? trim($token[1]) : 'none';
// replace plural and select format recursively
- if ($type == 'plural' || $type == 'select') {
+ if ($type == 'plural' || $type == 'select') {
if (!isset($token[2])) {
return false;
}
@@ -244,7 +244,7 @@ class MessageFormatter extends Component
$this->_errorMessage = "Message pattern is invalid.";
return false;
}
- foreach($tokens as $i => $token) {
+ foreach ($tokens as $i => $token) {
if (is_array($token)) {
if (($tokens[$i] = $this->parseToken($token, $args, $locale)) === false) {
$this->_errorCode = -1;
diff --git a/framework/i18n/PhpMessageSource.php b/framework/i18n/PhpMessageSource.php
index 2e611f50e0..78665112bf 100644
--- a/framework/i18n/PhpMessageSource.php
+++ b/framework/i18n/PhpMessageSource.php
@@ -73,9 +73,9 @@ class PhpMessageSource extends MessageSource
if ($messages === null && $fallbackMessages === null && $fallbackLanguage != $this->sourceLanguage) {
Yii::error("The message file for category '$category' does not exist: $messageFile Fallback file does not exist as well: $fallbackMessageFile", __METHOD__);
- } else if (empty($messages)) {
+ } elseif (empty($messages)) {
return $fallbackMessages;
- } else if (!empty($fallbackMessages)) {
+ } elseif (!empty($fallbackMessages)) {
foreach ($fallbackMessages as $key => $value) {
if (!empty($value) && empty($messages[$key])) {
$messages[$key] = $fallbackMessages[$key];
diff --git a/framework/mail/BaseMailer.php b/framework/mail/BaseMailer.php
index 139b4afaa7..01f6635ac6 100644
--- a/framework/mail/BaseMailer.php
+++ b/framework/mail/BaseMailer.php
@@ -348,5 +348,4 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont
$event = new MailEvent(['message' => $message, 'isSuccessful' => $isSuccessful]);
$this->trigger(self::EVENT_AFTER_SEND, $event);
}
-
}
diff --git a/framework/test/Fixture.php b/framework/test/Fixture.php
index 5a38ae513b..e22a139e68 100644
--- a/framework/test/Fixture.php
+++ b/framework/test/Fixture.php
@@ -82,4 +82,3 @@ class Fixture extends Component
{
}
}
-
diff --git a/framework/validators/ImageValidator.php b/framework/validators/ImageValidator.php
index 52fb235755..fa9587d57a 100644
--- a/framework/validators/ImageValidator.php
+++ b/framework/validators/ImageValidator.php
@@ -124,7 +124,7 @@ class ImageValidator extends FileValidator
}
if ($this->underHeight === null) {
$this->underHeight = Yii::t('yii', 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.');
- }
+ }
if ($this->overWidth === null) {
$this->overWidth = Yii::t('yii', 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.');
}
diff --git a/framework/validators/PunycodeAsset.php b/framework/validators/PunycodeAsset.php
index c0c1e2b541..5f6a4110cd 100644
--- a/framework/validators/PunycodeAsset.php
+++ b/framework/validators/PunycodeAsset.php
@@ -6,6 +6,7 @@
*/
namespace yii\validators;
+
use yii\web\AssetBundle;
/**
diff --git a/framework/validators/ValidationAsset.php b/framework/validators/ValidationAsset.php
index 14d7ad0e95..e9bb79d305 100644
--- a/framework/validators/ValidationAsset.php
+++ b/framework/validators/ValidationAsset.php
@@ -6,6 +6,7 @@
*/
namespace yii\validators;
+
use yii\web\AssetBundle;
/**
diff --git a/framework/web/AssetConverter.php b/framework/web/AssetConverter.php
index 1b7d1c84d6..23062d97a9 100644
--- a/framework/web/AssetConverter.php
+++ b/framework/web/AssetConverter.php
@@ -82,7 +82,7 @@ class AssetConverter extends Component implements AssetConverterInterface
$proc = proc_open($command, $descriptor, $pipes, $basePath);
$stdout = stream_get_contents($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
- foreach($pipes as $pipe) {
+ foreach ($pipes as $pipe) {
fclose($pipe);
}
$status = proc_close($proc);
diff --git a/framework/widgets/ActiveFormAsset.php b/framework/widgets/ActiveFormAsset.php
index 5acb5e1902..94b00e5143 100644
--- a/framework/widgets/ActiveFormAsset.php
+++ b/framework/widgets/ActiveFormAsset.php
@@ -6,6 +6,7 @@
*/
namespace yii\widgets;
+
use yii\web\AssetBundle;
/**
diff --git a/framework/widgets/LinkPager.php b/framework/widgets/LinkPager.php
index a2c905c731..22cfdf0dcf 100644
--- a/framework/widgets/LinkPager.php
+++ b/framework/widgets/LinkPager.php
@@ -128,7 +128,7 @@ class LinkPager extends Widget
protected function registerLinkTags()
{
$view = $this->getView();
- foreach($this->pagination->getLinks() as $rel => $href) {
+ foreach ($this->pagination->getLinks() as $rel => $href) {
$view->registerLinkTag(['rel' => $rel, 'href' => $href], $rel);
}
}
diff --git a/framework/widgets/Pjax.php b/framework/widgets/Pjax.php
index 1d7046c895..825a4acd9e 100644
--- a/framework/widgets/Pjax.php
+++ b/framework/widgets/Pjax.php
@@ -25,6 +25,8 @@ use yii\web\Response;
* You may configure [[linkSelector]] to specify which links should trigger pjax, and configure [[formSelector]]
* to specify which form submission may trigger pjax.
*
+ * You may disable pjax for a specific link inside the container by adding `data-pjax="0"` attribute to this link.
+ *
* The following example shows how to use Pjax with the [[\yii\gridview\GridView]] widget so that the grid pagination,
* sorting and filtering can be done via pjax:
*
diff --git a/framework/yii b/framework/yii
index 6964ce5112..036962a28f 100755
--- a/framework/yii
+++ b/framework/yii
@@ -8,11 +8,11 @@
* @license http://www.yiiframework.com/license/
*/
-defined('YII_DEBUG') or define('YII_DEBUG', true);
+defined('YII_DEBUG') ?: define('YII_DEBUG', true);
// fcgi doesn't have STDIN and STDOUT defined by default
-defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
-defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
+defined('STDIN') ?: define('STDIN', fopen('php://stdin', 'r'));
+defined('STDOUT') ?: define('STDOUT', fopen('php://stdout', 'w'));
require(__DIR__ . '/Yii.php');
diff --git a/tests/unit/extensions/mongodb/CollectionTest.php b/tests/unit/extensions/mongodb/CollectionTest.php
index 3eb97b692f..9a0c0b458b 100644
--- a/tests/unit/extensions/mongodb/CollectionTest.php
+++ b/tests/unit/extensions/mongodb/CollectionTest.php
@@ -187,6 +187,60 @@ class CollectionTest extends MongoDbTestCase
$this->assertNotEmpty($result[0]['items']);
}
+ public function testFindAndModify()
+ {
+ $collection = $this->getConnection()->getCollection('customer');
+ $rows = [
+ [
+ 'name' => 'customer 1',
+ 'status' => 1,
+ 'amount' => 100,
+ ],
+ [
+ 'name' => 'customer 2',
+ 'status' => 1,
+ 'amount' => 200,
+ ],
+ ];
+ $collection->batchInsert($rows);
+
+ // increment field
+ $result = $collection->findAndModify(['name' => 'customer 1'], ['$inc' => ['status' => 1]]);
+ $this->assertEquals('customer 1', $result['name']);
+ $this->assertEquals(1, $result['status']);
+ $newResult = $collection->findOne(['name' => 'customer 1']);
+ $this->assertEquals(2, $newResult['status']);
+
+ // $set and return modified document
+ $result = $collection->findAndModify(
+ ['name' => 'customer 2'],
+ ['$set' => ['status' => 2]],
+ [],
+ ['new' => true]
+ );
+ $this->assertEquals('customer 2', $result['name']);
+ $this->assertEquals(2, $result['status']);
+
+ // Full update document
+ $data = [
+ 'name' => 'customer 3',
+ 'city' => 'Minsk'
+ ];
+ $result = $collection->findAndModify(
+ ['name' => 'customer 2'],
+ $data,
+ [],
+ ['new' => true]
+ );
+ $this->assertEquals('customer 3', $result['name']);
+ $this->assertEquals('Minsk', $result['city']);
+ $this->assertTrue(!isset($result['status']));
+
+ // Test exceptions
+ $this->setExpectedException('\yii\mongodb\Exception');
+ $collection->findAndModify(['name' => 'customer 1'], ['$wrongOperator' => ['status' => 1]]);
+ }
+
/**
* @depends testBatchInsert
*/
@@ -240,54 +294,54 @@ class CollectionTest extends MongoDbTestCase
$this->assertEquals($expectedRows, $rows);
}
- /**
- * @depends testMapReduce
- */
- public function testMapReduceInline()
- {
- $collection = $this->getConnection()->getCollection('customer');
- $rows = [
- [
- 'name' => 'customer 1',
- 'status' => 1,
- 'amount' => 100,
- ],
- [
- 'name' => 'customer 2',
- 'status' => 1,
- 'amount' => 200,
- ],
- [
- 'name' => 'customer 2',
- 'status' => 2,
- 'amount' => 400,
- ],
- [
- 'name' => 'customer 2',
- 'status' => 3,
- 'amount' => 500,
- ],
- ];
- $collection->batchInsert($rows);
+ /**
+ * @depends testMapReduce
+ */
+ public function testMapReduceInline()
+ {
+ $collection = $this->getConnection()->getCollection('customer');
+ $rows = [
+ [
+ 'name' => 'customer 1',
+ 'status' => 1,
+ 'amount' => 100,
+ ],
+ [
+ 'name' => 'customer 2',
+ 'status' => 1,
+ 'amount' => 200,
+ ],
+ [
+ 'name' => 'customer 2',
+ 'status' => 2,
+ 'amount' => 400,
+ ],
+ [
+ 'name' => 'customer 2',
+ 'status' => 3,
+ 'amount' => 500,
+ ],
+ ];
+ $collection->batchInsert($rows);
- $result = $collection->mapReduce(
- 'function () {emit(this.status, this.amount)}',
- 'function (key, values) {return Array.sum(values)}',
- ['inline' => true],
- ['status' => ['$lt' => 3]]
- );
- $expectedRows = [
- [
- '_id' => 1,
- 'value' => 300,
- ],
- [
- '_id' => 2,
- 'value' => 400,
- ],
- ];
- $this->assertEquals($expectedRows, $result);
- }
+ $result = $collection->mapReduce(
+ 'function () {emit(this.status, this.amount)}',
+ 'function (key, values) {return Array.sum(values)}',
+ ['inline' => true],
+ ['status' => ['$lt' => 3]]
+ );
+ $expectedRows = [
+ [
+ '_id' => 1,
+ 'value' => 300,
+ ],
+ [
+ '_id' => 2,
+ 'value' => 400,
+ ],
+ ];
+ $this->assertEquals($expectedRows, $result);
+ }
public function testCreateIndex()
{
diff --git a/tests/unit/framework/base/ExceptionTest.php b/tests/unit/framework/base/ExceptionTest.php
index 635b55cd47..136fc28174 100644
--- a/tests/unit/framework/base/ExceptionTest.php
+++ b/tests/unit/framework/base/ExceptionTest.php
@@ -15,7 +15,7 @@ class ExceptionTest extends TestCase
$this->assertEquals('bar', $array['message']);
$this->assertEquals('foo', $array['previous']['message']);
- $e = new InvalidCallException('bar', 0 ,new UserException('foo'));
+ $e = new InvalidCallException('bar', 0, new UserException('foo'));
$array = $e->toArray();
$this->assertEquals('bar', $array['message']);
$this->assertEquals('foo', $array['previous']['message']);