0

我正在寻找如何完成下一个任务。我有一个控制器,它加载一个视图,其中一个表列出了我的数据库中的页面。在表格中的每一行中都有一个图标的位置,单击该图标将执行以下两项操作之一。

如果用户没有启用 javascript:

  • 单击该图标将重定向到控制器中的删除功能,其中页面的 id 作为参数
  • 删除控制器函数将在模型发送页面 id 中运行删除函数以删除模型函数
  • 模型中的删除函数将从数据库中删除页面,当返回到页面控制器删除函数时,它将重定向回索引函数以再次显示页面表列表。
  • 重定向后,它将显示有关成功/失败的标题和消息。

如果用户确实启用了 javascript:

  • 使用带有数据页面 id 的 jquery post 方法向控制器中的删除函数发送帖子
  • 删除控制器函数将在模型发送页面 id 中运行删除函数以删除模型函数
  • 模型中的删除函数将从数据库中删除页面,当返回到页面控制器删除函数时,它会为 json 对象创建一个消息数组以返回到 post 请求的成功函数。
  • 带有我的 pnotify 插件的消息将创建一条由该 json 对象形成的消息并将其显示给用户

我想知道的是如何正确适应这两种情况?我已经开始尝试这个,但如果到目前为止我犯了错误,我想澄清一下。

<?php
// Controller delete function
public function delete($content_page_id)
{
    if (isset($content_page_id) && is_numeric($content_page_id))
    {
        $content_page_data = $this->content_page->get($content_page_id);
        if (!empty($content_page_data))
        {
            //update is ran instead of delete to accompodate 
            //for the soft delete functionality
            $this->content_page->update('status_id', 3);
            if ($this->input->is_ajax_request())
            {
               //return json data array
            }
        }
    }
}
?>

用于带有删除按钮的多个表的全局 JS 文件

/* Delete Item */
$('.delete').click(function(event) { 
    event.preventDefault();
    var item_id = $(this).attr('rel');
    $.post(<?php echo current_url(); ?>'delete', { item_id : item_id }, function(data)  
    {
        if (data.success)
        {
            var anSelected = fnGetSelected( oTable );
            oTable.fnDeleteRow( anSelected[0] );
        }
    }, 'json');
});
4

2 回答 2

5

我认为你应该在 PHP 中有两个函数:

public function delete($content_page_id) {
  // Your delete code

  return "a string without format";
}

public function deleteAjax($content_page_id) {
  return json_encode($this->delete($content_page_id));
}

因此,当用户启用 JS 时,您调用 deleteAjax 并在 $.post 函数中传递一个参数,让 PHP 知道 JS 已启用:

$.post(<?php echo current_url(); ?>'delete', { item_id : item_id, js: 1 }, function(data)  
{
    if (data.success)
    {
        var anSelected = fnGetSelected( oTable );
        oTable.fnDeleteRow( anSelected[0] );
    }
}, 'json');

如果 JS 被禁用,则调用其他函数。您应该使用 AJAX 专用控制器而不是同一类中的函数。

于 2013-08-30T18:37:18.943 回答
0

1)就“显示消息”而言 -如果存在,视图本身可以准备好接收“消息” 。带我们回到...

2)你可以让你的删除功能返回你想要显示的消息吗?您的 AJAX 方法将忽略此消息,而您的视图将显示它...

3)我同意您的“控制器删除功能”应该根据请求是否为 AJAX 以不同的结果“完成”。我喜欢@Skaparate(8 月 30 日 18:37 回答)在添加时所做的事情:js:1 在你的删除函数中,你可以在一个简单的条件下使用它:

if js = 1
    标头('HTTP/1.1 200');
否则
    调用视图并包含/传入“消息”

于 2013-09-07T14:25:50.877 回答