cakephp pagination virtual jquery-ui-sortable paginator

Enlace de ordenamiento de paginación en una propiedad de campo/entidad virtual en CakePHP 3.0



pagination jquery-ui-sortable (2)

Como se indica en los documentos vinculados, las propiedades virtuales no se pueden usar en los hallazgos. Eso es por diseño, las propiedades virtuales solo viven en entidades, están construidas en PHP después de que los datos han sido recuperados de la base de datos.

Columnas computadas

Así que olvídate de las propiedades virtuales por un momento y concéntrate en consultas y columnas calculadas.

Las columnas sortWhitelist deben especificarse mediante sortWhitelist

Tenga en cuenta que, al igual que las columnas de los modelos asociados, las columnas calculadas deben especificarse en la opción sortWhitelist para poder utilizarlas en la clasificación.

Libro de cocina> Controladores> Componentes> Paginación> Controle qué campos se usan para ordenar

A través de las opciones de paginación

Aquí tiene algunas opciones, por ejemplo, puede definir columnas calculadas en las opciones de paginación

$this->paginate = [ // ... ''sortWhitelist'' => [ ''id'', ''first_name'', ''last_name'', ''full_name'', // ... ], ''fields'' => [ ''id'', ''first_name'', ''last_name'', ''full_name'' => $Table->query()->func()->concat([ ''first_name'' => ''literal'', ''last_name'' => ''literal'' ]), // ... ], ''order'' => [ ''full_name'' => ''DESC'' ] ];

Un buscador personalizado

Otra opción más reutilizable sería usar un buscador personalizado

$this->paginate = [ // ... ''sortWhitelist'' => [ ''id'', ''first_name'', ''last_name'', ''full_name'', // ... ], ''finder'' => ''withFullName'', ''order'' => [ ''full_name'' => ''DESC'' ] ];

public function findWithFullName(/Cake/ORM/Query $query, array $options) { $query->select([ ''id'', ''first_name'', ''last_name'', ''full_name'' => $this->query()->func()->concat([ ''first_name'' => ''literal'', ''last_name'' => ''literal'' ]), // ... ]); return $query; }

Consulta personalizada separada

También es posible pasar directamente objetos de consulta a Controller::paginate() .

$this->paginate = [ // ... ''sortWhitelist'' => [ ''id'', ''first_name'', ''last_name'', ''full_name'', // ... ], ''order'' => [ ''full_name'' => ''DESC'' ] ]; $query = $this->Table ->find() ->select([ ''id'', ''first_name'', ''last_name'', ''full_name'' => $this->query()->func()->concat([ ''first_name'' => ''literal'', ''last_name'' => ''literal'' ]), // ... ]); $results = $this->paginate($query);

Quiero crear un enlace de ordenamiento de paginación en una propiedad de campo / entidad virtual en CakePHP 3.0.

En CakePHP 2.x solía crear un campo virtual y luego crear un enlace de clasificación de paginación en ese campo. Sin embargo, en CakePHP 3.0, los campos virtuales han sido reemplazados por propiedades de entidades virtuales .

¿Hay alguna forma de que pueda hacer que esto funcione en CakePHP 3.0?

En mi situación, tengo una columna first_name y last_name, que se combinan como full_name en una propiedad de entidad virtual . Quiero ordenar el nombre completo.


Establezca su orden de clasificación predeterminado para que sea el mismo que su campo virtual:

public $paginate = [ ''order'' => [ ''first_name'' => ''ASC'', ''last_name'' => ''ASC'', ] ];

A continuación, solo agregue lo siguiente a su Vista para evitar que el paginador anule el orden predeterminado a menos que lo especifique el usuario:

if (empty($_GET[''direction''])) { $this->Paginator->options([''url'' => [''direction'' => null, ''sort'' => null]]); }