2

2 つの機能を組み合わせて、コードを統合し、使用方法に応じて動的にしたいと考えています。これが可能かどうかはわかりません。

まず、基本的な使い方を整理しましょう。私の例では、Post および PostCategory モデル (および CRUD ビルド) があります。カテゴリを作成し、新しい投稿を作成してカテゴリに割り当てます。enabled投稿には、またはになる能力がありますdisabled。基本的に、いくつかの新しい投稿を作成し、準備ができるまでエンド ユーザーに表示されないようにすることができます。enabled1 つのユースケースはドリップ フィード システムで、100 件の投稿を追加し、x 日ごとに 1 つの切り替えを行うことができます。それはこの範囲を超えています。

views\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、 as inを使用するのは好きではありません。getPostStatusConst()$model->postStatusConst

ただし、これらを「ゲッター」としても使用したいと思います。インデックスとビューでは、同じ関数も呼び出すとよいでしょう。配列を返す代わりに、「Enabled」や「Disabled」などの「ナイスネーム」を返す

これ以上混乱させたくないので、関数の名前を変更しません。

ビュー\投稿\view.php

<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'category.name',
        'name',
        'text:ntext',
        'postStatusConst',  // <-- Calls getPostStatusConst()
        'created_at:datetime',
        'updated_at:datetime',
    ],
]) ?>

Noticeはcreate アクション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()ですか?as を使用し$model->postStatusConstて表示する、Enabledまたは適切に表示するDisabled、または asPost::getPostStatusConst()をドロップダウンの配列を取得するために使用します。

4

2 に答える 2