Je travaille sur une application de blog dans Codeigniter 3.1.8 et Bootstrap 4. J'ai un formulaire "Modifier l'article" avec validation .
Si la validation échoue (parce que le champ Titre a été vidé, par exemple), le formulaire devrait recharger avec des erreurs de validation .
Ma update () (vit dans le contrôleur Posts) est fausse: il utilise une redirection, donc le formulaire est rechargé sans erreurs de validation, à son état initial.
<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>
3 Réponses :
Ce que je ferais dans ce scénario est de fusionner les deux méthodes en une seule méthode en se basant sur la validation pour savoir si j'enregistre l'entrée ou non.
votre code ressemblerait à ceci:
public function edit($id) { // Only logged in users can edit posts if (!$this->session->userdata('is_logged_in')) { redirect('login'); } $Post = $this->Posts_model->get_post($id); // user does not own the post, redirect if ($this->session->userdata('user_id') !== $Post->author_id) { redirect('/' . $id); } // 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>'); // if validation fails, or the form isn't submitted if ($this->form_validation->run() === false ) { $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'] = $Post; $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{ // 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']; } $this->Posts_model->update_post($id, $post_image, $slug); $this->session->set_flashdata('post_updated', 'Your post has been updated'); redirect('/' . $slug); } }
et vous n'avez pas à implémenter la mise à jour séparément, il vous suffit de publier dans / edit / $ id au lieu de / update / $ id ... ceci est un exemple approximatif, votre vérification de slug ( ce que je n'ai pas abordé) n'est pas la bonne façon de le faire, si elle réussit la validation, le titre est déjà rempli car il est défini sur requis donc je suppose que vous vouliez dire if (! empty (slug)) code>, mais encore une fois dans votre else, vous définissez le slug directement à partir de l'entrée de l'utilisateur, donc je l'ajouterais à la validation et je m'assurerais qu'il est unique dans la base de données à l'exception du $ id en cours de modification.
Encore une fois, c'est le résultat d'un copier-coller de votre code d'origine.J'ai peut-être manqué quelque chose, alors faites-le bien lire pour vous assurer que rien ne manque et incluez les erreurs de validation dans les données que vous passez à la vue. p>
Une envie de pouvoir utiliser quelque chose comme $ this-> edit ($ id)
au lieu de redirect ('/ posts / edit /'. $ Slug);
à conserver mon code aussi SEC que possible.
Oui, c'est certainement une option ... avez-vous essayé cela?
Je l'ai fait, mais pour une raison quelconque, cela ne fonctionne pas. Je peux coller l'intégralité de l'application ici. La voici donc sur Github . Jetez un œil.
quelles erreurs obtenez-vous? Je pense que cela devrait fonctionner très bien, vous avez le $ id et il est disponible dans la même classe.
Je suis redirigé vers siteurl.com/post_id
au lieu de siteurl.com/posts/edit/post_slug
. Et je vois un message "Désolé, nous n'avons pas trouvé le contenu que vous recherchez".
c'est assez évident pourquoi votre chemin ne fonctionne pas quand vous y pensez. $ this-> edit
seules les options sont à rediriger, fv échoue d'où la raison pour laquelle vous allez rediriger ('/'. $ slug);
. plus loin, rediriger = les données d'exécution ont disparu, par exemple validation_errors
vide. pour ne pas mentionner, les changements d'url qui sont bâclés.
Vous avez 3 options:
Option 2:
Cette option résout également le problème d'authentification potentiel signalé dans les commentaires.
Veuillez lire les commentaires intégrés dans le code. p >
public function edit($id) { // Only logged in users can edit posts if (!$this->session->userdata('is_logged_in')) { redirect('login'); } $data['post'] = $this->Posts_model->get_post($id); if ($this->session->userdata('user_id') == $data['post']->author_id) { show_error('Access denied'); // function exits } if ($_POST) { $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'); not required anymore $config['upload_path'] = './assets/img/posts'; $config['allowed_types'] = 'jpg|png'; $config['max_size'] = '2048'; $this->load->library('upload', $config); if ($this->form_validation->run() && $this->upload->do_upload()) { // always use the name from the upload lib // sometimes it changes it in case of duplicates (read docs for more) $post_image = $this->upload->data('file_name'); // doesn't make sense with title validation rule, this will always be true to get // passed validation 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'); } $this->Posts_model->update_post($id, $post_image, $slug); $this->session->set_flashdata('post_updated', 'Your post has been updated'); redirect('/' . $slug); } else { $data['errors'] = validation_errors() . $this->upload->display_errors(); } } $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['tagline'] = 'Edit the post "' . $data['post']->title . '"'; $this->load->view('partials/header', $data); $this->load->view('edit-post'); $this->load->view('partials/footer'); }
Je ne veux pas de message flash, je veux juste que le formulaire invalide soit renvoyé. Je pourrais faire cette validation sur le front-end et je le ferai , mais j'ai besoin d'une validation back-end dans le cas (peu probable) où les utilisateurs désactiveraient JavaScript.
J'ai réussi à obtenir le résultat souhaité à l'aide de dans le contrôleur J'ai: p> set_flashdata () code> comme suggéré par @Alex
chargez la vue dans la fonction au lieu de rediriger, ou vous pouvez mettre les erreurs en session pour les afficher après la redirection
Et je viens de remarquer que vous ne vérifiez pas si l'utilisateur a la permission de modifier le message dans votre méthode de mise à jour uniquement dans votre méthode d'édition (vous ne devriez jamais supposer qu'un utilisateur n'essaiera pas de publier directement sur un identifiant de publication différent) donc bonne idée d'ajouter la même vérification dans les deux méthodes.
@ahmad S'il vous plaît, postez une réponse. Merci!