如何识别CakePHP中3.X选择的按钮?

问题描述:

我认为答案Which Submit Button was Clicked in CakePHP?。这种情况并不适用于我,因为我对每个按钮同样的动作。如何识别CakePHP中3.X选择的按钮?

我想重新使用bootstrap模式,我想知道调用模式时选择了哪个项目。很简单,我有一张桌子,每个学校的对象都有成绩。当用户点击添加按钮,我想调用的模式,并添加一个档次为对象。我想知道选择哪个对象,因为我想重新使用的所有对象的模式。我怎么能在cakephp 3.x中做到这一点?

The classbook 后老师要添加一个档次,按+键我怎么知道,如果他/她选择了数学和英语,如果我用节省等级相同的模式? add grade

+0

你的问题还不清楚给我,所以你可以张贴一些截图? –

好,最简单的方法就是在模有隐藏字段,其中包含一个主题。我认为这与cakephp没有太大的关系。 实施例应该是这样的:

function modalopen(subject) { 
 
    $('#modal #subject').val(subject); 
 
    $('#modal').modal('toggle'); 
 
    }
<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
    <meta charset="utf-8"> 
 
    <title></title> 
 
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script> 
 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous"> 
 
    </head> 
 
    <body> 
 
    <button type="button" class="btn btn-info" onclick="modalopen('english')">+</button> 
 
<button type="button" class="btn btn-info" onclick="modalopen('math')">+</button> 
 

 
<div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="" aria-hidden="true"> 
 
    <div class="modal-dialog"> 
 
    <div class="modal-content"> 
 
     <div class="modal-header"> 
 
     <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 
 
     <h4 class="modal-title" id=""></h4> 
 
     </div> 
 
     <div class="modal-body"> 
 
     sub (will be hidden):<br> 
 
     <input type="text" name="subject" id ="subject" value="" placeholder="will be hidden"><br> 
 
     Mark:<br> 
 
     <input type="text" name="mark" id ="mark" value="" placeholder="mark"> 
 
     </div> 
 
     <div class="modal-footer"> 
 
     <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
 
     <button type="button" class="btn btn-primary">Save</button> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div> 
 
    </body> 
 
</html>

+0

假设你的模态包含一个Cake表单,我会在Cake中添加一个隐藏的表单域: –

确定哪个按钮被按下的唯一方法是使用JavaScript。这意味着使用按钮上的HTML标签选项为基础的方法来启动模式,即:

<!-- Button trigger modal: CAN *NOT* USE THIS TECHNIQUE!! --> 
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal"> 
    Launch demo modal 
</button> 

我假设你的模式里面的形式是蛋糕生成表格,并提交按钮一个正常的表单提交,这会触发页面的重绘,从而有效地杀死模式(IE没有“模式删除”)。

为了尽可能地接近Cake的范式,我会将它发送回服务器的隐藏表单域。

喜欢的东西:

在蛋糕上侧的CTP在创建表单:

// HTML WRAPPER FOR MODAL 

<?= $this->Form->create(yourentity); ?> 
(your form stuff) 
<?= $this->Form->hidden("subject_id",["id"=>"subject-id-field"]); 
(end of form stuff including submit) 
<?= $this->Form->end(); ?> 

// HTML WRAPPER FOR MODAL 

这将在您的形式像

<input type="hidden" name="subject_id" id="subject-id-field"/> 

东西我们需要在Javascript中抓住这个隐藏的字段,所以我给它一个名称(特定于表单)和一个id(全局),因为我更喜欢用#id-syntax指代所有内容,但是你也可以使用form [name = subject_id]和摆脱ID子句

在HTML中的浏览器端,来创建你的按钮:

<button type="button" class="btn btn-primary" onclick="launch_dialog('MATH')">Add Math</button> 

在JavaScript中的浏览器端,功能按钮被点击的时候打电话,这台形式的主题ID,然后启动模式/形态:

<script> 
function launch_dialog(subject) { 
    $("#subject-id-field").val(subject); // use the id of the hidden field 
    $("#your-modal").modal("show"); // or whatever you do to launch the modal 
} 
</script> 

论函数在服务器端表单目标:

 # in your controller php file 
    function formAction() { 
     if($this->request->data["subject_id"]=="MATH") { // use the name of the hidden field 
      // do math record 
     } 
     // etc 

    } 

另一个注意事项 - 如果您的成绩记录确实有subject_id记录的subject_id字段,您可以让该按钮的onclick函数使用该常数调用launch_dialog函数,然后您将不需要服务器内的任何IF函数行动代码。只要确保使用原来的记录来生成ID,例如:

在控制器之前渲染:

$this->set("subjects",$this->[entity]->Subjects->find("list"); 

在CTP文件,是这样的:

<?php foreach($subjects as $id=>$name): ?> 
<button type="button" class="btn btn-primary" 
    onclick="launch_dialog(<?= $id ?>)">Add <?= $name ?></button> 
<?php endforeach; ?>