3

场景:我有一个带有显示国家/地区的 twitter 引导缩略图网格的视图。当用户点击一张图片时,它应该在同一个网格(屏幕)中显示与该国家相关的城市。

技术:首先我用国家填充 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>

如果成功,我需要更新相同的 dataProvider,它位于名为 _detail 的视图中,因此是 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 CodeClient 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格式。 更新视图

<?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 回答