diff --git a/apps/advanced/backend/web/css/site.css b/apps/advanced/backend/web/css/site.css index e6db73c..6a355bd 100644 --- a/apps/advanced/backend/web/css/site.css +++ b/apps/advanced/backend/web/css/site.css @@ -17,3 +17,24 @@ body { font-size: 21px; padding: 14px 24px; } + +/* add sorting icons to gridview sort links */ +a.asc:after, a.desc:after { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + padding-left: 5px; +} + +a.asc:after { content: /*"\e113"*/"\e151"; } +a.desc:after { content: /*"\e114"*/"\e152"; } + +.sort-numerical a.asc:after { content: "\e153"; } +.sort-numerical a.desc:after { content: "\e154"; } + +.sort-ordinal a.asc:after { content: "\e155"; } +.sort-ordinal a.desc:after { content: "\e156"; } diff --git a/apps/advanced/frontend/web/css/site.css b/apps/advanced/frontend/web/css/site.css index e6db73c..6a355bd 100644 --- a/apps/advanced/frontend/web/css/site.css +++ b/apps/advanced/frontend/web/css/site.css @@ -17,3 +17,24 @@ body { font-size: 21px; padding: 14px 24px; } + +/* add sorting icons to gridview sort links */ +a.asc:after, a.desc:after { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + padding-left: 5px; +} + +a.asc:after { content: /*"\e113"*/"\e151"; } +a.desc:after { content: /*"\e114"*/"\e152"; } + +.sort-numerical a.asc:after { content: "\e153"; } +.sort-numerical a.desc:after { content: "\e154"; } + +.sort-ordinal a.asc:after { content: "\e155"; } +.sort-ordinal a.desc:after { content: "\e156"; } diff --git a/apps/basic/web/css/site.css b/apps/basic/web/css/site.css index 84c46e8..707c66d 100644 --- a/apps/basic/web/css/site.css +++ b/apps/basic/web/css/site.css @@ -18,3 +18,24 @@ body { font-size: 21px; padding: 14px 24px; } + +/* add sorting icons to gridview sort links */ +a.asc:after, a.desc:after { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + padding-left: 5px; +} + +a.asc:after { content: /*"\e113"*/"\e151"; } +a.desc:after { content: /*"\e114"*/"\e152"; } + +.sort-numerical a.asc:after { content: "\e153"; } +.sort-numerical a.desc:after { content: "\e154"; } + +.sort-ordinal a.asc:after { content: "\e155"; } +.sort-ordinal a.desc:after { content: "\e156"; } diff --git a/framework/yii/base/View.php b/framework/yii/base/View.php index 68b1094..d3db27d 100644 --- a/framework/yii/base/View.php +++ b/framework/yii/base/View.php @@ -259,16 +259,16 @@ class View extends Component $output = ''; if ($this->beforeRender($viewFile)) { + Yii::trace("Rendering view file: $viewFile", __METHOD__); $ext = pathinfo($viewFile, PATHINFO_EXTENSION); if (isset($this->renderers[$ext])) { - if (is_array($this->renderers[$ext])) { + if (is_array($this->renderers[$ext]) || is_string($this->renderers[$ext])) { $this->renderers[$ext] = Yii::createObject($this->renderers[$ext]); } /** @var ViewRenderer $renderer */ $renderer = $this->renderers[$ext]; $output = $renderer->render($this, $viewFile, $params); } else { - Yii::trace("Rendering view file: $viewFile", __METHOD__); $output = $this->renderPhpFile($viewFile, $params); } $this->afterRender($viewFile, $output); diff --git a/framework/yii/bootstrap/ButtonGroup.php b/framework/yii/bootstrap/ButtonGroup.php index 529c7ef..4fc2eb3 100644 --- a/framework/yii/bootstrap/ButtonGroup.php +++ b/framework/yii/bootstrap/ButtonGroup.php @@ -17,7 +17,7 @@ use yii\helpers\Html; * * ```php * // a button group with items configuration - * echo ButtonGroup::::widget([ + * echo ButtonGroup::widget([ * 'buttons' => [ * ['label' => 'A'], * ['label' => 'B'], @@ -25,7 +25,7 @@ use yii\helpers\Html; * ]); * * // button group with an item as a string - * echo ButtonGroup::::widget([ + * echo ButtonGroup::widget([ * 'buttons' => [ * Button::widget(['label' => 'A']), * ['label' => 'B'], diff --git a/framework/yii/data/ActiveDataProvider.php b/framework/yii/data/ActiveDataProvider.php index e95e4b8..012b7dd 100644 --- a/framework/yii/data/ActiveDataProvider.php +++ b/framework/yii/data/ActiveDataProvider.php @@ -158,7 +158,7 @@ class ActiveDataProvider extends BaseDataProvider throw new InvalidConfigException('The "query" property must be an instance of Query or its subclass.'); } $query = clone $this->query; - return $query->limit(-1)->offset(-1)->count('*', $this->db); + return (int) $query->limit(-1)->offset(-1)->count('*', $this->db); } /** diff --git a/framework/yii/grid/GridView.php b/framework/yii/grid/GridView.php index 8a3196b..2981c82 100644 --- a/framework/yii/grid/GridView.php +++ b/framework/yii/grid/GridView.php @@ -89,6 +89,11 @@ class GridView extends BaseListView */ public $showFooter = false; /** + * @var string|boolean the HTML content to be displayed when [[dataProvider]] does not have any data. + * If false, the grid view will still be displayed (without body content though). + */ + public $empty = false; + /** * @var array|Formatter the formatter used to format model attribute values into displayable texts. * This can be either an instance of [[Formatter]] or an configuration array for creating the [[Formatter]] * instance. If this property is not set, the "formatter" application component will be used. diff --git a/framework/yii/i18n/FallbackMessageFormatter.php b/framework/yii/i18n/FallbackMessageFormatter.php index 16d38f5..17928f5 100644 --- a/framework/yii/i18n/FallbackMessageFormatter.php +++ b/framework/yii/i18n/FallbackMessageFormatter.php @@ -66,7 +66,7 @@ class FallbackMessageFormatter * @param array $args Arguments to insert into the format string * @return string The formatted string, or `FALSE` if an error occurred */ - public function format(array $args) + public function format($args) { return static::formatMessage($this->_locale, $this->_pattern, $args); } @@ -79,7 +79,7 @@ class FallbackMessageFormatter * @param array $args The array of values to insert into the format string * @return string The formatted pattern string or `FALSE` if an error occurred */ - public static function formatMessage($locale, $pattern, array $args) + public static function formatMessage($locale, $pattern, $args) { if (($tokens = static::tokenizePattern($pattern)) === false) { return false; diff --git a/framework/yii/widgets/BaseListView.php b/framework/yii/widgets/BaseListView.php index 27b2eaf..ffbba38 100644 --- a/framework/yii/widgets/BaseListView.php +++ b/framework/yii/widgets/BaseListView.php @@ -139,7 +139,7 @@ abstract class BaseListView extends Widget $pageCount = $pagination->pageCount; if (($summaryContent = $this->summary) === null) { $summaryContent = '
' - . Yii::t('yii', 'Showing {totalCount, plural, =0{0} other{{begin}-{end}}} of {totalCount} {totalCount, plural, one{item} other{items}}.') + . Yii::t('yii', 'Showing {totalCount, plural, =0{0} other{{begin, number, integer}-{end, number, integer}}} of {totalCount, number, integer} {totalCount, plural, one{item} other{items}}.') . '
'; } } else { diff --git a/tests/unit/data/ar/Customer.php b/tests/unit/data/ar/Customer.php index 60a68b5..0d2add1 100644 --- a/tests/unit/data/ar/Customer.php +++ b/tests/unit/data/ar/Customer.php @@ -17,6 +17,9 @@ class Customer extends ActiveRecord public $status2; + public static $afterSaveInsert = null; + public static $afterSaveNewRecord = null; + public static function tableName() { return 'tbl_customer'; @@ -31,4 +34,11 @@ class Customer extends ActiveRecord { $query->andWhere('status=1'); } + + public function afterSave($insert) + { + static::$afterSaveInsert = $insert; + static::$afterSaveNewRecord = $this->isNewRecord; + parent::afterSave($insert); + } } diff --git a/tests/unit/framework/db/ActiveRecordTest.php b/tests/unit/framework/db/ActiveRecordTest.php index eb9d425..d8d8f8f 100644 --- a/tests/unit/framework/db/ActiveRecordTest.php +++ b/tests/unit/framework/db/ActiveRecordTest.php @@ -295,10 +295,14 @@ class ActiveRecordTest extends DatabaseTestCase $this->assertNull($customer->id); $this->assertTrue($customer->isNewRecord); + Customer::$afterSaveNewRecord = null; + Customer::$afterSaveInsert = null; $customer->save(); $this->assertEquals(4, $customer->id); + $this->assertFalse(Customer::$afterSaveNewRecord); + $this->assertTrue(Customer::$afterSaveInsert); $this->assertFalse($customer->isNewRecord); } @@ -309,10 +313,15 @@ class ActiveRecordTest extends DatabaseTestCase $this->assertTrue($customer instanceof Customer); $this->assertEquals('user2', $customer->name); $this->assertFalse($customer->isNewRecord); + Customer::$afterSaveNewRecord = null; + Customer::$afterSaveInsert = null; + $customer->name = 'user2x'; $customer->save(); $this->assertEquals('user2x', $customer->name); $this->assertFalse($customer->isNewRecord); + $this->assertFalse(Customer::$afterSaveNewRecord); + $this->assertFalse(Customer::$afterSaveInsert); $customer2 = Customer::find(2); $this->assertEquals('user2x', $customer2->name);