我想将 2 个函数组合在一起,以合并代码,并根据其使用方式进行动态化。我不知道这是否可能。
首先,让我们列出基本用途。在我的示例中,我有 Post 和 PostCategory 模型(并构建了 CRUD)。您创建一个类别,然后创建一个新帖子并将其分配给该类别。帖子可以是enabled
或disabled
。从本质上讲,您可以创建一些新帖子,并且在您准备好之前让最终用户无法查看它们。一个用例是滴灌系统,您可以在其中添加 100 个帖子,并且enabled
每 x 天切换一次。这超出了本文的范围。
意见\帖子\_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
as in,getPostStatusConst()
因为它不像$model->postStatusConst
与“getter”的关系那样被访问。
不过,我也想将它们用作“吸气剂”。在索引和视图中,最好也调用相同的函数。而不是返回一个数组,而是返回一个“好名字”,例如“启用”或“禁用”
为此,我不会重命名该函数,因为我不想增加任何混淆。
意见\帖子\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
or 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()
做同样的事情吗?使用 as$model->postStatusConst
来显示Enabled
或Disabled
很好地显示,或者作为Post::getPostStatusConst()
获取下拉列表的数组。