0.00
97 читателей, 71 топик

как убрать перенаправление в 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() для подсчета кириллических символов

[EVO] eForm - вывод сообщения о превышении допустимого размера файла

Долго искал, готовых решений не нашел, на основании этого топика сделал простое решение. Вызов формы:
[!validatefilesize!]
[!eForm? ... &eFormOnValidate=`validatefilesize`!]

в чанке &tpl:
<input type="file" name="testfile" eform="Файл :file:0">

сниппет validatefilesize:
<?php
function validatefilesize($fields,&$vMsg,&$rMsg){
	if ($_FILES['testfile']['size'] > 1024){  //имя поля и максимальный размер файла    
		$vMsg[]='Размер файла больше допустимого';
	}
	return; 
};
?>

думаю много кому пригодится, правки и дополнения приветствуются.

[EVO] Установка заголовка Last-Modified и 304 Not Modified для поисковых систем (Update от 15.11.2014)

Зачем нужен Last-Modified

HTTP заголовок Last-Modified сообщает клиенту время последнего изменения страницы (объекта). Если клиент (браузер, поисковый робот) получил заголовок Last-Modified, то при следующем обращении к адресу, при условии, что страница (объект) есть в локальном кеше, он добавит вопрос If-Modified-Since (не изменилась ли страница после даты, полученной в Last-Modified). В свою очередь сервер, получив запрос If-Modified-Since должен сверить полученную временную метку с временем последнего изменения страницы и, если страница не изменялась ответить 304 Not Modified.
Если страница не изменилась, то сервер прекратит передачу данных после отправки заголовков с кодом 304 Not Modified, тело страницы, изображения и другие объекты передаваться не будут.
Для поисковых же систем это полезно тем что за один и тот же промежуток времени робот успеет проиндексировать больше новых страниц на вашем сайте, потому что не будет загружать страницы которые не поменялись.

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