如何使用动态添加的字段构建Kohana MVC应用程序并提供验证和反馈

时间:2010-04-15 03:55:59

标签: php kohana

我有点问题。

我有一个动态添加字段的Kohana应用程序。

添加的字段称为DISA编号。

在模型中,我查看它们,结果作为数组返回。 我将数组编码为JSON字符串并使用JQuery填充它们 View知道数组的长度,因此在显示之前根据需要创建尽可能多的DISA元素。请参阅下面的代码,了解其工作原理。

我发现,这开始变得难以管理。代码变得混乱。这种类型的动态内容的错误处理最终成为现实 棋布。不仅如此,它无法满足我的需求。 你在这里看到的只是一小段代码。

对于错误处理我正在使用验证库。我开始在帖子中返回的所有字段上使用add_rules。由于它们总是电话号码,我设置了一个必需的规则(当它在那里时)和一个数字规则在validation-> as_array()键上。这样可行。 困难实际上是让它回到视图中。 即动态添加的javascript字段。提交回表格。将内容保存到会话中。 View必须从数据库加载字段+上一篇文章中的字段,并发出有问题的字段的信号。这一切都非常混乱,我通过查看控制器和模型来传播这些代码。

所以我的问题是。你之前在Kohana做过这件事吗?你是如何处理的? 必须有一个更简单的方法吗?

代码段。

- 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/articles/jquery-form-validator-because-form-validation-is-a-mess/

到目前为止一切顺利。

EDIT2:好的,内联验证器工作得非常好。我决定做的是在提交到数据库之前在模型中进行基本验证。这可以防止实际到达数据库的任何错误。但我正在使用表单验证器来提供即时反馈。

1 个答案:

答案 0 :(得分:0)

我之前已经建立了类似的东西。

我做的是开发一个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;
            }
        }
    }
}

希望这会有所帮助:)