Готовые решения

Localizator, модификаторы для получения переводов

Локализатор очень хорошая штука и хотелось ее опробовать, но как то не задалось переносить уже готовые данные со всего сайта в поля локализатора. Пришлось искать решения для вывода данных и при том с учетом того что же есть в основном контенте страниц.
Итак… модификаторы для вывода данных, пошагово:

1. создаем плагин…
Юрий Фомин
01 декабря 2020, 18:41
modx.pro
11
603
+15

[СДЕЛАЙ САМ] Добавляем отображение прогресса загрузки файлов в AjaxForm

Пишу себе на память, но вдруг кому-то тоже нужно. На 17-ю строку в этом файле assets/components/ajaxform/js/default.js добавляем вот такой код
Артур
01 декабря 2020, 13:49
modx.pro
3
363
+1

[СДЕЛАЙ САМ] Получение ЛЮБЫХ полей пользователя

Если использовать как модификатор для fenom то запись будет такой:
{идентификатор пользователя | getUserInfo: 'fieldname1,fieldname2,extended.fieldname'}

Если как сниппет, то такой:
{'getUserInfo' | snippet:[
'input' => 'идентификатор пользователя',
'options' => 'fieldname1,fieldname2,extended.fieldname'
]}

идентификатор пользователя — id;
fieldname1,fieldname2 — основные поля профиля без префикса;
extended.fieldname — дополнительные поля профиля, те что хранятся в json и редактируются на отдельной вкладке, префикс extended. обязателен.

Собственно сам код сниппета getUserInfo (input и options передавать обязательно):
<?php
if(!$input){return false;}
if(!$options){return false;}

$sql = 'SELECT * FROM `modx_users` LEFT JOIN  `modx_user_attributes` ON modx_users.id = modx_user_attributes.internalKey WHERE modx_users.id=:id';
$statement = $modx->prepare($sql);
if ( $statement->execute(array('id'=>$input)) ) {
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);
}
$output = [];
$options = explode(',',$options);
if($result) {
    foreach($options as $option){
         $option = trim($option); // это на тот случай если полей много и захочется сделать перенос строки
        if (strpos($option,'extended.') === false) {
            $output[$option] = $result[0][$option];
        } else {
            $extended = json_decode($result[0]['extended'], 1);
            $ext = explode(".", $option);
            $ext = $ext[1];
            
            if(strpos($ext,'|') === false){
                $output[$ext] = $extended[$ext];
            }else{
                $cont = explode("|", $ext);
                $key = $cont[0];
                $val = $cont[1];
                $output[$key][$val] = $extended[$key][$val];
                
            }
        }    
    }
}

if(count($output) == 1 && !$extended){
    return $output[$options[0]];
}elseif(count($output) == 1 && $extended){
    return $output[$ext];
}else{
    return $output;
}
Артур
27 ноября 2020, 01:33
modx.pro
1
304
+1

[СДЕЛАЙ САМ] Определение расположения пользователя по ip

Задача была простым способом определять регион пользователя, что с ним потом делать можете решить сами. Публикую сниппет заготовку, которая сэкономит кому-то немного времени.
<?php
$url = 'https://suggestions.dadata.ru/suggestions/api/4_1/rs/iplocate/address';
$siteIsAvaliable = $modx->runSnippet('isSiteAvailible', array('url' => $url));
if($siteIsAvaliable){
    $token = $modx->getOption('dadata_api_key');
    $ip = $_SERVER['REMOTE_ADDR'];
    $headers = array(
    	'Accept: application/json',
    	'Authorization: Token ' . $token
    );
    $ch = curl_init($url.'?ip='.$ip);
    curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,30);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HEADER, false);
    $result = json_decode(curl_exec($ch),1);
    curl_close($ch);
    $region = $result['location']['data']['region'] . ' ' . $result['location']['data']['region_type_full'];
    return  $region;
}else{
    $modx->log(1, 'detectRegion: Не возможно определить регион. Сервис DaData недоступен');
    return false;
}
UPD: Я учёл замечания, поэтому сделал проверку на доступность сервера isSiteAvailible (код взят с сайт myrusakov.ru/php-site-uptime.html)
<?php
if(!$url){return false;}
// Проверка правильности URL
if(!filter_var($url, FILTER_VALIDATE_URL)){
    return false;
}

// Инициализация cURL
$curlInit = curl_init($url);

// Установка параметров запроса
curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curlInit,CURLOPT_HEADER,true);
curl_setopt($curlInit,CURLOPT_NOBODY,true);
curl_setopt($curlInit,CURLOPT_RETURNTRANSFER,true);

// Получение ответа
$response = curl_exec($curlInit);

// закрываем CURL
curl_close($curlInit);

return $response ? true : false;
Чтобы не задерживать загрузку страницы, определение работает через ajax. Для этого в самом верху страницы надо вызвать сниппет ajaxReceiver
<?php
// Откликаться будет ТОЛЬКО на ajax запросы
if($_SERVER['REQUEST_METHOD'] != 'POST' ) {return;}

// Сниппет будет обрабатывать не один вид запросов, поэтому работать будем по запрашиваемому действию
// Если в массиве POST нет действия - выход
if (empty($_POST['action'])) {return;}
// А если есть - работаем
$res = '';
$action = $_POST['action'];
switch ($action) {
	case 'region-detect':
	    $res = $modx->runSnippet('detectRegion');
	break;	
	// А вот сюда потом добавлять новые методы
}

// Если у нас есть, что отдать на запрос - отдаем и прерываем работу парсера MODX
if (!empty($res)) {
	die($res);
}
Это универсальный сниппет, можно добавлять различные действия, но это к теме не относится.
И на фронте нужен js, который проверит есть ли установленная кука, если нет, то проверит может быть пользователь авторизован и его регион записан в админке, если нет, то отправим запрос на сервер, определим регион и установим куку
$(document).ready(function(){

    detectRegion();

    function detectRegion() {
        var cookies = document.cookie.split('; '),
            bool = false;
        //проверяем установлена ли кука
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].split('=');
            if (cookie[0] == 'region') {
                bool = true;
            }
        }
        // если нет, то 
        if(!bool){
            var date = new Date(Date.now());
            date.setFullYear(date.getFullYear() + 1);
            date = date.toUTCString();
            var metaRegion = document.querySelector('meta[name="region-detect"]');
            // проверяем есть эти данные в админке
            if (metaRegion.value) {
                document.cookie = 'region=' + metaRegion + '; path=/; expires=' + date;
            } else {
                //  делаем запрос на сервер
                $.post(location.href, {'action': 'region-detect'}, function (response) {
                    //console.log(response);
                    if (response) {
                        document.cookie = 'region=' + response  + ';  path=/; expires=' + date;
                    }
                });
            }
        }
    }
});
Поле на странице выглядит так
<meta name="region-detect" content="{$_modx->user.state}"/>
Ну и чтобы не искать откуда тянуть список всех регионов РФ вот вам json
{"0":"\u0410\u043b\u0442\u0430\u0439\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0439","1":"\u0410\u043c\u0443\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","2":"\u0410\u0440\u0445\u0430\u043d\u0433\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","3":"\u0410\u0441\u0442\u0440\u0430\u0445\u0430\u043d\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","4":"\u0411\u0435\u043b\u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","5":"\u0411\u0440\u044f\u043d\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","6":"\u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","7":"\u0412\u043e\u043b\u0433\u043e\u0433\u0440\u0430\u0434\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","8":"\u0412\u043e\u043b\u043e\u0433\u043e\u0434\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","9":"\u0412\u043e\u0440\u043e\u043d\u0435\u0436\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","10":"\u0415\u0432\u0440\u0435\u0439\u0441\u043a\u0430\u044f \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","11":"\u0417\u0430\u0431\u0430\u0439\u043a\u0430\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0439","12":"\u0418\u0432\u0430\u043d\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","13":"\u0418\u043d\u044b\u0435 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0433\u043e\u0440\u043e\u0434 \u0438 \u043a\u043e\u0441\u043c\u043e\u0434\u0440\u043e\u043c \u0411\u0430\u0439\u043a\u043e\u043d\u0443\u0440","14":"\u0418\u0440\u043a\u0443\u0442\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","15":"\u041a\u0430\u0431\u0430\u0440\u0434\u0438\u043d\u043e-\u0411\u0430\u043b\u043a\u0430\u0440\u0441\u043a\u0430\u044f \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430","16":"\u041a\u0430\u043b\u0438\u043d\u0438\u043d\u0433\u0440\u0430\u0434\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","17":"\u041a\u0430\u043b\u0443\u0436\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","18":"\u041a\u0430\u043c\u0447\u0430\u0442\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0439","19":"\u041a\u0430\u0440\u0430\u0447\u0430\u0435\u0432\u043e-\u0427\u0435\u0440\u043a\u0435\u0441\u0441\u043a\u0430\u044f \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430","20":"\u041a\u0435\u043c\u0435\u0440\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c - \u041a\u0443\u0437\u0431\u0430\u0441\u0441","21":"\u041a\u0438\u0440\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","22":"\u041a\u043e\u0441\u0442\u0440\u043e\u043c\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","23":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0439","24":"\u041a\u0440\u0430\u0441\u043d\u043e\u044f\u0440\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0439","25":"\u041a\u0443\u0440\u0433\u0430\u043d\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","26":"\u041a\u0443\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","27":"\u041b\u0435\u043d\u0438\u043d\u0433\u0440\u0430\u0434\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","28":"\u041b\u0438\u043f\u0435\u0446\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","29":"\u041c\u0430\u0433\u0430\u0434\u0430\u043d\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","30":"\u041c\u043e\u0441\u043a\u0432\u0430","31":"\u041c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","32":"\u041c\u0443\u0440\u043c\u0430\u043d\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","33":"\u041d\u0435\u043d\u0435\u0446\u043a\u0438\u0439 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0439 \u043e\u043a\u0440\u0443\u0433","34":"\u041d\u0438\u0436\u0435\u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","35":"\u041d\u043e\u0432\u0433\u043e\u0440\u043e\u0434\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","36":"\u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","37":"\u041e\u043c\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","38":"\u041e\u0440\u0435\u043d\u0431\u0443\u0440\u0433\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","39":"\u041e\u0440\u043b\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","40":"\u041f\u0435\u043d\u0437\u0435\u043d\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","41":"\u041f\u0435\u0440\u043c\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0439","42":"\u041f\u0440\u0438\u043c\u043e\u0440\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0439","43":"\u041f\u0441\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","44":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0410\u0434\u044b\u0433\u0435\u044f","45":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0410\u043b\u0442\u0430\u0439","46":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0411\u0430\u0448\u043a\u043e\u0440\u0442\u043e\u0441\u0442\u0430\u043d","47":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0411\u0443\u0440\u044f\u0442\u0438\u044f","48":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0414\u0430\u0433\u0435\u0441\u0442\u0430\u043d","49":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0418\u043d\u0433\u0443\u0448\u0435\u0442\u0438\u044f","50":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u041a\u0430\u043b\u043c\u044b\u043a\u0438\u044f","51":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u041a\u0430\u0440\u0435\u043b\u0438\u044f","52":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u041a\u043e\u043c\u0438","53":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u041a\u0440\u044b\u043c","54":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u041c\u0430\u0440\u0438\u0439 \u042d\u043b","55":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u041c\u043e\u0440\u0434\u043e\u0432\u0438\u044f","56":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0421\u0430\u0445\u0430 - \u042f\u043a\u0443\u0442\u0438\u044f","57":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u041e\u0441\u0435\u0442\u0438\u044f - \u0410\u043b\u0430\u043d\u0438\u044f","58":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0422\u0430\u0442\u0430\u0440\u0441\u0442\u0430\u043d","59":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0422\u044b\u0432\u0430","60":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0425\u0430\u043a\u0430\u0441\u0438\u044f","61":"\u0420\u043e\u0441\u0442\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","62":"\u0420\u044f\u0437\u0430\u043d\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","63":"\u0421\u0430\u043c\u0430\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","64":"\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433","65":"\u0421\u0430\u0440\u0430\u0442\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","66":"\u0421\u0430\u0445\u0430\u043b\u0438\u043d\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","67":"\u0421\u0432\u0435\u0440\u0434\u043b\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","68":"\u0421\u0435\u0432\u0430\u0441\u0442\u043e\u043f\u043e\u043b\u044c","69":"\u0421\u043c\u043e\u043b\u0435\u043d\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","70":"\u0421\u0442\u0430\u0432\u0440\u043e\u043f\u043e\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0439","71":"\u0422\u0430\u043c\u0431\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","72":"\u0422\u0432\u0435\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","73":"\u0422\u043e\u043c\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","74":"\u0422\u0443\u043b\u044c\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","75":"\u0422\u044e\u043c\u0435\u043d\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","76":"\u0423\u0434\u043c\u0443\u0440\u0442\u0441\u043a\u0430\u044f \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430","77":"\u0423\u043b\u044c\u044f\u043d\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","78":"\u0425\u0430\u0431\u0430\u0440\u043e\u0432\u0441\u043a\u0438\u0439 \u043a\u0440\u0430\u0439","79":"\u0425\u0430\u043d\u0442\u044b-\u041c\u0430\u043d\u0441\u0438\u0439\u0441\u043a\u0438\u0439 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0439 \u043e\u043a\u0440\u0443\u0433 - \u042e\u0433\u0440\u0430","80":"\u0427\u0435\u043b\u044f\u0431\u0438\u043d\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c","81":"\u0427\u0435\u0447\u0435\u043d\u0441\u043a\u0430\u044f \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430","82":"\u0427\u0443\u0432\u0430\u0448\u0441\u043a\u0430\u044f \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 - \u0427\u0443\u0432\u0430\u0448\u0438\u044f","83":"\u0427\u0443\u043a\u043e\u0442\u0441\u043a\u0438\u0439 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0439 \u043e\u043a\u0440\u0443\u0433","84":"\u042f\u043c\u0430\u043b\u043e-\u041d\u0435\u043d\u0435\u0446\u043a\u0438\u0439 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0439 \u043e\u043a\u0440\u0443\u0433","85":"\u042f\u0440\u043e\u0441\u043b\u0430\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c"}
Артур
27 ноября 2020, 01:19
modx.pro
1
1 216
+1

[СДЕЛАЙ САМ] Login + HybridAuth + Аjax

Всем привет, пишу это прежде всего для себя, чтобы не забыть что и как я делал. Прежде всего нам понадобится установить AjaxForm, FormIt, Login и HybridAuth. Тем кто никогда не настраивал регистрацию и авторизацию через Login обязательно прочитать серию статей на эту тему здесь itchief.ru/modx/login-registration. Если дополнения стоят и общий механизм понятен можно продолжать.
Насколько я понял HybridAuth после получения разрешений от пользователя отправляет его на адрес указанный в callback_uri, но проблема в том, что это может быть только Главная страница, поэтому я внёс небольшие изменения в файл core/components/hybridauth/model/hybridauth/hybridauth.class.php, для того чтобы можно бы указывать любую страницу сайта для редиректа.
Артур
25 ноября 2020, 23:41
modx.pro
3
426
+1

[СДЕЛАЙ САМ] Интеграция по API калькулятора расчёта доставки от Logsis

Дальше идёт работающее решение для сайта blackbuffalo.ru/ (это чтобы посмотреть как работает), но оно мне не нравится изначально я хотел расширить класс доставки, как говорится «пацан к успеху шёл. не повезло. не фартануло». А теперь к делу. API сервиса простое, из нюансов могу отметить только то, что комиссия за наложенный платёж прибавляется только в личном кабинете Logsis, на сайт её не затащить, поэтому сумма на сайте будет отличаться от суммы в ЛК процентов на 8-10. Для более точных расчётов можно передавать параметр os (оценочная стоимость), но мой заказчик пожелал этого не делать. Переходим к коду.
Артур
01 ноября 2020, 16:44
modx.pro
143
0

VESP: Обновление существующих таблиц в базе

В этой статье я делюсь своим опытом о том, как лучше всего обновить существующие таблицы БД при работе с VESP.

В заметке Знакомимся с Vesp Core описан базовый функционал создания таблиц через миграции. Пока сайт находится в разработке и в таблицах нет ценных данных, можно менять таблицы полностью откатывая все миграции, и запуская их заново. Это отлично работает. Но удаляет все данные из таблиц и для работающего сайта не годится.
Иван Бондаренко
22 октября 2020, 12:29
modx.pro
2
371
+15

Localizator. Атрибут hreflang для мультиязычных сайтов



У нас есть мультиязычный сайт, построенный на Fenom и Localizator. Нам нужно прописать атрибут «hreflang» для правильного распознавания локализованной версии страницы поисковиками типа Google и Яндекс.

Используем вариант указания языковых версии в head. Этот вариант подходит для сайтов, у которых языков меньше 10 штук. Если больше, то оптимально будет указать локальные версии в sitemap.xml.

Совместно с @Евгений Webinmd накидали сниппет hreflangs, а потом его еще улучшил @Alex =).

Иван Бочкарев
22 сентября 2020, 22:28
modx.pro
4
768
+17

Hook Formit. CallTouch + MODX

Всем привет!

Поступила задача на интеграцию форм с calltouch.ru/



На сайте есть информация Как подключить заявки с сайта к отслеживанию Calltouch

Мы же выберем решение в виде хука для Formit.

Иван Бочкарев
16 сентября 2020, 13:07
modx.pro
5
683
+16

Модуль оплаты для сервиса Яндекс.Касса по новому протоколу

Всем привет!
Возникла необходимость написать собственный модуль оплаты по Яндекс.Кассе, набросал за пару дней — делюсь.
Дмитрий
12 сентября 2020, 14:07
modx.pro
7
675
+12