diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 3827116feb..6c83e166ea 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -3,7 +3,7 @@ Yii Framework 2 Change Log 2.0.14 under development ------------------------ - +- Enh #15226: Auto generate placeholder from fields (vladis84) - Bug #15356: Fixed multiple bugs in `yii\db\Query::getTablesUsedInFrom()` (vladis84, samdark) - Bug #14157: Add support for loading default value `CURRENT_TIMESTAMP` of MySQL `datetime` field (rossoneri) - Bug #15046: Throw an `yii\web\HeadersAlreadySentException` if headers were sent before web response (dmirogin) diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index 2907573fa2..2b4eef1552 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -1314,6 +1314,8 @@ class BaseHtml $options['id'] = static::getInputId($model, $attribute); } + self::setActivePlaceholder($model, $attribute, $options); + return static::input($type, $name, $value, $options); } @@ -1362,6 +1364,21 @@ class BaseHtml return static::activeInput('text', $model, $attribute, $options); } + /** + * Generate placeholder from model label. + * @param Model $model the model object + * @param string $attribute the attribute name or expression. See [[getAttributeName()]] for the format + * 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()]]. + */ + protected static function setActivePlaceholder($model, $attribute, &$options = []) + { + if (isset($options['placeholder']) && $options['placeholder'] === true) { + $options['placeholder'] = $model->getAttributeLabel($attribute); + } + } + /** * Generates a hidden input tag for the given model attribute. * This method will generate the "name" and "value" tag attributes automatically for the model attribute @@ -1458,6 +1475,7 @@ class BaseHtml $options['id'] = static::getInputId($model, $attribute); } self::normalizeMaxLength($model, $attribute, $options); + self::setActivePlaceholder($model, $attribute, $options); return static::textarea($name, $value, $options); } diff --git a/tests/framework/helpers/HtmlTest.php b/tests/framework/helpers/HtmlTest.php index d045bd3306..9393377a73 100644 --- a/tests/framework/helpers/HtmlTest.php +++ b/tests/framework/helpers/HtmlTest.php @@ -1579,6 +1579,24 @@ HTML; $actual = Html::activeCheckboxList($model, 'types', ['foo']); $this->assertEqualsWithoutLE($expected, $actual); } + + public function testActiveTextInput_placeholderFillFromModel() + { + $model = new HtmlTestModel(); + + $html = Html::activeTextInput($model, 'name', ['placeholder' => true]); + + $this->assertContains('placeholder="Name"', $html); + } + + public function testActiveTextInput_customPlaceholder() + { + $model = new HtmlTestModel(); + + $html = Html::activeTextInput($model, 'name', ['placeholder' => 'Custom placeholder']); + + $this->assertContains('placeholder="Custom placeholder"', $html); + } } /**