蛋糕php 3.0中的多个表单提交

时间:2017-03-03 05:28:59

标签: cakephp cakephp-3.0 form-submit

我正在使用cake php 3.0来开发一个应用程序。当用户尝试编辑其详细信息时,成功的Flash消息会多次出现,因为表单已多次提交。我正在使用cake php form builder。这是我的代码

<?= $this->Form->create('Project'); ?>  
    <?= $this->Html->link('  キャンセル 編集', array('action' => 'view', $project['id']), array('class' => 'btn btn-default pull-right', 'style' => 'margin: 5px 14px 0 0', 'rule' => 'button')); ?>
   <?= $this->Form->button(__('   保存 '), array('class' => 'btn btn-default pull-right', 'style' => 'margin: 5px 14px 0 0 ',  'id' => 'edit', 'onsubmit'=> 'disable()')); ?>
  <h3 style="font-weight:bold; padding-left:10px; margin: 10px 0 20px;"> 案件基本情報 </h3>

   <section id="unseen">
   <div class="col-sm-12" role="complementary">
    <div class="panel panel-default" >
    <div class="panel-body table-responsive" style ="padding:0px !important">
      <table class="table table-bordered table-condensed f11 table-nowrap " style ="margin:0px; ">
        <tbody>
          <tr>
            <td width="23%" class="numeric cell-bg">案件ID</td>
            <td class="numeric">
              <?php if ($project['survey_status'] == $this->Comm->DbConst('PROJECT_SURVEY_STATUS_NEW')) { ?>
                <?= $this->Form->input('survey_id', array('type' => 'text', 'class' => 'form-control', 'required' => true, 'label' => false, 'value' => __($project['survey_id']))) ?> <div style="color:red;"><?php
                if (!empty($errors['survey_id'])) {
                  echo reset($errors['survey_id']);
                }
                ?></div></td>
            <?php } else { ?>
                  <?= $this->Form->input('survey_id', array('type' => 'text', 'class' => 'form-control', 'required' => false, 'label' => false, 'disabled' => true, 'value' => __($project['survey_id']))) ?> </td>
                <?php } ?>
            <td width="30%" colspan="2"  class="numeric cell-bg">運用者名</td>
          </tr>
          <tr>
            <td class="numeric cell-bg">案件名</td>
            <td class="numeric"><?= $this->Form->input('title', array('type' => 'text', 'class' => 'form-control', 'required' => true, 'label' => false, 'value' => __($project['title']))) ?> <div style="color:red;"><?php
                if (!empty($errors['title'])) {
                  echo reset($errors['title']);
                }
                ?></div></td>
            <td colspan="2" rowspan="3" class="numeric"> 
              <div class="selectRow">             
                <select class="operator form-control" style="max-width:100%; " name="operator[]" data-placeholder="運用者選択" multiple required >
                  <?php foreach ($operators as $operator) { ?>
                    <option value=<?php
                    echo $operator['id'] . ":" . $operator['username'];
                    ?> selected><?php echo h($operator['username']); ?></option>
                          <?php } ?>
                </select>
                <div style="color:red;"><?php
                  if (!empty($errors['operator'])) {
                    echo reset($errors['operator']);
                  }
                  ?></div>
              </div>
            </td>
          </tr>
          <tr>
            <td colspan="2" class="numeric cell-bg"><strong>顧客情報</strong></td>
          </tr>
          <tr>
            <td class="numeric cell-bg">会社名</td>
            <td class="numeric"><?= $this->Form->input('company_name', array('type' => 'text', 'class' => 'form-control', 'required' => true, 'label' => false, 'value' => __($project['company_name']))) ?> <div style="color:red;"> <?php
                if (!empty($errors['company_name'])) {
                  echo reset($errors['company_name']);
                }
                ?></div></td>
          </tr>
          <tr>
            <td class="numeric cell-bg">部署名</td>
            <td class="numeric"><?= $this->Form->input('department_name', array('type' => 'text', 'class' => 'form-control', 'required' => true, 'label' => false, 'value' => __($project['department_name']))) ?> <div style="color:red;"><?php
                if (!empty($errors['department_name'])) {
                  echo reset($errors['department_name']);
                }
                ?></div></td>
            <td colspan="2" class="numeric cell-bg">参照者 </td>
          </tr>      
          <tr>
            <td class="numeric cell-bg">管理者氏名</td>
            <td class="numeric"><?= $this->Form->input('name', array('type' => 'text', 'class' => 'form-control', 'required' => true, 'label' => false, 'value' => __($project['name']))) ?><div style="color:red;"> <?php
                if (!empty($errors['name'])) {
                  echo reset($errors['name']);
                }
                ?></div></td>
            <td colspan="2" rowspan="3" class="numeric">
              <div class="selectRow">             
                <select class="viewer form-control" style="max-width:100%;" name="viewer[]" data-placeholder="参照者選択" multiple required >
                  <?php foreach ($viewers as $viewer) { ?>
                    <option value=<?php echo $viewer['id'] . ":" . $viewer['username']; ?> selected><?php echo h($viewer['username']); ?></option>
                  <?php } ?>
                </select>             
                <div style="color:red;"><?php
                  if (!empty($errors['viewer'])) {
                    echo reset($errors['viewer']);
                  }
                  ?></div>
              </div>
            </td>
          </tr>
          <tr>
            <td class="numeric cell-bg">管理者アカウント</td>
            <td class="numeric"><?= $this->Form->input('air_id', array('type' => 'text', 'class' => 'form-control', 'required' => true, 'label' => false, 'value' => __($project['air_id']))) ?> <div style="color:red;"><?php
                if (!empty($errors['air_id'])) {
                  echo reset($errors['air_id']);
                }
                ?></div></td>
          </tr>
          <tr>
            <td class="numeric cell-bg">管理者メールアドレス</td>
            <td class="numeric"><?= $this->Form->input('email', array('type' => 'email', 'class' => 'form-control', 'required' => true, 'label' => false, 'value' => __($project['email']))) ?><div style="color:red;"> <?php
                if (!empty($errors['email'])) {
                  echo reset($errors['email']);
                }
                ?></div></td>
          </tr>

        </tbody>
      </table>
    </div>
  </div>
</div>

    Form-&gt; end()?&gt;

如何防止多次提交。使用cake php的功能或使用任何其他方法。我已经尝试加载csrf组件,但这对我没用。

2 个答案:

答案 0 :(得分:0)

我做了什么来阻止多个表单提交,是在提交和操作完成它的工作后,我重定向到另一个URL或相同。

<?php

public function add(){
    //Grab data and validate it
    if($this->save($data)){
        $this->Flash->set(...);
        return $this->redirect(array('action', 'index')); // redirect to prevent resubmission
    }
    //Do other processing ...

}

答案 1 :(得分:0)

根据我的经验,重复的表单提交通常总是双击......等等。只需让您的提交<button>调用一个禁用该按钮的JavaScript函数,然后提交表单就可以防止这种情况发生。

您可以考虑在隐藏字段中向表单添加唯一ID,以检测仍然可以通过的任何重复提交,但第一个选项应该可以解决问题。