我有一个帖子列表,我想使用多个复选框删除它们。 我点了这个链接Multiple Check boxes in cake php 但我得到这个错误(我使用cakephp 2.4):
找不到PostsController :: deleteSelect()的视图。
确认您已创建文件:C:\ xampp \ htdocs \ cakephp2 \ app \ View \ Themed \ Cakestrap \ Posts \ delete_select.ctp
我想从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'));
}
}
答案 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')
);
}
}