Поле обновления Codeigniter Grocery Crud?

$crud->set_rules('user_password', 'Password', 'trim|required|matches[konfirmpass]');
$crud->set_rules('konfirmpass', 'Konfirmasi Password', 'trim|required');

$crud->callback_edit_field('user_password',array($this,'_user_edit'));
$crud->callback_add_field('user_password',array($this,'_user_edit'));

функция обратного вызова:

function _user_edit(){
    return '<input type="password" name="user_password"/>  Confirmation password* : <input type="password" name="konfirmpass"/>';   
}

У меня вопрос как обновить если только "пароль" не пустой?


person Idham Perdameian    schedule 15.11.2011    source источник
comment
Сообщите нам, какую библиотеку CRUD вы используете.   -  person Gustav Bertram    schedule 15.11.2011
comment
Кроме того, что это за версия CI?   -  person Damien Pirsy    schedule 15.11.2011
comment
Спасибо, я использую Grocerycrud, grocerycrud.com и CodeIgniter v 2.0.3.   -  person Idham Perdameian    schedule 15.11.2011


Ответы (1)


Я установил CI 2.0.3 и GC 1.1.4 для проверки, потому что на первый взгляд ваш код выглядел нормально. Как оказалось, это так, и ваш код работает. Я изменил готовый метод employees_management в контроллере examples с помощью GC. Добавил столбец user_password в базу данных и добавил свой код в контроллер.

Код гарантирует, что поля пароля совпадают и что они не пусты при отправке.

  • Пустые результаты в "The Password field is required"
  • Несоответствующие результаты в "The Password field does not match the konfirmpass field."

Возможно, если это не работает для вас, вы должны опубликовать весь свой метод, а не только правила и обратные вызовы, чтобы мы могли увидеть, есть ли какие-либо другие проблемы.

Работает

Изменить

Для редактирования поля, только если пароль был отредактирован нужно добавить

$crud->callback_before_update( array( $this,'update_password' ) );

function update_password( $post ) { 
if( empty( $post['user_password'] ) ) {
    unset($post['user_password'], $post['konfirmpass']);
}

return $post;
}

Это, однако, может означать, что вам нужно удалить проверку для пустого пароля в зависимости от того, в каком порядке выполняются обратные вызовы (если они выполняются до или после проверки формы). Если они запускаются перед проверкой формы, вам также нужно будет выполнить вызов callback_before_insert() и добавить свои правила проверки в два обратных вызова. Очевидно, что для вставки потребуется правило required, а для обновления — нет.

Правка 2, разъяснение правки 1

Изучив это, проверка выполняется перед обратными вызовами, поэтому вы не можете установить правила проверки в функциях обратного вызова. Для этого вам потребуется использовать функцию getState(), которая позволяет добавлять логику на основе действия, выполняемого CRUD.

В этом случае мы хотим сделать поле пароля required только при добавлении строки и не требуется при обновлении.

Таким образом, в дополнение к вышеупомянутому обратному вызову update_password() вам нужно будет обернуть правила проверки формы в проверку состояния.

if( $crud->getState() == 'insert_validation' ) {
    $crud->set_rules('user_password', 'Password', 'trim|required|matches[konfirmpass]');
    $crud->set_rules('konfirmpass', 'Konfirmasi Password', 'trim|required');
}

Это добавит параметры проверки, если CRUD вставляется.

person Ben Swinburne    schedule 28.11.2011
comment
Спасибо Ben Swinburne, Да, я имею в виду. Если пользователь добавляет новую запись, правило проверки должно работать. Я имею в виду, что если пользователь edit record и оставить пароль в поле пустым, поэтому пароль не нужно обновлять, и правило проверки здесь не требуется, но если пользователь редактирует запись и пароль поля не пусты, я хочу, чтобы правило проверки работало нормально. Еще раз спасибо за помощь. - person Idham Perdameian; 05.12.2011
comment
Привет, Бен Суинберн, я должен попробовать ваше предложение, но я не понимаю, когда мне нужно правило проверки, а не требуется? - person Idham Perdameian; 06.12.2011
comment
Спасибо, это работает. я очень рад, не как другие пользователи, вы попробуйте сами :). Может быть, я действительно не понимаю, поэтому я должен был спросить. И, наконец, для обновления я использую этот код: if( $crud->getState() == 'update_validation' && !empty($_POST['user_password'])) { //Validation run here } И использую callback update_password(). Спасибо, Бен Суинберн - person Idham Perdameian; 07.12.2011