I am working on a basic blog application in Codeigniter 3.1.8.
I have a create post form and an update post form. They both have validation rules. For the update form's invalid field "warnings", I want to replace the expression "field is required" with "field can not be empty".
Here is the code (Posts controller):
public function edit($id) {
$data = $this->Static_model->get_static_data();
$data['post'] = $this->Posts_model->get_post($id);
$data['tagline'] = 'Edit the post "' . $data['post']->title . '"';
$this->load->view('partials/header', $data);
$this->load->view('edit');
$this->load->view('partials/footer');
}
public function update() {
// Form data validation rules
$this->form_validation->set_rules('title', 'Title', 'required');
$this->form_validation->set_rules('desc', 'Short description', 'required');
$this->form_validation->set_rules('body', 'Body', 'required');
$this->form_validation->set_error_delimiters('<p class="error">', '</p>');
$id = $this->input->post('id');
if ($this->form_validation->run()) {
$this->Posts_model->update_post($id, $data);
redirect('posts/post/' . $id);
} else {
$this->edit($id);
}
}
If the title field is empty I want the warning to be: "The Title field can not be empty."
What shall I add/change to the update method?
You can do like this :
in your update method set message for required like this :
$this->form_validation->set_rules('title', 'Title', 'required',
array('required' => 'The Title field can not be empty')
);
$this->form_validation->set_rules('desc', 'Short description', 'required',
array('required' => 'Short description can not be empty')
);
/* use same for other fields*/
for more : https://www.codeigniter.com/user_guide/libraries/form_validation.html#setting-validation-rules
I have managed to get the desired invalid fields warnings this way:
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">', '</p>');
$id = $this->input->post('id');
if ($this->form_validation->run()) {
$this->Posts_model->update_post($id, $data);
redirect('posts/post/' . $id);
} else {
$this->edit($id);
}
}
Related
The problem here is that registration is working properly but it is not redirecting to certain page which i want.because to go to that page which is in another controller, id should be set on session .bt even after setting id to session it not working .help me out thank you..here is the code
controller
public function newregister()
{
if($this->session->userdata("passenger_id"))
return redirect("user/dashboard");
$this->load->view('userregister');
}
public function register()
{
$this->form_validation->set_rules('fname', 'Fullname', 'required|min_length[5]|max_length[42]|trim|alpha_numeric_spaces');
$this->form_validation->set_rules('uname', 'Username', 'trim|required|min_length[5]|max_length[12]|is_unique[passengers.uname]');
$this->form_validation->set_rules('dob', 'Date of birth', 'required');
$this->form_validation->set_rules('gender', 'Gender', 'required');
$this->form_validation->set_rules('mobile', 'Mobile Number', 'trim|required|max_length[10]|min_length[10]');
$this->form_validation->set_rules('city', 'City', 'required');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
$this->form_validation->set_rules('pword', 'Password', 'trim|required|min_length[8]');
$this->form_validation->set_rules('confirmpword', 'Confirm Password', 'trim|required|min_length[8]|matches[pword]');
$this->form_validation->set_error_delimiters('<p class="text-danger">','</p>');
if($this->form_validation->run()){
$this->load->model('user_model');
$pdata=array(
'passenger_id'=>$this->input->post('passenger_id'),
'fname'=>$this->input->post('fname'),
'uname'=>$this->input->post('uname'),
'dob'=>$this->input->post('dob'),
'gender'=>$this->input->post('gender'),
'mobile'=>$this->input->post('mobile'),
'city'=>$this->input->post('city'),
'email'=>$this->input->post('email'),
'pword'=>sha1($this->input->post('pword')),
'confirmpword' =>sha1($this->input->post('confirmpword'))
);
if($this->user_model->user_validate($pdata))
{
$this->session->set_userdata($pdata);
$this->session->set_flashdata('message','You have successfully registered to SMS TravelBook... ');
return redirect('user/dashboard');
}
else{
$this->session->set_flashdata('message','Sorry failed to register');
return redirect('home/register');
}
}
else{
$this->newregister();
}
}
Model
public function user_validate($pdata)
{
return $this->db->insert('passengers',$pdata);
}
Your main issue seems to be that you're setting session before even saving data into the database. Also, keep in mind that you shouldn't store passwords in session, I've written the rectified code, comments are mentioned wherever necessary, you're free to tweak it according to your needs. Hope it helps you.
Controller
public function newregister()
{
if($this->session->userdata("passenger_id")){
redirect("user/dashboard");
}else{
$this->load->view('userregister');
}
}
public function register()
{
$this->form_validation->set_rules('fname', 'Fullname', 'required|min_length[5]|max_length[42]|trim|alpha_numeric_spaces');
$this->form_validation->set_rules('uname', 'Username', 'trim|required|min_length[5]|max_length[12]|is_unique[passengers.uname]');
$this->form_validation->set_rules('dob', 'Date of birth', 'required');
$this->form_validation->set_rules('gender', 'Gender', 'required');
$this->form_validation->set_rules('mobile', 'Mobile Number', 'trim|required|max_length[10]|min_length[10]');
$this->form_validation->set_rules('city', 'City', 'required');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
$this->form_validation->set_rules('pword', 'Password', 'trim|required|min_length[8]');
$this->form_validation->set_rules('confirmpword', 'Confirm Password', 'trim|required|min_length[8]|matches[pword]');
$this->form_validation->set_error_delimiters('<p class="text-danger">','</p>');
if($this->form_validation->run()){
$pdata=array(
'passenger_id' => '', // empty because no value yet(value not inserted in db)
'fname' => $this->input->post('fname'),
'uname' => $this->input->post('uname'),
'dob' => $this->input->post('dob'),
'gender' => $this->input->post('gender'),
'mobile' => $this->input->post('mobile'),
'city' => $this->input->post('city'),
'email' => $this->input->post('email'),
'pword' => sha1($this->input->post('pword')),
'confirmpword' => sha1($this->input->post('confirmpword'))
);
$this->load->model('user_model');
$dbId = $this->user_model->user_validate($pdata); // get the inserted id
if($dbId) // check if query was successful
{
$pdata=array(
'passenger_id' => $dbId,
'fname' => $this->input->post('fname'), // or $pdata['fname']
'uname' => $this->input->post('uname'), // or $pdata['uname']
'dob' => $this->input->post('dob'), // ...
'gender' => $this->input->post('gender'),
'mobile' => $this->input->post('mobile'),
'city' => $this->input->post('city'),
'email' => $this->input->post('email'),
'pword' => sha1($this->input->post('pword')), // avoid storing password in session
'confirmpword' => sha1($this->input->post('confirmpword')) // avoid storing password in session
);
/* or you could just do - $pdata['passenger_id'] = $dbId;(because rest of the data is same) */
$this->session->set_userdata($pdata);
$this->session->set_flashdata('message','You have successfully registered to SMS TravelBook... ');
redirect('user/dashboard');
}
else{
$this->session->set_flashdata('message','Sorry failed to register');
redirect('home/register');
}
}
else{
$this->newregister();
}
}
Model
public function user_validate($pdata)
{
return ($this->db->insert('passengers', $pdata)) ? $this->db->insert_id() : false; // return insert_id if successful else return false
}
I want to insert validate data into database.
My code is like below, where submit is my button name and name, email, mobile is my form fields:
if($this->input->post('submit'))
{
$name = $this->input->post('name');
$email = $this->input->post('email');
$mobile = $this->form_validation->set_rules('mobile', 'Mobile','trim|required|numeric');
$query = $this->my_model->insertdata($name, $email, $mobile);
}
How can I validate form fields if I have written code like above?
You should use Form Validation Library.
First, autoload it:
Open application/config/autoload.php and edit line 61 like below:
$autoload['libraries'] = array('form_validation');
Now, you can validate your form in your controller. Here is an example for you:
public function some_function()
{
$this->form_validation->set_rules('input_name', 'input human name', 'required');
if ($this->form_validation->run() === false)
{
//return some error here
}
else
{
// send data to your model (e.g. $this->Some_model->some_function())
}
}
Please see Form Validation Library Guide to see all references and examples. Also please follow this order for submitting forms: View -> Controller -> Model.
first, you are putting insecure data into your database.
$data = [
'name' => html_escape($this->input->post('name'),
'email' => html_escape($this->input->post('email'),
'mobile' => html_escape($this->input->post('mobile');
];
$this->form_validation->set_rules('mobile',Mobile','trim|required|numeric');
$this->form_validation->set_rules('name',name','trim|required');
$this->form_validation->set_rules('email',Email','trim|required|valid_email');
if ($this->form_validation->run() === false)
{
//print error
}else
{
$this->db->insert('TABLE', $data);
}
public function register()
{
$this->form_validation->set_rules('username', 'Usename Name', 'trim|required|min_length[3]|max_length[30]');
$this->form_validation->set_rules('email', 'Email ID', 'trim|required|valid_email|is_unique[jobseeker_registration.email]');
$this->form_validation->set_rules('mobile', 'Mobile', 'trim|required|numeric');
if ($this->form_validation->run() === false)
{ $this->load->view('register'); }
else
{
$data = array(
'name' => $this->input->post('name'),
'username' => $this->input->post('username'),
'email' => $this->input->post('email'),
'mobile' => $this->input->post('mobile'),
'password' => $this->input->post('password')
);
$this->Jobseeker_model->insertdata($data)
}
}
This code is work for me very well for form validation
I've taken the "auth" controller and copied it and renamed it as "site". I have renamed the references to views etc. to "site". When I go to www.mysite/index.php/site/create_user the form loads fine. However on hitting submit I get redirected to www.mysite.com/index.php/site/login and nothing is added to the database. Can anyone tell me why this does not work? My site controller is below:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Site extends CI_Controller {
//
//Authentication
//
function __construct()
{
parent::__construct();
$this->load->database();
$this->load->library(array('ion_auth','form_validation'));
$this->load->helper(array('url','language'));
$this->form_validation->set_error_delimiters($this->config->item('error_start_delimiter', 'ion_auth'), $this->config->item('error_end_delimiter', 'ion_auth'));
$this->lang->load('auth');
}
//Function to log the user in
function login()
{
$this->data['title'] = "Login";
//validate form input
$this->form_validation->set_rules('identity', 'Identity', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
if ($this->form_validation->run() == true)
{
// check to see if the user is logging in
// check for "remember me"
$remember = (bool) $this->input->post('remember');
if ($this->ion_auth->login($this->input->post('identity'), $this->input->post('password'), $remember))
{
//if the login is successful
//redirect them back to the home page
$this->session->set_flashdata('message', $this->ion_auth->messages());
redirect('/', 'refresh');
}
else
{
// if the login was un-successful
// redirect them back to the login page
$this->session->set_flashdata('message', $this->ion_auth->errors());
redirect('site/login', 'refresh'); // use redirects instead of loading views for compatibility with MY_Controller libraries
}
}
else
{
// the user is not logging in so display the login page
// set the flash data error message if there is one
$this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message');
$this->data['identity'] = array('name' => 'identity',
'id' => 'identity',
'type' => 'text',
'value' => $this->form_validation->set_value('identity'),
);
$this->data['password'] = array('name' => 'password',
'id' => 'password',
'type' => 'password',
);
$this->_render_page('site/login', $this->data);
}
}
//Function to log the user out
function logout()
{
$this->data['title'] = "Logout";
// log the user out
$logout = $this->ion_auth->logout();
// redirect them to the login page
$this->session->set_flashdata('message', $this->ion_auth->messages());
redirect('site/login', 'refresh');
}
//Function to create a user
function create_user()
{
$this->data['title'] = "Create User";
if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin())
{
//redirect('site/login', 'refresh');
}
$tables = $this->config->item('tables','ion_auth');
// validate form input
$this->form_validation->set_rules('first_name', $this->lang->line('create_user_validation_fname_label'), 'required');
$this->form_validation->set_rules('last_name', $this->lang->line('create_user_validation_lname_label'), 'required');
$this->form_validation->set_rules('email', $this->lang->line('create_user_validation_email_label'), 'required|valid_email|is_unique['.$tables['users'].'.email]');
$this->form_validation->set_rules('phone', $this->lang->line('create_user_validation_phone_label'), 'required');
$this->form_validation->set_rules('company', $this->lang->line('create_user_validation_company_label'), 'required');
$this->form_validation->set_rules('password', $this->lang->line('create_user_validation_password_label'), 'required|min_length[' . $this->config->item('min_password_length', 'ion_auth') . ']|max_length[' . $this->config->item('max_password_length', 'ion_auth') . ']|matches[password_confirm]');
$this->form_validation->set_rules('password_confirm', $this->lang->line('create_user_validation_password_confirm_label'), 'required');
if ($this->form_validation->run() == true)
{
$username = strtolower($this->input->post('first_name')) . ' ' . strtolower($this->input->post('last_name'));
$email = strtolower($this->input->post('email'));
$password = $this->input->post('password');
$additional_data = array(
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'company' => $this->input->post('company'),
'phone' => $this->input->post('phone'),
);
}
if ($this->form_validation->run() == true && $this->ion_auth->register($username, $password, $email, $additional_data))
{
// check to see if we are creating the user
// redirect them back to the admin page
$this->session->set_flashdata('message', $this->ion_auth->messages());
redirect("site", 'refresh');
}
else
{
// display the create user form
// set the flash data error message if there is one
$this->data['message'] = (validation_errors() ? validation_errors() : ($this->ion_auth->errors() ? $this->ion_auth->errors() : $this->session->flashdata('message')));
$this->data['first_name'] = array(
'name' => 'first_name',
'id' => 'first_name',
'type' => 'text',
'value' => $this->form_validation->set_value('first_name'),
);
$this->data['last_name'] = array(
'name' => 'last_name',
'id' => 'last_name',
'type' => 'text',
'value' => $this->form_validation->set_value('last_name'),
);
$this->data['email'] = array(
'name' => 'email',
'id' => 'email',
'type' => 'text',
'value' => $this->form_validation->set_value('email'),
);
$this->data['company'] = array(
'name' => 'company',
'id' => 'company',
'type' => 'text',
'value' => $this->form_validation->set_value('company'),
);
$this->data['phone'] = array(
'name' => 'phone',
'id' => 'phone',
'type' => 'text',
'value' => $this->form_validation->set_value('phone'),
);
$this->data['password'] = array(
'name' => 'password',
'id' => 'password',
'type' => 'password',
'value' => $this->form_validation->set_value('password'),
);
$this->data['password_confirm'] = array(
'name' => 'password_confirm',
'id' => 'password_confirm',
'type' => 'password',
'value' => $this->form_validation->set_value('password_confirm'),
);
$this->_render_page('site/create_user', $this->data);
}
}
//Function to render the page
function _render_page($view, $data=null, $returnhtml=false)//I think this makes more sense
{
$this->viewdata = (empty($data)) ? $this->data: $data;
$view_html = $this->load->view($view, $this->viewdata, $returnhtml);
if ($returnhtml) return $view_html;//This will return html on 3rd argument being true
}
}
This exact code works when in the auth controller. When in the site controller I make it so you must login and you must be an admin to make a user (i.e. uncommenting out this line //redirect('site/login', 'refresh');) then it also works, but for some reason when that line is commented it works in the auth controller but not the site controller.
Any help is much appreciated. I've tried to figure it out but can't see why it works in one and not the other (and why it works in site but only as an admin when that code is uncommented and not at all when it is commented, whilst in auth it works in either case).
Thanks in advance.
The reason you get redirected is one of two reasons.
First : $this->_render_page('site/login', $this->data);
When you hit the submit button it is still pointing to the login controller.
Second : if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin())
The create user function in the Auth controller is for admins only, You will have to // out the code or you will be redirected to the login page due to not being logged and not being an admin.
try this:
//$this->_render_page('site/login', $this->data);
//if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin())
By marking out these two lines you should be able to veiw and submit your page without being redirected.
:)
There seems to be many questions about form validation but none answer my problem.
Unless I'm missing something obvious, my form validation will not run, but only on a certain page, all other pages are fine.
Here is the problem code:
public function activate($code = '')
{
// This function lets a user activate their account with the code or link they recieved in an email
if($code == '' || isset($_POST[''])){
$form = '';
$this->load->library('form_validation');
$this->load->helper('form');
if ($this->form_validation->run() == FALSE){
// No code, so display a box for them to enter it manually
$this->form_validation->set_rules('activation_code', 'Activation Code', 'trim|required|xss_clean|integer');
$form .= validation_errors();
$form .= form_open_multipart('user/activate', array('class' => 'formee'));
$form .= form_label('Enter your activation code below and click \'Activate\' to start using your account. If you need a hand please contact live chat.', 'activation_code');
$form .= form_input(array('name' => 'activation_code'));
$data = array(
'name' => 'submit',
'value' => 'Activate',
'class' => 'right',
'style' => 'margin-top:10px;',
);
$form .= form_submit($data);
$form .= form_close();
}else{
$form .= "form run";
}
}else{
// Code recieved through the GET or POST variable XSS clean it and activate the account
}
$data = array(
'title' => $this->lang->line('activate_title'),
'links' => $this->gen_login->generate_links(),
'content' => $form
);
$this->parser->parse('beer_template', $data);
}
You can see the page here: http://77.96.119.180/beer/user/activate
You can see form validation working here: http://77.96.119.180/beer/user/register
Can anyone help?
You call the set_rules after the run:
if ($this->form_validation->run() == FALSE){
// No code, so display a box for them to enter it manually
$this->form_validation->set_rules('activation_code', 'Activation Code', 'trim|required|xss_clean|integer');
But should be before:
$this->form_validation->set_rules('activation_code', 'Activation Code', 'trim|required|xss_clean|integer');
if ($this->form_validation->run() == FALSE){
}
I'm trying to update a contact and only update the contact depending on the id.
Model:
function updateContact() {
$data = array(
'title' => $this->input->post('title'),
'first_name' => $this->input->post('first_name'),
'surname' => $this->input->post('surname'),
'phone_number' => $this->input->post('phone_number'),
'fax' => $this->input->post('fax'),
'email' => $this->input->post('email')
);
$this->db->where('id', $this->uri->segment(3));
$this->db->update('contacts', $data);
}
Controller:
function update() {
$this->load->model('league/add_contact_model');
$data['rows'] = $this->add_contact_model->viewContact();
// field name, error message, validation rules
$this->form_validation->set_rules('title', 'Title', 'trim|required');
$this->form_validation->set_rules('first_name', 'First Name', 'trim|required');
$this->form_validation->set_rules('surname', 'Surname Name', 'trim|required');
$this->form_validation->set_rules('phone_number', 'Phone Number', 'trim|required');
$this->form_validation->set_rules('email', 'Email', 'trim|required');
if($this->form_validation->run() == FALSE)
{
$data['main_content'] = "league/update_contact";
$this->load->view('includes/template', $data);
}
else
{
if($query = $this->add_contact_model->updateContact())
{
$this->load->view('includes/top');
$this->load->view('includes/header');
$this->load->view('league/contact_updated');
$this->load->view('includes/footer');
}
else
{
$this->load->view('includes/top');
$this->load->view('includes/header');
$this->load->view('league/about_added');
$this->load->view('includes/footer');
}
}
}
It's updating if the where statement isn't there, but obviously it just updates everything, so just unsure of how the where statement should be written.
Thanks in advance for any help :)
function updateContact( $id ) {
....
$this->db->where('id', $id );
in your controller make sure that id (segment(3)) is valid before execute Model method
Just to add to bensius comment, you really shouldn't have $this->uri->segment(3) in the model. This should belong in your controller.