0.00
96 читателей, 73 топика

Yandex Map Custom TV

Для хранения в TV координат точки на яндекс-карте.
Скачивать здесь: github.com/Pathologic/YandexMapCustomTV
Требует DocLister c гитхаба (:



Выводится как-то так:

<script src="//api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<script type="text/javascript">
var myMap;
var coords = [ [*coords*] ];
if (coords.length) {
    ymaps.ready(init);
}
function init () {
    myMap = new ymaps.Map('map', {
        center: coords,
        zoom: 15
    });
    placemark = new ymaps.Placemark(coords, {
        hintContent: "Точка на карте",
        balloonContentBody: "<b>Бла-бла-бла</b>"
    }, {
        preset: 'islands#darkOrangeIcon'
    });
    myMap.geoObjects.add(placemark);
}
</script>

Крошки для админа

Как-то попался запутанный сайт и стало напрягать, что открыв ресурс для редактирования или нажав «создать дочерний» не видно, кто же собственно «папа» :) Так, по быстрому родился плагин adminNav на событие OnDocFormRender, который отображает путь к нашему ресурсу.


/**
 * adminNav
 *
 * Крошки для админа
 *
 * @author      webber (web-ber12@yandex.ru)
 * @category    plugin
 * @version     0.1
 * @license     http://www.gnu.org/copyleft/gpl.html GNU Public License (GPL)
 * @internal    @events OnDocFormRender
 * @internal    @properties &use_menutitle=Подставлять menutitle;text;0
 * @internal    @installset base, sample
 * @internal    @modx_category Manager and Admin
 */

$e = &$modx->Event;
if ($e->name == 'OnDocFormRender') {
	$id = $e->params['id'];
	$out = '<b>' . $modx->config['site_name'] . '</b>';
	$tmp = array();
	if ($id) {
		//редактируем известный документ
		$tmp = $modx->getParentIds($id);
	} else if (isset($_GET['pid'])) {
		//знаем только родителя и это не корень сайта
		$id = (int)$_GET['pid'];
		$tmp = $modx->getParentIds($id);
		array_unshift($tmp, $id);
	} else {
		//родитель - корень сайта
		$id = 0;
		
	}
	$tmp = array_reverse($tmp);
	$parents = implode(',', $tmp);
	if (!empty($parents)) {
		$orderBy = " FIND_IN_SET(id, '" . $parents . "') ";
		$q = $modx->db->query("SELECT id, " . ($use_menutitle == '1' ? " IF(menutitle='', pagetitle, menutitle) as " : "") . " pagetitle FROM " . $modx->getFullTableName("site_content") . " WHERE id IN (" . $parents . ") ORDER BY " . $orderBy);
		while ($row = $modx->db->getRow($q)) {
			$out .= " → <a href='index.php?a=27&id=" . $row['id'] . "'>" . htmlentities($row['pagetitle'], ENT_QUOTES, $modx->config['modx_charset']) . "</a>"; 
		}
	}
	
$out = '
<script type="text/javascript">
	$j(document).ready(function(){
		var content = "' . $out . '";
		$j("#create_edit h1").append("<div style=\"font-size:11px;\">" + content + "</div>");
	})
</script>
';
$e->output($out);
}


На выходе должно получится примерно так



Примечание:
1. требует установленного managermanager (сейчас он стоит у всех по умолчанию)
2. должен вызываться после вызова managermanager в «порядок вызова плагинов при наступлении события».

Возможно уже есть подобные решения, но я что-то не нашел.

как убрать перенаправление в MODX Revolution 2.2.6-pl (traditional)

у меня на сайте стоит перенаправление, как убрать?!
дело в том что хотел сайт сканировать через айболит или манул и т.п.
но перенаправляет в дом страницу
заранее спс всем

EvoGallery: защита оригинальных картинок

UPD: Сам по себе этот пост устарел, как и сама EvoGallery, но в комментариях обсуждается похожая, более актуальная тема защиты оригиналов для SimpleGallery.




Хочу поделиться способом защиты оригиналов картинок в милой сердцу EvoGallery.

… Мой клиент покупает у проектировщиков эскизы деревянных домов за деньги, эти эскизы будут размещаться на создаваемом сайте. Так как эскизы стоят денег — я защищаю их водяным знаком.

Несмотря на то, что появилась прекрасная SimpleGallery, для несложных проектов по-прежнему использую ЭвоГаллери — сила привычки велика. Думаю, и для многих других эта галерея по-прежнему актуальна.

Если картинок на сайте немного, я предпочитаю хранить оригиналы прямо «на месте», то есть в папке с именем original внутри альбома ресурса. Мало ли, клиенту придёт счастливая мысль поменять размеры превьюшек или сменить ватермарк.

Но есть одно но… чего стоят тогда все мои водяные знаки, если любой хитрый посетитель с минимумом знаний может запросто скачать оригиналы из этой папки? Да даже интуитивно может догадаться — название папки original говорит само за себя.

Вот и пришла мысль задать это имя самому. Для этого:

Читать дальше →

Base_url для нескольких доменов одного сайта

Решение для тех, кто устал бороться с несколькими доменами одного сайта и не знает, что с этим делать (возможно, что такие есть))))

1. Создаем сниппет siteUrl следующего содержания

<?php
return MODX_SITE_URL;
?>


2. В хидере сайта заменяем
<base href="[(site_url)]">
на
<base href="[!siteUrl!]">
. В результате избавляемся от «непонятных» перекидываний то на домен с www, то на домен без www, то на тестовый домен (это я еще не говорю про те сайты, которые изначально крутятся одновременно на нескольких доменах.

Все дело в том, что [(site_url)] кэшируется один раз и на разных страницах в зависимости от «точки входа» может быть разным — отсюда и проблемы с переходами туда/сюда (в критических случаях, практически всегда — вплоть до сброса корзины шопкипера на страницах с www и без него). Также очень актуально для ajax, когда мы «неожиданно» получаем «кроссдоменные» запросы, которые не работают :)

Решение конечно элементарнейшее, но после очередного вопроса решил написать о нем на видном месте :)

[REVO] Кейс: Профайлы преподавателей, или getResources слишком долгий

Под моим надзором находится сайт онлайн-школы. И есть на этом сайте страничка с профайлами преподавателей. Фактически она представляет собой опубликованный родительский ресурс с неопубликованными ресурсами для каждого из преподавателей. Вся информация о преподавателе расположена в «телевизорах» (TV).
На сайте профайл представляет собой ссылку в виде Фото+Имя и всплывающее окошко с более подробной информацией и формой записи на обучение. Все профайлы подцеплялись при помощи getResources и выводились списком.
К тому же есть пара переключателей, которые генерировали список Ajax-запросом без перезагрузки страницы – это «Язык» и «Носитель языка/Русскоязычный преподаватель».
Собственно, это была предыстория.

Профайлов не так уж много – 20-25, однако скорость генерации списка с помощью getResources заставляла меня плакать навзрыд – 5-12с. И чем больше, я знакомился с его документацией, тем меньше я верил в его нормальную работоспособность.


Читать дальше →

[REVO] Breadcrumbs – Убираем ссылки с неопубликованных ресурсов

Недавно мне была поставлена задача создать хлебные крошки для сайта. Сам сайт имеет не очень сложную структуру, поэтому в карте сайта были добалены дополнительные пункты меню, группирующие схожие ресурсы. Сами эти пункты своих страниц не имеют.
Другими словами – родитель есть, а страницы у родителя нет.
Но, несмотря на это, заказчик определил, что в хлебных крошках эти пункты меню отображаться все равно должны, но уже без ссылок.

Читать дальше →

[REVO] Избавляемся от дубликатов alias

Сложилась такая ситуация, что при импорте данных, url генерируется автоматически, и было очень много дубликатов, что не позволяло открывать страницы с дублирующими alias.

Ниже приведено решение, которое производит поиск дубликатов и их редактирование.
При это редактируются не все найденные alias, а только второй и последующий, это делается для того чтобы оставить 1 оригинал.

Редактирование происходит путем добавления id в начало адреса страницы.

<?php
error_reporting(0);
mysql_connect('localhost','','');
mysql_select_db('');

$d = mysql_query("SELECT group_concat(`id`) ids, count(id) c FROM `revo_site_content` GROUP by concat(uri) HAVING c > 1");
while($res = mysql_fetch_array($d))
{
$ids = explode(",",$res['ids']);
$i = 0;
foreach($ids as $id)
{
	$i++;
	if($i == 1)
		continue;
	echo $id . "\r\n
";
	$m = mysql_fetch_array(mysql_query("SELECT uri FROM `revo_site_content` WHERE id = $id"));
	$uri = $m['uri'];
	$uri2 = explode("/",$uri);
	$uri2 = end($uri2);
	$uri = str_replace($uri2,$id."-".$uri2, $uri);
		
	mysql_query("UPDATE `revo_site_content` SET `uri` = '".$uri."', `alias` = CONCAT('".$id."-',`alias`) WHERE `id` = '$id'");
}
}


Настройки

Указываем данные для подключения к БД
mysql_connect('localhost','','');
mysql_select_db('');


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

[REVO] Удаление старых изображений. Скрипт

Данный скрипт позволяет удалять изображения с сервера, которые уже не используются в работе системы.

1) Скрипт работает! только с tv параметрами.
2) Не является плагином или сниппетом

Настройки:

1) Настраиваем подключение к БД
$host = ''; //Database host
$user = ''; //User
$pass = ''; //Password
$dbname = ''; //Database name


2) Указываем имя таблицы со значениями tv параметров
$table_name = 'revo_site_tmplvar_contentvalues'; //Table name


3) Указываем id tv параметра который отвечает за изображения. При этом скрипт обрабатывает как одиночные так и мультизагруженные изображения например через MIGX
$tmplvarid = ''; // Required value for tmplvarid


4) Указываем имя папки с изображениями. Необходимо учесть путь о корня. Также прошу обратить внимание что данная версия скрипта не смотрит сквозь вложенные папки.
$folder_name = ''; //FoНастрlder with images


5) Настраиваем работу скрипта по крону.

Прошу учесть что вся работа скрипта проверялась на vds при 20000 изображений. При этом было удалено порядка 9000 устаревших файлов.

<?php
$host = 'localhost'; //Database host
$user = ''; //User
$pass = ''; //Password
$dbname = ''; //Database name
$table_name = 'revo_site_tmplvar_contentvalues'; //Table name
$tmplvarid = ''; // Required value for tmplvarid
$folder_name = 'images'; //FoНастрlder with images


$connect = mysqli_connect($host, $user, $pass);

//Get files list
$files_list = scandir($folder_name);
unset($files_list[0]);
unset($files_list[1]);
$files_list_accoc = array_flip($files_list);
mysqli_set_charset($connect, "utf8");
echo "<p>Files list:</p>";
$i = 1;
foreach($files_list as $value)
	{
	echo $i . ". " . $value . "
";
//Searching for files in database
	$q = "SELECT * FROM " . $dbname . "." . $table_name . " WHERE tmplvarid=" . $tmplvarid . " AND value like '%" .$value. "%'";
	$result = mysqli_query($connect, $q);
	$rows = mysqli_num_rows($result);
//Remove from list if exist
	if ($rows == 1)
		{
		unset($files_list_accoc[$value]);
		}
	$i++;
	}
mysqli_close($connect);
$files_list_trash = array_flip($files_list_accoc);
echo "<hr><p>Useless files:</p>";
$ii = 1;
//Removing of useless files
foreach($files_list_trash as $value)
	{
	$command = "rm -rf " . $folder_name . "/" . $value;
	echo $ii .". '" .$command. "'
"; 
	//Test it, before uncomment next line
	exec($command);
	$ii ++ ;
	}
?>


removeOldImage git

Данное решение используется для узко-направленных задач и не всем может подойти.

eForm - ограничение максимального количества символов и вывод сообщения об ошибке

По аналогии с проверкой размера файла, сделал проверку количества вводимых символов в textarea с выводом сообщения.
Вызов формы:
[!validatetextsize!]
[!eForm? ... &eFormOnValidate=`validatetextsize`!]

в чанке &tpl:
<textarea name="text" eform="Обращение ::0"></textarea>

сниппет validatetextsize:
<?php
function validatetextsize($fields,&$vMsg,&$rMsg){
       if (strlen(htmlspecialchars($fields['text']))>2500){//имя элемента массива совпадает с аттрибутом name
		$vMsg[]='Превышен максимальный размер сообщения 2500 символов';
	}
        return; 
};
?>

не уверен в необходимости использования тут htmlspecialchars(), но на всякий случай поставил.
правки и дополнения приветствуются

UPDATE
то же самое, но с добавлением класса для подсветки невалидного поля с помощью css
<?php
function validatetextsize($fields,&$vMsg,&$rMsg,&$rClass){
       if (strlen(htmlspecialchars($fields['text']))>2500){//имя элемента массива совпадает с аттрибутом name
		$vMsg[]='Превышен максимальный размер сообщения 2500 символов';
                $rClass['text'] = 'invalid';
	}
        return; 
};
?>


UPDATE 2
для сайтов в UTF-8 кодировке рекомендуется использовать mb_strlen() для подсчета кириллических символов