Использование CakePHP FormHelper с загрузочными формами - PullRequest
29 голосов
/ 29 февраля 2012

FormHelper CakePHP - это способ создания форм при создании приложений 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 производить этот вывод?

Ответы [ 9 ]

35 голосов
/ 02 июля 2012

Вдохновленный ответом Лериксона, это мое окончательное решение для 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' и добавил класс control-label к элементу label.

18 голосов
/ 02 сентября 2013

Вот решение для 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'))); ?>
11 голосов
/ 29 февраля 2012

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

<?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' => '')
)); ?>
2 голосов
/ 06 августа 2013

Применяя тот же принцип, что и выше, к функции 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>
2 голосов
/ 29 февраля 2012

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

Добавьте 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.

1 голос
/ 21 августа 2014

Чтобы заставить его работать с горизонтальной формой в начальной загрузке с начальной загрузкой, я должен был использовать:

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' );
1 голос
/ 18 октября 2013

У меня была такая же проблема при использовании 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>'
)); ?>

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

1 голос
/ 04 апреля 2013

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

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

<?php echo $this->Form->input('Fieldname', array(
    'label' => array('class' => 'control-label','text'=>'HERE YOU LABEL TEXT')
)); ?>
0 голосов
/ 14 февраля 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...