Welcome Guest, Not a member yet? Register   Sign In
C4 Latest version shield manage users
#1

So i have been playing around with the newest version of shield and really be running in a circle with the manage users, so shield creates a user model default I have made a create user and delete user and update user, create users was a bit tricky using just the code example here the update user has me just stumped, if i edit user then it says username taken, or password required.

My question is how to validate when info has changed so if I edit user name John profile but dont change his username it shouldn't say username taken same for email



public function update($id)
{

    $users = auth()->getProvider();
    $user = $users->findById($id);

    $validation = \Config\Services::validation();
    $validation->setRules([
        'username' => 'required|is_unique[users.username]',
        'email' => 'required|is_unique[auth_identities.secret]'
    ]);

    $data = [
        'username' => $this->request->getPost('username'),
        'email' => $this->request->getPost('email')
    ];

    if (!$user->hasChanged()) {
        return redirect()->back()
            ->with("message", "Nothing to update.");
    }

    if ($validation->run($data)) {

        $user->fill([
            'username' => $data['username'],
            'email' => $data['email']
        ]);

        $users->update($user);

        return redirect()->to("admin/dashboard/manage-users")
                ->with("message", "User updated.");

    }
    return redirect()->back()
            ->with('errors', $validation->getErrors())
            ->withInput();
}
Reply
#2

(This post was last modified: 05-18-2024, 01:22 PM by warcooft.)

Try add validation error message as follows:

PHP Code:
$validation->setRules([
        'username' => [
                'rules'  => 'required|is_unique[users.username,id,{$id}]',
                'errors' => [
                    'reuired' => 'username required.'
                    'is_unique'  => 'username: ({value}) already taken',
                ],
            ],
        'email' => [
                'rules'  => 'required|is_unique[auth_identities.secret,user_id,{$id}]'
                'errors' => [
                    'reuired' => 'email required.'
                    'is_unique'  => 'email: ({value}) already taken',
                ],
            ],
    ]); 
@xxxx[{::::::::::::::::::::::::::::::::>
Reply
#3

That changes nothing, if i edit a user lets say email if i change email it tells me username is taken
Reply
#4

(This post was last modified: 05-18-2024, 03:53 PM by warcooft.)

Read https://codeigniter.com/user_guide/libra...aceholders
let say $id = 4 So it will ignore the row in the database that has id=4 when it verifies the email or username is unique.
@xxxx[{::::::::::::::::::::::::::::::::>
Reply
#5

This code is dangerous. Because an attacker  can send any values to your server.
Be sure that $id does not have invalid value as the id value (number only?) before running this code.

PHP Code:
$validation->setRules([
        'username' => [
                'rules'  => 'required|is_unique[users.username,id,{$id}]',
                'errors' => [
                    'reuired' => 'username required.'
                    'is_unique'  => 'username: ({value}) already taken',
                ],
            ],
        'email' => [
                'rules'  => 'required|is_unique[auth_identities.secret,user_id,{$id}]'
                'errors' => [
                    'reuired' => 'email required.'
                    'is_unique'  => 'email: ({value}) already taken',
                ],
            ],
    ]); 
Reply
#6

Did you ever resolve this? I have the same issue.

Thanks!
Reply
#7

(This post was last modified: Yesterday, 04:16 AM by luckmoshy.)

do thid
PHP Code:
<?php

// Assume you're getting the user ID from a form or route
$id = (int) $this->request->getPost('id'); // or route segment

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

$validation->setRules([
    
'username' => [
        
'rules' => 'required|is_unique[users.username,id,{id}]',
        
'errors' => [
            
'required'  => 'Username is required.',
            
'is_unique' => 'The username ({value}) is already taken.',
        ],
    ],
    
'email' => [
        
'rules' => 'required|valid_email|is_unique[auth_identities.secret,user_id,{id}]',
        
'errors' => [
            
'required'  => 'Email is required.',
            
'valid_email' => 'Please enter a valid email address.',
            
'is_unique' => 'The email ({value}) is already taken.',
        ],
    ],
]);

$dataToValidate $this->request->getPost();

// Add `{id}` replacement manually for the `{id}` in rule
$validation->run($dataToValidatenull, ['id' => $id]);

if (!
$validation->withRequest($this->request)->run(nullnull, ['id' => $id])) {
    return 
redirect()->back()->withInput()->with('errors'$validation->getErrors());

Codeigniter First, Codeigniter Then You!!
yekrinaDigitals

Reply




Theme © iAndrew 2016 - Forum software by © MyBB