1

まず、CodeIgniter と MVC は初めてです。

CMS を作成していますが、2 つのアプリケーション (フロント エンド/CMS) を使用するか、管理者をコントローラーとして作成するか、どのルートを使用するかを決定できません。私は 1 つのアプリケーションを選択し、コントローラーを介して管理者を作成しました。

このようにすると、フォーム検証で問題が発生しました。検証されない場合、フォームをロードできず、リダイレクトする必要があります。つまり、検証されていないフィールドを再入力しません。3 番目の URI セグメントの変数を使用して、新しいレコードを挿入するためのフォーム、レコードを編集するためのデータが入力されたフォーム、またはすべてのレコードの表形式のリストを表示するかどうかを決定します。

フォームは /admin/videos/save に投稿します

function videos()
{
    if (!$this->tank_auth->is_logged_in()) {
        redirect('/auth/login/');
    } else {

        $this->load->model('videos_model');

        $data['section'] = "Videos";
        $data['area']    = "Videos";
        $data['mode']    = $this->uri->segment(3, 'create');
        $data['user_id']  = $this->tank_auth->get_user_id();
        $data['username'] = $this->tank_auth->get_username();

        if ($data['mode'] == 'edit') {

            $data['ID']     = $this->uri->segment(4);
            $data['videos'] = $this->videos_model->get_videos($data['ID']);

        } elseif ($data['mode'] == 'list') {

            if ($this->uri->segment(4)) {
                $data['filter'] = $this->uri->segment(4);

                $data['videos'] = $this->videos_model->get_filtered_videos($data['filter']);
            } else {
                $data['videos'] = $this->videos_model->get_filtered_videos();
            }
        } elseif ($data['mode'] == 'save') {
            $this->load->helper('form');
            $this->load->library('form_validation');

            $this->form_validation->set_rules('videoTitle', 'Title', 'required');
            $this->form_validation->set_rules('Code', 'Youtube Code', 'required');

            if ($this->form_validation->run() === FALSE) {
                redirect('/admin/videos');
            } else {
                $this->videos_model->set_videos();
                redirect('/admin/videos/list');
            }
        }

        if ($data['mode'] != "create" && empty($data['videos'])) {
            show_404();
        }



        $this->load->view('admin/templates/head', $data);
        $this->load->view('admin/templates/body_navbar', $data);
        $this->load->view('admin/videos', $data);
        $this->load->view('admin/templates/footer', $data);
    }
}

私はこれについて間違った方法で設定していますか? 2 つのアプリケーション フォルダーを使用するか、すべてを編集/挿入/表示するために 3 つのコントローラーを使用する必要があります。または、現在のセットアップに対する解決策はありますか?

4

2 に答える 2

0

1 つのアプリケーション フォルダーと管理者全体をコントローラーとして使用し続けています。

フォームへのリダイレクトを続行し、フォームフィールドとエラーをセッションに保存することで、フォームの検証と再入力の問題を解決しました。

一度表示したセッションのエラーデータを破棄しますが、他の情報はそのままにしておきます。これにより、ユーザーは移動して戻ってきても情報が残ります。フォームが正しく検証され、情報がデータベースに保存されると、セッション データが破棄されます。

    function videos()
{
    if (!$this->tank_auth->is_logged_in()) {
        redirect('/auth/login/');
    } else {

        $this->load->model('videos_model');

        $data['section'] = "Videos";
        $data['area']    = "Videos";
        $data['mode']    = $this->uri->segment(3, 'create');
        $data['user_id']  = $this->tank_auth->get_user_id();
        $data['username'] = $this->tank_auth->get_username();

        if ($this->session->userdata('videoTitle'))
            $data['videoTitle'] = $this->session->userdata('videoTitle');
        if ($this->session->userdata('Code'))
            $data['Code'] = $this->session->userdata('Code');
        if ($this->session->userdata('videoTitle'))
            $data['description'] = $this->session->userdata('description');
        if ($this->session->userdata('errors')){
            $data['errors'] = $this->session->userdata('errors');
            $this->session->unset_userdata('errors');
        }

        if ($data['mode'] == 'edit') {

            $data['ID']     = $this->uri->segment(4);
            $video_data = $this->videos_model->get_videos($data['ID']);
            $data['videoTitle'] = $video_data['videoTitle'];
            $data['Code'] = $video_data['blipCode'];
            $data['description'] = $video_data['description'];

        } elseif ($data['mode'] == 'list') {

            if ($this->uri->segment(4)) {
                $data['filter'] = $this->uri->segment(4);

                $data['videos'] = $this->videos_model->get_filtered_videos($data['filter']);
            } else {
                $data['videos'] = $this->videos_model->get_filtered_videos();
            }
        } elseif ($data['mode'] == 'save') {
            $this->load->helper('form');
            $this->load->library('form_validation');

            $this->form_validation->set_rules('videoTitle', 'Title', 'required');
            $this->form_validation->set_rules('Code', 'Youtube Code', 'required');


            if ($this->form_validation->run() === FALSE) {
                $formdata = array(
                    'videoTitle' => $this->input->post('videoTitle'),
                    'Code' => $this->input->post('Code'),
                    'description' => $this->input->post('description'),
                    'errors' =>  validation_errors()
                );
                $this->session->set_userdata($formdata);
                redirect('/admin/videos');
            } else {
                $this->videos_model->set_videos();
                $this->session->unset_userdata('videoTitle');
                $this->session->unset_userdata('Code');
                $this->session->unset_userdata('description');
                redirect('/admin/videos/list');
            }
        }

        $this->load->view('admin/templates/head', $data);
        $this->load->view('admin/templates/body_navbar', $data);
        $this->load->view('admin/videos', $data);
        $this->load->view('admin/templates/footer', $data);
    }
}
于 2013-08-01T10:24:14.653 に答える
0

私は個人的に CodeIgniter のフォーム ヘルパーやバリデーション ライブラリを使用したことがないので、無知で申し訳ありませんが、代わりに AJAX 投稿としてこれを行っていない特別な理由はありますか?

私はこれについて間違った方法で設定していますか? 2 つのアプリケーション フォルダーを使用するか、すべてを編集/挿入/表示するために 3 つのコントローラーを使用する必要があります。または、現在のセットアップに対する解決策はありますか?

なぜ 3 つのコントローラー? 1 つのコントローラーで複数の機能を使用できます。正直なところ、フォームに単純な AJAX 投稿を行い、検証が成功したかどうかに関係なく JSON データを返すことをお勧めします。リダイレクトは必要ありません。

何かのようなもの:

// AJAX

function validateForm() {
  $.post('route/to/controller', {"apple": appleValue, "peach": peachValue}, function(data) {

     json = $.parseJSON(data);

        if (json.success)
           alert('Great!');
        else
            alert('Nope!');
});

//コントローラ

function validateForm()
{
  $data['success'] = ...validation checks...

  echo json_encode($data);
}
于 2013-08-01T00:29:29.760 に答える