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
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
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
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
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