Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Manipular variables del controlador en el JS de la vista

15 de marzo de 2016

Holaa!

Estoy intentando que en mi proyecto al elegir uno de los nombres de la plantillas que tengo en una base de datos guardadas a través de un campo choice de un formulario, estas aparezcan en un tinymce. Con plantilla me refiero a unas tablas que ya tengo creadas parcialmente rellenas para ahorrarle tiempo a mis supuestos usuarios.

Tanto el nombre de las plantillas como el contenido de las mismas lo consulto en la base de datos a través de controlador, y luego estos datos se los paso a la vista. El contenido de las plantillas lo paso como un array donde cada posición del mismo coincide con la opción en el formulario (el nombre de la misma)

$("#nombre_del_form").change(function() {
       //conozco la opción elegida que coincidiría con la posición del array donde guardo el contenido de las plantillas                 
        var s =$(this).val();  
        if (s > 0){ 
            var selected = CONTENIDO DE LA PLANTILLA; //esto es lo que me faltaría!!!!!          
           tinyMCE.activeEditor.setContent(selected);           
        }      
 
    });

GRACIAAAS!!!


Respuestas

#1

Hola @helenmelenen, Pienso que la petición la deberías hacer con un ajax para que te traiga el contenido y puedas colocarlo en el campo que quieres.

Algo como esto:

$(nombre_del_form).change(function () {
 
    $.ajax({
        url: Routing.generate('ajax_route_name', {'code': $(this).val()}),
        data: {code: $(this).val()},
 
        statusCode: {
            404: function () {
                $(row_id).find('div').text("{{ 'meesage.notfound'|trans }}");
            }
        }
 
    }).done(function (data) {
 
        tinyMCE.activeEditor.setContent; //NO se si así se escriba en el editor
 
    });
 
});

Espero te sirva,

Saludos

@miguelplazasr

15 marzo 2016, 15:28
#2

Además de la anterior solución Ajax, también podrías resolverlo de la siguiente manera. Suponiendo que esta sea la variable que pasas desde el controlador:

$plantillas = array(
    '<table> ... </table>',
    '<table> ... </table>',
    '<table> ... </table>',
);

Puedes transformar esa variable PHP en JavaScript gracias a Twig. Sería algo así:

<script>
{% for i, plantilla in plantillas %}
    var plantillas[{{ i }}] = "{{ plantilla|e('js') }}";
{% endfor %}
</script>

El |e('js) es importante porque estás metiendo valores de variables dentro de cadenas que se usan en código JavaScript, así que debes "escapar" los contenidos para JavaScript (y eso es lo que significa |e('js'))

Tu navegador vería este código así:

var plantillas[0] = "<table> ... </table>";
var plantillas[1] = "<table> ... </table>";
var plantillas[2] = "<table> ... </table>";

Otra posible solución sería codificar como JSON el array de plantillas en el controlador y pasarlo como una cadena de texto. Luego ya lo utilizas en JavaScript directamente así:

var plantillas = "{{ plantillas_codificadas_en_json|e('js') }}";

@javiereguiluz

15 marzo 2016, 15:38
#3

Gracias por las respuestas @miguelplazasr y @javiereguiluz. Respecto a tu solución @miguelplazasr, ¿cuál sería la 'ajax_route_name'?¿La del controlador que devuelve los datos a la vista? ¿y el 'code'?

Por otro lado @javiereguiluz, he probado tu solución de esta manera:

En el controlador:

$contents = json_encode($template_contents); return $this->render('EjemploBundle:Ejemplo:ejemplo.html.twig', array( 'form' => $form->createView(),'contents'=> $contents));

En la vista: var templates = "{{ contents|e('js') }}";
$("#nombredelform").change(function(templates) { // to get the selected value
var s =$(this).val();
if (s > 0){
var selected = templates[s];
tinyMCE.activeEditor.setContent(selected);
}

});

Al hacer esto selected = templates[s], lo que pretendo es coger la tabla s del array e imprimir entera, sin embargo me imprime el elemento s de contenido de la tabla por ejemplo un \ o un < o una t, dependiendo del valor de s, como si fuese texto plano, en vez de html.

@helenmelenen

16 marzo 2016, 9:53
#4

Hola @helenmelenen, esto lo coloque como respuesta a una entrada del foro Problemas con el path de Symfony 2.7 en JS, si tienes dudas adicionales, no dudes en preguntar.

Saludos,


La forma en que soluciono este tipo de problema es usando el FOSJsRoutingBundle

Es muy sencillo de usar y facilita mucho la vida, aquí dejo un ejemplo de como lo uso.

En los parámetros de la ruta dentro de las anotaciones del controlador le coloco expose.

/**
     * Finds and displays a Category entity.
     *
     * @Route("/{slug}", name="category_show", options={"expose"=true})
     * @Method("GET")
     * @param Category $entity
     *
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function showAction(Category $entity)

Y dentro de la vista coloco el Routing.generate('nombreDeLaRuta', {'parametroKey': valor})

$.ajax({
                url: Routing.generate('ajax_product_name', {'code': $product}),
            }).done(function (data) {
 
                $('#row_detail_' + $index).find('div').text(data.name);
 
            });

Eso es todo, espero sea de ayuda.

@miguelplazasr

16 marzo 2016, 22:32