У меня есть небольшая проблема.
У меня есть приложение Kohana с динамически добавляемыми полями.
Добавленные поля называются номерами DISA.
В модели я смотрю их, и результат возвращается в виде массива.
Я кодирую массив в строку JSON и использую JQuery для их заполнения.
Представление знает длину массива и создает столько элементов DISA, сколько требуется перед отображением. См. Код ниже для краткого изложения того, как это работает.
Что я обнаружил, так это то, что этим становится трудно управлять. Код становится грязным. Обработка ошибок этого типа динамического содержимого заканчивается
распространяться повсюду. Мало того, это не работает, как я хочу.
То, что вы видите здесь, это просто небольшой фрагмент кода.
Для обработки ошибок я использую библиотеку проверки. Я начал с использования add_rules на всех полях, которые возвращаются в посте. Поскольку они всегда являются телефонными номерами, я установил требуемое правило (когда оно есть) и цифровое правило для клавиш validation-> as_array (). Это работает.
Сложность в том, чтобы вернуть его к виду.
то есть динамически добавленное поле JavaScript. Отправляет обратно в форму. Сохранить содержимое в сеансе. View должен загружать поля из базы данных + поля из предыдущего поста и сигнализировать о проблемных полях. Это все довольно грязно, и я распространяю этот код как по контроллеру, так и по модели.
Итак, мой вопрос. Вы делали это раньше в Кохане и как вы справились с этим?
Должен быть более легкий путь, верно?
Фрагмент кода.
- edit.php -
public function phone($id){
...
$this->template->content->disa_numbers =
$phones->fetch_disa_numbers($this->account, $id);
...
}
- phones.php -
public function fetch_disa_numbers($account, $id)
{
$query = $this->db->query("SELECT id, cid_in FROM disa WHERE owner_ext=?", array($id));
if (!$query){
return '';
}
return $query;
}
- edit_phones.php ---
<script type="text/javascript">
var disaId = 1;
function delDisaNumber(element){
/* Put 'X_' on the front of the element name to mark this for deletion */
$(element).prev().attr('name', 'X_'+$(element).prev().attr('name'));
$(element).parent().hide();
}
function addDisaNumber(){
/* input name is prepended with 'N_' which means new */
$("#disa_numbers").append("<li><input name='N_disa"+disaId+"' id='disa'"+
"type='text'/><a class='hide' onClick='delDisaNumber(this)'></a></li>");
disaId++;
}
</script>
...
<php
echo form::open("edit/saveDisaNumbers/".$phone, array("class"=>"section", "id"=>"disa_form"));
echo form::open_fieldset(array("class"=>"balanced-grid"));
?>
<ul class="fields" id="disa_numbers">
<?php
$disaId = 1;
foreach ( $disa_numbers as $disa_number ){
echo '<li>';
echo form::input('disa'.$disaId, $disa_number->cid_in);
echo'<a class="hide" onclick="delDisaNumber(this)"></a>';
echo "</li>";
$disaId++;
}
?>
</ul>
<button type="button"onclick="addDisaNumber()"><a class="add"></a>Add number</button>
<?php
echo form::submit('submit', 'Save');
echo form::close();
?>
РЕДАКТИРОВАТЬ: я нашел плагин проверки встроенной формы, который идеально подходит для этого. Ссылка здесь.
http://www.position -absolute.com / статьи / JQuery форм-валидатор-потому-формы валидация-это-беспорядок /
Пока все хорошо.
EDIT2: Хорошо, встроенный валидатор работает очень хорошо. Я решил сделать базовую проверку в модели перед отправкой в базу данных. Это предотвращает попадание чего-либо плохого в базу данных. Но я использую форму валидатора, чтобы обеспечить мгновенную обратную связь.