Usando CakePHP FormHelper con Bootstrap Forms

FormHelper de CakePHP es la forma en que se generan formularios al hacer aplicaciones CakePHP. Como uno podría suponer, esto incluye la generación de elementos de entrada, de esta manera:

$this->Form->input('abc'); 

Que producirá HTML algo como esto:

 

Ahora, lamentablemente, Bootstrap quiere algo como lo siguiente:

 

¿Cómo hago para que CakePHP produzca esta salida?

Inspirado por la respuesta de Lericson, esta es mi solución final para CakePHP 2.x:

 Form->create('ModelName', array( 'class' => 'form-horizontal', 'inputDefaults' => array( 'format' => array('before', 'label', 'between', 'input', 'error', 'after'), 'div' => array('class' => 'control-group'), 'label' => array('class' => 'control-label'), 'between' => '
', 'after' => '
', 'error' => array('attributes' => array('wrap' => 'span', 'class' => 'help-inline')), )));?>
Form->input('Fieldname', array( 'label' => array('class' => 'control-label'), // the preset in Form->create() doesn't work for me )); ?>
Form->end();?>

Que produce:

  
Error message

Básicamente, agregué las teclas ‘formato’ y ‘error’, y agregué la clase de etiqueta de control al elemento de etiqueta.

Aquí hay una solución para Bootstrap 3

 Form->create('User', array( 'class' => 'form-horizontal', 'role' => 'form', 'inputDefaults' => array( 'format' => array('before', 'label', 'between', 'input', 'error', 'after'), 'div' => array('class' => 'form-group'), 'class' => array('form-control'), 'label' => array('class' => 'col-lg-2 control-label'), 'between' => '
', 'after' => '
', 'error' => array('attributes' => array('wrap' => 'span', 'class' => 'help-inline')), ))); ?>
Form->input('username'); ?> Form->input('password'); ?>
Form->end(__('Login')); ?>

En caso de que un campo necesite su propia etiqueta:

 Form->input('username', array('label' => array('text' => 'Your username', 'class' => 'col-lg-2 control-label'))); ?> 

Aquí hay una forma:

 Form->create(null, array( 'inputDefaults' => array( 'div' => array('class' => 'control-group'), 'label' => array('class' => 'control-label'), 'between' => '
', 'after' => '
', 'class' => '') )); ?>

Su respuesta es correcta, pero para el beneficio de otros usuarios hay otros ajustes que puede hacer para aprovechar el error / texto de ayuda:

Agregue form-horizontal a la class en Form->create() para formularios más compactos (tags a la izquierda de la entrada, en lugar de en la parte superior)

Aquí se explica cómo colocar el texto de ayuda debajo de un campo (debe hacerse para cada campo), sin olvidar cerrar .

 echo $this->Form->input('field_name', array( 'after'=>'This text appears underneath the input.')); 

y para mostrar correctamente los errores:

 // cake 2.0 echo $this->Form->input('abc', array( 'error' => array('attributes' => array('class' => 'controls help-block')) )); 

Productos:

 
This is the error validation message.

Es un margen adicional y no tan limpio como el bootstrap, pero es una solución rápida. La alternativa es hacer cada mensaje de error individualmente.

y se alinea muy bien. Sin embargo, no he descubierto una manera fácil de utilizar mensajes en inline .

Aplicando el mismo principio que el anterior a la función form-> end de la siguiente manera:

 Form->end(array( 'label' => __('Submit'), 'class' => 'btn', 'div' => array( 'class' => 'control-group', ), 'before' => '
', 'after' => '
' ));?>

Para producir:

 

pequeño agregar para otros comentarios:

si quieres agregar clase y cambiar el texto base de la etiqueta, puedes escribir a continuación

 Form->input('Fieldname', array( 'label' => array('class' => 'control-label','text'=>'HERE YOU LABEL TEXT') )); ?> 

Tuve el mismo problema al usar slywalker / cakephp-plugin-boost_cake, abrí un ticket y lo arregló en unas pocas horas, actualizó a 1,03 y me dijo que lo use así

 Form->input('email', array( 'label' => array( 'text' => __('Email:'), ), 'beforeInput' => '
', 'afterInput' => '
' )); ?>

Espero que ayude a alguien más también

Para que funcione con una forma horizontal en bootstrap con bootswatch tuve que usar:

 echo $this->Form->create( 'User', array( 'action' => 'add', 'admin' => 'false', 'class' => 'form-horizontal', 'inputDefaults' => array( 'format' => array( 'before', 'label', 'between', 'input', 'error', 'after' ), 'class' => 'form-control', 'div' => array( 'class' => 'form-group' ), 'label' => array( 'class' => 'col-lg-2 control-label' ), 'between' => '
', 'after' => '
', 'error' => array( 'attributes' => array( 'wrap' => 'span', 'class' => 'text-danger' ) ), ) ) );

Entonces puedes usarlo como siempre:

 echo $this->Form->input( 'User.username' ); 

Luc Franken publicó este enlace en su comentario: http://github.com/slywalker/cakephp-plugin-boost_cake

Me tomó un tiempo darme cuenta, así que para aquellos que todavía están buscando la solución más simple:

¡Simplemente agregue el complemento CakePHP Bootstrap de GitHub y deje que el ayudante haga el trabajo por usted!