【问题标题】:Execute an action before redirecting to the template in the confirm dialog在确认对话框中重定向到模板之前执行操作
【发布时间】:2013-08-05 09:44:08
【问题描述】:

第一个字段是评论家的标题,第二个字段是评论家的内容。当我在标题字段中写入内容时,会自动在数据库中创建对象 Critic。在这种情况下,我有一个新的评论家的新行,但在内容的文件中,值为空。在这种情况下会出现一个确认对话框。

当确认对话框出现时,我应该怎么做才能点击“确定”按钮,除了被重定向到新模板之外,还要执行控制器的 eliminarCriticaAction。

$('a').on('click', function(e) {
        if( ! $('#criTitulo').val() || ! $('#criContenido').val() ) {
            if ( ! $('#criTitulo').val() && $('#criContenido').val() ) {
                if(! window.confirm( 'Falta el titulo' )) {
                    e.preventDefault();
                }               
            }
            else if ( ! $('#criContenido').val() && $('#criTitulo').val() ) {
                return confirm('Falta el contenido');
            }   
        }
    });

删除控制器的动作:

public function eliminarCriticaAction($pysStr)
{
    $em = $this->getDoctrine()->getManager();
    $pys = $em->getRepository('PYSBundle:Pys')->findPys($pysStr);
    $usuario = $this->get('security.context')->getToken()->getUser();
    $critica = $em->getRepository('UsuarioBundle:Usuario')->findCritica($usuario, $pys);

    if(!$critica) 
    {
        throw new AccessDeniedException("No hay ninguna crítica que borrar");
    }

    $em->remove($critica);

    $em->flush();

}

编辑

$('a').on('click', function(e) {
    var titulo = $('#criTitulo').val(), contenido = $('#criContenido').val();
    console.log(titulo);
    console.log(contenido);
    if ( ( titulo && !contenido ) || ( !titulo && contenido ) ) {
        e.preventDefault();
        console.log('Link clicked !');
        if (window.confirm( 'Falta el titulo' )) {
            $.get(Routing.generate('eliminar_critica.' + $('html').attr('lang'), { "_locale": $('html').attr('lang'), "pysStr": $('section').attr('pelicula') }));
            window.location.href = $(e.target).attr('href');
        }
    }
});

【问题讨论】:

    标签: javascript symfony dialog confirm


    【解决方案1】:

    我不清楚删除控制器的路径是什么。我将假设路由名称为“my_pys”的“/Pys/{pysStr}”。此外,您当前的“pysStr”应该在您的树枝模板中作为变量提供。假设您在显示控制器中放置:

    'currentPysStr' => $pysStr    (put this in the render method are argument)
    
    $('a').on('click', function(e) {
        if( ! $('#criTitulo').val() || ! $('#criContenido').val() ) {
            if ( ! $('#criTitulo').val() && $('#criContenido').val() ) {
                if(! window.confirm( 'Falta el titulo' )) {
                    e.preventDefault();
                } else {
                    $.get({{ path('my_pys', {'pysStr': currentPysStr}) }})
                }
            }
            else if ( ! $('#criContenido').val() && $('#criTitulo').val() ) {
                return confirm('Falta el contenido');
            }   
        }
    });
    

    然后在您的删除控制器中,您将拥有当前的 PysStr,并且只有当您在确认对话框中按 OK 时才会调用此控制器。

    与您的订单问题相同,您可以选择将此脚本放在树枝模板中还是使用全局变量。 (https://stackoverflow.com/questions/18035337/translate-the-jeditable-plugins-attributes/18035436#18035436)

    编辑:(聊天后)

    $('a').on('click', function(e) {
        var titulo = $('#criTitulo').val(),
            contenido = $('#criContenido').val();
        console.log(titulo);
        console.log(contenido);
        // Requested: XOR
        // One of the values must be set, the other one must not be set
        if ( ( titulo && !contenido ) || ( !titulo && contenido ) ) {
                e.preventDefault();
                console.log('Link clicked !');
                if (window.confirm( 'Falta el titulo' )) {
                    var ajax;
                    var url = Routing.generate('eliminar_critica.' + $('html').attr('lang'), { "_locale": $('html').attr('lang'), "pysStr": $('section').attr('pelicula') });
                    console.log(url); // This is just here for debugging purposes
                    ajax = $.get(url);
                    ajax.done(function() {
                        window.location.href = $(e.target).attr('href');
                    });
                }
        }
    });
    

    window.location.href 放在done() 中保证请求是在页面刷新之前发出的

    eliminarCriticaAction 应该给出一个响应,即一切都在进行 (2**) 响应。 204 适合这样:

    return new response('', 204); // 204: No Content

    【讨论】:

    • 是的,这段代码工作正常,但我正在寻找的是当按下“确定”按钮而不是“取消”时调用的 deleteAction。
    • 调整了我的答案,现在应该触发 OK,而不是取消
    • 我刚刚编辑了问题代码。现在,当单击“ok”按钮时,它会有效地执行“else”,如果我键入 console.log 则会出现消息。但是删除功能没有执行。
    • 检查你的 symfony 日志文件,看看你的应用是否收到了来自客户端的请求。
    • 如果您的路由出现问题或框架中的其他问题可能会发生这种情况。检查您的应用文件夹中的 symfony dev.log 以查看当时是否有请求。此外,最好使用浏览器检查网络流量(例如使用 firebug)。
    【解决方案2】:

    看看FOSJsRoutingBundle。它使您也可以在 JavaScript 中使用您的路由。

    安装包后,修改你的Controller annotation:

    eliminar_critica:
        locales: { es: "/eliminar-critica/{pysStr}/", en: "/delete-critic/{pysStr}/" }
        defaults: { _controller: UsuarioBundle:Default:eliminarCritica }
        options:
            expose: true
    

    之后就可以使用这段JavaScript代码来访问路由了:

    Routing.generate('eliminar_critica', { pysStr: 10 });
    // will result in /eliminar-critica/10/
    
    $.get(Routing.generate('eliminar_critica', { pysStr: 10 }));
    // will call /eliminar-critica/10/ without redirecting your browser
    

    如需进一步阅读,您应该阅读jQueryAJAX


    在你的 JavaScript 中:

    $('a').on('click', function(e) {
        if( ! $('#criTitulo').val() || ! $('#criContenido').val() ) {
            if ( ! $('#criTitulo').val() && $('#criContenido').val() ) {
                if(! window.confirm( 'Falta el titulo' )) {
                    e.preventDefault();
                } else {
                    // insert this line: (optional add a callback)
                    $.get(Routing.generate('eliminar_critica', { pysStr: 10 }));
                }
            }
            else if ( ! $('#criContenido').val() && $('#criTitulo').val() ) {
                return confirm('Falta el contenido');
            }   
        }
    });
    

    对于像

    这样的漂亮回调

    您的实体已被删除!

    看看 jQuery get() method here

    【讨论】:

    • 是的,这段代码工作正常,但我正在寻找的是当按下“确定”按钮而不是“取消”时调用的 deleteAction。
    • 更新了我的答案。请注意,JavaScript 部分与 Symfony2 无关。
    • 我已经在使用 FOSJsRoutingBundle。我刚刚编辑了问题代码。现在,当单击“ok”按钮时,它会有效地执行“else”,如果我键入 console.log 则会出现消息。但是删除功能没有执行。
    • 检查您的控制台。服务器返回什么状态信息?还可以尝试在您的action 中添加echo 1; exit; 并查看是否返回。
    • 你的控制台输出是什么?服务器响应?服务器日志中有任何内容吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2020-05-19
    • 1970-01-01
    相关资源
    最近更新 更多