Hacer que el plugin web2py ckeditor funcione con SQLFORM.grid
Ejemplos basados en proyecto plug_and_play.
I.
INCLUIR ckeditor.js
Hay 2 alternativas: incluir via python, o de la forma clásica javascript.
Utilice la que no cause problemas (errores en la consola).
- Via python. En la vista que extiende '_index.html', que inicia con:
{{extend '_index.html'}}
en donde se hacen los llamados Ajax para mostrar el formulario(SQLFORM.grid)
correspondiente, se debe agregar el siguiente bloque, inmediatamente luego
anterior:
{{
response.files.insert(0,URL('static','plugin_ckeditor/ckeditor_basic.js'))
response.include_meta()
response.include_files()
}}
Quedando el inicio del archivo de la siguiente forma:
{{extend '_index.html'}}
{{
response.files.insert(0,URL('static','plugin_ckeditor/ckeditor_basic.js'))
response.include_meta()
response.include_files()
}}
(Ver ejemplo: "views/desktop/admin_desktop.html")
2. Forma clásica javascript
En cualquier archivo de la vista donde se utilizará ckeditor, agregar lo siguiente:
<script type="text/javascript" src="proxy.php?url=https%3A%2F%2Fgithub.com%2F%7B%7B%3DURL%28request.application%2C%27static%27%2C%27plugin_ckeditor%2Fckeditor_basic.js%27%29%7D%7D">
</script> II. Incluir la siguiente funcion javascript, por ejemplo, en el archivo "views/_index.html" si se requiere que esté disponible para todas las vistas.
<body>
... resto de "body"
<!-- Bloque Ckeditor -->
<script type="text/javascript">
function deleteCKEditorInstances() {
//Necesario para que funcione el plugin ckeditor en los grids
//El siguiente bloque "recarga" los widgets CKEditor. (en realidad, los elimina, el plugin los recarga luego)
if (CKEDITOR && CKEDITOR.instances) {
for (var oldName in CKEDITOR.instances) {
//en la página de donde se sacó el código, se realiza un cambio de nombres
//source: http://stackoverflow.com/questions/1794219/ckeditor-instance-already-exists
//como utilizamos un plugin, la utilizacion no es la misma, y parece ser innecesario
//var newName = "ajax"+oldName;
//CKEDITOR.instances[newName] = CKEDITOR.instances[oldName];
//CKEDITOR.instances[newName].name = newName;
delete CKEDITOR.instances[oldName];
}
}
//el bloque anterior, en funcionalidad es equivalente a
//CKEDITOR.instances = new Array();
//pero pareciera mas apropiado en cuanto al manejo de memoria
}
</script>
<!-- END Bloque Ckeditor -->
</body>
III.
Al final de las vistas llamadas vía ajax, agregar el siguiente llamado
a la funcion javascript (definida en "views/_index.html")
<script type="text/javascript">
deleteCKEditorInstances();
</script>
(ver ejemplo: "views/desktop/display_persona.load")