多次删除与复选框cakephp

时间:2013-10-31 11:12:39

标签: php cakephp checkbox cakephp-2.0 cakephp-2.3

我有一个帖子列表,我想使用多个复选框删除它们。 我点了这个链接Multiple Check boxes in cake php 但我得到这个错误(我使用cakephp 2.4):

  1. 找不到PostsController :: deleteSelect()的视图。

  2. 确认您已创建文件:C:\ xampp \ htdocs \ cakephp2 \ app \ View \ Themed \ Cakestrap \ Posts \ delete_select.ctp

  3. 我想从index.ctp访问此数据,而不是从delete_select.ctp访问。我的问题是我如何访问这些数据“data ['Post'] ['box'] []”?

    我的代码是:

    index.ctp

    <?php foreach ($posts as $post): ?>
    <tr>
        <td><?php echo $post['Post']['id']; ?></td>
        <td>
            <?php echo $this->Html->link($post['Post']['title'], array('action' => 'view', $post['Post']['id'])); ?>
        </td>
        <td>
            <?php echo $post['Post']['created']; ?>
        </td>
    
        <td>
    
        <?php echo $this->Form->checkbox('post', 
                                      array(
                                        'value' => $post['Post']['id'],
                                        'name' => "data['Post']['box'][]",
                                       ));?></td>
    
        <td>
    
            <?php echo $this->Form->postLink(
                'Delete',
                array('action' => 'delete', $post['Post']['id']),
                array('confirm' => 'Are you sure?'));
            ?>
            <?php echo $this->Html->link('Edit', array('action' => 'edit', $post['Post']['id'])); ?>
    
        </td>
    </tr>
    <?php endforeach; ?>
    <p><?php echo $this->Html->link('deleteSelect', array('action' => 'deleteSelect')); ?></p>
    

    deleteSelect功能

        public function deleteSelect(){
    if(!empty($this->data)) {
        foreach($this->data['Post']['box'] as $key => $value){
    
                $this->Post->delete($value);
        }
        $this->redirect(array('action' => 'index'));
    }
    
    }
    

4 个答案:

答案 0 :(得分:1)

如果您希望将某些数据传递给您的操作,则必须在表单中包含所有复选框。

但是你不能这样做,因为你使用创建表单的Form::postLink并且你不能在另一个表单中嵌套表单。

所以你必须摆脱你的postLinks。你确定需要它们吗?它们不能都是简单的链接吗?

删除邮政链接后,您可以将所有代码放在一个大表格中

echo $this->Form->create('Post', array('action' => 'deleteSelect'));

// your foreach code here

echo $this->Form->end('Delete selected posts');

另外:在您的控制器中放置这段代码

$this->redirect(array('action' => 'index'));

超出if条件

所以即使没有传递数据(也没有选中复选框),页面也会被重定向

答案 1 :(得分:0)

CakePHP要求,如果你在控制器中调用一个函数,你就会有一个相应的.ctp文件,如上所述。

要解决此问题,您可以在方法中使用$this->autoRender = false;

答案 2 :(得分:0)

没有发布数据

视图文件的最后一行是:

<p><?php 
echo $this->Html->link(
    'deleteSelect', 
    array('action' => 'deleteSelect')
); 
?></p>

除非有一些javascript正在收听点击 - 这只是一个链接,而不是提交表单的东西,这意味着没有表单数据。鉴于此,相关的控制器操作未输入相应的if,因此尝试呈现视图文件:

public function deleteSelect(){
    if(!empty($this->data)) {
        ...
        // Unreachable
        $this->redirect(array('action' => 'index'));
    }

}

为了防止问题中提到的问题 - 简单的根据表单数据的存在进行重定向:

public function deleteSelect(){
    if(!empty($this->data)) {
        ...
    }

    // Always executed
    $this->redirect(array('action' => 'index'));
}

但是,这不会解决主要问题,因为它写的只会做什么。

输入需要采用

格式

对于做任何事情的输入(忽略javascript的使用),他们需要在一个表单中。因此,原始html需要改变:

<table>
    ...
    <input type="checkbox">
    ...
    <input type="checkbox">
    ...
    <input type="checkbox">
</table>
<p>
    <a href="/deleteSelect" ...>deleteSelect</a>
</p>

要:

<form action="/deleteSelect" ...>
    <table>
        ...
        <input type="checkbox">
        ...
        <input type="checkbox">
        ...
        <input type="checkbox">
    </table>

    <input type="submit" value="deleteSelect">
</form>

即:

  • 以表格
  • 包裹表格
  • 定义表单操作以转到相应的功能
  • 该链接必须更改为提交按钮。

通过这种方式,可以实现预期的结果。

警告 - 嵌套表单

知道将表单放在另一个表单中是无效的。因此,要使“普通表单”使“多删除”功能正常工作,需要删除各个删除按钮,因为它们也是嵌入式表单。使用postLink的另一种方法是使它们成为普通链接并使用简单的javascript处理程序来阻止通过get提交,例如:

$('a.delete').click(function(e) {
    if (confirm('Sure?')) {
        $.post(this.attr('href')});
    }
    return false;
});

答案 3 :(得分:0)

我已经在我的代码中实现了它,只看到我的代码。

      <div>


     <?php //echo $this->Form->create();

   echo $this->Form->create(null, array(
  'url' => array('controller' => 'manageParcels', 'action' => 'deleteParcel')
  ));

 ?>

  <table width="100%" border="1">
   <tr>
        <th></th>

         <th>Parcel Number</th>
         <th>Consignment Number </th>
         <th>Customer Name </th>
         <th>Customer Address </th>
         <th>Customer Phone-Number </th>
          <th>Customer EmailId </th>
            </tr>
        <?php foreach($parcelDatas as $parcelData){

            ?> 


        <tr>

       <td><input type="checkbox" name ="status[]" value="<?php echo   
        $parcelData['ManageParcel']['id'];  ?>"></input></td>


        <td align='center'><?php echo $this->html->link($parcelData['ManageParcel']
     ['parcelNo'], array('action' => 'editParcel',$parcelData['ManageParcel']['id']), 
      array('escape' => false));?> </td>
    <td align='center'><?php echo $parcelData['ManageParcel']['ConNo']; ?></td>
<td align='center'><?php echo $parcelData['ManageParcel']['cusName']; ?></td>
<td align='center'><?php echo $parcelData['ManageParcel']['cusAddress']; ?></td>
<td align='center'><?php echo $parcelData['ManageParcel']['cusPhone']; ?></td>
<td align='center'><?php echo $parcelData['ManageParcel']['cusEmail']; ?></td>

        </tr>
        <?php 
        }?>
        </table>
         <?php 

         echo $this->Form->end(__('Delete Parcel')); ?>

    </div>




 **My controller code**

       public function deleteParcel()
   {
    $this->autoRender=FALSE;
    if ($this->request->is('post'))
    {
        if(empty($this->request->data))

        {
            $this->Session->setFlash(__('Please select parcel '));
            return $this->redirect(
            array('controller' => 'ManageParcels', 'action' =>   
                            'listParcel')
            );
        }
        $deleteParcels=$this->request->data['status'];
        $size=sizeof($deleteParcels);
        foreach ($deleteParcels as $deleteParcel)
        {

            $this->ManageParcel->id = $deleteParcel;

            $parcelData=$this->ManageParcel->findById($deleteParcel);


            if ($this->ManageParcel->delete()) {
            $this->recordActivity('deleteParcel','Parcel 
                   Number '.$parcelData['ManageParcel']['parcelNo'] . ' deleted' );
            $this->Session->setFlash(__('Parcel data deleted'));

            }
    else {
    $this->Session->setFlash(__('Parcel data was  not Deleted'));
        return $this->redirect(array('action' => 'listParcel'));
            }

        }
    $this->recordActivity('deleteParcel',$size.' Parcels data deleted ');
        return $this->redirect(
        array('controller' => 'ManageParcels', 'action' => 'listParcel')
        );

    }


 }