CakePHP + jQuery AJAX回调 - 不通过$ session-> flash()删除会话;

时间:2010-07-15 07:27:39

标签: jquery session cakephp

基本上它会像这样崩溃:

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

问题:

  • 最终回调读取CakePHP的flash消息命令$ session-> flash(),并在简单的javascript弹出窗口中显示结果,其div标签是通过$('body').prepend()创建的。关闭弹出窗口后,创建的元素是来自DOM的.remove()。
  • 当用户单击链接并且为下一页运行Flash消息回调时,CakePHP闪存消息数据永远不会被删除,并且它会重新显示该消息。当一个人继续点击页面,或者直到一段时间过去,然后最终从PHP会话中删除该消息时,这将重复2-5次。
  • 直接访问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-&gt; Session-&gt; delete('Messages.flash')删除有问题的会话。也没有运气。

如果有人有任何建议,我很乐意听到。我没有想法。

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

2 个答案:

答案 0 :(得分:0)

我认为正在发生的事情是,在PHP重置之前,AJAX正在使用Session flash。通常,它是在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调用重置它。

答案 1 :(得分:0)

问题似乎是太多的AJAX请求与数据库会话冲突,所以时间完全关闭,数据库数据似乎被旧的会话数据覆盖。我将把它留在那并关闭这个问题。