2016-09-13 4 views
2

Я хочу создать форму в CakePHP, имея активную команду SecurityComponent. Пока все хорошо, теперь я хочу добавить пользовательские элементы input, которые я не могу сгенерировать с помощью FormHelper. Однако я должен включить эти поля в проверки безопасности и проверки.Как создать ручные входы в CakePHP 2 с помощью SecurityComponent?

Основная проблема заключается в том, что я не могу отображать переключатели вне их меток. Поэтому я делаю их такими же:

<div class="radio radio-inline"> 
    <input id="genderMALE" type="radio" name="data[User][gender]" value="MALE"/> 
    <label for="genderMALE">Male</label> 
</div> 
<div class="radio radio-inline"> 
    <input id="genderFEMALE" type="radio" name="data[User][gender]" value="FEMALE"/> 
    <label for="genderFEMALE">Female</label> 
</div> 

Что само по себе прекрасно работает. Тем не менее, FormHelper не имеет уведомления о них, поэтому SecurityComponent регистрирует это как фальсификацию формы. Честно говоря, моя просьба.

Я попытался сгенерировать входы с помощью FormHelper, но поддержка радио ограничена. Вариант format здесь не работает:

Радиоустройства не могут иметь порядок элементов ввода и метки, управляемых этими настройками. - Cookbook

Рядом с этим я не мог найти способ сделать простой отдельностоящий переключатель. И единственный способ, которым я нашел, чтобы принять input, был проигнорирован в SecurityComponent.

Что такое способ торта исправить это?

Update 14-09 09:16
Мой текущий фикс/хак будет создавать пользовательские кнопки радио в простом HTML, как показано выше. Затем соедините значение этих радиовходов с полем ввода, созданным с помощью FormHelper. Используя CSS, я могу скрыть этот вход, позволяя ему изменять JavaScript, а не используя type="hidden".

Существуют ли какие-либо опасности/проблемы, которые могут возникнуть при использовании этого метода?

сторона примечание: В конце концов это проблема с дизайном. Тем не менее, я вынужден использовать Bootstrap и оставлю только 2 дня, чтобы закончить свою задачу. И я не хочу идти по пути написания пользовательского CSS/JS, чтобы заставить это работать.

ответ

0

В момент получения содержимого с помощью взломочного решения я наткнулся на поле FormHelper::$fields. Это поле отслеживает все входы, созданные с помощью FormHelper, и позже используется SecurityComponent, чтобы проверить, была ли изменена форма.

решение требует некоторой дополнительной работы, как вам необходимо выполнить следующие шаги:

  1. Добавить пользовательской формы Элемент fields массив
  2. Восстановить значение из предыдущего представить (если перенаправление обратно на форму)
  3. Добавить параметр по умолчанию, так поле не будет опущен из почтовых данных

Рабочей CTP

<div class="radio radio-inline"> 
    <input id="genderMALE" type="radio" name="data[User][gender]" value="MALE" 
     <?= $this->request->data('User.gender') == 'MALE' ? 'checked' : ''?> /> 
    <label for="genderMALE">Male</label> 
</div> 
<div class="radio radio-inline"> 
    <input id="genderFEMALE" type="radio" name="data[User][gender]" value="FEMALE" 
     <?= $this->request->data('User.gender') == 'FEMALE' ? 'checked' : ''?> /> 
    <label for="genderFEMALE">Female</label> 
</div> 
<input type="radio" name="data[User][gender]" value="" class="hidden" 
    <?= $this->request->data('User.gender') ? '' : 'checked'?> /> 
<?php $this->Form->fields[] = 'User.gender' ?> 

Это далеко не красиво, но я развею его близко к внутренностям самого пирога. Может потребоваться создать помощник вместо ручного ввода входов каждый раз.

 Смежные вопросы

  • Нет связанных вопросов^_^