Benjamen Kuhman
Benjamen Kuhman

Reputation: 350

Unable to preserve input values after form validation Codeigniter 4

This is a question I have seen asked before but I have been unable to find an answer for the newer version of Codeigniter.

Controller

<?php


namespace App\Controllers;


class SendEmail extends BaseController
{
    public function index($validation = NULL){
        // Load form helper
        helper('form');

        // Instantiate session
        $session = \Config\Services::session();

        // Set css, javascript, and flashdata
        $data = [
            'css' => array('contact.css'),
            'js' => array('contact.js'),
            'validation' => $validation,
            'success' => $session->get('success')
        ];

        // Show views
        echo view('templates/header', $data);
        echo view('contact', $data);
        echo view('templates/footer', $data);
    }
    public function sendEmail(){
        // Instantiate request
        $request = $this->request;

        // Captcha API
        $captchaUser = $request->getPost('g-recaptcha-response');
        // Captcha Key loaded from a file left out of the repo
        $captchaConfig = config('Config\\Credentials');
        $captchaKey = $captchaConfig->captchaKey;
        $captchaOptions = [
            'secret' => $captchaKey,
            'response' => $captchaUser
        ];
        $client = \Config\Services::curlrequest();
        $captchaResponse = $client->request('POST', 'https://www.google.com/recaptcha/api/siteverify', ['form_params' => $captchaOptions]);
        $captchaObj = json_decode($captchaResponse->getBody());

        // Load validation library
        $validation = \Config\Services::validation();

        // Set validation rules
        $validation->setRules([
            'name' => 'required|alpha_dash|alpha_space',
            'email' => 'required|valid_email',
            'subject' => 'required|alpha_numeric_punct',
            'message' => 'required|alpha_numeric_punct'
        ]);

        // Validate inputs
        if (!$this->validate($validation->getRules())){
            // Run index function to show the contact page again
            $this->index($this->validator);
        }
        // Validate captcha
        elseif(!$validation->check($captchaObj->success, 'required')){
            $validation->setError('captcha','Did not pass captcha. Please try again.');
            $this->index($validation->getErrors());
        }
        else{
            // Set variables to input
            $name = $request->getPost('name');
            $email = $request->getPost('email');
            $subject = $request->getPost('subject');
            $message = $request->getPost('message');

            // Load email class
            $emailC = \Config\Services::email();

            // Set email settings
            $emailC->setFrom('[email protected]', $name);
            $emailC->setReplyTo($email);
            $emailC->setTo('[email protected]');

            $emailC->setSubject($subject);
            $emailC->setMessage($message);

            // Testing section
            echo '<br>'.$name.'<br>'.$email.'<br>'.$subject.'<br>'.$message;

            /* Temporarily disabled for testing purposes
            // Send email
            if($emailC->send(false)){
                // Redirect
                return redirect()->to(base_url().'/contact')->with('success', true);
            }else{
                // Display error
                throw new \CodeIgniter\Database\Exceptions\DatabaseException();
            };
            */
        }
    }
}

Contact View

<div class="container">
    <div class="row">
        <div class="col">
            <div class="alert alert-success align-center" id="message-alert" <?php if($success){echo 'style="display:block"';} ?>>Message successfully sent!</div>
        </div>
    </div>
    <div class="row justify-content-center">
        <div class="col-md-6">
            <?php echo form_open('send_email', ['id'=>'contactForm'])?>
                <div class="form-group">
                    <label for="name">Name</label>
                    <input name="name" type="text" class="form-control" id="name" aria-describedby="name" placeholder="Name" required>
                    <p class="invalid"><?php if(isset($validation)&&$validation->hasError('name')){echo $validation->getError('name');}?></p>
                </div>
                <div class="form-group">
                    <label for="email">E-Mail</label>
                    <input name="email" type="email" class="form-control" id="email" aria-describedby="email" placeholder="E-mail" required>
                    <small id="emailHelp" class="form-text">I'll never share your email with anyone else.</small>
                    <?php //echo $validation->email;?>
                    <p class="invalid"><?php if(isset($validation)&&$validation->hasError('email')){echo $validation->getError('email');}?></p>
                </div>
                <div class="form-group">
                    <label for="subject">Subject</label>
                    <input name="subject" type="text" class="form-control" id="subject" placeholder="Subject" required>
                    <p class="invalid"><?php if(isset($validation)&&$validation->hasError('subject')){echo $validation->getError('subject');}?></p>
                </div>
                <div class="form-group">
                    <label for="message">Message</label>
                    <textarea name="message" rows="5" class="form-control" id="message" placeholder="Type your message here." required></textarea>
                    <p class="invalid"><?php if(isset($validation)&&$validation->hasError('message')){echo $validation->getError('message');}?></p>
                </div>
                <button id="submitButton" type="submit" class="btn btn-primary g-recaptcha" data-sitekey="6Ldf07AZAAAAAAflQCaJcWgGFCWevCswpIrm0mJN" data-callback='onSubmit' data-action='submit'>Submit</button>
            <p class="invalid"><?php if(isset($validation)&&$validation->hasError('captcha')){echo $validation->getError('captcha');}?></p>
            <?php echo form_close()?>
        </div>
    </div>
</div>
<script>
    function onSubmit(token) {
        document.getElementById("contactForm").submit();
    }
</script>
<script src="https://www.google.com/recaptcha/api.js"></script>

From my understanding of the way validation used to work in CodeIgniter, is that when you loaded your view after a form validation it would update the values with what was previously entered. This does not seem to be the case for CodeIgniter 4. I've also tried directly loading the views rather than calling the index function on validation fail. Still would not fill in the form values.

Now I could just pass these values to the index function via $data array. Which is the fix I'm going to use for now. This is more so a sanity check to see if there is something basic I'm missing or if I'm incorrectly using the validation format for CodeIgniter 4.

Upvotes: 0

Views: 2173

Answers (1)

aeran
aeran

Reputation: 1397

in CI4 you can use old() function to preserve the input value upon form validation:

View file:

<input type="tel" name="phone" value="<?= old('phone'); ?>">

In Controller you must use withInput() in the redirect() code:

$validation =  \Config\Services::validation();
$request = \Config\Services::request();

// your input validation rules
$validation->setRules(...)

if($request->getMethod() == "post" && ! $validation->withRequest($request)->run()) {
    return redirect()->back()->withInput()->with('error', $this->validation->getErrors());
    } else {
    // form validation success
}

Upvotes: 1

Related Questions