【发布时间】:2019-01-05 19:27:31
【问题描述】:
我正在使用 Codeigniter 3.1.8 和 Bootstrap 4 开发一个博客应用程序。我有一个带有验证的“编辑帖子”表单。
如果验证失败(例如,因为 Title 字段已被清空),表单应该重新加载验证错误。
我的update()(位于 Posts 控制器中)方法是错误的:它使用重定向,所以表单被重新加载没有验证错误,到它的初始状态。
public function edit($id) {
// Only logged in users can edit posts
if (!$this->session->userdata('is_logged_in')) {
redirect('login');
}
$data = $this->Static_model->get_static_data();
$data['pages'] = $this->Pages_model->get_pages();
$data['categories'] = $this->Categories_model->get_categories();
$data['posts'] = $this->Posts_model->sidebar_posts($limit=5, $offset=0);
$data['post'] = $this->Posts_model->get_post($id);
if ($this->session->userdata('user_id') == $data['post']->author_id) {
$data['tagline'] = 'Edit the post "' . $data['post']->title . '"';
$this->load->view('partials/header', $data);
$this->load->view('edit-post');
$this->load->view('partials/footer');
} else {
/* If the current user is not the author
of the post do not alow edit */
redirect('/' . $id);
}
}
public function update() {
// Form data validation rules
$this->form_validation->set_rules('title', 'Title', 'required', array('required' => 'The %s field can not be empty'));
$this->form_validation->set_rules('desc', 'Short description', 'required', array('required' => 'The %s field can not be empty'));
$this->form_validation->set_rules('body', 'Body', 'required', array('required' => 'The %s field can not be empty'));
$this->form_validation->set_error_delimiters('<p class="error-message">', '</p>');
$id = $this->input->post('id');
// Update slug (from title)
if (!empty($this->input->post('title'))) {
$slug = url_title($this->input->post('title'), 'dash', TRUE);
$slugcount = $this->Posts_model->slug_count($slug);
if ($slugcount > 0) {
$slug = $slug."-".$slugcount;
}
} else {
$slug = $this->input->post('slug');
}
// Upload image
$config['upload_path'] = './assets/img/posts';
$config['allowed_types'] = 'jpg|png';
$config['max_size'] = '2048';
$this->load->library('upload', $config);
if(!$this->upload->do_upload()){
$errors = array('error' => $this->upload->display_errors());
$post_image = $this->input->post('postimage');
} else {
$data = array('upload_data' => $this->upload->data());
$post_image = $_FILES['userfile']['name'];
}
if ($this->form_validation->run()) {
$this->Posts_model->update_post($id, $post_image, $slug);
$this->session->set_flashdata('post_updated', 'Your post has been updated');
redirect('/' . $slug);
} else {
redirect('/posts/edit/' . $slug);
}
}
我几乎可以肯定问题出在这一行:redirect('/posts/edit/' . $slug);,但我还没有找到可行的替代方案。
使用$this->edit($id) 代替redirect('/posts/edit/' . $slug); 也不起作用。我希望它会,因为我想让代码保持干燥。
我应该改变什么?
编辑。我这样做了:
if ($this->form_validation->run()) {
$this->Posts_model->update_post($id, $post_image, $slug);
$this->session->set_flashdata('post_updated', 'Your post has been updated');
redirect('/' . $slug);
} else {
$this->form_validation->run();
$this->session->set_flashdata('errors', validation_errors());
var_dump($this->session->flashdata('errors'));
//redirect('/posts/edit/' . $slug);
}
var_dump($this->session->flashdata('errors')); 返回所有验证错误。
我希望将 has-error 类添加到表单组并附加 p class="error-message">The Title field is required.</p>。
<div class="form-group has-error">
<input type="text" name="title" id="title" class="form-control error" placeholder="Title" data-rule-required="true" value="Learn to code with us" aria-invalid="true">
<p class="error-message">The Title field is required.</p>
</div>
【问题讨论】:
-
在函数中加载视图而不是重定向,或者您可以将错误放在会话中以在重定向后显示
-
我刚刚注意到您没有在您的编辑方法中检查用户是否有权在您的更新方法中编辑帖子(您永远不应该假设用户不会尝试直接发布到不同的帖子 ID),因此最好在两种方法中添加相同的检查。
-
@ahmad 请发布答案。谢谢!
标签: php codeigniter validation