Php 如何在模块中使用ExpressionEngine表单验证类在模板中重新填充表单?

Php 如何在模块中使用ExpressionEngine表单验证类在模板中重新填充表单?,php,validation,templates,forms,expressionengine,Php,Validation,Templates,Forms,Expressionengine,是否可以在硬编码到模板中的表单上显示错误并重新填充字段?到目前为止,我只知道如何在模块视图中显示错误,而没有在模板中显示错误 基于ExpressionEngine的逻辑,我猜我需要通过模块中的标记使验证错误可见,或者甚至从模块生成整个表单,但我不确定如何最好地实现这一点 这是我现在拥有的 function submit_form() { $this->EE->load->helper('form'); $this->EE->load-

是否可以在硬编码到模板中的表单上显示错误并重新填充字段?到目前为止,我只知道如何在模块视图中显示错误,而没有在模板中显示错误

基于ExpressionEngine的逻辑,我猜我需要通过模块中的标记使验证错误可见,或者甚至从模块生成整个表单,但我不确定如何最好地实现这一点

这是我现在拥有的

function submit_form()
{        
    $this->EE->load->helper('form');
    $this->EE->load->library('form_validation');

    $this->EE->form_validation->set_rules('first_name', 'First Name', 'required');
    $this->EE->form_validation->set_rules('last_name', 'Last Name', 'required');
    $this->EE->form_validation->set_rules('address', 'Address', 'required');
    $this->EE->form_validation->set_rules('city', 'City', 'required');
    $this->EE->form_validation->set_rules('province', 'Province', 'required');

    if ($this->EE->form_validation->run() == FALSE)
    {
        return $this->EE->load->view('form_errors');
    }
    else
    {
        // success
    }
} 
对于测试,视图仅包含:

echo validation_errors(); 

有人能帮忙吗?

这是一个很好的问题,我花了很长时间才找到最好的解决办法

CodeIgniter非常好,但只能与适当的视图和控制器一起使用,因此在开发前端标记时,它不能开箱即用

通常,提交前端表单的首选方式是在upd.addon.php文件中注册一个“操作”(我猜您已经为
submit\u form()
函数注册了这个操作)。然后给它分配一个编号,您可以使用url
/index.php?ACT=37
或类似的内容发布该编号。这是一个很好的系统,因为这意味着我们知道表单提交来自我们的模块。然而,对于输入表单,这是一个障碍,因为这意味着我们无法重新填充输入字段。因此,您需要将输入表单配置为回发到当前URL,并在处理表单提交之前等待模板引擎尝试呈现您的标记

实现这一点最简单也是最丑陋的方法是使用
$this->EE->output->show_user_error(FALSE,数组错误)
。实际上,您可以通过操作或在模块代码中使用它。它显示了标准的灰色EE消息页面,我们都知道和憎恨它

有了这样的介绍,你可能知道解决方案不会那么简单,对吧?以下是实现内联错误检查的标记函数的框架:

function my_form()
{
    // load default tag variables
    $tag_vars = array();
    $tag_vars[0] = array(
        'first_name' => '',
        'error:first_name' => '',
        'last_name' => '',
        'error:last_name' => ''
    );

    // handle a form submission
    if ($this->EE->input->post('my_form_hidden') == '1'))
    {
        // load POST data into tag
        $tag_vars[0]['first_name'] = $this->EE->input->post('first_name', TRUE);
        $tag_vars[0]['last_name'] = $this->EE->input->post('last_name', TRUE);

        // use CI validation library to check submission
        $this->EE->load->helper('form');
        $this->EE->load->library('form_validation');
        $this->EE->form_validation->set_rules('first_name', 'lang:first_name', 'required');
        $this->EE->form_validation->set_rules('last_name', 'lang:first_name', 'required');

        $valid_form = $this->EE->form_validation->run();
        if ($valid_form)
        {
            // probably save something to database, then redirect
        }
        else
        {
            $form_errors = array();
            foreach (array('first_name', 'last_name') as $field_name)
            {
                $field_error = form_error($field_name);
                if ($field_error)
                {
                    $form_errors[] = $field_error;
                    $tag_vars[0]['error:'.$field_name] = $field_error;
                }
            }

            if ($this->EE->TMPL->fetch_param('error_handling') != 'inline')
            {
                // show default EE error page
                return $this->EE->output->show_user_error(FALSE, $form_errors);
            }
        }
    }

    // parse and output tagdata
    $out = $this->EE->functions->form_declaration(array(
        'action' => $this->EE->functions->fetch_current_uri(),
        'hidden_fields' => array('my_form_hidden')));
    $out .= $this->EE->TMPL->parse_variables($tagdata, $tag_vars);
    return $out.'</form>';
}
请注意我们随表单一起提交的隐藏字段,这允许我们确保只处理此表单的提交,而不处理页面上的任何其他表单,如登录表单或其他内容。如果一个页面上有多个表单实例(比如在通道入口循环或其他内容中),则需要实施一些技巧,以确保只处理已提交的表单实例,例如,将条目id作为隐藏字段提交


很高兴得到所有的文档,希望这对其他EE开发人员也有用

非常感谢,阿德里安!有点麻烦,但现在我知道了。如果我也有一些实时JavaScript验证(大多数访问者都会看到)的话,将错误传递到一个显示有返回按钮的视图进行更正似乎不是什么大问题。是的,如果你只是为自己的站点开发,并且知道前端会有JS验证,那么这是一个非常聪明的解决方案。如果您正在开发商业模块,并且希望设计师具有最大的灵活性,那么我的解决方案可能会更有帮助。谢谢!我想出了如何用一个动作来处理表单,但验证让我一头雾水。
<input type="text" name="first_name" value="{first_name}" />
{error:first_name}