Мануал как добавить яндекс карты к топику

Многии задаются вопросом как добавить yandex какрту к топику чтобы можно было отмечать точки.
Такой вопрос встал и у меня после неудачного серфинга понял что прийдётся под свои нужды писать самому.

Я думаю многим будет интересно как я это сделал поэтому представляю список всех изменений что я вносил в код.

Оговорюсь сразу делал не через плагины а правил коды. Просто времени на изучение плагинов небыло.

И так приступим

1. В \classes\actions\ActionTopic.class.php после:
$_REQUEST['topic_title']=$oTopic->getTitle();


добавил:
$_REQUEST['coodrinati']=$oTopic->getCoodrinati();



после:
$oTopic->setTextSource(getRequest('topic_text'));


в 2-х местах (добавление и редактирование) добавил:
$oTopic->setCoodrinati(getRequest('coodrinati'));


2. В \classes\modules\topic\entity\Topic.entity.class.php перед:
public function getTags() {
        return $this->_aData['topic_tags'];
    }


добавил:
public function getCoodrinati() {
        return $this->_aData['coodrinati'];
    }


и перед:
public function setTextSource($data) {
        $this->_aData['topic_text_source']=$data;
    }


добавил:
public function setCoodrinati($data) {
        $this->_aData['coodrinati']=$data;
    }


3. В \classes\modules\topic\mapper\Topic.mapper.class.php добавил coodrinati сюда:
public function AddTopic(TopicEntity_Topic $oTopic) {
                $sql = "INSERT INTO ".DB_TABLE_TOPIC." 
                        (blog_id,
                        user_id,
                        topic_type,
                        topic_title, 
                        coodrinati,                   
                        topic_tags,
                        topic_date_add,
                        topic_user_ip,
                        topic_publish,
                        topic_publish_draft,
                        topic_publish_index,
                        topic_cut_text,
                        topic_forbid_comment,
                        topic_text_hash                 
                        )
                        VALUES(?d,  ?d, ?,      ?,      ?,      ?,  ?, ?, ?d, ?d, ?d, ?, ?, ?d, ?)
                ";                      
                if ($iId=$this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getUserId(),$oTopic->getType(),$oTopic->getTitle(),$oTopic->getCoodrinati(),$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash()))


и сюда:

public function UpdateTopic(TopicEntity_Topic $oTopic) {                
                $sql = "UPDATE ".DB_TABLE_TOPIC." 
                        SET 
                                blog_id= ?d,
                                topic_title= ?,
                                coodrinati = ?,                         
                                topic_tags= ?,
                                topic_date_add = ?,
                                topic_date_edit = ?,
                                topic_user_ip= ?,
                                topic_publish= ?d ,
                                topic_publish_draft= ?d ,
                                topic_publish_index= ?d,
                                topic_rating= ?f,
                                topic_count_vote= ?d,
                                topic_count_read= ?d,
                                topic_count_comment= ?d, 
                                topic_cut_text = ? ,
                                topic_forbid_comment = ? ,
                                topic_text_hash = ? 
                        WHERE
                                topic_id = ?d
                ";                      
                if ($this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getTitle(),$oTopic->getCoodrinati(),$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getDateEdit(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getRating(),$oTopic->getCountVote(),$oTopic->getCountRead(),$oTopic->getCountComment(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash(),$oTopic->getId())) {


4. Выполнил запрос в базу:

ALTER TABLE `prefix_topic` ADD `coodrinati` varchar(250) default NULL AFTER `topic_forbid_comment`


5. Теперь начинаем править шаблоны: \templates\skin\synio\actions\ActionTopic\add.tpl
после:
{hook run='form_add_topic_topic_end'}

Вставить

				<script>
					var vallmappa = '{$_aRequest.coodrinati}';
				</script>

    <script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>	
	<script src="/templates/skin/synio/actions/ActionTopic/myscript.js" type="text/javascript"></script>	
	<p><label for="topic_tags">Введите адрес и нажмите найти:</label>
    <input type="text" class="input-text" id="yaserchinput" value="" style="width: 520px;"/>
    <input type="button" id="yaserch" class="button" value="Найти"/></p>
	<label for="topic_tags">Отметьте место на карте:</label>	
	<div id="map" style="width: 600px; height: 300px;margin-bottom: 10px;"></div>	
 

Путь до myscript.js можно менять сам файл вот тут: ссылка

6. Теперь сделаем вывод в топиках: \templates\skin\synio\topic_topic.tpl
после:

	{$oTopic->getText()}
  

Вставляем:

  <script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>
		<script type="text/javascript">
			ymaps.ready(init);
			function init () {
				vallmappa = '{$oTopic->getCoodrinati()}';
				perr = vallmappa.split(',');
				var myMap = new ymaps.Map("map", {
						center: [perr[0],perr[1]],
						zoom: 16
					});
				myMap.controls.add('typeSelector').add('smallZoomControl', { left: 5, top: 75 });
				myPlacemark = new ymaps.Placemark([perr[0],perr[1]]);
				myMap.geoObjects.add(myPlacemark);
			}
		</script>		
		<div id="map" style=" float: left; width:100%; height:200px"></div>	
  


В результате получил:



Хотите поддержать автора топика ?:
DONATE: http://livestreetcms.com/profile/Nick0/donate/

33 комментария

avatar
прекрасный топик. только под кат, пожалуйста.
avatar
ссори забыл про подкат поправил
avatar
Как я люблю такие штуки в виде плагина =)
avatar
Как будет время лбещаю разобраться и сделать в виде плагина :)
avatar
классно! спасибо, то что доктор прописал! :)

может подскажите такой момент: нужно чтобы эту геометку можно было ставить только при публикации топиков в определённый блог. в какую сторону смотреть и где править?)
avatar
нужно дописать проверки при добвлении топика.
avatar
с этого бы места подробнее...))
avatar
Круто. А Гугл-мап можно так добавить, интересно?
avatar
конечно по сути поменяется только js файл и шаблоны ввода вывода
avatar
avatar
Классно, спасибо за описание, хотелось бы ещё для Google что то подобное найти..:)
Единственное почему бы просто в место
{if $_aRequest.coodrinati}
                                <script>
                                        var vallmappa = '{$_aRequest.coodrinati}';
                                </script>
    {else}              
                                <script>
                                        var vallmappa = '';
                                </script>       
        {/if}

вставить

                                <script>
                                        var vallmappa = '{$_aRequest.coodrinati}';
                                </script>
avatar
да что то стормозил сейчас поправлю :)
avatar
для google попозже как время будет напишу что нить подобное
avatar
Хорошо, будем ждать..:)
avatar
avatar
Большое спасибо..:)
avatar
предлагаю отрывать руки за изменение стандартных таблиц.
avatar
я предложил свою реализацию и сразу предупредил что правил ядро. я икому не навязываю данный вариант решения. если он вам не подходит то мы вас поняли :)
avatar
Вообще да, править ядро очень плохо, НО я даже за такое решение так-как здесь описан полное пошаговое руководство которое можно реализовать не только для топиков в ядре но и у своих плагинов или модулей, у которых бы хотелось видеть Яндекс или Google карты..:)
avatar
nick0 молодец, развивай эту тему. Отмечать точки могут все кто создает топик или только админ?
1d10t
предлагаю отрывать руки за изменение стандартных таблиц
Может xtext для новой версии LS уже на подходе? :)
avatar
Тот кто создаёт тему
avatar
да он готов, только опять не для текущей версии )
avatar
А зачем и кому он нужен не для текущей версии:) Серега когда будет уже для актуальной версии?
avatar
Полезный мануал, давно искал реализацию чего-то подобного. Спасибо!

Попутный вопрос. Можно ли как-то сделать отдельную страницу, на которой будет отображаться список меток из всех топиков? Этакая карты объектов.
avatar
конечно можно :)
avatar
логичный вопрос — как? ))
avatar
присоединяюсь к вопросу)
avatar
только кодом писать готового нет и сечас времени мало на бесплатную работу :(
avatar
А как сделать так если скажем я хочу залить зеленым цветом московскую область а какуюнибудь Турцию красным? Тоесть выделять территории цветам, можно ли это както реализовать?
avatar
полигоны если только.
avatar
nick0 сделай пожалуйста нормальный платный плагин, лично я готов заплатить в от 2000 до 3000 р. за реализацию такого плагина. Уверен — желающих купить будет предостаточно. Здесь были решения, но они или под версию 0.4.2 а потом авторы забили на них, тот же xtext например. Карты в топиках думаю многим не помешали бы.
avatar
Согласен, + страница со всеми метками)
avatar
карта в создании топика есть, но при создании топика выдает:
Catchable fatal error: Argument 1 passed to ModuleTopic_MapperTopic::AddTopic() must be an instance of TopicEntity_Topic, instance of PluginSkmapsimple_ModuleTopic_EntityTopic given, called in /home/p98654/www/mydvina.ru/classes/modules/topic/Topic.class.php on line 195 and defined in /home/p98654/www/mydvina.ru/classes/modules/topic/mapper/Topic.mapper.class.php on line 31
Не подскажите куда копать?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.