3

シナリオ:国を示す Twitter ブートストラップ サムネイル グリッドのビューがあります。ユーザーが 1 つの画像をクリックすると、その国に関連する都市が同じグリッド (画面) に表示されるはずです。

技術:最初に dataProvider に国を入力します。次に、国 ID を含む ajax リクエストをコントローラーに送信する必要があります。コントローラーは、その国に関連する都市をデータベースにクエリし、新しい dataProvider をビューに送信して更新します。新しいデータを持つ同じサムネイル dataProvider。

質問:どうすればいいですか?

これが私のコードです:

サムネイル宣言付きのビュー (ビューの名前: _detail)

<?php 

            $this->widget('bootstrap.widgets.TbThumbnails', array(
            'id' => 'detailThumbnails',
            'dataProvider' => $dataprov,
            'template' => "{items}\n{pager}",
            'itemView' => '_thumb',
            ));

        ?>

サムネイル「itemView」プロパティで呼び出されるビュー (ビューの名前: _thumb)

<?php
    require_once '_detail.php';
?>
<li class="span3">
    <a href="#" class="<?php echo "thumbnail".$data['id']  ?>" rel="tooltip" data-title=" <?php echo "Clicar.."; ?>">
        <img src="<?php echo Yii::app()->getBaseUrl() . $data['photo'] ?>" alt="">
        <a href=
           "
           <?php 
           echo $className;
           echo $this->createUrl(get_class($data).'/view', array('id' => $data['id'])); 

           ?>
           "
           >
               <?php 

               echo $data['name'].$data['id']; 
               ?>
        </a>

        <?php

        Yii::app()->clientScript->registerScript('thumbClick'.$data['id'],'
                    $(".thumbnail'.$data['id'].'").click(function(){
                        var request = $.ajax({
                            data: {
                                id : '.$data['id'].'
                            },
                            type: "post",
                            url:"'.Yii::app()->createAbsoluteUrl("tripDetail/getCities").'",
                            error: function(response, error)
                            {
                                alert("Error: " + response + " : " + error);
                            },
                        });
                        $(".thumbnail'.$data['id'].'").ajaxSuccess(function() {
                            $.fn.yiiListView.update("detailThumbnails");
                        });
                    });
                ');
        ?>
    </a>
</li>

成功した場合、_detail という名前のビューにある同じ dataProvider を更新する必要があるため、require_once. 私がやろうとしているのは、コントローラー(以下)からのデータをjsonで渡し、ここでデコードすることです。しかし、json 応答から新しいデータ プロバイダーを構築する方法がわかりません。また、エンコードが適切に行われたかどうかもわかりません。それは...ですか????

コントローラ (一部の機能のみ)

public function actionCreate()
        {
            $session = new CHttpSession;
            $session->open();

            if(isset($_SESSION['mySession']))
            {
                $data = $_SESSION['mySession'];

                if ($data)
                {
                    if(!isset($_GET['ajax']))
                    {
                        $dataprov = new CActiveDataProvider("Country");
                        $this->render('create', 
                                array(
                                    'dat'=>$data,
                                    'dataprov'=>$dataprov
                                    )
                                );
                    }

                }
            }
        }

        public function actionGetCities()
        {

            if(isset($_POST['id']))
            {
                $cityId = $_POST['id'];

                $dataProvider = $this->getCitiesFromDb($cityId);

                echo $this->renderPartial('_detail',array('dataprov'=> $dataProvider),true,true);   
            }
        }

        public function getCitiesFromDb($cityId)
        {
            $criteria = new CDbCriteria;  
            $criteria->select = "*";
            $criteria->condition = "b4_Country_id = " . $cityId;

            $dataProv = new CActiveDataProvider('City', 
                    array('criteria'=>$criteria));

            return $dataProv;
        }   

これが正しい方法でない場合は、お知らせください

4

2 に答える 2

2

あなたはミキシングServer Side CodeしてClient side codeいます。


サーバーサイドコード


このコードはサーバー上にあり、要求に応じて実行され、クライアントに有効な出力を提供します。一度実行されると、クライアントとの接続は維持されません


クライアントサイドコード


リクエストがサーバーに送信されると、クライアントはサーバーからの応答を待ち、サーバーから送信されたものをすべて受信します。完了すると、ユーザーまたはスクリプトによってさらに要求が行われるまで、サーバーから切断されます。

ここで行ったことは、<?php$json = CJSON::decode(data)?>phpタグはサーバー側のものであり、コードのようにクライアント側に表示されるため、データを設定できません。以下を検討してください

AJAXリクエストが正常に行われた場合は、を変更datatypeしてみてくださいAjax request。途中だと思いますが、JSON受信したものをデコードする方法がわかりません。'dataType'=>'json'ajaxリクエストで使用できます。詳細については、AjaxとJsonを使用したフィールドの更新を参照してください。

これが人生を楽にしてくれることを願っています

更新部分については、ページを作成し、経由して呼び出してビューrenderpartialに戻るなどの操作を行うことができますHTML

public function actionGetCities()
        {

            if(isset($_POST['id']))
            {
                $cityId = $_POST['id'];

                $dataProvider = $this->getCitiesFromDb($cityId);
                echo $this->renderPartial('updateView',array('dataprovider'=> $dataProvider),true,true);//see documentation for third and fourth parameter and change if you like   
            }
        }

ビューでは、最初に元のグリッドを持つdivを更新するだけなので、jsonフォーマットを使用する必要はありません。 updateView

<?php 
            $this->widget('bootstrap.widgets.TbThumbnails', array(
                'id' => 'detailThumbnails',
                'dataProvider' => $dataProvider,
                'template' => "{items}\n{pager}",
                'itemView' => '_thumb',
            ));

        ?>

注:このコードはテストされておらず、アイデアのためにのみ提供されています。

于 2012-10-28T21:47:16.757 に答える
1

わかりました、昨日、jquery にあった問題を修正しました。生成された html は適切でしたが、画像が更新されたときに挿入されていませんでした。その後、小さなライトが点灯しました。

Yii::app()->clientScript->registerScript('thumbClick'.$data['id'],'
                    $(".thumbnail'.$data['id'].'").click(function(){
                        var request = $.ajax({
                            data: {
                                id : '.$data['id'].'
                            },
                            type: "post",
                            success: function(data) {
                                $("#detailThumbnails").html(data);
                            },
                            url:"'.Yii::app()->createAbsoluteUrl("tripDetail/getCities").'",
                            error: function(response, error)
                            {
                                alert("Error: " + response + " : " + error);
                            },
                        });
                    });
                ');

「成功:」と言うコードの部分

bool.dev をはじめとする皆様のご支援に心より感謝申し上げます。あなたの助けは貴重でした。

于 2012-10-30T09:50:24.440 に答える