【问题标题】:CakePHP + jQuery AJAX callback - Not deleting session via $session->flash();CakePHP + jQuery AJAX 回调 - 不通过 $session->flash() 删除会话;
【发布时间】:2010-07-19 15:44:40
【问题描述】:

基本上是这样分解的:

  • 访问应用程序时会加载主模板页面。
  • 链接由 onclick 处理程序处理,该处理程序通过 jQuery ajax 调用重新加载 master 的相关部分,触发其他事件等。
  • 初始 onclick 处理程序完成后,它会调用两个或多个 ajax 回调来更新页面的其他部分。

问题:

  • 最后的回调读取 CakePHP 的 flash 消息命令 $session->flash(),并在一个简单的 javascript 弹出窗口中显示结果,谁的 div 标签是通过 $('body').prepend() 创建的。弹出窗口关闭后,创建的元素将从 DOM 中删除()。
  • 当用户单击一个链接并为下一页运行 Flash 消息回调时,CakePHP 的 Flash 消息数据从未被删除,它会重新显示该消息。当一个人继续点击页面时,这将重复 2-5 次,或者直到过了一小段时间,然后最终从 PHP 会话中删除该消息。
  • 直接访问ajax链接时,flash数据显示一次,页面重新加载后删除。

上周这一直让我难以置信。除了回调本身,我已经删除了所有其他不相关的东西,它仍然显示相同的行为。令人沮丧。

代码很简单,看起来像这样:

在 onclick 调用后返回的布局页面。

<?php echo $content_for_layout ?>

<script>
  $(window).ready(function() {
    page_load_callback();
  });
</script>

javascript。

function page_load_callback() {

  $.ajaxSetup({
        cache: true // We want our client to cache stuff, and override this in PHP.
  });

  $.ajax({
        cache: false, // Force this to not cache via jQuery
        beforeSend: function() {
            $('body').prepend('<div id="flash_message_popup"></div>');
        },
        url: flash_message_popup_link, // global variable set in default.ctp
        success: function(data) {
            $('#flash_message_popup').html(data);
            if ($('#flash_message_popup').is(':empty')) {
                $('#flash_message_popup').remove();
            } else {
                create_popup('flash_message_popup');
            }
        },
        error: function(a, b, c) {
            $('#flash_message_popup').remove();
        }
    });
}

function create_popup(tag) {
    if (editing_hall == true) {
        return false;
    }
    var selector = '#' + tag;
    $(selector).attr('style', 'position: absolute; display: none; top: 5; left: 5; z-index: 100;');
    $(selector).slideDown('slow');
}

*.ctp 文件。

<?php if ($message = $session->flash()): ?>
<span id="flash_data">
    <div class="flash_message"><?php echo $message; ?></div>
    <div class="btn_large bottom_round"><a name="" onclick="$('#flash_message_popup').slideUp('slow', function() { $('#flash_message_popup').remove(); });">close</a></div>
</span>
<?php endif; ?>

控制器方法。

function flash_message_popup() {
    $expires = 60*60*24*30*7;
    header('Expires: '.gmdate('D, d M Y H:i:s', time()-$expires) . ' JST'); // minus for past  
    $this->layout = 'ajax';

    $this->render('../elements/flash_message_popup');
}

会话被存储在数据库中,直到这个特定的实例才被证明是一个问题。我不确定这是否是浏览器缓存问题(我不应该是?我特别没有通过 PHP 和 jQuery 进行缓存)、古怪的会话问题、时间问题、我的 javascript 中出现的问题,或者什么。我尝试添加一个冗余回调,它使用 $this->Session->delete('Messages.flash'); 删除有问题的会话;也没有运气。

如果有人有任何建议,我很想听听。我没主意了。

编辑:我还检查了 Apache 日志,回调肯定会被 ajax 查询调用,但不会删除会话消息。只有在我手动调用它之后它才会删除。

【问题讨论】:

  • 我目前已返回到在返回的 /controller/action 视图中内联打印 Flash 消息。然而,这不是我想做的。我们正在专门设计页面,以便可以缓存 html 本身,并通过 ajax 调用更新页面的相关部分。如果消息发生更改,客户端将不幸地读取先前缓存的页面,这是不可取的。我还在纠结为什么 主页加载后的回调没有 删除会话数据。啊。
  • 我使用 jQuery 计时器库减慢了回调速度,这有助于缓解问题,但并不能完全消除它。还在考虑。

标签: jquery session cakephp


【解决方案1】:

我认为发生的事情是 AJAX 在 PHP 重置会话闪存之前对其进行处理。通常,它在 CRUD 方法中设置为成功或失败,例如

    if ($this->Invoice->save($this->data)) {
        $this->Session->setFlash(__('The Invoice has been saved', true));
        $this->redirect(array('action' => 'index'));
    } else {
        $this->Session->setFlash(__('The Invoice could not be saved. Please, try again.', true));
    }

因为您正在执行 AJAX 操作,所以在显示 flash 消息之前它可能无法到达该代码。在这种情况下,我要么在进入方法时重置它,要么在你显示它之后使用 AJAX 调用来重置它。

【讨论】:

  • 感谢 Leo 的回复。现在,onclick 调用转到基于标准 CRUD 的 /controller/action,后者又根据响应调用 setFlash,然后返回标准 action.ctp 文件。这一切都经过测试,可以作为标准页面跳转正常工作。在我们对所有内容进行 AJAX 处理之后,我们添加了一个回调,该回调 /controller/action 的数据返回(无重定向)之后运行。从理论上讲,这意味着下次您调用 $session->flash() 时,它将打印并立即删除该数据。不幸的是,它不会立即删除它,后续操作会再次调用它。
  • 没有足够的字符来评论!一时兴起,我向 afterFilter() 添加了显式 $this->Session->delete 无济于事,并且还使用了标准会话(不是 Message.flash),也没有运气。
【解决方案2】:

问题似乎是与数据库会话冲突的 AJAX 请求太多,因此时间完全关闭,并且数据库数据似乎被旧会话数据覆盖。我将保留它并关闭此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多