2015-08-23 3 views
0

В CakePHP я создал поле с несколькими полями, заполненное множеством флажков. Я пытаюсь создать его в бутстрап-аккордеоне, чтобы каждая группа optgroup могла рухнуть.CakePHP Formhelper with Bootstrap Accordion

вход:

echo $this->Form->input('Subject', array(
    'class' => 'checkbox-inline no_indent', 
    'type' => 'select', 
    'multiple' => 'checkbox', 
    'options' => $options 
)); 
$options = array(
    __('Primary') => array(
     '1' => __('General'), 
     '2' => __('English'), 
     '3' => __('Maths'), 
     '4' => __('Science')    
    ), 
    __('Secondary') => array(
     '5' => __('General'), 
     '6' => __('English'), 
     '7' => __('Maths'), 
     '8' => __('Science')    
    ) 
); 

стиль я хочу, чтобы изменить в:

<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> 
    <div class="panel panel-default"> 
     <div class="panel-heading" role="tab" id="headingOne"> 
      <h4 class="panel-title"> 
       <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne"> 
        <legend>Primary</legend> 
       </a> 
      </h4> 
     </div> 
     <div id="collapseOne" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingOne"> 
      <div class="panel-body"> 
       <div class="checkbox-inline no_indent"><input type="checkbox" name="data[Subject][Subject][]" value="1" id="SubjectSubject1" /><label for="SubjectSubject1">General</label></div> 
       <div class="checkbox-inline no_indent"><input type="checkbox" name="data[Subject][Subject][]" value="2" id="SubjectSubject2" /><label for="SubjectSubject2">English</label></div> 
       <div class="checkbox-inline no_indent"><input type="checkbox" name="data[Subject][Subject][]" value="3" id="SubjectSubject3" /><label for="SubjectSubject3">Maths</label></div> 
       <div class="checkbox-inline no_indent"><input type="checkbox" name="data[Subject][Subject][]" value="4" id="SubjectSubject4" /><label for="SubjectSubject4">Science</label></div>      
      </div> 
     </div> 
    </div> 
    <div class="panel panel-default"> 
     <div class="panel-heading" role="tab" id="headingTwo"> 
      <h4 class="panel-title"> 
       <a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo"> 
        <legend>Secondary</legend> 
       </a> 
      </h4> 
     </div> 
     <div id="collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo"> 
      <div class="panel-body"> 
       <div class="checkbox-inline no_indent"><input type="checkbox" name="data[Subject][Subject][]" value="5" id="SubjectSubject5" /><label for="SubjectSubject5">General</label></div> 
       <div class="checkbox-inline no_indent"><input type="checkbox" name="data[Subject][Subject][]" value="6" id="SubjectSubject6" /><label for="SubjectSubject6">English</label></div> 
       <div class="checkbox-inline no_indent"><input type="checkbox" name="data[Subject][Subject][]" value="7" id="SubjectSubject7" /><label for="SubjectSubject7">Maths</label></div> 
       <div class="checkbox-inline no_indent"><input type="checkbox" name="data[Subject][Subject][]" value="8" id="SubjectSubject8" /><label for="SubjectSubject8">Science</label></div> 
      </div> 
     </div> 
    </div> 
</div> 

Я сделал некоторые поиски, но я не мог найти способ изменить разметку за отказа группы .. не уверен, есть ли на самом деле способ сделать это?

ответ

1

Вы всегда можете использовать псевдонимы по умолчанию с вашими специальными помощниками. Таким образом, при вызове Form:input у вас может быть ваша собственная функция для создания вашего аккордеона.

Другими словами внутри папки View\Helpers вы можете создать класс с именем BootstrapFormHelper

Тогда в этом классе вы пишете

App::uses('FormHelper', 'View/Helper'); 

class BootstrapFormHelper extends FormHelper { 

    /** 
    * input method 
    * 
    * @param string $fieldName 
    * @param array $options 
    */ 
    public function input($fieldName, $options = array()) { 
     if(isset($options['class'] && issset($options['class']['checkbox-inline']){ 
      //put your code to create the Accordion 
     } 
     return parent::input($fieldName, $options); 
    } 
} 

Внутри вас AppController:

public $helpers = array(
    'Form' => array(
     'className' => 'BootstrapForm' 
    ), 
) 

Теперь, когда вы звоните Form::input метод, который будет выполнен, будет методом BootstrapForm::input()

См. Последний абзац здесь http://book.cakephp.org/2.0/en/views/helpers.html#using-and-configuring-helpers. Надеюсь, поможет.

Edit:

Примером может быть:

Не знаю, если моя логика помогает вам или вас смущает больше.

+0

Пожалуйста, исправьте меня, если я ошибаюсь. Расширение FormHelper позволяет вам устанавливать кучу классов начальной загрузки по умолчанию, поэтому вам не нужно устанавливать его отдельно. Я могу сделать что-то подобное в инструкции 'if':' $ class = array ('class' => 'form-control'); '' $ options = array_merge ($ class, $ options); 'Но это вещи Торт уже позволяет мне делать. Но в Cake нет параметров для изменения легенды и добавления div для обертывания тега. –

+0

Да, есть. '' $ options ['before'] '', '' $ options ['between'] '', '' $ options ['separator'] '' и '' $ options ['after'] ''. Кроме того, с помощью этой функции вы можете создавать свои собственные параметры и возвращать их. Например, я могу добавить '' option ['icon'] '' и вернуть шрифт-удивительный значок с помощью ввода при вызове метода. – gmponos

+0

По-прежнему не повезло. Независимо от того, какой пользовательский параметр я установил, Cake рассматривает его как атрибут во входном теге. Я также попытался подстроить массив ''format' => ('label', 'before', 'input', 'between', 'error', 'after')', но только упорядочивает порядок 'input' и' ярлык' .. и т. д., а не optgroup. Не могли бы вы изменить коды выше, чтобы я знал, где я делаю это неправильно? .. –