用最少的输入在CodeIgniter中创建New/Edit表单



在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.tplmodify.tpl。我的控制器有modifyadd功能,加载modify.tpladd.tpl。所有tpl都显示一个表:theadtbodymodify.tplthead中多显示一行:原始数据。modify.tpl在其输入字段中显示/设置原始值。

我有一个简单的数据结构,它描述了应该从用户那里得到什么数据,tpl -文件知道,应该如何显示他们的输入字段(例如inputbox, select, checkbox等)。

如果你不想使用+框架(Smarty),我认为在PHP/CI中创建类似的东西并不太难。

最新更新