php - (UPD) 在 yii 上不限制表格输入

标签 php mysql validation input yii

请原谅,如果这个问题已经出现在 StackExchange 上,但我没有在 Stack 和 Google 上找到它。

从一个角度来看,问题很简单:我需要在 Yii 框架上实现表格输入。没有问题,如果我不想将多行添加到数据库表中。例如:

WorkController::actionBatchCreate()。 Source: Yii - multiple records in one form submission .

    public function actionBatchCreate()
{
    $models=array();
    // since you know how many models
    $i=0;
    while($i < 5)
    {
        $models[]=Work::model();
        $i++;
        // you can also allocate memory for the model with `new Modelname` instead
        // of assigning the static model
    }
    if (isset($_POST['Work']))
    {
        $valid=true;
        foreach ($_POST['Work'] as $j=>$model)
        {
            if (isset($_POST['Work'][$j]))
            {
                $models[$j]=new Work; // if you had static model only
                $models[$j]->attributes=$model;
                $valid=$models[$j]->validate() && $valid;
            }
        }
        if ($valid)
        {
            $i=0;
            while(isset($models[$i]))
            {
                $models[$i++]->save(false);// models have already been validated
            }
            // anything else that you want to do, for example a redirect to admin page
            $this->redirect(array('work/admin'));
        }
    }

    $this->render('batchcreate',array('models'=>$models));
}

查看:batchcreate.php。 Source: Collecting Tabular Input

<div class="form">
<?php echo CHtml::beginForm(); ?>
<table>
    <tr>
        <th>Name</th>
        <th>Measure</th>
        <th>Count</th>
        <th>Work</th>
        <th>Mat</th>
        <th>Mech</th>
    </tr>
    <?php foreach($models as $m=>$model): ?>
        <tr>
            <td><?php echo CHtml::activeTextField($model,"[$m]work_name"); ?></td>
            <td><?php echo CHtml::activeTextField($model,"[$m]measure"); ?></td>
            <td><?php echo CHtml::activeTextField($model,"[$m]count"); ?></td>
            <td><?php echo CHtml::activeTextField($model,"[$m]work",array('size'=>8)); ?></td>
            <td><?php echo CHtml::activeTextField($model,"[$m]material",array('size'=>8)); ?></td>
            <td><?php echo CHtml::activeTextField($model,"[$m]mechanisms",array('size'=>8)); ?></td>
        </tr>
    <?php endforeach; ?>
</table>

<?php echo CHtml::submitButton('Save'); ?>
<?php echo CHtml::endForm(); ?>

actionBatchCreate() 所示 - 它将创建 5 个模型 Work(表格中有 5 行)。如果我只需要将 5 条记录添加到数据库中,它会完美地工作,而不是更少或更多。但是,如果我想添加更少 - 问题就开始了。由于 $valid 变量,它不会保存空行,因此如果它们为空,它们将突出显示。如果我删除验证 - 它会将空记录添加到数据库中。 在我看来,第二个循环必须做一些事情:while(isset($models[$i])),必须添加另一个条件。例如:检查某些字段在表单中是否不为空,如果为真 - 忽略它,但我不知道如何从模型中获取值,因为我是 Yii 的新手。 停止,pl0x。

更新:

我已经尝试实现这个东西。我将 $valid 变量更改为 array(),因此它的成员将对应于每个模型:

    public function actionBatchCreate()
{
    $models=array();
    $valid=array();
    // since you know how many models
    $i=0;
    while($i < 5)
    {
        $models[]=Work::model();
        $valid[$i]=0; // all false
        $i++;
        // you can also allocate memory for the model with `new Modelname` instead
        // of assigning the static model
    }
    if (isset($_POST['Work']))
    {

        foreach ($_POST['Work'] as $j=>$model)
        {
            if (isset($_POST['Work'][$j]))
            {
                $models[$j]=new Work; // if you had static model only
                $models[$j]->attributes=$model;
                if($models[$j]->validate()===true)
                {
                    $valid[$j]=1; // true
                }
            }
        }
        $i=0;
        while(isset($models[$i]))
        {
           if($valid[$i]===1) // if valid[i] true, then save
           {
               $models[$i]->save();// models have already been validated
           }
           $i++;
        }
        // anything else that you want to do, for example a redirect to admin page
        $this->redirect(array('work/admin'));
    }

    $this->render('batchcreate',array('models'=>$models));
}

结果它不保存任何东西,只是跳转到行$this->redirect(array('work/admin'));

最佳答案

作为快速解决方案,我可以提出下一个表单数据处理的简单方法:

if (isset($_POST['Work']))
{
    foreach ($_POST['Work'] as $j => $model)
    {
        if (isset($_POST['Work'][$j]))
        {
            $models[$j] = new Work();
            $models[$j]->attributes = $model;
            $models[$j]->save();
        }
    }
}

请注意,我删除了包含 if ($valid) {} 和所有其他相关内容的部分。这是因为 $model->save() 实际上执行数据验证,在您的情况下您不需要单独的验证和保存过程。

关于php - (UPD) 在 yii 上不限制表格输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23299423/

相关文章:

c# - 在 MySql 连接字符串中使用密码? C#

ajax - 通过ajax禁用验证器

javascript - jQuery 选择菜单验证器适用于 FF 和 Chrome,但不适用于 IE

validation - MVC3/Razor 客户端验证未触发

PHP重构工具

php - 如果文件名存在于媒体上传目录中,则在文件名末尾添加数字

mysql - 如果 EXPLAIN 仅显示 400 行,为什么 MySQL SELECT 查询需要 1-2 分钟才能运行?

php - 将一些数据反序列化为数组

php - 如何使用php生成随机人名?

php - 如何在 php 中使用 prepare 语句从数据库中获取数据?