我有一个页面按部分划分,最后一部分有表格联系。
我的代码形式:
<section id="contact"> <div class="contact_form"> <span class="form_settings"> <?php $this->load->helper("form"); //echo $msg; //echo validation_errors(); echo form_open("main/send_email"); echo form_label("", "nome"); $data = array( "placeholder" => "Nome:", "class" => "form_settings", "name" => "nome", "id" => "nome", "value" => set_value("nome") ); echo form_input($data); echo form_error('nome'); echo form_label("", "email"); $data = array( "placeholder" => "Email:", "class" => "form_settings", "name" => "email", "id" => "email", "value" => set_value("email") ); echo form_input($data); echo form_error('email'); echo form_label("", "msg"); $data = array( "placeholder" => "Mensagem:", "class" => "form_settings", "name" => "msg", "id" => "msg", "value" => set_value("msg") ); echo form_textarea($data); echo form_error('msg'); echo form_submit("submit", "Enviar", "class='form_settings'"); echo form_close(); ?> </span> </div> </section>
我的控制器有一个函数send_email():
public function send_email() {
$this->load->library("form_validation");
$this->form_validation->set_rules("nome", "Nome:", "required|alpha|xss_clean");
$this->form_validation->set_rules("email", "Email:", "required|valid_email|xss_clean");
$this->form_validation->set_rules("msg", "Mensagem:", "required|xss_clean");
if ($this->form_validation->run() == FALSE) {
redirect('main/contactPage#contact');
} else {
$this->load->library("email");
$this->email->from(set_value("email"), set_value("nome"), set_value("msg"));
$this->email->to("xxx@gmail.com");
$this->email->subject("Mensagem");
$this->email->message(set_value("msg"));
$this->email->send();
$data["msg"] = "Email enviado com sucesso!";
//echo $this->email->print_debugger();
redirect('main/contactPage#contact', $data);
}
}
如果表单错误,它会重定向到部分页面,但不会显示验证错误。 如果形式正确,它会重定向到部分页面,但不会显示$ data的值。
对此有何解决方案?
韩国社交协会!
答案 0 :(得分:1)
编辑#2:
在绞尽脑汁之后,这就是我想出来的。如果表单验证为FALSE,则检查每个单独的验证错误,如果存在,则设置flash数据项。然后重定向,并在设置时回显闪存数据。以下是更新的代码。
控制器
public function send_email() {
$this->load->library("form_validation");
$this->form_validation->set_rules("nome", "Nome:", "required|alpha|xss_clean");
$this->form_validation->set_rules("email", "Email:", "required|valid_email|xss_clean");
$this->form_validation->set_rules("msg", "Mensagem:", "required|xss_clean");
if ($this->form_validation->run() == FALSE) {
// Set the flashdata that will be preserved for only the next server request
if (form_error('nome')) {
$this->session->set_flashdata('nome-failed','Your error message here');
}
if (form_error('email')) {
$this->session->set_flashdata('email-failed','Your error message here');
}
if (form_error('email')) {
$this->session->set_flashdata('msg-failed','Your error message here');
}
// Redirect to the contact section
redirect('main/contactPage#contact');
} else {
$this->load->library('email');
$this->email->from($this->input->post('email'), $this->input->post('nome'));
$this->email->to('xxx@gmail.com');
$this->email->subject('Mensagem');
$this->email->message($this->input->post('msg'));
$this->email->send();
if ($this->email->send() === TRUE) {
// Set the flashdata that will be preserved for only the next server request
$this->session->set_flashdata('success', 'Email enviado com sucesso!');
// Redirect to the contact section
redirect('main/contactPage#contact');
}
}
}
查看
<?php
$this->load->helper("form");
// Test to see if the var is set before you try to echo it so you won't get an error
if ( isset( $this->session->flashdata('success') ) ) {
echo $this->session->flashdata('success');
};
if ( isset( $this->session->flashdata('nome-failed') ) ) {
echo $this->session->flashdata('nome-failed');
};
if ( isset( $this->session->flashdata('email-failed') ) ) {
echo $this->session->flashdata('email-failed');
};
if ( isset( $this->session->flashdata('msg-failed') ) ) {
echo $this->session->flashdata('msg-failed');
};
echo form_open("main/send_email");
编辑#1:
我错过了控制器中的一部分,具体而言,您无法重定向,并期望验证错误。你最终做的就是从头开始重新加载表单。因此,您需要在if ($this->form_validation->run() == FALSE) {
分支下加载视图,以便查看由您在上面设置的表单验证规则生成的任何表单验证错误。我修改了上面的控制器代码来反映这一点。表单中的视图代码将保持不变。 Here是CI用户指南中的相关页面,显示了构建代码所需的内容。
原文答案:
从我可以收集的内容(控制器的格式设置为borked),看起来你实际上并没有在sendmail函数中输入值。您可以通过调用CI中的$this->input->post();
函数来实现。
我不相信你可以在重定向上传递数据(至少我从来没有能够这样做,也没有为CI提供这样的文档),所以你应该测试电子邮件是否成功发送,以及如果是这样,请使用成功消息设置$msg
变量重新加载视图,以便显示。
您还注释了视图中显示表单验证错误或发送成功数据的部分。但我怀疑你在评论之前得到了一个PHP未定义的变量错误,所以检查是否先设置var,然后检查是否为echo。示例如下。
答案 1 :(得分:0)
一旦控制器文件发生变化,CI的验证消息根本不起作用。你必须使用会话。它仅适用于来自同一控制器内直接加载视图页面的消息。