Я хотел бы объединить 2 функции вместе, чтобы объединить код и быть динамичным в зависимости от того, как он используется. Я не знаю, возможно ли это.
Во-первых, давайте выложим основное использование. В моем примере у меня есть модели Post и PostCategory (и построенные CRUD). Вы создаете категорию, затем создаете новый пост и назначаете его категории. Пост может быть enabled
или disabled
. По сути, вы можете создать несколько новых сообщений и сделать их недоступными для просмотра конечными пользователями, пока вы не будете готовы. Одним из вариантов использования может быть система капельной подачи, в которой вы можете добавить 100 сообщений и переключаться на enabled
каждые x дней. Это выходит за рамки этого.
представления\post\_form.php
<div class="post-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'category_id')->dropDownList(
$model->getPostCategoryConst(),
['prompt'=> '- Category -']
)->label('Category')
?>
<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'text')->textarea(['rows' => 6]) ?>
<?= $form->field($model, 'status')->dropDownList(
$model->getPostStatusConst(),
['prompt'=> '- Status -']
) ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
Обратите внимание на раскрывающиеся списки для category_id
и status
и функций, которые они вызывают
\common\models\Post.php
const STATUS_ENABLED = 1;
const STATUS_DISABLED = 0;
public function getCategory()
{
return $this->hasOne(PostCategory::className(), ['id' => 'category_id']);
}
/* -- Added -- */
public function getPostCategoryConst()
{
return ArrayHelper::map(PostCategory::find()->orderBy('name DESC')->all(), 'id', 'name');
}
public function getPostStatusConst()
{
return [
self::STATUS_DISABLED => 'Disabled',
self::STATUS_ENABLED => 'Enabled',
];
}
Теперь это работает просто отлично :) Однако мне не нравится использовать get
, как в getPostStatusConst()
, поскольку к нему нет доступа, как $model->postStatusConst
, аналогично тому, как отношения с «геттером».
Я хотел бы использовать их как "геттеры". В индексе и представлении было бы неплохо также вызывать одни и те же функции. Вместо того, чтобы возвращать массив, возвращать «красивое имя», например «Включено» или «Отключено».
Ради этого я не буду переименовывать функцию, так как не хочу еще больше вносить путаницу.
представления\post\view.php
<?= DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'category.name',
'name',
'text:ntext',
'postStatusConst', // <-- Calls getPostStatusConst()
'created_at:datetime',
'updated_at:datetime',
],
]) ?>
Обратите внимание, что postStatusConst
— это та же функция, которую мы использовали в _form
для нашего действия по созданию. В _form нужно было вернуть массив для выпадающего списка. На наш взгляд, ему просто нужно вернуть красивое имя, такое как Enabled
или Disabled
.
Я старался
Я попробовал эту функцию в модели Post:
public function getPostStatusConst()
{
if ( isset($this) ) {
return ($this->status === self::STATUS_ENABLED) ? 'Enabled' : 'Disabled';
}
return [
self::STATUS_DISABLED => 'Disabled',
self::STATUS_ENABLED => 'Enabled',
];
}
Это явно не сработало :) Я этого не ожидал, потому что я знаю, что $this
ссылается на себя в классе. Это просто показывает, к чему я иду.
В отношениях hasOne()
, похоже, знает, используем ли мы его как прямой вызов (Post::getCategory) или встроенный ($model->category->name)..
Вопрос
Возможно ли, чтобы getPostStatusConst()
сделал то же самое? Использовать как $model->postStatusConst
для красивого отображения Enabled
или Disabled
или как Post::getPostStatusConst()
для получения массива для раскрывающегося списка.