在CodeIgniter(或任何框架)中创建"New"或"Edit"表单是非常常见的。
在不使用自动脚手架的情况下,在CodeIgniter中用最少的输入/麻烦等创建这些表单的最快/最简单方法是什么
理想的解决方案应该处理许多元素,在提交之前验证自己,如果出现错误不应该清除表单,并且仍然可以被开发人员阅读。它不依赖于"生成器"脚本。
我写了一组代码,它目前存在于MY_Controller中,它使用您为表单验证编写的$config来生成表单。
在创建表单的过程中,将*添加到标签等
我会把它挖出来,星期一贴出来。
我更喜欢它是一个图书馆,但我的CI知识仍在增长…
添加了MY_controller.php的详细信息:
我在MY_Controller.php文件
中有以下内容function generate_form($config, $legend = 'Details', $wraptag = 'div', $buttontext = 'update')
{
$fields = array();
$files = 0;
if($config)
{
foreach($config as $c)
{
if(strpos($c['rules'],'required') === FALSE) {
$label = $c['label'];
}
else
{
$label = $c['label'].' <span class="required">*</span>';
}
$data = array(
'name' => $c['field'],
'id' => $c['field'],
'value' => set_value($c['field'], $c['value']),
'class' => $c['field'],
);
$fields[] = '<'.$wraptag.'>'."rn";
$func = 'form_'.$c['input_type'];
switch ($c['input_type'])
{
case 'displayonly':
$fields[] = form_label($label, $c['field'])."rn";
$fields[] = '<input type="text" value="'.$c['value'].'" disabled="disabled"/>';
break;
case 'dropdown':
case 'multiselect':
$fields[] = form_label($label, $c['field'])."rn";
$fields[] = $func($c['field'], $c['options'], $c['value']);
break;
case 'datepicker':
$fields[] = form_label($label, $c['field'])."rn";
$fields[] = $func($c['field'])."rn";
break;
case 'timezone':
$fields[] = form_label($label, $c['field'])."rn";
$fields[] = timezone_menu($c['value'],$c['field'], $c['field']);
break;
case 'upload':
$fields[] = form_label($label, $c['field'])."rn";
$fields[] = $func($data)."rn";
$files = 1;
break;
default:
$fields[] = form_label($label, $c['field'])."rn";
$fields[] = $func($data)."rn";
break;
}
$fields[] = '</'.$wraptag.'>'."rn";
}
$fields[] = '<'.$wraptag.'>'."rn";
$fields[] = form_submit('btnSubmit', 'Update');
$fields[] = '</'.$wraptag.'>'."rn";
$form_start[] = validation_errors('<div class="error">', '</div><!--class="error"-->');
if($files)
{
$form_start[] = form_open_multipart(uri_string());
}
else
{
$form_start[] = form_open(uri_string());
}
$form_start[] = '<fieldset>';
$form_start[] = '<legend>'.$legend.'</legend>';
$form_end[] = '</fieldset>'."rn";
$form_end[] = form_close();
}
if($wraptag == 'li')
{
$fields_start = '<ul>';
$fields_end = '</ul>';
}
else
{
$fields_start = '';
$fields_end = '';
}
return (implode('',$form_start).$fields_start.implode('',$fields).$fields_end.implode('',$form_end));
}
function create_validation_from_config($config)
{
foreach($config as $c)
{
if($c['rules'] != '')
{
if($c['input_type'] == 'datepicker')
{
$validation[] = array(
'field' => $c['field'].'_day',
'label' => $c['label'],
'rules' => $c['rules'],
);
$validation[] = array(
'field' => $c['field'].'_month',
'label' => $c['label'],
'rules' => $c['rules'],
);
$validation[] = array(
'field' => $c['field'].'_year',
'label' => $c['label'],
'rules' => $c['rules'],
);
}
else
{
$validation[] = array(
'field' => $c['field'],
'label' => $c['label'],
'rules' => $c['rules'],
);
}
}
}
return $validation;
}
NETTE框架有一个自动的自动验证系统,通过javascript(客户端)和php(服务器端)给用户反馈- Link.
也许你可以在CI中写一些类似的东西(理解Nette源文件),或者你可以使用Nette框架来代替。
我使用CI与Smarty。我创建了一个add.tpl
智能模板,和一个扩展add.tpl
的modify.tpl
。我的控制器有modify
和add
功能,加载modify.tpl
和add.tpl
。所有tpl
都显示一个表:thead
和tbody
。modify.tpl
在thead
中多显示一行:原始数据。modify.tpl
在其输入字段中显示/设置原始值。
我有一个简单的数据结构,它描述了应该从用户那里得到什么数据,tpl
-文件知道,应该如何显示他们的输入字段(例如inputbox, select, checkbox等)。
如果你不想使用+框架(Smarty),我认为在PHP/CI中创建类似的东西并不太难。