0

MVC の概念を理解し、一度に複数のフォームを表示する際に根本的な問題があります。さまざまな方法を試しましたが、まだ行き詰まっています。それは、CI と MVC を正しく理解していないと思うからです。

2 つの異なるフォームに対して 2 つの異なるビューを使用してみました。うまくいきませんでした。コントローラーでフォームごとに 1 つの関数を使用してみました。それもうまくいきませんでした。どうすればいいのかわからない。

私はこれを行う必要があります。

  1. コントローラーを作成し、その中に index() 関数を含めます。
  2. この index() 内の各フォームのフォーム要素を構築します
  3. 両方のフォームを表示する 1 つのビューを作成し、index() 内から呼び出す
  4. form_open を使用して、送信アクションを別の関数に指示します - それを validate() と呼びます
  5. 入ってくるものすべてを検証し、エラーを送り返します
  6. どういうわけか、これは私が得られない主なビットですが、フォームが正しく入力されている場合はアクションを完了してください。

6 私の最大の問題です。それを行う方法がわかりません。たとえば、フォームが正常に完了したら、ユーザーに選択した場所にディレクトリを作成してもらいたいので、mkdir() を使用しています。そのため、validate() 関数内に if ステートメントが必要ですか??

アップデート

これまでに作成したコードは次のとおりです。

コントローラ:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

// Forms CodeIgniter コントローラ クラス Admin extends CI_Controller {

// Controller constructor
public function __construct()
{
    parent::__construct();
    // Load form helper required to validate forms
    $this->load->helper(array('form', 'url'));
    $this->load->library('form_validation');        
}

//*************************************************//

// Prepare data for the view to output the forms
public function index()
{

    //*****************************************************//
    //returns a drop down list of radio buttons, one for each directory
    $map_one = $this->recursive_model->iterate_add_folder_names();
    $data['folder_list_add'] = $map_one;    
    //****************************************************//
    //*****************************************************//
    //also returns a drop down list of radio buttons (slightly different), one for each directory
    $map_two = $this->recursive_model->iterate_folder_names();
    $data['folder_list_select'] = $map_two; 
    //****************************************************//

    //load the views and the forms
    $this->load->view('templates/header.php');
    $this->load->view('admin/add_new_folder.php', $data);
    $this->load->view('admin/add_new_file.php', $data);
    $this->load->view('templates/small_footer.php');
}

//*************************************************//

//function if adding a new directory to the current structure
public function add_folder()
{
    //need to select a directory for it to go under
    $this->form_validation->set_rules('new_folder', 'New Folder', 'required');
    //and name the new directory
    $this->form_validation->set_rules('new_folder_name', 'New Folder Name', 'required');

    if ($this->form_validation->run() === FALSE)
    {
        $this->index();
    }
    else
    {   
        if($this->input->post())
        {
            $new_folder = $this->input->post('new_folder');
            $new_folder_name = $this->input->post('new_folder_name');
            $folder_path = "/var/www/html/mike/content".$new_folder."/".$new_folder_name;
            mkdir($folder_path, 0777);
            $this->index();
        }
    }

}

//*************************************************//

public function add_file()
{

    //folder location and name of file
    $folder_name = $this->input->post('folder_name');
    $new_folder_name = $this->input->post('file_name');

    //validation rules
    $this->form_validation->set_rules('folder_name', 'Folder Name', 'required');
    $this->form_validation->set_rules('file_name', 'File Name', 'required');

    //if there is an error with validation
    if ($this->form_validation->run() === FALSE)
    {
        //gets stuck here every time when trying to upload a new folder :(
        $this->index();
    }
    //if there is not an error with validation
    else
    {   
        //$folder_name will be something like "http://www.example.com/publications/people/reports"
        $config['upload_path'] = $folder_name;
        $config['allowed_types'] = 'gif|jpg|png|html|pdf|xls';
        $this->load->library('upload', $config);

        //if file cannot be loaded (due to $config perhaps?)
        if ( ! $this->upload->do_upload())
        {
            $error = array('error' => $this->upload->display_errors());
            $this->index();
        }
        else
        {
            $data = array('upload_data' => $this->upload->data());
            $this->index();
        }

    }   

}

//*************************************************//

}

ここに 1 つのビュー (add_new_file.php) があります。

<div id="container">

<h1>Upload A File/Publication</h1>

<div id="body">

<?php //echo $error;?>

<?php echo form_open_multipart('admin/add_file');?>

<?php echo $folder_list_select; ?>   &nbsp;&nbsp; 
<input type="file" name="file_name" size="20" />   &nbsp;&nbsp; 
<input type="submit" value="upload" />

</form>

</div>

もう一つはこちら(add_new_folder.php)

div id="container">

<h1>Add A New Folder</h1>

<div id="body">

<?php echo validation_errors(); ?>

<?php echo form_open('admin/add_folder');?>

<?php echo $folder_list_add; ?>   &nbsp;&nbsp; 
New Folder Name: <input type="text" name="new_folder_name">   &nbsp;&nbsp; 
<input type="submit" value="upload" />

</form>

</div>

これがこのスレッドへの回答に役立つことを願っています。

基本的に、最初のセクション (フォルダーの追加) は機能しますが、ファイルの追加は機能しません。これは、if ($this->form_validation->run() === FALSE)が常に false を返すためです。他のフォームのフォーム要素を見ている可能性があると思います-これはすべきではありません。私は何が欠けていますか?

4

1 に答える 1

6

私はこれを行う必要があります。
1. コントローラーを作成し、その中に index() 関数を含めます。
[会話のために、このコントローラーを thx -edと呼びましょう]Users

もちろん。カッコいい。editその Controllerに 、またはその他と呼ばれる関数を含めることもできますbanana。どちらの方法でも機能します。indexメソッド (関数)だけを使用すると、URL は次のようになりhttp://example.com/index.php/usersますが、コントローラーに のような別のメソッドを追加するbananaと、URL は のようになりhttp://example.com/index.php/users/bananaます。

2. この index() 内の各フォームのフォーム要素を構築します

通常、フォーム要素はコントローラーでは作成されません。ここで、MVC の V の出番です。表示されるものはview.

だから、次のようなことをするかもしれません

// Users Controller
class Users extends CI_Controller{
    function index(){
        //index method
    }

    function banana(){
        $this->load->view('banana_view');
    }
}

次に、application/views/banana_view.phpフォームを作成します。にアクセスするhttp://example.com/users/bananaと、 で作成したフォームが表示されbanana_view.phpます。

3. 両方のフォームを表示する 1 つのビューを作成し、index() 内から呼び出す

確かに、それはうまくいくでしょう。ただし、それぞれ<form></form>が独自の<input type="submit" name="Lets GO">内部を必要とするため、各フォームデータを送信する場所が必要になることに注意してください。これはaction=""です。省略してもかまいませんが、現在表示しているページ (ここでは ) にフォームが送信されることに注意してください。そのため、フォーム データを処理するためhttp://example.com/index.php/users/bananaにメソッドに何かを含める必要があります。banana()ただし、通常は 経由で設定されform_open()ます。のようなものform_open('index.php/users/eat_banana');が生成されます<form action="index.php/users/eat_banana"...

4 . form_open を使用して、送信アクションを別の関数に指示します - それを validate() と呼びます

とは呼ばないでくださいlate_for_dinner。しかし、真剣にvalidate、少し広いです-何を検証しますか? 理由を検証しますか? 検証に関しては、https://www.codeigniter.com/user_guide/libraries/form_validation.html。しかし、CodeIgniter の基礎を理解したら、その橋を渡る必要があります (それほど時間はかかりません)。

5. 入ってくるものすべてを検証し、エラーを送り返します

最後の質問を参照してください。

6 . どういうわけか、これは私が得られない主なビットですが、フォームが正しく入力されている場合はアクションを完了してください。

多くの場合、人々は成功メッセージを表示します

class Users extends CI_Controller{

    function index(){
        //index method
    }

    function banana(){
        $this->load->view('banana_view');
    }

    // assuming form_open('index.php/users/eat_banana'); in banana_view
    function eat_banana(){
        //make sure that this is a POST
        if($this->input->post()){
            // do things with the data
            // typically it gets saved to a database
            // via a model (the M in MVC)
            // http://ellislab.com/codeigniter/user-guide/general/models.html

            if($saved_to_db){
                // set message to send to the view
                $data['message'] = "Everything went OK";
            }else{
                $data['message'] = "but who was database? data didn't save :(";
            }
            // load the view and send the data
            $this->load->view('eat_banana', $data);
        }
     }

application/views/eat_banana.php:

 <!DOCTYPE html>
 <html>
 <head></head>
 <body>
 <div>
     <b>Form submitted.</b><br />
     The message is: <?php echo $message; ?>
 </div>
 </html>

また、代わりにリダイレクトすることを好む場合もあります

class Users extends CI_Controller{

    function index(){
        //index method
    }

    function banana(){
        $this->load->view('banana_view');
    }

    // assuming form_open('index.php/users/eat_banana'); in banana_view
    function eat_banana(){
        //make sure that this is a POST
        if($this->input->post()){
            // do things with the data             
            if($saved_to_db){
                // just send them to the homepage
                redirect('/');
            }else{
                // send them back to the form
                redirect('index.php/users/banana');
            }
        }
     }

そう、

Mはモデル用です。モデルは、データベースと対話するために使用されます。

Vベンダービューです。ビューは、テキスト、フォーム、写真、GIF などを画面にレンダリングします。とにかくその考えです。echoコントローラから巨大な最小化されていない JavaScript アプリケーションを実行することを妨げるものは何もありません。それは完全にMVC thoではありません。

Cはコントローラ用です。コントローラーはデータを呼び出してビューに送信し、ビューから送信されたデータを受信し、そのデータを取得してモデルに送信してデータベースに保存します (ただし、CodeIgniter はこれを強制しませんが、保存したい場合は可能です)コントローラーから直接データベースにデータを送信しますが、これは明らかに MVC プリンシパルも無効にします)、データベースからデータを取得し、表示のためにビューに送信します。これらがとにかく基本です。

于 2013-05-30T01:22:14.280 に答える