FormHelper de CakePHP est la façon dont vous générez des formulaires lors de la création d'applications CakePHP. Comme on pourrait le supposer, cela inclut la génération d'éléments d'entrée, comme ceci:
$this->Form->input('abc');
Ce qui produira quelque chose de HTML comme ceci:
<div class="input text">
<label for="ModelAbc">Abc</label>
<input name="data[Model][Abc]" class="" maxlength="250" type="text" id="ModelAbc">
</div>
Maintenant, malheureusement, Bootstrap veut quelque chose comme ceci:
<div class="control-group">
<label for="ModelAbc" class="control-label">Abc</label>
<div class="controls">
<input name="data[Model][Abc]" class="" maxlength="250" type="text" id="ModelAbc">
</div>
</div>
Comment faire pour que CakePHP produise cette sortie?
Inspiré par la réponse de lericson, voici ma dernière solution pour CakePHP 2.x:
<?php echo $this->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' => '<div class="controls">',
'after' => '</div>',
'error' => array('attributes' => array('wrap' => 'span', 'class' => 'help-inline')),
)));?>
<fieldset>
<?php echo $this->Form->input('Fieldname', array(
'label' => array('class' => 'control-label'), // the preset in Form->create() doesn't work for me
)); ?>
</fieldset>
<?php echo $this->Form->end();?>
Ce qui produit:
<form...>
<fieldset>
<div class="control-group required error">
<label for="Fieldname" class="control-label">Fieldname</label>
<div class="controls">
<input name="data[Fieldname]" class="form-error" maxlength="255" type="text" value="" id="Fieldname"/>
<span class="help-inline">Error message</span>
</div>
</div>
</fieldset>
</form>
J'ai essentiellement ajouté les clés 'format' et 'error', et ajouté la classe control-label à l'élément label.
Voici une solution pour Bootstrap 3
<?php echo $this->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' => '<div class="col-lg-3">',
'after' => '</div>',
'error' => array('attributes' => array('wrap' => 'span', 'class' => 'help-inline')),
))); ?>
<fieldset>
<legend><?php echo __('Username and password'); ?></legend>
<?php echo $this->Form->input('username'); ?>
<?php echo $this->Form->input('password'); ?>
</fieldset>
<?php echo $this->Form->end(__('Login')); ?>
Dans le cas où un champ a besoin de sa propre étiquette:
<?php echo $this->Form->input('username', array('label' => array('text' => 'Your username', 'class' => 'col-lg-2 control-label'))); ?>
Voici une façon:
<?php echo $this->Form->create(null, array(
'inputDefaults' => array(
'div' => array('class' => 'control-group'),
'label' => array('class' => 'control-label'),
'between' => '<div class="controls">',
'after' => '</div>',
'class' => '')
)); ?>
Appliquer le même principe que ci-dessus à la fonction form-> end comme suit:
<?php echo $this->Form->end(array(
'label' => __('Submit'),
'class' => 'btn',
'div' => array(
'class' => 'control-group',
),
'before' => '<div class="controls">',
'after' => '</div>'
));?>
Produire:
<div class="control-group">
<div class="controls">
<input class="btn" type="submit" value="Submit">
</div>
</div>
Votre réponse est correcte, mais pour le bénéfice des autres utilisateurs, vous pouvez effectuer d'autres ajustements pour tirer parti du texte d'erreur/d'aide:
Ajoutez form-horizontal
À class
dans la Form->create()
pour des formulaires plus compacts (étiquettes à gauche de l'entrée plutôt qu'en haut)
Voici comment mettre du texte d'aide sous un champ (à faire pour chaque champ), sans oublier de fermer le </div>
.
echo $this->Form->input('field_name', array(
'after'=>'<span class="help-block">This text appears
underneath the input.</span></div>'));
et pour afficher correctement les erreurs:
// cake 2.0
echo $this->Form->input('abc', array(
'error' => array('attributes' => array('class' => 'controls help-block'))
));
Les sorties:
<div class="control-group required error">
<label for="ModelAbc" class="control-label">Abc</label>
<div class="controls">
<input name="data[Model][Abc]" class="" maxlength="250" type="text" id="ModelAbc">
</div>
<!-- error message -->
<div class="controls help-block">This is the error validation message.</div>
<!-- error message -->
</div>
C'est du balisage supplémentaire et pas aussi soigné que bootstrap mais c'est une solution rapide. L'alternative est de faire chaque message d'erreur individuellement.
et il s'aligne bien. Cependant, je n'ai pas encore trouvé de moyen simple d'utiliser les messages inline
.
petite annonce pour un autre commentaire:
si vous voulez ajouter une classe et changer le texte de base de l'étiquette, vous pouvez écrire ensuite
<?php echo $this->Form->input('Fieldname', array(
'label' => array('class' => 'control-label','text'=>'HERE YOU LABEL TEXT')
)); ?>
J'ai eu le même problème en utilisant slywalker/cakephp-plugin-boost_cake, j'ai ouvert un ticket et il l'a réparé en quelques heures, il a mis à jour à 1,03 et m'a dit de l'utiliser comme ça
<?php echo $this->Form->input('email', array(
'label' => array(
'text' => __('Email:'),
),
'beforeInput' => '<div class="input-append">',
'afterInput' => '<span class="add-on"><i class="icon-envelope"></i></span></div>'
)); ?>
J'espère que ça aide quelqu'un d'autre aussi
Pour le faire fonctionner avec une forme horizontale dans bootstrap avec bootswatch j'ai dû utiliser:
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' => '<div class="col-lg-10">',
'after' => '</div>',
'error' => array( 'attributes' => array( 'wrap' => 'span',
'class' => 'text-danger' ) ),
)
)
);
Ensuite, vous pouvez simplement l'utiliser comme d'habitude:
echo $this->Form->input( 'User.username' );
Luc Franken a posté ce lien dans son commentaire: http://github.com/slywalker/cakephp-plugin-boost_cake
Il m'a fallu un certain temps pour le remarquer, donc pour ceux qui recherchent toujours la solution la plus simple:
Ajoutez simplement le plugin CakePHP Bootstrap de GitHub et laissez l'assistant faire le travail pour vous!