Yandex map: динамическая загрузка содержимого балуна

Задача: динамически загружать контент по клику на метку, в т.ч. и при кластеризации

Решение:

Добавим события открытия балуна по клике на метку из карты и кластера:

                objectManager.objects.events.add('balloonopen', function (e) {
                    console.log("Открыт балун вне кластера");
                    var id = e.get('objectId'),
                    geoObject = objectManager.objects.getById(id);
                    downloadContent([geoObject], id);
                });          

                objectManager.clusters.events.add('balloonopen', function (e) {
                    var id = e.get('objectId'),
                        cluster = objectManager.clusters.getById(id),
                        geoObjects = cluster.properties.geoObjects;
                        console.log("Открыт балун из кластера..");
                        downloadContent(geoObjects, id, true);
                });   
....
function downloadContent(obj,id,isCluster){    
    console.log("Загружаем объект:");
    aids = obj.map(function (geoObject) {return geoObject.id;});
    if ((obj.length)<200) {
        $("#global").addClass("loading");   
            $.post("?r=inications/get_points_content", {  
            ids:aids,
        }).done(function(data) {            
            obj.forEach(function (geoObject) {
              //console.log("--присваиваем новое тело балуна");                
              if (geoObject.properties.balloonContentBody.includes("<l></l>")){
                //console.log("-подменяю содержимое балуна!");  
                //console.log(geoObject);
                geoObject.properties.balloonContentBody =geoObject.properties.balloonContentBody.replace("<l></l>",data.result[geoObject.id].content);      
                if (isCluster!==true){
                    objectManager.objects.balloon.setData(objectManager.objects.balloon.getData());
                } else {
                    objectManager.clusters.balloon.setData(objectManager.clusters.balloon.getData());
                };
                //setNewData();
              }            
            });                   
            $("#global").removeClass("loading");                    
        });
    } else {
     ToastMessage("error","Кластер слишком велик","Кластер слишком велик для того чтобы его раскрыть. Увеличьте масштаб и попробуйте снова!",6000);   
    };
} 

К сожалению, если в кластере собрано очень много меток (более 200), то обновление идёт довольно долго, потому пришлось немножко ограничить загрузку. В хорошем варианте, нужно бы отслеживать клик по заголовку списка в кластере, но это пока не удалось

WordPress грузит ресурсы по http вместо https

После переноса одного из сайтов на wordpress с одного сервера на другой, столкнулся с проблемой, что все ресурсы (css, js и т.п.) грузятся по протоколу http, хотя основной сайт грузится по https (загрузка http вместо https). Изменение и проверка всего и вся в БД результата не дало. Помог рецепт добавить в wp-config.php строчку:

$_SERVER['HTTPS'] = 'on';

Заработало. Что такое было, не понятно.. Точнее понятно что это настройки apache, но вот какие, так обнаружить и не удалось.

P.S. Кроме того, естественно была проведена работа по замене всех ссылок вида http на https внутри БД wordpress. Однако это не помогло в моём случае.

YII: Шаблон модели при использовании CRUD генератора

Не понятно почему, но CRUD не создает самостоятельно модель для работы с таблицой БД. По крайне мере у меня. Потому из нескольких разрозненных кусков собрал «рыбу»:

<?php

namespace app\models;

class YandexKeys extends \yii\db\ActiveRecord{

public static function tableName(){
    return 'api_map_keys'; // Имя таблицы в БД в которой хранятся записи
}
 
public function rules(){    
        return [
            [['name', 'key'], 'required'],  // какие поля есть в таблице обязательные для добавления
        ];
    }
 
public function attributeLabels(){  // Зададим имена колонок
        return [
            'id' => 'ID',
            'name' => 'Имя',
            'key' => 'Ключ API'
        ];
 }
 
 public static function getAll(){   // выборка всех значений из БД
    $data = self::find()->all();
    return $data;
 }

}

Краткая шпаргалка по YII2

Последнее время в очередной раз вплотную занимаюсь работой с фреймворком yii2. В связи с чет сделал для себя небольшую шпаргалку.

Получение POST/GET параметров:

$request = Yii::$app->request;
$period= $request->post("period");
$period= $request->get("period");

Выполнение SQL запроса типа SELECT:

// Вариант 1
$lsa = Yii::$app->db->createCommand($sql)->queryAll();       
foreach ($lsa as $row99) {   
}
// Вариант 2
$rows = (new \yii\db\Query())->select(['id'])->from('users')->where(['login' => $login])->limit(1)->all();
foreach ($rows as $row99) {   
}

Выполнение SQL запроса типа Insert:

// Вариант 1
$res=(new \yii\db\Query())->createCommand()->insert('users', ['login' =>$username])->execute();
        if ($res==false){
            die("Не удалось вставить запись с новым пользователем..Увы и ах..");
        };   
// Вариант 2
        $sql="insert into posting_zones (area,name,coors) values ($area,concat('Зона ',(select (max(id)+1) as name from posting_zones)),'$coors')";
        $res= Yii::$app->db->createCommand($sql)->execute();       

Корневой путь YII:

$dir=Yii::$app->basePath;

Корневой URL приложение YII:

$WUO_ROOT=Yii::getAlias('@app')."/web/";

Получение параметров из файла конфигурации YII:

$params = require(__DIR__ . '/../../config/web.php');
$geo_config = \yii\helpers\ArrayHelper::getValue($params, 'params'); //всякие настройки

Данные авторизованного пользователя (шаблон basic):

Yii::$app->user->identity

YII2: Bad Request (#400) Unable to verify your data submissionYII2:

Такая ошибка:

Bad Request (#400) Unable to verify your data submissionYII2

может возникнуть при принудительном вызове формы с POST или GET параметрами со страницы сайта. Например:

    <form id="TheFormRoute" method="post" action="?r=site%2Fls_route_report" target="Маршруты доставки">
        <input type="hidden" id="f_count_ls" name="f_count_ls" value="" />
        <input type="hidden" id="f_route_id" name="f_route_id" value="" />
        <input type="hidden" id="f_route_name" name="f_route_name" value="" />
        <input type="hidden" id="f_period" name="f_period" value="" />
        <input type="hidden" id="f_area" name="f_area" value="" />
        <input type="hidden" id="f_area_name" name="f_area_name" value="" />
        <input type="hidden" id="f_ls_list" name="f_ls_list" value="" />
    </form>

В контроллере сайта код вида :

    public function actionLs_route_report()    {
      Yii::$app->controller->enableCsrfValidation = false;
      return $this->render('route_report');  
    }

Как раз и приведет к подобной ошибке:

Это своеобразная защита фреймворка от потенциального флуда. Вариантов решения несколько:

Отключить проверку CSRF глобально:

    'components' => [
        'request' => [
            'enableCsrfValidation' => false,
        ],

Отключить проверку для конкретного контроллера:

class SiteController extends Controller
{
    
    public function beforeAction($action){ 
        $this->enableCsrfValidation = false; 
        return parent::beforeAction($action); 
    }    
    
    public function actionLs_route_report()    {
      return $this->render('route_report');  
    }

Или воспользоваться ПРАВИЛЬНЫМ по мнению фреймворка методом:

    <form id="TheFormRoute" method="post" action="?r=site%2Fls_route_report" target="Маршруты доставки">
        <input id="form-token" type="hidden" name="<?=Yii::$app->request->csrfParam?>" value="<?=Yii::$app->request->csrfToken?>"/>
        <input type="hidden" id="f_count_ls" name="f_count_ls" value="" />
        <input type="hidden" id="f_route_id" name="f_route_id" value="" />
        <input type="hidden" id="f_route_name" name="f_route_name" value="" />
        <input type="hidden" id="f_period" name="f_period" value="" />
        <input type="hidden" id="f_area" name="f_area" value="" />
        <input type="hidden" id="f_area_name" name="f_area_name" value="" />
        <input type="hidden" id="f_ls_list" name="f_ls_list" value="" />
    </form>
1 5 6 7 8 9 56