Выполнить действие перед перенаправлением на шаблон в диалоговом окне подтверждения

Первое поле — название критики, второе поле — содержание критики. Когда я что-то пишу в поле title автоматически создается объект Critic в БД. В этой ситуации у меня есть новая строка с новым критиком, но в поле содержимого значение равно null. В этой ситуации появляется диалоговое окно подтверждения.

Когда появится диалоговое окно подтверждения, что мне нужно сделать, чтобы нажать кнопку «ОК» и, помимо перенаправления на новый шаблон, выполнить 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');
        }
    }
});

person Community    schedule 05.08.2013    source источник


Ответы (2)


Мне неясно, каков маршрут к вашему контроллеру удаления. Я предполагаю, что "/Pys/{pysStr}" с именем маршрута "my_pys". Также ваш текущий «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 )

EDIT: (после чата)

$('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

person Flip    schedule 05.08.2013
comment
Да, этот код работает нормально, но то, что я ищу, - это deleteAction, вызываемый при нажатии кнопки «ОК», а не «Отмена». - person ; 05.08.2013
comment
скорректировал мой ответ, теперь он должен срабатывать при OK, а не отменять - person Flip; 05.08.2013
comment
Я только что отредактировал код вопроса. Теперь, когда я нажимаю кнопку «ОК», он эффективно выполняет else, и если я набираю console.log, появляется сообщение. Но функция удаления не выполняется. - person ; 05.08.2013
comment
Проверьте файлы журнала symfony, чтобы узнать, получает ли ваше приложение запрос от клиента. - person Flip; 05.08.2013
comment
Он не выполняет действие - person ; 05.08.2013
comment
Это может произойти, если что-то не так с вашей маршрутизацией или что-то еще не так во фреймворке. Проверьте ваш symfony dev.log в папке вашего приложения, чтобы увидеть, есть ли запрос в это время. Также хорошо проверять сетевой трафик с помощью браузера (например, с помощью firebug). - person Flip; 05.08.2013
comment
Странно, console.log появляется в консоли, когда я нажимаю кнопку «ОК», но строка $.get(Routing... не выполняется. В консоли браузера об этой строке ничего не появляется, только console.log - person ; 05.08.2013
comment
давайте продолжим это обсуждение в чате - person ; 05.08.2013
comment
Я пытаюсь уточнить функцию JS, и ошибка возникает в window.location.href = $(e.target).attr('href'); Вместо этого перенаправьте маршрут ссылки, перенаправленный на filmboot.local/app_dev.php /es/user/pelicula/machete/undefined Так что я думаю, что проблема в этой строке. У deleteAction нет возврата, это проблема? - person ; 06.08.2013
comment
присоединяйтесь к чату снова. или открыть новый вопрос. - person ferdynator; 06.08.2013
comment
Да, пожалуйста, закройте этот вопрос и начните новый, потому что один вопрос следует за другим, и сообщения должны редактироваться таким образом. Ваш последний вопрос касается того, как jEditable получает правильные значения. - person Flip; 06.08.2013

Взгляните на 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

Для дальнейшего чтения вы должны прочитать о jQuery и AJAX


В вашем 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() метод здесь.

person ferdynator    schedule 05.08.2013
comment
Да, этот код работает нормально, но то, что я ищу, - это deleteAction, вызываемый при нажатии кнопки «ОК», а не «Отмена». - person ; 05.08.2013
comment
Обновил мой ответ. Имейте в виду, что часть JavaScript не имеет ничего общего с Symfony2. - person ferdynator; 05.08.2013
comment
Я уже использую FOSJsRoutingBundle. Я только что отредактировал код вопроса. Теперь, когда я нажимаю кнопку «ОК», он эффективно выполняет else, и если я набираю console.log, появляется сообщение. Но функция удаления не выполняется. - person ; 05.08.2013
comment
Проверьте свою консоль. Какое сообщение о состоянии возвращает сервер? Также попробуйте добавить echo 1; exit; в свой action и посмотрите, вернется ли он. - person ferdynator; 05.08.2013
comment
какой у тебя вывод на консоль? Ответ сервера? Что-нибудь в логах сервера? - person ferdynator; 05.08.2013
comment
Странно, console.log появляется в консоли, когда я нажимаю кнопку «ОК», но строка $.get(Routing... не выполняется. В консоли браузера об этой строке ничего не появляется, только console.log - person ; 05.08.2013
comment
давайте продолжим это обсуждение в чате - person ; 05.08.2013
comment
Я пытаюсь уточнить функцию JS, и ошибка возникает в window.location.href = $(e.target).attr('href'); Вместо перенаправления маршрута ссылки, перенаправленного на http://filmboot.local/app_dev.php/es/user/pelicula/machete/undefined/ Так что я думаю, что проблема в этой строке. У deleteAction нет возврата, это проблема? - person ; 06.08.2013