Использование CakePHP FormHelper с формами Bootstrap

CakePHP FormHelper – это то, как вы создаете формы при создании приложений CakePHP. Как можно было бы предположить, это включает в себя создание входных элементов, например:

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

Что создаст HTML что-то вроде этого:

 <div class="input text"> <label for="ModelAbc">Abc</label> <input name="data[Model][Abc]" class="" maxlength="250" type="text" id="ModelAbc"> </div> 

Теперь, к сожалению, Bootstrap хочет что-то вроде следующего:

 <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> 

Как заставить CakePHP производить этот вывод?

Solutions Collecting From Web of "Использование CakePHP FormHelper с формами Bootstrap"

Вдохновленный ответом lericson, это мое окончательное решение для 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();?> 

Что производит:

 <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> 

Я в основном добавил ключи «format» и «error» и добавил класс элемента управления к элементу метки.

Вот решение для 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')); ?> 

Если поле нуждается в собственном ярлыке:

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

Вот один из способов:

 <?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' => '') )); ?> 

Ваш ответ правильный, но в интересах других пользователей есть некоторые другие настройки, которые вы можете сделать, чтобы воспользоваться текстом ошибки / помощи:

Добавьте form-horizontal к class в Form->create() для более компактных форм (метки слева от ввода, а не сверху)

Вот как добавить текст справки под полем (должно быть сделано для каждого поля), не забывая закрыть </div> .

 echo $this->Form->input('field_name', array( 'after'=>'<span class="help-block">This text appears underneath the input.</span></div>')); 

и правильно отображать ошибки:

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

Выходы:

 <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> 

Это дополнительная надбавка, а не такая аккуратная, как бутстрап, но это быстрое решение. Альтернативой является выполнение каждого сообщения об ошибке отдельно.

и он хорошо сочетается. Однако я не нашел простой способ использовать inline сообщения.

Применяя тот же принцип, что и выше, к функции form-> end следующим образом:

 <?php echo $this->Form->end(array( 'label' => __('Submit'), 'class' => 'btn', 'div' => array( 'class' => 'control-group', ), 'before' => '<div class="controls">', 'after' => '</div>' ));?> 

Производить:

 <div class="control-group"> <div class="controls"> <input class="btn" type="submit" value="Submit"> </div> </div> 

маленький добавить для других комментариев:

если вы хотите добавить класс и изменить основной текст метки, вы можете написать следующее

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

У меня была такая же проблема с использованием slywalker / cakephp-plugin-boost_cake, я открываю билет, и он исправил его через несколько часов, он обновился до 1,03 и сказал мне использовать его так

 <?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>' )); ?> 

Я надеюсь, что это поможет кому-то еще

Чтобы заставить его работать с горизонтальной формой в bootstrap с помощью bootswatch, мне пришлось использовать:

 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' ) ), ) ) ); 

Тогда вы можете просто использовать его как обычно:

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

Люк Франкен добавил эту ссылку в свой комментарий: http://github.com/slywalker/cakephp-plugin-boost_cake

Мне потребовалось некоторое время, чтобы заметить это, поэтому для тех, кто все еще ищет простейшее решение:

Просто добавьте плагин CakePHP Bootstrap из GitHub и дайте помощнику выполнить эту работу за вас!