我有点问题。
我有一个动态添加字段的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:好的,内联验证器工作得非常好。我决定做的是在提交到数据库之前在模型中进行基本验证。这可以防止实际到达数据库的任何错误。但我正在使用表单验证器来提供即时反馈。
答案 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;
}
}
}
}
希望这会有所帮助:)