Entrar a un CRUD editando directamente por ID

Si se quiere poder acceder desde una URL a editar directamente un registro, se puede habilitar en el controlador que inicia el CRUD, al añadir la sección bootstrapper para el listado, usando la clave _extraAction.

Ejemplo:

$this->_view->addSection('body', 'zaf/' . Config::get('admTheme') . '/crud-bootstrap-list', array(
    '_title'      => 'Órdenes de trabajo',
    '_controller' => 'OrdentrabCrud',
    '_extraAction' => $this->_id2edit()
));

La función _id2edit() genera una extraAction que arregla todo para pasar un ID númerico al controlador y automáticamente editar el registro. Si se le pasa un parámetro a _id2edit() en vez de usar 'edt' se usará la acción especificada como parámetro. Esto es útil por ejemplo para hacer procesos antes de editar.

Una extraAction es un array que contiene dos claves: source y target. Son pasadas al script JS crud-bootstrap-list. Source es una URL y target es un selector donde colocar el resultado. La extraAction que genera _id2edit es la URL de edición y el #ID del div donde mostrarlo, pero se puede usar para otras cosas.

Editar con una clase diferente

A veces es necesario editar, listar, o añadir desde una clase diferente. Esto es muy útil cuando se lista con una VIEW pero se quiere editar con una simple tabla.

En initData() de la clase CRUD, se establece $this->edtOtherClass para definir la clase a usar. En realidad no es la clase, sino el nombre del controlador (sin guionado ni un prefijo como Ctrl_)

Ejemplo: tenemos la clase Ctrl_PrevVsRevisionesCrud que usa una VIEW para listar, y queremos usar una tabla para editar, que la gestiona el controlador PrevVsRevisionesCrudPlus (clase Ctrl_PrevVsRevisionesCrudPlus).

En el primero pondremos, simplemente:

$this->edtOtherClass = 'PrevVsRevisionesCrudPlus';

Como queremos sustituir el controlador original por el otro, pero dejar todo lo demás intacto, dentro de la clase del otro hay que especificar que se va a dibujar en la ventana del controlador original, y que el listado se va a hacer con el controlador original, o sea:

$this->lstOtherClass = 'PrevVsRevisionesCrud';
$this->edtSelector   = "#edt_Ctrl_PrevVsRevisionesCrud";
$this->lstSelector   = "#lst_Ctrl_PrevVsRevisionesCrud";

Aprovechar ordenación y filtros para recuperar un RecordSet

Por ejemplo para hacer un informe con la actual selección y criterios de ordenación:

  • Podemos poner un botón arriba de la tabla "Imprimir"

  • Hay que crear una funcion (accesible mediante _autoexec()) en la clase CRUD.

public function imprimir()
{
    // Si queremos considerar el actual criterio de ordenación:
    if ($this->tableView->getOrderedFieldSet()) {
        $this->tableView->getTable()->setSqlSortBy(\zfx\SQLGen::getOrderBy($this->tableView->getOrderedFieldSet()->getFieldSet(), $this->tableView->getOrderMapping()));
    }

    // Si queremos considerar el actual filtrado:
    $this->applyCurrentFilters();

    // Recuperamos el RecordSet
    $datos = $this->tableView->getTable()->readRS();

    // ... Operamos con datos como necesitemos (imprimir, guardar, etc).
}

Esto no vale para imprimir sino para cualquier otra cosa que necesitemos hacer. Se puede combinar con las casillas.