2

我想将 2 个函数组合在一起,以合并代码,并根据其使用方式进行动态化。我不知道这是否可能。

首先,让我们列出基本用途。在我的示例中,我有 Post 和 PostCategory 模型(并构建了 CRUD)。您创建一个类别,然后创建一个新帖子并将其分配给该类别。帖子可以是enableddisabled。从本质上讲,您可以创建一些新帖子,并且在您准备好之前让最终用户无法查看它们。一个用例是滴灌系统,您可以在其中添加 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_idstatus它们调用的函数

\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',
    ];
}

现在这工作得很好:) 但是,我不喜欢使用getas 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 中,它需要为下拉列表返回一个数组。在我们看来,它只需要返回一个好听的名称,例如Enabledor 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来显示EnabledDisabled很好地显示,或者作为Post::getPostStatusConst()获取下拉列表的数组。

4

2 回答 2

0

这是可能的,但实际上不值得对代码进行所有更改。您将不得不重写魔术__get()方法并考虑某种方法来在一个结构中存储和访问两个返回。

我会留下getPostStatusConst()当前状态名称,并在下拉列表的状态列表中添加其他方法(甚至是静态方法)。

于 2016-08-03T20:52:01.120 回答
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 的索引:

意见\post\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',
    ],
]) ?>

意见\post\_form.php

<?= $form->field($model, 'status')->dropDownList(
    Post::getPostStatus(),
    ['prompt'=> '- Status -']
) ?>

所有这些情况似乎都很好。任何人有任何情况下这不起作用

于 2016-08-04T00:38:30.480 回答