world tutorial hello español ejemplos beforefilter cakephp find cakephp-3.0 key-value dropdown

hello - cakephp tutorial 3



¿Cómo creo un par keyValue(campo de visualización) combinando/teniendo dos campos en CakePHP 3? (2)

Necesito ayuda para obtener dos valores (para el menú desplegable amigable para los seres humanos) en un par de clave-valor usando find o get o cualquier otra cosa. Necesito ayuda con el método más simple de hacer esto en CakePHP.

Aquí está mi intento:

  1. en mi controlador

    $users = $this->LocationsUser->Users->find(''list'', [ ''limit'' => 1, ''keyField'' => ''id'', ''valueField'' => [''first_name'', ''last_name''] ])->where([''id'' => $id]);

  2. en mi vista

    echo $this->Form->input(''user_id'', [ ''options'' => $users, ''type'' => ''select'', ''multiple'' => false, ]);

  3. El resultado en mi lista desplegable:

    <option value="10">Fabian;Pankiers</option>

Vea Necesito un resultado sin el punto y coma ";" . Ahora puedo usar javascript para eliminar el punto y coma, pero eso es exagerado. ¿Hay una manera simple de lograr esto dentro de CakePHP 3?


Solución simple y rápida, funcionó como un encanto ( CakePHP 3.2.6 ):

$users = $this->LocationsUser->Users->find(''list'', [ ''limit'' => 1, ''keyField'' => ''id'', ''valueField'' => function ($e) { return $e->get(''first_name''). '' '' . $e->get(''last_name''); } ])->where([''id'' => $id]);


Hay varias formas de resolver esto, aquí hay tres de ellos:

Use una devolución de llamada para el valor valueField

Utilice una devolución de llamada y cose el valor usando valores de los resultados.

$query = $this->LocationsUser->Users ->find(''list'', [ ''valueField'' => function ($row) { return $row[''first_name''] . '' '' . $row[''last_name'']; } ]) ->where([''id'' => $id]);

Ver también

Formateadores de resultados

Use un formateador de resultados que sume los valores, eso es lo que el buscador de list hace internamente, y básicamente lo mismo que el ejemplo anterior, simplemente más complicado.

$query = $this->LocationsUser->Users ->find() ->select([''id'', ''first_name'', ''last_name'']) ->formatResults(function($results) { /* @var $results /Cake/Datasource/ResultSetInterface|/Cake/Collection/CollectionInterface */ return $results->combine( ''id'', function($row) { return $row[''first_name''] . '' '' . $row[''last_name'']; } ); }) ->where([''id'' => $id]);

Combinado con propiedades virtuales

También podría usar (re) usar propiedades virtuales aquí, dado por ejemplo un nombre de propiedad full_name definido en su clase de entidad de User :

protected function _getFullName() { return $this->_properties[''first_name''] . '' '' . $this->_properties[''last_name'']; }

Simplemente puede devolver eso en el formateador en lugar de combinar manualmente los dos campos nuevamente:

function($row) { return $row[''full_name'']; }

Lo mismo podría hacerse en el ejemplo de valueField .

Ver también

Campos computados

Agregue un campo calculado y use ese para la opción valueField

$query = $this->LocationsUser->Users ->find(''list'', [ ''keyField'' => ''id'', ''valueField'' => ''concatenated'' ]); $query ->select([ ''id'', ''concatenated'' => $query->func()->concat([ ''first_name'' => ''literal'', '' '', ''last_name'' => ''literal'' ]) ]) ->where([''id'' => $id]);

Ver también

Anular el buscador de listas

Si desea que siempre se aplique su lista personalizada, puede anular el buscador de list en la clase de la tabla Users .

use Cake/ORM/Query; // ... public function findList(Query $query, array $options) { return $query ->find() ->select([''id'', ''first_name'', ''last_name'']) // etc ... ; }

De esa manera, puede continuar utilizando find(''list'') .

Ver también