Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii2:状态';启用'&';残疾人士';辅助函数-动态使用_Php_Yii2_Yii2 Advanced App_Yii2 Model - Fatal编程技术网

Php Yii2:状态';启用'&';残疾人士';辅助函数-动态使用

Php Yii2:状态';启用'&';残疾人士';辅助函数-动态使用,php,yii2,yii2-advanced-app,yii2-model,Php,Yii2,Yii2 Advanced App,Yii2 Model,我想将两个函数组合在一起,以整合代码,并根据其使用方式保持动态。我不知道这是否可能 首先,让我们列出基本用途。在我的示例中,我有Post和PostCategory模型(以及CRUD构建)。创建一个类别,然后创建一篇新文章并将其分配给该类别。帖子可以启用或禁用功能。基本上,您可以创建一些新的帖子,并在准备好之前让最终用户无法查看这些帖子。一个用例是滴灌供给系统,您可以每x天添加100个帖子,并有一个开关启用。这超出了本文的范围 views\post\\ form.php <div class

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

首先,让我们列出基本用途。在我的示例中,我有Post和PostCategory模型(以及CRUD构建)。创建一个类别,然后创建一篇新文章并将其分配给该类别。帖子可以启用
或禁用
功能。基本上,您可以创建一些新的帖子,并在准备好之前让最终用户无法查看这些帖子。一个用例是滴灌供给系统,您可以每x天添加100个帖子,并有一个开关启用
。这超出了本文的范围

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>
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',
    ];
}
<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'category.name',
        'name',
        'text:ntext',
        'postStatusConst',  // <-- Calls getPostStatusConst()
        'created_at:datetime',
        'updated_at:datetime',
    ],
]) ?>
    <?= 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'],
    ],
]); ?>
<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'category.name',
        'name',
        'text:ntext',
        'postStatus',
        'created_at:datetime',
        'updated_at:datetime',
    ],
]) ?>
<?= $form->field($model, 'status')->dropDownList(
    Post::getPostStatus(),
    ['prompt'=> '- Status -']
) ?>

现在它工作得很好:)但是,我不喜欢像在
getPostStatusConst()
中那样使用
get
,因为它不像
$model->postStatusConst
那样被访问,类似于与“getter”的关系

不过,我也想用这些作为“获取者”。在索引和视图中,也可以调用相同的函数。不返回数组,而是返回“好的名称”,如“已启用”或“已禁用”

出于这个原因,我不会重命名这个函数,因为我不想再添加任何混淆

views\post\view.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>
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',
    ];
}
<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'category.name',
        'name',
        'text:ntext',
        'postStatusConst',  // <-- Calls getPostStatusConst()
        'created_at:datetime',
        'updated_at:datetime',
    ],
]) ?>
    <?= 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'],
    ],
]); ?>
<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'category.name',
        'name',
        'text:ntext',
        'postStatus',
        'created_at:datetime',
        'updated_at:datetime',
    ],
]) ?>
<?= $form->field($model, 'status')->dropDownList(
    Post::getPostStatus(),
    ['prompt'=> '- Status -']
) ?>
这显然不起作用:)我没想到它会起作用,因为我知道,
$this
在类中引用它自己。它只是显示了我的目标

在关系中,
hasOne()

问题:
是否可以让
getPostStatusConst()
执行相同的操作?使用as
$model->postStatusConst
可以很好地显示
启用的
禁用的
,或者使用as
Post::getPostStatusConst()
来获取下拉列表的数组。

这是可能的,但不值得对代码进行所有更改。您必须重写magic
\uu get()
方法,并考虑以某种方式在一个结构中存储和访问两个返回


我将使用当前状态名离开
getPostStatusConst()
,并在下拉列表的状态列表中添加其他方法(甚至是静态方法)。

我非常接近。我没有想到PHP OOP行,但更多的是Yii。在谷歌上搜索了几次,我拍了拍额头。使用框架时,有时甚至会忘记用PHP编写代码;)

我重命名了该函数,使其更有意义

它无处不在。让我们看看我的积垢索引:

views\post\index.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>
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',
    ];
}
<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'category.name',
        'name',
        'text:ntext',
        'postStatusConst',  // <-- Calls getPostStatusConst()
        'created_at:datetime',
        'updated_at:datetime',
    ],
]) ?>
    <?= 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'],
    ],
]); ?>
<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'category.name',
        'name',
        'text:ntext',
        'postStatus',
        'created_at:datetime',
        'updated_at:datetime',
    ],
]) ?>
<?= $form->field($model, 'status')->dropDownList(
    Post::getPostStatus(),
    ['prompt'=> '- Status -']
) ?>

views\post\view.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>
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',
    ];
}
<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'category.name',
        'name',
        'text:ntext',
        'postStatusConst',  // <-- Calls getPostStatusConst()
        'created_at:datetime',
        'updated_at:datetime',
    ],
]) ?>
    <?= 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'],
    ],
]); ?>
<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'category.name',
        'name',
        'text:ntext',
        'postStatus',
        'created_at:datetime',
        'updated_at:datetime',
    ],
]) ?>
<?= $form->field($model, 'status')->dropDownList(
    Post::getPostStatus(),
    ['prompt'=> '- Status -']
) ?>

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>
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',
    ];
}
<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'category.name',
        'name',
        'text:ntext',
        'postStatusConst',  // <-- Calls getPostStatusConst()
        'created_at:datetime',
        'updated_at:datetime',
    ],
]) ?>
    <?= 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'],
    ],
]); ?>
<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'category.name',
        'name',
        'text:ntext',
        'postStatus',
        'created_at:datetime',
        'updated_at:datetime',
    ],
]) ?>
<?= $form->field($model, 'status')->dropDownList(
    Post::getPostStatus(),
    ['prompt'=> '- Status -']
) ?>


所有这些案例似乎都很有效。任何人有任何情况下,此将不起作用

谢谢您的时间。我同意,你说的不值得。在过去的项目中,我使用了两个独立的函数。随着我的前进,我试图把事情做得更好、更酷、更高效:)我想我在某个地方读到,关系,比如用Gii构建的关系(例如hasOne())知道如何使用它之间的区别。我浏览了代码,但没有跳过很多圈,因为每个文件都引用了另一个,引用了另一个lol。事实上,我非常接近:)我解决了它!我会在允许的时候标记我的答案(我想是2天)。在此之前,我愿意接受任何其他解决方案。可能是一些底层的Yii函数,或者更好的方法。这是一个不错的黑客攻击,但会根据PHP版本和配置触发错误/警告。在回答时,我考虑的是与Yii 2中的关系方法和属性可用的解决方案相同的解决方案。根据我的其他评论,它确实抛出了错误。我也在想同样的事情,它与关系有关。这应该是可复制的。我查看了源代码,但找不到他们在哪里实现了。您是否没有收到错误
严格标准:不应静态调用非静态方法Post::getPostStatus()?根据您的配置和/或PHP版本,您的日志(更糟糕的是,您的输出)可能会变得杂乱无章。几周前我重新安装了xampp,但忘记将错误报告更改为E_ALL。它是严格的和不赞成的。因此,虽然这确实很好,但strict会对此表示不满。