2013-08-05 1 views
0

Первое поле - это имя критика, второе поле - содержание критика. Когда я пишу что-то в поле заголовка, автоматически создает объект Critic в db. В этой ситуации у меня есть новая строка с новым критиком, но в fileld содержимого значение равно 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(); 

} 

EDIT

$('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'); 
     } 
    } 
}); 

ответ

0

Неясно мне, что путь к вашему удаления контроллера. Я буду предполагать «/ 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

+0

Да, этот код работает нормально, но то, что я ищу, - это deleteAction, вызываемый при нажатии кнопки «ok», а не «cancel». –

+0

скорректировал мой ответ, теперь он должен активировать OK, а не отменять – Flip

+0

Я только что редактировал код вопроса. Теперь, когда вы нажимаете кнопку «ok», он эффективно выполняет «else», и если я набираю console.log, появляется сообщение. Но функция удаления не выполняется. –

0

Посмотрите на 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()method here.

+0

Да, этот код работает нормально, но то, что я ищу, - это deleteAction, вызываемый при нажатии «ok», , а не «отменить». –

+0

Обновлен мой ответ. Имейте в виду, что часть JavaScript не имеет ничего общего с ** Symfony2 **. – ferdynator

+0

Я уже пользуюсь FOSJsRoutingBundle. Я только что редактировал код вопроса. Теперь, когда вы нажимаете кнопку «ok», он эффективно выполняет «else», и если я набираю console.log, появляется сообщение. Но функция удаления не выполняется. –