Как выполнить этот код в виджете

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Как выполнить этот код в виджете

Сообщение evgeniy123 »

С JS вообще не дружу скажу сразу. Не понимаю на что жалуется console.

Использую виджет SelectMapLocationWidget/
Doc:

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

/**
 * Выбор местоположения - виджет.
 * Виджет запоминает координаты при вводе адреса в инпут и отображает карту Google.
 * Необходимо передавать опции:
 * - address - селектор, для указания адреса;
 * - latitude - селектор для указания широты;
 * - longitude - селектор для указания долготы;
 * - hideMarker - если определено, то не будет установлен маркер на карте при поиске локации;
 * - onLoadMap - если определена функциия, то она будет вызвана при инициализации карты;
 * - addressNotFound - сообщение о не найденном адресе.
 *
 
Code:

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

 <?=   $form->field($model, 'address_geo_title')->widget(\kalyabin\maplocation\SelectMapLocationWidget::className(), [
                            'attributeLatitude' => 'lat_contact',  
                            // 'draggable' => true,
                            'jsOptions'=> [
                                'addressNotFound'=> Yii::t('users', 'ADDRESS_NOT_FOUND'),
                                'onLoadMap'=> new JsExpression(' 
                                
                                 mapOptions = {
                center: new google.maps.LatLng(51, 3),
                zoom: 12,
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                panControl: true
            }
            
                               return  new google.maps.Map($(self).get(0), mapOptions); '),
                                ],
                            'attributeLongitude' => 'lng_contact',
                            'googleMapApiKey' => Yii::$app->google->getSetting('web_google_map_key'),
                        ]); ?>
                        

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

  return  new google.maps.Map($(self).get(0), mapOptions); ,"address":"#settings-address_geo_title","latitude":"#settings-lat_contact","longitude":"#settings-lng_contact","draggable":false});

Uncaught SyntaxError: Unexpected token return

Хочу при загрузке страницы выводить сразу позицию на карте

Сейчас в коде у автора

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

(function($) {
    $.fn.selectLocation = function(options) {
        var self = this;
        var map;

        $(document).ready(function() {
            var mapOptions = {
                center: new google.maps.LatLng(55.997778, 37.190278),
                zoom: 12,
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                panControl: true
            };
            map = new google.maps.Map($(self).get(0), mapOptions);

            if (options.onLoadMap) {
                options.onLoadMap(map);
            }

            // маркер найденной точки
            var marker = null;
            ...
            
Помогите разобраться
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как выполнить этот код в виджете

Сообщение Nex-Otaku »

Точку с запятой перед "return" забыл. С яваскриптом всё-таки советую подружиться.
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Re: Как выполнить этот код в виджете

Сообщение evgeniy123 »

Nex-Otaku писал(а): 2018.02.18, 23:42 Точку с запятой перед "return" забыл. С яваскриптом всё-таки советую подружиться.
Не то чтобы я не совсем его не знаю, но иногда проблемы как эта всплывает. Вот например сделал как сказал. А он не меняет сам код. В самом виджете убрал вообще onLoadMap - работает. Поставил заново с изменениями, а он мне старый код рисует без ';'. Понимаю что может быть backend/runtime/cache что то , но у меня нет ничего. Откуда вообще он берется ? Как можно поменять это код ?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как выполнить этот код в виджете

Сообщение Nex-Otaku »

Яваскрипт и CSS кешируется в папке "/web/assets". Удалите всё содержимое этой папки и обновите страницу по Ctrl + F5. Должно помочь.
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Re: Как выполнить этот код в виджете

Сообщение evgeniy123 »

Все равно не действует.

Сделал так но ошибка все равно выводится
View:

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

'jsOptions'=> [
                                'addressNotFound'=> Yii::t('users', 'ADDRESS_NOT_FOUND'),
                                'onLoadMap'=> new JsExpression(' 
                                
                               
                                 new google.maps.Map($(self).get(0), 
                                  {
                center: new google.maps.LatLng(51, 3),
                zoom: 12,
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                panControl: true
            }
            ) '

                                ),
                                ],
                                
Console.

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

select-google-map-location.js?v=1519072479:31 Uncaught TypeError: options.onLoadMap is not a function
    at HTMLDocument.<anonymous> (select-google-map-location.js?v=1519072479:31)
    at fire (jquery.js?v=1519072479:3187)
    at Object.fireWith [as resolveWith] (jquery.js?v=1519072479:3317)
    at Function.ready (jquery.js?v=1519072479:3536)
    at HTMLDocument.completed (jquery.js?v=1519072479:3552)
    
Code JS Plugin :

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

(function($) {
    $.fn.selectLocation = function(options) {
        var self = this;
        var map;

        $(document).ready(function() {
            var mapOptions = {
                center: new google.maps.LatLng(55.997778, 37.190278),
                zoom: 12,
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                panControl: true
            };
            map = new google.maps.Map($(self).get(0), mapOptions);

            if (options.onLoadMap) {
                options.onLoadMap(map);  // Here error
            }
            
никогда не связывался с тут yii2 + js (plugin) и не понимаю что тут за функция нужна ему.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Как выполнить этот код в виджете

Сообщение Dominus »

Что то я не пойму что вы тут мудрите с js. Вы хотите что бы выводилась установленная позиция на карте при загрузке страницы?
Что мешает просто устанавливать нужные значения координат?
Модель:

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

//...
    public $address;
    public $longitude = '55.997778'; // Долгота
    public $latitude = '37.190278';  // Широта
//...
Вид:

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

<?= $form->field($model, 'address')->widget(\kalyabin\maplocation\SelectMapLocationWidget::className(), [
    'attributeLatitude' => 'latitude',
    'attributeLongitude' => 'longitude',
    'googleMapApiKey' => '<YOUR_REGISTERED_GOOGLE_MAP_API>', // Ваш Google Map API ключ
]); ?>
Вот и будет вам
Хочу при загрузке страницы выводить сразу позицию на карте
Последний раз редактировалось Dominus 2018.02.20, 06:29, всего редактировалось 1 раз.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Как выполнить этот код в виджете

Сообщение Dominus »

А так, детальная настройка карты:
Вид:

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

<?php
$script = new \yii\web\JsExpression("
    function(map)
    {
        var mapOptions = {
           center: new google.maps.LatLng(55.997778, 37.190278), // Координаты по умолчанию
           zoom: 14,
           mapTypeId: google.maps.MapTypeId.ROADMAP,
           panControl: true,
           //...
           disableDefaultUI: true, // Отключить интерфейс установленный по умолчанию
           zoomControl: true, // Включить управление Zoom
           maxZoom: 17, // Максимальный Zoom
           minZoom: 10  // Минимальный Zoom
       };
       
       map.setOptions(mapOptions);
    }
");
?>
<?= $form->field($model, 'address')->widget(\kalyabin\maplocation\SelectMapLocationWidget::className(), [   
    'attributeLatitude' => 'latitude', // Широта
    'attributeLongitude' => 'longitude', // Долгота
    'googleMapApiKey' => '<YOUR_REGISTERED_GOOGLE_MAP_API>', // Ваш Google Map API ключ
    'jsOptions' => ['onLoadMap' => $script],
]); ?>
Справочник Google Maps JavaScript API V3: https://developers.google.com/maps/docu ... /reference
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Re: Как выполнить этот код в виджете

Сообщение evgeniy123 »

Теперь понял как интеграцию jQuery использовать более эффективно :) Спасибо
Закрыто