Pongo como he solucionado el problema, aúnque sopongo que no de una forma muy brillante, por si alguien llega aquí buscando información.
Es necesario instalr el
FOSJsRouting para disponer de las rutas en JavaScript.
Para imaginarse el escenario supongamos que se trata de un visualizador de expedientes, cada expdiente tine una serie de documentos.
Desde un menu se pueden ir abriendo pestañas que contienen un grid con los documentos de cada expediente. Incluso se puede abrir varias veces el mismo expediente.
He generodo un crud con el generador de smartwig y lo he modificado de la siguiente forma.
Un boton abre un menu donde están cargados los expedientes exitentes.
{% menu_item
id="expediente"
value=path("expediente_todos") // El controlador index del CRUD
label="PENDIENTES"
onclick="addTab()" %}El script que gestiona las pestañas.
{% block javascripts %}
<script type="text/javascript">
var indiceTab = 0;
function addTab(){
indiceTab++;
var ruta = $(expediente).attr('value'); // LLama al controlador index del CRUD donde se genera el grid
var etiqueta = $(expediente).text();
tabsPral.wijtabs('add', ruta, etiqueta, indiceTab);
tabsPral.wijtabs('select', indiceTab);
}
$('#tabsPral span.ui-icon-close').live('click', function () {
index = $('li', tabsPral).index($(this).parent());
tabsPral.wijtabs('remove', index);
});
</script>
{% endblock %}En el controlador se modifica la creación del grid:
Modificando su Id que nos va a permitir más tarde hacer selecciones sobre él:
\YsJQuery::useComponent(\YsJQueryConstant::COMPONENT_JQGRID);
$prgId = date("YmdHis");
$grid = new \YsGrid('grid'.$prgId,'grid'.$prgId);Añadiendo funciones controladores del las acciones del CRUD, ya que no utilizo las que crea el Generador:
$grid->setOnDblClickRow( new \YsJsFunction("onDblClickRow(".$prgId.")"));
$grid->setOnDblClickRow( new \YsJsFunction("reloadGrid(".$prgId.")"));En la vista del index creo una barra de herramientas para las acciones
<p>{% ui_button width="15" value="E" onclick="onDblClickRow" %}
<p>{% ui_button width="15" value="R" onclick="reloadGrid()" %} y elimino los remote command y creo las funciones manejadoras. Muestro el dobleClick
{% block javascripts %}
<script type="text/javascript">
function onDblClickRow(prgId){
var grella = $('#grid'+prgId);
var id = grella.jqGrid('getGridParam','selrow');
if (id) {
$.pnotify('Se va a editar el registro: '+id);
$('#aplicacionWorkspace').load(
Routing.generate('expdiente_edit', { prgId: prgId, id: id }) // El routing debe adaptarse a esto
);
} else {
$.pnotify('Debe seleccionar un registro '+prgId);
}
}
function reloadGrid(prgId) {
var grella = $('#grid'+prgId);
jQuery('#grid'+prgId).jqGrid("clearGridData", true).trigger("reloadGrid");
}
</script>
{% endblock %}En el controlador hago que en el editAction se reciba
public function editAction($prgId, $id )y se envie a la vista el id del grid para no perder su referencia y no confundirlo con otros que existan en otras pestañas:
return array(
'prgId' => $prgId,
'entity' => $entity,
'edit_form' => $editForm->createView(),
);En la vista del edit despues de actualizar el registro intento que recarge el grid
{% ajax_form id="frmEditAplicacion"
update="#aplicacionWorkspace"
action=path("aplicacion_update", { "prgId": prgId, "id": entity.id })
method="PUT"
complete=js_function("jqXHR","
if (jqXHR.status == 200){
$.pnotify('Actualizado con éxito');
dlgEditAplicacion.wijdialog('destroy');
reloadGrid();
}")
%}la función de recarga
{% block javascripts %}
<script type="text/javascript">
function reloadGrid(){
$('#grid{{ prgId }}').trigger('reloadGrid');
}
</script>
{% endblock %} Con esto funciona adecuadamente la gestión de varias instancias del mismo crud en distintas pestañas.
Lo que aún no he conseguido es que me funione la recarga del grid. He buscado y mirado todo lo que he encontrado sobre JqGrid, pero ninguna de las soluciones parece funcionar.
He probado:
$('#grid{{ prgId }}').trigger('reloadGrid');
$("#mygrid").setGridParam(…).trigger("reloadGrid",[{page:1}]);
jQuery("#myGrid").jqGrid("clearGridData", false).trigger("reloadGrid");
$('.ui-jqgrid table', '#tab-ínfo').trigger('reloadGrid');Y nada.
Seguiré buscando...
Saludos.