3

私がここにいるのは、JQuery AJAX を使用して、JQuery タブに HTML コード (クライアントのデータを含むフォーム) の一部をロードできないためです。JQuery .load()、.append() .html() を使用しようとしましたが、JQuery タブで単純な html フォームをロードできません。私はcodeigniterを使用し、コントローラーにはいくつかの関数があります。この名前付きのfindClientの 1 つは、ラジオ入力を含むテーブルを持つ CI ページネーションを作成します。

class Management extends CI_Controller {

function __construct(){
    parent::__construct();  
    $this->load->library('myclients');
    session_start();
}


function index($clientsFound=0){
      ...
  ...       
}


public function findCliente(){
    // generate a pagination, in a table. each row have a radio, 
    // and hads a rispective id of that record
}

送信ボタンをクリックすると、タブ1で.... JQuery AJAXを呼び出します

$('#fm_submit_report').click(function(event){
            event.preventDefault();
            var form_data = {
                id_client: $('input:checked').val(),
                ci_csrf_token: $.cookie("ci_csrf_token")
            };
            var form = $(this);
            $.ajax({
                url: 'management/createReport',
                type: 'POST',
                async : false,
                data: form_data,
                dataType: 'html',
                success: function(dati, stato){
                    $('#tabs').tabs('select',4);
                    alert('Creation of a Report');
                    console.log('stato: '+stato+'   received data: '+dati);
                    $('#create_report').load(dati);
                    alert('end of load');
                },
                error: function(xhr) {

                var message = 'Errore nell\'invio del form: ';
                var status = xhr.status;
                var text = xhr.statusText;

                message += status + ': ' + text;

                $('<div class="error"/>').text(message).
                appendTo(form);

                }
            });
            return false;

この ajax は、メソッドcreateReport()に cient id を渡します。ご覧のとおり、このメソッドはmyclientsライブラリを使用してクライアント情報を取得し、この情報を「html コードの一部」に渡した後、クライアント データを内部に含むフォームを作成します。

public function createReport(){
    $client=$this->myclients->findClientById($this->input->post('id_cliente'));
    $data['client'] = $client;
 // this is a client information to pass in the view to generate the form, that will load in a tab

   $hthmlcode=$this->load->view('create_report', $data);
   // create_view is the html form 

 echo $htmlcode;
}

}/* End of function createReport */

JQueryタブにロードするhtmlコードはこれです

<table>
<tr>
    <td>                                                         
        <table style="margin-top:0" cellpadding="0" cellspacing="0" border="0">
            <?php echo form_open('management/storeReport') ?>
            <tr>
                <td class="report_left"><h2>Visit Date</h2></td>
                <td class="report_dx"><?php echo form_input('data_visita', '', 'class="data", id="datepickervisita"'); ?></td>
            </tr>
            [ ...cut ...]
            </tr>
        </table>
        <?php echo form_input($btnInviaReport); ?>

        <?php echo form_close(); ?>
        <div class="error_report"></div>
    </td>  
</tr>    
</table>
</div>

しかし残念ながら、html のコードは 5 番目のタブに読み込まれませんでした...そして投稿はページ全体を返します (代わりに私の html フォーム) !!!

firebug コンソールで、ajax の URL で設定したコントローラー/メソッドのパスが間違っていることに気付きました。fatc で設定しました

url: 'management/createReport'

しかし、コンソールでは、投稿が次のアドレスに送信されていることがわかります。

http://_local_ip_/management/management/createReport

しかし、明らかに、コントローラーを設定しない場合 (url:'createReport' を設定するだけ)、未定義のコントローラーのメソッドを呼び出すため、戻り変数 "dati" は空になります。

success: function(dati, stato)

私の.htaccessファイルがこの問題の原因であると思われます (ajax が呼び出されたときに、コントローラーの名前が 2 回繰り返されるのはなぜですか ???)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    #Removes access to the system folder by users.
    #Additionally this will allow you to create a System.php controller,
    #previously this would not have been possible.
    #'system' can be replaced if you have renamed your system folder.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %{ENV:REDIRECT_STATUS} 200
    RewriteRule .* - [L]

    RewriteRule ^(system|application) - [F,L]

    #When your application folder isn't in the system folder
    #This snippet prevents user access to the application folder
    #Submitted by: Fabdrol
    #Rename 'application' to your applications folder name.
    RewriteCond %{REQUEST_URI} ^public.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.

    ErrorDocument 404 /index.php
</IfModule> 

public は私のプロジェクトのフォルダーで、システム ディレクトリの外にあります ...

4

2 に答える 2

1

問題を解決しました。問題は、JQuery AJAX 関数の url エントリでした。

 url: 'management/createReport',

ライブラリMyjavascript/getSubmitRadio()に関数を作成します。この関数は、コントローラーに渡された文字列を受け取り、JQuery 関数全体を返します。JQuery 関数は、ヘッダー ビューに渡す文字列です。

 // -=[ Get the javascript code to insert in the header, to esecute a JQuery Submit on a specified form ]=-    
   $submitReportForm = $this->myjavascript->getSubmitRadio('fm_submit_report', 'input:checked', site_url('management/createReport'));

ビューにロードする完全なカスタムjqueryスクリプトを作成した後、次のようになります。

$('#fm_submit_report').click(function(event){
            event.preventDefault();
            var form_data = {
                id_cliente: $('input:checked').val(),
                ci_csrf_token: $.cookie("ci_csrf_token")
            };
            $.ajax({
                url: 'http://10.0.0.135/management/createReport.html ',
                type: 'POST',
                async : false,
                data: form_data,
                dataType: 'html',
                success: function(dati, stato){
                    $('#tabs').tabs('select',4);
                    alert('Creazione report per il cliente scelto');
                    console.log('stato: '+stato+'   dati ricevuti: '+dati);
                    $('#create_report').html(dati);
                    alert('Fine caricamento');
                },
                error: function(xhr) {

                var message = 'Errore nell\'invio del form: ';
                var status = xhr.status;
                var text = xhr.statusText;

                message += status + ': ' + text;

                $('<div class="error"/>').text(message).
                appendTo(form);

                }
            });
            return false;

    });  
于 2012-10-02T15:00:26.000 に答える
0

CodeIgniter のドキュメント(一番下を参照)による$this->load->view()と、3 番目のパラメーターがあります。

3 番目のオプション パラメータを使用すると、関数の動作を変更して、データをブラウザに送信するのではなく、文字列として返すことができます。これは、何らかの方法でデータを処理する場合に役立ちます。パラメータを true (ブール値) に設定すると、データが返されます。デフォルトの動作は false で、ブラウザに送信されます。

参考までに、コードにもタイプミスがあります。

代わりにこれを使用してください:

$htmlcode=$this->load->view('create_report', $data, TRUE);
echo $htmlcode;
于 2012-10-01T18:36:53.177 に答える