Как структурировать приложение MVC Kohana с динамически добавленными полями и обеспечить проверку и обратную связь - PullRequest
0 голосов
/ 15 апреля 2010

У меня есть небольшая проблема.

У меня есть приложение 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: Хорошо, встроенный валидатор работает очень хорошо. Я решил сделать базовую проверку в модели перед отправкой в ​​базу данных. Это предотвращает попадание чего-либо плохого в базу данных. Но я использую форму валидатора, чтобы обеспечить мгновенную обратную связь.

1 Ответ

0 голосов
/ 17 мая 2010

Я собирал нечто подобное раньше.

Я разработал класс Validation_lib, который является классом, построенным на основе валидации Kohana.

Это что-то похожее на:

class Validation_lib {
    static private $instance = NULL;

    private function __construct()
    {
        // Can overload Configs here
    }

    public static function instance()
    {
        if (self::$instance === NULL)
        {
            self::$instance = new self;
        }

        return self::$instance;
    }

    public function validate_dynamic($post)
    {
        $validate = new Validation($post);

        foreach ($post as $dynamic_key => $value)
        {
            switch ($dynamic_key)
            {
                // Do switch + regex matching for your $post['dynamic_name']
                // You can have maybe prepended 'phone_' for field of phone type
                // You can have maybe prepended 'mail_' for field of mail type..
                case (//regex match mailhere):
                   $validate->add_rules($key ,'required', valid::Email);
                   break;
            }
        }
    }
}

Надеюсь, это поможет:)

...