Yii2:状态'已启用'& '禁用'辅助功能 - 动态使用

时间:2016-08-03 20:34:41

标签: php yii2 yii2-advanced-app yii2-model

我想将两个功能组合在一起,以整合代码,并根据其使用方式保持动态。我不知道这是否可能。

首先,让我们列出基本用法。在我的例子中,我有Post和PostCategory模型(和CRUD构建)。您创建一个类别,然后创建一个新帖子并将其分配给该类别。帖子可以enableddisabled。从本质上讲,您可以创建一些新帖子,直到准备好后才能让最终用户看到它们。一个用例是滴灌系统,您可以每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_idstatus的下拉列表及其调用的功能

\共同\模型\ 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中,它需要为下拉列表返回一个数组。在我们看来,它只需要返回一个很好的名称,例如EnabledDisabled

我试过

我在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可以很好地显示EnabledDisabled,或者使用Post::getPostStatusConst()来获取下拉列表。

2 个答案:

答案 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 -']
) ?>

所有这些案件似乎都很好。任何人都有无效的情况?