Yandex, Яндекс карты, extension, параметры - размер, zoom

Выкладываем свои наработки
Ответить
sergmoro1
Сообщения: 114
Зарегистрирован: 2012.11.08, 13:07

Yandex, Яндекс карты, extension, параметры - размер, zoom

Сообщение sergmoro1 »

Теперь карта может быть нужного размера и с нужным zoom-ом

https://github.com/sergmoro1/yaMap

/extensions/yamap/yaMap.php

Код: Выделить всё

<?php

/**
* yaMap
*
* @author [email protected]
*
*/

class yaMap extends CWidget
{
    public $visible = true;
    public $points = '';
    public $params = array('zoom'=>13,'width'=>'420px','height'=>'210px');

    public function init()
    {
        // Don't do anything if I'm not visible
        if(!$this->visible) {
            return;
        }
        // If we have no points, just don't do anything
        if(count($this->points) == 0 || $this->points=='') {
            $this->visible = false;
            return;
        }

        Yii::app()->clientScript->registerScript(0,
            'yaMapPoints='.CJSON::encode($this->points).';'.
                'yaMapParams='.CJSON::encode($this->params).';',
            CClientScript::POS_READY
            );
        
        $this->publishAssets();

        parent::init();
    }
    
    public function run()
    {
        $this->render('yaMap');
    }

    public function publishAssets()
    {
        $assets = dirname(__FILE__).'/assets';
        $baseUrl = Yii::app()->assetManager->publish($assets);
        if(is_dir($assets)) 
        {
            Yii::app()->clientScript->registerCoreScript('jquery');
            Yii::app()->clientScript->registerScriptFile('http://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU');
            Yii::app()->clientScript->registerScriptFile($baseUrl . '/yamap.js', CClientScript::POS_HEAD);
        } else 
        {
            throw new Exception('yaMap - Error: Couldn\'t find assets to publish.');
        }
    }
}
Карта

/extensions/yamap/views/yaMap.php

Код: Выделить всё

<div id='map_canvas' style='width: 420px; height: 210px; display:none;'></div>
Точки передаются в скрипт в массиве со следующими полями: lat,lng,icon,header,body,footer

/extensions/yamap/assets/yamap.js

Код: Выделить всё

ymaps.ready(init);
var map; 

function init() {
if(yaMapPoints.length != 0) {
	var point=yaMapPoints[0];

	var mc=document.getElementById('map_canvas');
	var display=mc.style.display;
	mc.style.display='block';
	mc.style.width=yaMapParams['width'];
	mc.style.height=yaMapParams['height'];
		
	map = new ymaps.Map ('map_canvas', {center: [point['lat'], point['lng']], zoom: yaMapParams['zoom']}); 
	map.controls.add('smallZoomControl');
	map.controls.add('mapTools');

	var collection = new ymaps.GeoObjectCollection();
	
	for(var i=0;i<yaMapPoints.length;i++) {
		point=yaMapPoints[i];
		collection.add(makePlacemark(point));
		}
	map.geoObjects.add(collection);

	if(display=='none') mc.style.display='none';
	}
}
function makePlacemark(point) {
newPlacemark = new ymaps.Placemark([point['lat'], point['lng']], {
	// Свойства
	iconContent: point['icon'],
	balloonContentHeader: point['header'],
	balloonContentBody: '<em>' + point['body'] + '</em>',
	balloonContentFooter: point['footer'] }, {
	// Опции
	preset: 'twirl#blueStretchyIcon' // иконка растягивается под контент
	});
return newPlacemark;
}
1. Пример. Стандартные размеры и zoom

Во view

Код: Выделить всё

...
<tr>
    <th class='bottom'>
        Адрес
    </td> 
    <td class='bottom'>
        <?php echo $model->street; ?>
        <?php echo $model->townregion; ?>
        <?php if($model->lat<>0): ?>
            <span class='dotted-link' style='margin-left:10px;' onclick="
                var map_canvas=document.getElementById('map_canvas');
                if(map_canvas.style.display=='none')
                {
                    map_canvas.style.display='block';
                    this.innerHTML='скрыть карту';
                } else
                {
                    map_canvas.style.display='none';
                    this.innerHTML='показать на карте';
                }
                ">показать на карте</span>
        <?php else: ?>
            <span style='margin-left:10px;'>не найден на карте</span>
        <?php endif; ?>
    </td>
</tr>

<tr><td colspan=2>
<?php
if($model->lat<>0)
{
    $this->widget('ext.yaMap.YaMap',
        array(
            'points' => array(
                array(
                    'lat' => $model->lat,
                    'lng' => $model->lng,
                    'icon' => round($model->getPrice()/1000000),
                    'header' => $model->getPrice(),
                    'body'=> $model->title,
                    'footer' => $model->firm->firmContacts[0]->phone
                    ),
                )
            )
        );
}
?>
</td></tr>
...
2. Пример. Несколько точек и zoom

Код: Выделить всё

...
<?php 
    $i=1; $points=array();
    foreach($model->firmContacts as $contact):
    $points[]=array(
        'lat' => $contact->lat,
        'lng' => $contact->lng,
        'icon' => $i++,
        'header' => $model->firmIssue->short_name,
        'body'=> $contact->address,
        'footer' => $contact->phone
    );
?>
...
    <?php
        $this->widget('ext.yaMap.YaMap',
            array(
                'points' => $points,
                'params' => array('zoom'=>11),
            ));
    ?>
...
Вложения
yamap.zip
распакуйте в protected/extensions
(2.1 КБ) 362 скачивания
Последний раз редактировалось sergmoro1 2014.06.01, 17:02, всего редактировалось 7 раз.
Аватара пользователя
Darth_Ixis
Сообщения: 105
Зарегистрирован: 2010.08.23, 10:03
Откуда: KZ, Almaty

Re: Yandex, Яндекс карты, extension

Сообщение Darth_Ixis »

Оригинально)

Советую выложить код на гитхаб или хотя бы в архив запаковать.
sergmoro1
Сообщения: 114
Зарегистрирован: 2012.11.08, 13:07

Re: Yandex, Яндекс карты, extension

Сообщение sergmoro1 »

хорошо, а почему на гитхаб лучше?
Аватара пользователя
Darth_Ixis
Сообщения: 105
Зарегистрирован: 2010.08.23, 10:03
Откуда: KZ, Almaty

Re: Yandex, Яндекс карты, extension

Сообщение Darth_Ixis »

Погуглите сами, поймёте.

Основная фича - любой другой человек может отправить пулл-реквест, чтобы исправить баг или улучшить ваше расширение.
sergmoro1
Сообщения: 114
Зарегистрирован: 2012.11.08, 13:07

Re: Yandex, Яндекс карты, extension

Сообщение sergmoro1 »

спасибо. пока остановлюсь на архиве.
Аватара пользователя
yuran
Сообщения: 77
Зарегистрирован: 2010.11.04, 22:50
Контактная информация:

Re: Yandex, Яндекс карты, extension, параметры - размер, zoo

Сообщение yuran »

Закинул содержимое архива в protected/extensions/yamap Подскажите пожалуйста как теперь вызвать карту, где что прописать?
sergmoro1
Сообщения: 114
Зарегистрирован: 2012.11.08, 13:07

Re: Yandex, Яндекс карты, extension, параметры - размер, zoo

Сообщение sergmoro1 »

Во view нужно определить массив точек $points и задать параметры вывода карты в $params и вставить widget в нужном месте.
Виджет работает с уже определенными заранее координатами, чтобы не обращаться к геокодеру каждый раз.
Например, перед выводом view, можно сделать проверку

Код: Выделить всё

if($model->lng==0)
    $model->setCoords();

$this->widget('ext.yaMap.YaMap',
    array(
        'points' => array(
            array(
                'lat' => $model->lat,
                'lng' => $model->lng,
                'icon' => '',
                'header' => $model->price==0 ? 'цена не определена' : number_format($model->price,0,'',' ').' р.',
                'body'=> $model->getTitle(),
                'footer' => $model->firm->contacts[0]->phone,
                ),
            ),
        'params' => array('visible'=>$mapAlwaysVisible,'zoom'=>13,'width'=>'440px','height'=>'330px'),
        )
    );
 
В модели, в этом случае, нужно определять координаты:

Код: Выделить всё

public function setCoords()
    {
        if($this->lng==0)
        {
            // find and set coordinates and distance
            $fullAddress=$this->getFullAddress();
            $yxml = simplexml_load_file("http://geocode-maps.yandex.ru/1.x/?geocode=$fullAddress&results=1");
            if($yxml->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found) 
            {
                $coords = $yxml->GeoObjectCollection->featureMember[0]->GeoObject->Point->pos;
                $lnglat=explode(' ',$coords);
                $this->lng=$lnglat[0]; $this->lat=$lnglat[1];
                $this->setDistance();
                
            } else
            {
                $this->lng='55.786764'; $this->lat='49.122853'; $this->direct=0; $this->road=0; // center of Kazan
            }
            $this->saveAttributes(array('lng','lat','direct','road'));
        }
    } 
Аватара пользователя
yuran
Сообщения: 77
Зарегистрирован: 2010.11.04, 22:50
Контактная информация:

Re: Yandex, Яндекс карты, extension, параметры - размер, zoo

Сообщение yuran »

Не получается ни хрена:( Вот эти два фрагмента кода они где должны быть прописаны? Допустим я хочу вывести карту просто внизу после всего на главной странице. Тогда я должен первый код поместить внизу в themes/default/views/layouts/main.php
В модели, в этом случае, нужно определять координаты:
Где прописать это, папки models внутри extension/yamap нету. Насчет модели можно поподробнее пожалуйста. И простите за тупость:)

Вот эту курту получилось вывести viewtopic.php?f=9&t=10234
sergmoro1
Сообщения: 114
Зарегистрирован: 2012.11.08, 13:07

Re: Yandex, Яндекс карты, extension, параметры - размер, zoo

Сообщение sergmoro1 »

Все модели у Вас определены в /protected/models
о моделях можете посмотреть тут
http://www.yiiframework.ru/doc/guide/ru/basics.model

Например, есть таблица, в которой каждая запись описывает торговую точку. В том числе ее координаты.
Тогда в модели этой таблицы и нужно прописывать второй код. Но учтите - это конкретный пример, Вам нужно вносить коррективы под свои нужды.

Начните с простого вывода карты.

Советую вывести карту с парой-тройкой точек. Можете заранее найти их на карте Yandex
с помощью сервиса http://api.yandex.ru/maps/tools/getlonglat/.
и вставить widget в том месте, которое Вы определили (например, главная сраница).

Если карта не выводится, посмотрите консоль ошибок в браузере и сообщите. Удачи!
sergmoro1
Сообщения: 114
Зарегистрирован: 2012.11.08, 13:07

Re: Yandex, Яндекс карты, extension, параметры - размер, zoo

Сообщение sergmoro1 »

Да, и не забудьте поставить параметр visible=>1
Аватара пользователя
yuran
Сообщения: 77
Зарегистрирован: 2010.11.04, 22:50
Контактная информация:

Re: Yandex, Яндекс карты, extension, параметры - размер, zoo

Сообщение yuran »

Все модели у Вас определены в /protected/models
Это мой косяк, я пытаюсь прикрутить вывод карты в cms yupe http://yupe.ru а там все построено на модулях, там вообще нет такой папки /protected/models. Надо было сразу мне сказать что на yupe прикручиваю.
asisdes
Сообщения: 202
Зарегистрирован: 2013.10.03, 15:54

Re: Yandex, Яндекс карты, extension, параметры - размер, zoo

Сообщение asisdes »

Подскажите, я карту вставил,
а как передвигать Балун
т.е. я карту напрмер использую в Админ панели и там мне надо наоборот установить балун в нужное место.
Изображение
asisdes
Сообщения: 202
Зарегистрирован: 2013.10.03, 15:54

Re: Yandex, Яндекс карты, extension, параметры - размер, zoo

Сообщение asisdes »

Привет еще раз всем!
Есть кто в JS разбирается

http://api.yandex.ru/maps/jsbox/2.1/dragger

тут про драгер написано, можно как то прикрутить?
к существующему расширению?
Изображение
sergmoro1
Сообщения: 114
Зарегистрирован: 2012.11.08, 13:07

Re: Yandex, Яндекс карты, extension, параметры - размер, zoo

Сообщение sergmoro1 »

добрый день! был в отпуске и только увидел ваше сообщение. оно еще актуально?
да, и лучше использовать последний вариант, см. viewtopic.php?f=9&t=17592
asisdes
Сообщения: 202
Зарегистрирован: 2013.10.03, 15:54

Re: Yandex, Яндекс карты, extension, параметры - размер, zoo

Сообщение asisdes »

конечно актуально,
мне если честно яндекс карты нравятся больше
Изображение
sergmoro1
Сообщения: 114
Зарегистрирован: 2012.11.08, 13:07

Re: Yandex, Яндекс карты, extension, параметры - размер, zoo

Сообщение sergmoro1 »

Координаты точки на карте обычно определяются по введенному адресу.
Если вы хотите использовать драгер, то конечно можно вставить предложенный http://api.yandex.ru/maps/jsbox/2.1/dragger код в init,
сохраняя измененные координаты в скрытых полях.
Ответить