bootstrap 3确认cakephp中的删除模式

时间:2014-06-01 14:08:23

标签: javascript php jquery twitter-bootstrap cakephp

嗨我有一个记录表,其中每行都有一个删除链接。你会发现删除操作的cakephp:

public function delete($id){

        if ($this->request->is('get')) {
            throw new MethodNotAllowedException();
        }

        if ($this->Category->delete($id)) {
            $this->Session->setFlash( 'Votre élément a été supprimé.','default',array(),'success');
            return $this->redirect(array('action' => 'index'));
        }

    }

所以当我点击删除按钮时,会显示原始的javascript确认对话框,以确认视图中删除的操作。这是一个包含删除链接的index.ctp:

<!--table content-->
  <table class="table table-striped table-condensed table-bordered">
    <tr>
        <th>title</th>
        <th>Actions</th>
    </tr>

    <?php foreach ($categorys as $category): ?>
    <tr>
        <td><?php echo $category['Category']['title']; ?></td>
        <td>
            <?php
            echo $this->Html->link('View',
                                   array('controller' => 'categories', 'action' => 'view', $category['Category']['id']),
                                   array('class' => 'btn btn-info btn-sm active')
                                   ); ?>
            <?php
            echo $this->Html->link(
                'Edit', array('action' => 'edit', $category['Category']['id']),
                          array('class' => 'btn btn-primary btn-sm active')
            );
            ?>
            <?php
            echo $this->Form->postLink(
                'Delete',
                array('action' => 'delete', $category['Category']['id']),
                array('confirm' => 'Do you want really to delete thi element?','class' => 'btn btn-danger btn-sm active')
            );
            ?>
        </td>
    </tr>
    <?php endforeach; ?>
    <?php unset($category); ?>
  </table>

所以对于我想要的postlink,当我点击链接时它会显示一个像这样的bootstrap确认模式:

 <!-- Modal -->
    <div class="modal fade" id="ConfirmDelete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
        <div class="modal-dialog modal-sm">
            <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="myModalLabel">Category deletion</h4>
                </div>
                <div class="modal-body">
                    Do you  really want  to delete thi element?
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                    <a  class="btn btn-danger danger">Confirm</a>
                </div>
            </div>
        </div>
    </div>

有人可以帮我使用cake php的jshelper来创建一个bootstrap模式对话框而不是默认对话框。

谢谢。

2 个答案:

答案 0 :(得分:3)

我编辑了我的答案并改进了代码

在索引页面而不是postLink上,创建一个将调用模态的按钮或链接,即

<?php 
echo $this->Html->link(
    $this->Html->tag('i', '', array('class' => 'glyphicon glyphicon-trash')), 
    '#', 
    array(
       'class'=>'btn btn-danger btn-confirm',
       'data-toggle'=> 'modal',
       'data-target' => '#ConfirmDelete',
       'data-action'=> Router::url(
          array('action'=>'delete',$category['Category']['id'])
       ),
       'escape' => false), 
false);
?>

在你的模态中添加没有确认消息的postLink,而不是消息put false:

<?php
    echo $this->Form->postLink(
         'Confirm',
            array('action' => 'delete'),
            array('class' => 'btn btn-danger btn-sm active'),
            false,
         )
        );
        ?>

在bootstrap.js

之后添加此js代码
$(document).ready(function() {
  $(".btn-confirm").on("click", function () {
     var action = $(this).attr('data-action');
     $("form").attr('action',action);
});
});

或根据user1655410的建议添加此js代码

$('#ConfirmDelete').on('show.bs.modal', function(e) {
    $(this).find('form').attr('action', $(e.relatedTarget).data('action'));
});

答案 1 :(得分:0)

AJAX(这更灵活,但下面还有另一个简单的解决方案): 更新您的视图以获取类别列表:将删除后链接更改为://此按钮将触发ajax调用,添加ajx div和脚本

   <table class="table table-striped table-condensed table-bordered">
   <tr>
    <th>title</th>
    <th>Actions</th>
</tr>

    <?php foreach ($categorys as $category): ?>
<tr>
    <td><?php echo $category['Category']['title']; ?></td>
    <td>
        <?php
        echo $this->Html->link('View',
                               array('controller' => 'categories', 'action' => 'view', $category['Category']['id']),
                               array('class' => 'btn btn-info btn-sm active')
                               ); ?>
        <?php
        echo $this->Html->link(
            'Edit', array('action' => 'edit', $category['Category']['id']),
                      array('class' => 'btn btn-primary btn-sm active')
        );
        ?>
        <?php
          echo $this->Html->link(
          'Delete',
          "#",
           array("class"=>"btn btn-danger delete-btn", "data-id"=>$category['Category']['id'])
           );
         ?>
    </td>
</tr>
<?php endforeach; ?>
<?php unset($category); ?>
 </table>

  //add this div
    <div id="ajax_modal"></div>

  //add this script
    <script type="text/javascript">
        $(".delete-btn").click(function(){
        $.ajax({
        type: "POST",
        data:{
           category_id:$(this).attr("data-id"),
        },
        url: "<?php echo $this->base;?>/categories/ajax_show_delete_modal", //ajax function
        success:function(data) {
           $("#ajax_modal").html(data);
        }
    }); 
   });
   </script>

在您的Categories Controller中添加此功能:

  public function ajax_show_delete_modal(){
      $category_id = isset($_POST['category_id']) ? $_POST['category_id'] : 0;
      $this->set("category_id", $category_id);
      $this->layout = "ajax";
  }

添加到您的应用/视图/类别/:ajax_show_delete_modal.ctp

 <div class="modal fade" id="ConfirmDelete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-sm">
        <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="myModalLabel">Category deletion</h4>
            </div>
            <div class="modal-body">
                Do you  really want  to delete this element?
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <a  href="<?php echo $this->base.'/categories/delete/'.$category_id;?>" class="btn btn-danger danger">Confirm</a>
            </div>
        </div>
    </div>
</div>
<script type="text/javascript">
    $("#trigger").click();
</script>

另一个解决方案,简单的一个:

  <table class="table table-striped table-condensed table-bordered">
<tr>
    <th>title</th>
    <th>Actions</th>
</tr>

<?php foreach ($categorys as $category): ?>
<tr>
    <td><?php echo $category['Category']['title']; ?></td>
    <td>
        <?php
        echo $this->Html->link('View',
                               array('controller' => 'categories', 'action' => 'view', $category['Category']['id']),
                               array('class' => 'btn btn-info btn-sm active')
                               ); ?>
        <?php
        echo $this->Html->link(
            'Edit', array('action' => 'edit', $category['Category']['id']),
                      array('class' => 'btn btn-primary btn-sm active')
        );
        ?>
          <?php
         echo $this->Html->link(
       'Delete',
        "#",
        array("class"=>"btn btn-danger delete-btn", "data-id"=>$category['Category']['id']) //$category['Category']['id'])
        );
       ?>
    </td>
</tr>
   <?php endforeach; ?>
      <?php unset($category); ?>
  </table>

     <a data-target="#ConfirmDelete" role="button" data-toggle="modal" id="trigger"></a>
     <div class="modal fade" id="ConfirmDelete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
      <div class="modal-dialog modal-sm">
          <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="myModalLabel">Category deletion</h4>
              </div>
              <div class="modal-body">
                  Do you  really want  to delete this element?
              </div>
              <div class="modal-footer">
                  <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                  <div id="ajax_button"></div>
              </div>
          </div>
      </div>
  </div>
  <script type="text/javascript">
      $(".delete-btn").click(function(){
       $("#ajax_button").html("<a href='<?php echo $this->base;?>/categories/delete/"+ $(this).attr("data-id")+";?>' class='btn btn-danger'>Confirm</a>");
      $("#trigger").click();  
 });