我想将两个功能组合在一起,以整合代码,并根据其使用方式保持动态。我不知道这是否可能。
首先,让我们列出基本用法。在我的例子中,我有Post和PostCategory模型(和CRUD构建)。您创建一个类别,然后创建一个新帖子并将其分配给该类别。帖子可以enabled
或disabled
。从本质上讲,您可以创建一些新帖子,直到准备好后才能让最终用户看到它们。一个用例是滴灌系统,您可以每x天添加100个帖子并切换到enabled
。这超出了这个范围。
视图\交\ _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
的下拉列表及其调用的功能
\共同\模型\ 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
那样被访问,类似于关系如何与“吸气剂”。
我想将这些用作“吸气剂”。在索引和视图中,也可以调用相同的函数。而不是返回一个数组,返回一个“好名字”,如“启用”或“禁用”
为此,我不会重命名该功能,因为我不想再添加任何混淆。
视图\交\ 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-&gt; category-&gt; name)..
是否可以让getPostStatusConst()
做同样的事情?使用$model->postStatusConst
可以很好地显示Enabled
或Disabled
,或者使用Post::getPostStatusConst()
来获取下拉列表。
答案 0 :(得分:0)
有可能但是真的不值得代码中的所有更改。您必须覆盖魔术__get()
方法,并考虑在一个结构中存储和访问两个返回的某种方式。
我会将getPostStatusConst()
保留为当前状态名称,并使用下拉列表的状态列表添加其他方法(甚至是静态)。
答案 1 :(得分:0)
我非常接近。我不是在考虑PHP OOP线,而是更多Yii。一些谷歌搜索,我打了我的额头。使用框架时,有时会忘记用PHP编写文本;)
public function getPostStatus()
{
if ( isset($this) && get_class($this) == __CLASS__) {
// not static
return ($this->status === self::STATUS_ENABLED) ? 'Enabled' : 'Disabled';
}
return [
self::STATUS_DISABLED => 'Disabled',
self::STATUS_ENABLED => 'Enabled',
];
}
我重命名了这个功能,以便更有意义。
无处不在。让我们看看我的CRUD的索引:
<强>视图\交\的index.php 强>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'category.name',
'name',
//'text:ntext',
'postStatus',
// 'created_at',
// 'updated_at',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
<强>视图\交\ view.php 强>
<?= DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'category.name',
'name',
'text:ntext',
'postStatus',
'created_at:datetime',
'updated_at:datetime',
],
]) ?>
和 views \ post \ _form.php
<?= $form->field($model, 'status')->dropDownList(
Post::getPostStatus(),
['prompt'=> '- Status -']
) ?>
所有这些案件似乎都很好。任何人都有无效的情况?