Почему CodeIgniter пропускает URL, если проверка плоха два раза? - PullRequest
2 голосов
/ 02 марта 2012

У меня такая ситуация. Например,

Путь: localhost/intranet/

Если я введу этот URL:

localhost/intranet/usuarios/actualizar/richard

и оставьте все поля незаполненными и отправьте, проверка проходит нормально и показывает ошибку: «все эти поля обязательны для заполнения» Но, если я снова нажму кнопку «Отправить», он отправит меня по адресу:

localhost/intranet/usuarios/actualizar/

Подсказка: usuarios = USERS на английском языке, actualizar = UPDATE_INFO.

Итак, как вы можете видеть, аргумент, в данном случае richard, является бесполезным. Я бегу 2.1 CodeIgniter. Почему это происходит? я не хочу, чтобы CodeIgniter пропустил аргумент, потому что он покажет много ошибок, связанных с тем, что CI не может найти аргумент для работы.

Это нормально? Может кто-нибудь может щелкнуть два раза, когда проверка не может увидеть, является ли то же самое поведение?

ОБНОВЛЕНИЕ # 1 Добавлен метод обновления данных

public function actualizar() {

        // we check if the form was submited. If not, load register view.
        if($_SERVER['REQUEST_METHOD'] == "POST") {

        // translation for errors.
        $required_msg = "<strong>%s</strong> es un campo obligatorio.";
        $exact_length_msg = "<strong>%s</strong> debe contener 10 dígitos exactamente.";
        $numeric_msg = "<strong>%s</strong> debe contener solamente dígitos.";
        $email_msg = "<strong>%s</strong> debe ser una dirección válida.";
        $unique_msg = "<strong>%s</strong> ya está registrado en el sistema. Seleccione uno distinto.";


        // set the messages with translations.
        $this->form_validation->set_message('required', $required_msg);
        $this->form_validation->set_message('exact_length', $exact_length_msg);
        $this->form_validation->set_message('numeric', $numeric_msg);
        $this->form_validation->set_message('valid_email', $email_msg);
        $this->form_validation->set_message('is_unique', $unique_msg);

        // set the rules for each input field           
        $this->form_validation->set_rules('userName', 'Nombre', 'trim|required');
        $this->form_validation->set_rules('userLastName', 'Apellido', 'trim|required');
        $this->form_validation->set_rules('userUsername', 'Nombre de Usuario', 'trim|required|is_unique[usuarios.userUsername]');
        $this->form_validation->set_rules('userCellphone', 'Teléfono', 'trim|numeric|exact_length[10]');
        $this->form_validation->set_rules('userEmail', 'Correo Electrónico', 'trim|required|valid_email||is_unique[usuarios.userEmail]');
        $this->form_validation->set_rules('userAddress', 'Dirección', 'trim|required');

        // set the custom delimiters for each error msg
        $this->form_validation->set_error_delimiters('<li>', '</li>');

            // we check if the validation pass the rules. If not, show the view again with errors msgs.
            if($this->form_validation->run() == FALSE) {
                $data['title'] = "Registrar Usuario";
                $data['page_title'] = "Panel de Control";
                $data['header']  = "header";
                $data['scripts'] = array('alert-dismiss');
                $data['body']    = "usuarios-actualizar";
                $this->load->view('template', $data);
            } else {

                // if validation went ok, we capture the form data.
                $fields = array(
                    'userName' => $this->input->post('userName'),
                    'userLastName' => $this->input->post('userLastName'),
                    'userUsername' => $this->input->post('userUsername'),
                    'userEmail' => $this->input->post('userEmail'),
                    'userAddress' => $this->input->post('userAddress'),
                    'userCellphone' => $this->input->post('userCellphone'),
                    'userIn' => $this->input->post('userIn'),
                    'userOut' => $this->input->post('userOut'),
                    'userLastLogin' => '',
                    'userRole' => $this->input->post('userRole')
                 );

                 $userName = $this->input->post('userName');
                 $userLastName = $this->input->post('userLastName');
                 $userEmail = $this->input->post('userEmail');
                 $userID = $this->input->post('userID');
                 $userUsername = $this->input->post('userUsername');

                // send the $data to the model                          
                if($this->Data_model->update_entry($userID, $fields) == TRUE) {
                    $this->session->set_flashdata('alert', 'El perfil ha sido actualizado con éxito.');
                    $this->session->set_flashdata('style', 'success');
                    redirect('usuarios/perfil/' . $userUsername);
                } else {
                    $this->session->set_flashdata('alert', 'Hubo un error actualizando el perfil. Inténtelo de nuevo.');
                    $this->session->set_flashdata('style', 'error');
                    redirect('usuarios/perfil/' . $userUsername);
                }

            }

        // If the request method is not POST, it means that form was not submitted.
        } else {
            $data['title'] = "Actualizar Datos";
            $data['page_title'] = "Actualizar Datos";
            $data['header']  = "header";
            $data['scripts'] = array('alert-dismiss');
            $data['body']    = "usuarios-actualizar";
            $data['user'] = $this->Data_model->get_profile_for_update($userUsername);
            $this->load->view('template', $data);
        }
    }
<?=form_close?>

Я только что сказал CI загружать представление, а не перенаправлять и терять URL. Я повторяю: в первый раз, это работает круто. Но если я ничего не меняю и просто нажимаю SEND еще раз, это не получается :( Просто заметил это сегодня вечером. Просто из любопытства снова нажал кнопку отправить, и он пошел в ад.

Надеюсь, кто-нибудь может дать мне некоторое представление о том, что происходит. Спасибо.

P.S. Может быть, у этого парня такая же проблема. Не совсем уверен ... CodeIgniter Set URL перенаправления проверки формы

ОБНОВЛЕНИЕ # 2 Добавлен код просмотра

     <?=form_open('usuarios/actualizar')?> 

  <?php
      $config = array(
        'type' => 'submit',
        'content' => '<i class="icon-ok icon-white"></i> Guardar Usuario',
        'class' => 'btn btn-primary'
      );
  ?>

  <div class="row">
      <h2 class="section-title span10">Actualizar Usuario</h2>
    <div class="span2">
      <?=form_button($config)?>
    </div>  
  </div>

  <?php if (validation_errors() != null) : ?>
  <div class="alert alert-warning fade in">
  <a class="close" data-dismiss="alert">&times;</a>
    <ul class="unstyled">
      <?=validation_errors()?>
    </ul>
  </div>
  <?php endif;?>

    <div class="span5">  
      <h3 class="box-title">Datos Personales</h3>
        <input type="hidden" name="userID" value="<?=$user->userID ?>">
        <label>Nombre<span class="required">*</span></label>
        <input type="text" class="span4" name="userName" value="<?=set_value('username', $user->userName)?>">
        <label>Apellido<span class="required">*</span></label>
        <input type="text" class="span4" name="userLastName" value="<?=set_value('userLastName', $user->userLastName)?>">
        <label>Teléfono</label>
        <input type="text" class="span4" name="userCellphone" value="<?=set_value('userCellphone', $user->userCellphone)?>">
        <label>Correo Electrónico<span class="required">*</span></label>
        <input type="text" class="span4" name="userEmail" value="<?=set_value('userEmail', $user->userEmail)?>">
        <label>Dirección<span class="required">*</span></label>
        <textarea class="span4" name="userAddress"><?=set_value('userAddress', $user->userAddress)?></textarea>
    </div>

Это не работает, потому что не может найти аргумент, поэтому объект $ user не может быть создан. Это приводит к огромному количеству ошибок.

РЕШЕНИЕ:

У меня не так много представителей, поэтому я не могу ответить сам, но вот решение:

Боже мой. Может быть, я засыпаю.

Как Madmartigan заявляет, я не использовал "аргумент". Итак, я добавил это:

$data['user'] = $this->Data_model->get_profile_for_update($this->uri->segment(3));

Ооо, мне не важно, если он "потеряет" аргумент в URL, он работает, потому что перед загрузкой представления вызовите $ data ['user'] stuff:)

Спасибо за вашу помощь, ребята, вы лучшие.

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Это кажется довольно очевидным:

<?=form_open('usuarios/actualizar')?>

Это всегда будет отправлять на usuarios/actualizar, поэтому вы потеряете любые другие сегменты URI или строку запроса.Просто оставьте поле пустым, чтобы опубликовать текущий URL:

<?=form_open()?>

... хотя я не вижу, чтобы actualizar() действительно что-то делал с аргументами, переданными ему в URL, так что это не такПонятно, почему вы хотите, чтобы оно было usuarios/actualizar/richard, так как richard, похоже, не используется.

РЕДАКТИРОВАТЬ: ОК, теперь я вижу это: $this->uri->segment(3).Вы должны уметь обрабатывать случай, когда это не задано, поэтому дополнительно сделайте это в своем контроллере, чтобы предотвратить ошибки:

$userUsername = $this->uri->segment(3);
if ( ! $userUsername) show_404();

Только для записи, вы также можете сделать это, чтобы установить значение по умолчанию"username":

public function actualizar($userUsername = 'Default Name') {
    // your code
}

Поскольку CI довольно строг в отношении того, что он разрешает в URL, лучше использовать строку запроса вместо имен, если вы ожидаете символы, которые не разрешены в вашем $config['permitted_uri_chars'].

0 голосов
/ 02 марта 2012

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

redirect('controller-name/method-name/parameter-name');

Загрузите помощник формы в этом методе, и вы сможете получить доступ ко всем сообщениям проверки, поскольку codeigniter хранит их в журнале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...