Skip to main content
 首页 » 编程设计

jquery之Yii 和 EGMap 扩展(Google map )在复选框更改时刷新 map

2026年07月28日8lyj

我正在使用 Yii framework 开发交互式 map 和 Yii egmap extension 。 当用户单击复选框时,我想刷新 map (ajax),如图所示: 我只能使用以下代码在服务器端执行此操作(刷新整个页面):

<?php 
    Yii::app()->clientScript->registerScript('filterscript'," 
        $('#filter_all').click(function() { 
            $(\"input[name='filter\[\]']\").prop('checked', this.checked); 
            window.location.href = 'http://' + window.location.host + window.location.pathname + '?tags=sale,rent,residential,commercial,agricultural'; 
        }); 
        $(\"input[name='filter\[\]']\").click(function() { 
            var tags = '?tags='; 
            var tmp=new Array(); 
            $('#filter_all').prop('checked', !$(\"input[name='filter\[\]']:not(:checked)\").length); 
            $('input[type=checkbox]').each(function () { 
                if (this.checked)  
                    tmp.push($(this).val()); 
 
            }); 
            tags += tmp.join(','); 
            window.location.href = 'http://' + window.location.host + window.location.pathname + tags; 
        }); 
        $('#filter_all').prop('checked', !$(\"input[name='filter\[\]']:not(:checked)\").length); 
    ",CClientScript::POS_READY); 
?> 

map 是使用 EGMap 扩展和以下代码生成的:

<?php 
 
// Get latlong from location-aware web browser saved in cookie 
if (isset($_COOKIE['latlng'])){ 
    list($lat,$long) = explode(',',htmlentities(htmlspecialchars(strip_tags($_COOKIE['latlng'])))); 
}else{ 
    $lat = 3.159553312559541; 
    $long = 101.71481802016604; 
} 
Yii::import('ext.gmap.*'); 
 
$gMap = new EGMap(); 
$gMap->setJsName('map'); 
$gMap->zoom = 10; 
$mapTypeControlOptions = array( 
    'sensor'=>true, 
    'position'=> EGMapControlPosition::LEFT_BOTTOM, 
    'style'=>EGMap::MAPTYPECONTROL_STYLE_DROPDOWN_MENU 
); 
 
$gMap->mapTypeControlOptions= $mapTypeControlOptions; 
$gMap->setWidth('100%'); 
$gMap->setHeight(500); 
$gMap->setCenter($lat, $long); 
 
$icon = new EGMapMarkerImage("http://".$_SERVER['HTTP_HOST'].Yii::app()->baseUrl."/images/bighouse.png"); 
 
$icon->setSize(32, 37); 
$icon->setAnchor(16, 16.5); 
$icon->setOrigin(0, 0); 
 
// Status label 
$status_type = array( 
    0=>'success', 
    1=>'warning', 
    2=>'important', 
    3=>'important', 
); 
 
$condition = ''; 
$sale_cond = ''; 
$rent_cond = ''; 
 
if ($match['sale']==='' && $match['rent']==='' && $match['residential']==='' && $match['commercial']==='' && $match['agricultural']===''){ 
    $condition = "AND ( 
        (MATCH (tags) AGAINST ('sale')  
        AND MATCH (tags) AGAINST ('residential')) 
        OR 
        (MATCH (tags) AGAINST ('rent')  
        AND MATCH (tags) AGAINST ('residential') ) 
        OR 
        (MATCH (tags) AGAINST ('sale')  
        AND MATCH (tags) AGAINST ('commercial')) 
        OR 
        (MATCH (tags) AGAINST ('rent')  
        AND MATCH (tags) AGAINST ('commercial') ) 
        OR 
        (MATCH (tags) AGAINST ('sale')  
        AND MATCH (tags) AGAINST ('agricultural')) 
        OR 
        (MATCH (tags) AGAINST ('rent')  
        AND MATCH (tags) AGAINST ('agricultural') ) 
    )"; 
}else{ 
    if ($match['sale']!=''){ 
        $sale_cond = "MATCH (tags) AGAINST ('sale')"; 
        if ($match['residential']!=''){ 
            $cond[1] = "(".$sale_cond." AND MATCH (tags) AGAINST ('residential'))"; 
        } 
        if ($match['commercial']!=''){ 
            $cond[2] = "(".$sale_cond." AND MATCH (tags) AGAINST ('commercial'))"; 
        } 
        if ($match['agricultural']!=''){ 
            $cond[3] = "(".$sale_cond." AND MATCH (tags) AGAINST ('agricultural'))"; 
        } 
        if ($match['residential']!='' || $match['commercial']!='' || $match['agricultural']!=''){ 
            $sale_cond = implode(' OR ', $cond); 
        } 
    } 
    if ($match['rent']!=''){ 
        $rent_cond = "MATCH (tags) AGAINST ('rent')"; 
        if ($match['residential']!=''){ 
            $cond[1] = "(".$rent_cond." AND MATCH (tags) AGAINST ('residential'))"; 
        } 
        if ($match['commercial']!=''){ 
            $cond[2] = "(".$rent_cond." AND MATCH (tags) AGAINST ('commercial'))"; 
        } 
        if ($match['agricultural']!=''){ 
            $cond[3] = "(".$rent_cond." AND MATCH (tags) AGAINST ('agricultural'))"; 
        } 
        if ($match['residential']!='' || $match['commercial']!='' || $match['agricultural']!=''){ 
            $rent_cond = implode(' OR ', $cond); 
        } 
 
    } 
    if ($sale_cond!=''){ 
        $condition = 'AND '.$sale_cond; 
        if ($rent_cond!=''){ 
            $condition .= ' OR '.$rent_cond; 
        } 
    }elseif ($rent_cond!=''){ 
        $condition = 'AND '.$rent_cond; 
    } 
} 
 
$props = Property::model()->findAll('active=1 '.$condition); 
if ($props!==null){ 
    foreach ($props as $prop){ 
        // Prepare status label for info box 
        $status_label='<span class="label label-'.$status_type[(int)$prop['status']].'">'.$list_status[(int)$prop['status']].'</span>'; 
        $prop_photo = ''; 
        $win_height = '110px'; 
        // Check if photo exist 
        if (is_file('images/property/'.$prop['photo'])){ 
            $prop_photo = '<img src="http://'.$_SERVER['HTTP_HOST'].Yii::app()->baseUrl.'/images/property/'.$prop['photo'].'" /><br />';  
            $win_height = '310px'; 
        } 
 
        $email_img = '<img src="http://'.$_SERVER['HTTP_HOST'].Yii::app()->baseUrl.'/site/strtoimg?pid='.$prop['id'].'" />'; 
 
        $view_link = '<div style="float:left"><a href="'.Yii::app()->baseUrl.'/public/view/'.$prop['id'].'">View this property</a></div>'; 
        $edit_link = ''; 
        if (!Yii::app()->user->isGuest && (int)$prop['user_id']===(int)Yii::app()->user->id){ 
            $edit_link = '<div style="float:right"><a href="'.Yii::app()->baseUrl.'/prop/update/'.$prop['id'].'">Edit this property</a></div>'; 
        } 
        $links = '<div>'.$view_link.'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$edit_link.'</div>'; 
 
        $info_window = new EGMapInfoWindow('<div style="height:'.$win_height.'">'. 
                $prop_photo. 
                substr($prop['description'],0,40).'...'.'<br />'. 
                'Price: '.$prop['price'].'<br />'. 
                'Email: '.$email_img.'<br />'. 
                'Tel: '.$prop['contact_phone'].'<br />'. 
                $status_label.' Added: '.$prop['date_upload'].'<br />'. 
                $links. 
                '</div>'); 
        $marker = new EGMapMarker($prop['latitude'], $prop['longitude'], array('title' => $prop['title'],'icon'=>$icon)); 
        $marker->addHtmlInfoWindow($info_window); 
        $gMap->addMarker($marker); 
    } 
} 
$gMap->renderMap(); 
 
?> 

所有这些代码都在 View 文件中。该 map 由 ID 为 EGMapContainer0 的 html 元素中的 EGMap 扩展生成。知道如何在单击复选框时通过 ajax 实现刷新 map 吗?

谢谢。

请您参考如下方法:

我一直在使用这张 map ,它很棒并且易于使用,但它的问题是你不能将它与 renderPartial 一起使用,它根本不渲染。唯一的解决方案是使用 iframe。 Ajax 更新根本不起作用。