forms - Yii2 一个 Action 中的多种形式

标签 forms yii2

在单个操作中处理多个表单的正确方法是什么?

这是我的模型/MembersBans.php

<?php

namespace app\models;

use Yii;
use yii\behaviors\TimestampBehavior;
use app\models\Members;

class MembersBans extends \yii\db\ActiveRecord {

public $username;

public static function tableName() {
    return '{{%members_bans}}';
}

public static function primaryKey() {
    return array('ban_id');
}

public function behaviors() {
    return [
        [
            'class' => TimestampBehavior::className(),
            'createdAtAttribute' => 'date_added',
            'updatedAtAttribute' => 'last_updated',
        ],
    ];
}

public function rules() {
    return [
        [['ban_id', 'ban_memberid', 'date_added', 'last_updated'], 'integer'],
        [['username', 'end_date'], 'safe'],
        ['end_date', 'date', 'format' => 'yyyy-mm-dd'],
        [['ban_ip'], 'string', 'max' => 40],
        [['reason'], 'string', 'max' => 255]
    ];
}

public function attributeLabels() {
    return [
        'ban_id' => Yii::t('app', 'ID на бана'),
        'ban_memberid' => Yii::t('app', 'Потребителско ID'),
        'username' => 'Потребителско име',
        'ban_ip' => Yii::t('app', 'IP адрес'),
        'end_date' => Yii::t('app', 'Дата на изтичане'),
        'reason' => Yii::t('app', 'Причина за бана'),
        'date_added' => Yii::t('app', 'Дата на добавяне'),
    ];
}

public function getMemberBans() {
    $bans = $this->find()->where('ban_memberid');
    return $bans;
}

public function getIpBans() {
    $bans = $this->find()->where('ban_ip');
    return $bans;
}

public function getMember() {
    return $this->hasOne(Members::className(), ['member_id' => 'ban_memberid']);
}

public function banMember() {
    $memberInfo = Members::findByUsername($this->username);
    if ($memberInfo) {
        $this->ban_memberid = $memberInfo->member_id;
        if ($this->save()) {
            Yii::$app->session->setFlash('alert-success', 'Потребителят беше успешно блокиран.');
        } else {
            Yii::$app->session->setFlash('alert-error', 'Възникна грешка при блокирането на потребителя.');
        }
    } else {
        Yii::$app->session->setFlash('alert-error', 'Не съществува потребител с това потребителско име.');
    }
}

public function banIp() {
    if ($this->save()) {
        Yii::$app->session->setFlash('alert-success', 'IP адресът беше успешно блокиран.');
    } else {
        Yii::$app->session->setFlash('alert-error', 'Възникна грешка при блокирането на IP адреса.');
    }
}

}

我的 Controller /MembersBansController.php:

public function actionList() {
    $membersBans = new MembersBans();
    if ($membersBans->load(Yii::$app->request->post('banMember'))) {
        $membersBans->banMember();
    }
    if ($membersBans->load(Yii::$app->request->post('banIp'))) {
        $membersBans->banIp();
    }
    return $this->render('list', [
                'membersBans' => $membersBans,
    ]);
}

意见/成员(member)禁令/名单:

<div class="the-box">
    <?php
    $activeForm = ActiveForm::begin([
        'id'                     => 'banMember',
        'enableClientValidation' => true,
        'enableAjaxValidation'   => true,
        'validateOnSubmit'       => true,
        'validateOnChange'       => true,
        'validateOnType'         => true,
    ])
    ?>
    <?= $activeForm->field($membersBans, 'username', [
        'template' => '{label}{input}{hint}{error}'
    ])->textInput(['class' => 'form-control', 'placeholder' => 'Въведете потребителско име']);
    ?>
    <?= $activeForm->field($membersBans, 'end_date', [
        'template' => '{label}{input}{hint}{error}'
    ])->textInput(['class' => 'form-control datepicker', 'placeholder' => 'Въведете период на бана']);
    ?>
    <?= $activeForm->field($membersBans, 'reason', [
        'template' => '{label}{input}{hint}{error}'
    ])->textInput(['class' => 'form-control', 'placeholder' => 'Въведете причина за бана']);
    ?>
    <div class="form-group">
        <?= Html::submitButton('Добави', ['type' => 'submit', 'class' => 'btn btn-default']) ?>
    </div>
    <?php ActiveForm::end()?>
</div>


<div class="the-box">
    <?php
    $activeForm = ActiveForm::begin([
        'id'                     => 'banIp',
        'enableClientValidation' => true,
        'enableAjaxValidation'   => true,
        'validateOnSubmit'       => true,
        'validateOnChange'       => true,
        'validateOnType'         => true,
    ])
    ?>
    <?= $activeForm->field($membersBans, 'ban_ip', [
        'template' => '{label}{input}{hint}{error}'
    ])->textInput(['class' => 'form-control', 'placeholder' => 'Въведете IP адрес или цяла мрежа']);
    ?>
    <?= $activeForm->field($membersBans, 'end_date', [
        'template' => '{label}{input}{hint}{error}'
    ])->textInput(['class' => 'form-control datepicker', 'placeholder' => 'Въведете период на бана']);
    ?>
    <?= $activeForm->field($membersBans, 'reason', [
        'template' => '{label}{input}{hint}{error}'
    ])->textInput(['class' => 'form-control', 'placeholder' => 'Въведете причина за бана']);
    ?>
    <div class="form-group">
        <?= Html::submitButton('Добави', ['type' => 'submit', 'class' => 'btn btn-default']) ?>
    </div>
    <?php ActiveForm::end() ?>
</div>

它似乎不起作用。有任何想法吗?

最佳答案

身份证号 ActiveForm并不意味着 $_POST 中的 id。你应该使用:
$membersBans->load(Yii::$app->request->post())
或者
$membersBans->load(Yii::$app->request->post('MembersBans'))
用于从表单加载属性。

例如来自 CeBe 的多种表格 ( http://www.yiiframework.com/forum/index.php/topic/53935-solved-subforms/page__p__248184#entry248184 )

public function actionCreate()
{   
    $user = new User;
    $profile = new Profile;

    if ($user->load(Yii::$app->request->post()) && $profile->load(Yii::$app->request->post()) && Model::validateMultiple([$user, $profile])) {

        $user->save(false); // skip validation as model is already validated
        $profile->user_id = $user->id; // no need for validation rule on user_id as you set it yourself
        $profile-save(false); 

        return $this->redirect(['view', 'id' => $user->id]);
    } else {
        return $this->render('create', [
            'user' => $user,
            'profile' => $profile,
        ]);
    }
}

在您的 action你用一个 model .我认为你应该扩展 MembersBansMembersBansIp类(class)。还有您的 action :
public function actionList() {
    $membersBans = new MembersBans();
    $membersBansIp = new MembersBansIp();
    if ($membersBans->load(Yii::$app->request->post())) {
        $membersBans->banMember();
    }
    if ($membersBansIp->load(Yii::$app->request->post())) {
        $membersBansIp->banIp();
    }
    return $this->render('list', [
                'membersBans' => $membersBans,
                'membersBansIp' => $membersBansIp,
    ]);
}

view :
<?php
    $activeForm = ActiveForm::begin([
            'id' => 'banMember',
])
?>

    <?= $activeForm->field($membersBans, 'fieldMembersBans') ?>
    <?= Html::submitButton('Login', ['class' => 'btn btn-primary']) ?>
    <?php ActiveForm::end() ?>
<?php
    $activeForm = ActiveForm::begin([
            'id' => 'banMemberIp',
])
?>

    <?= $activeForm->field($membersBansIp, 'usernameMembersBansIp') ?>
    <?= Html::submitButton('Login', ['class' => 'btn btn-primary']) ?>
    <?php ActiveForm::end() ?>

编辑

我把你的代码。他是工作。 https://yadi.sk/i/y7PkwGUPekjPD https://yadi.sk/i/h8dCYQz3ekk2B

但是我将 Controller 更改为此
$membersBans = new MembersBans();
        if ($membersBans->load(Yii::$app->request->post())) {
            $membersBans->banMember();
        }
        if ($membersBans->load(Yii::$app->request->post())) {
            $membersBans->banIp();
        }

而在 modelMembersUser ,因为我没有Members对象:
$memberInfo = User::findByUsername($this->username);
        if ($memberInfo) {
            $this->ban_memberid = $memberInfo->id;

简历:您的代码有效。更改 controller ,我怎么写的。

关于forms - Yii2 一个 Action 中的多种形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28567736/

相关文章:

javascript - 通过 jquery 更改 select 中的默认选定选项

php - 提交表单后尝试创建一个 php 自动电子邮件,并使用 HTML 设置电子邮件样式

php - Yii2 效率——外键还是匿名函数?

php - Yii2 db mysql 连接抛出 ssh 端口 33060

javascript - 如何禁用/覆盖 Yii2 中的依赖项

javascript - 将 javascript 数组中的值发送到表单值 html,将 html 值中的值发送到 php

php - 确定是否选择了其他 <option>,或者是否提交了带有空白值的默认值 "Select one..."

php - 如何在yii2中使用查询数据进行另一个sql查询

php - 上传不带扩展名的文件 yii2

jquery - WordPress 联系表单 7 将值从表单传递到联系表单