+1.13
133 читателя, 228 топиков

Небольшие карапульки для Эво, может кому понадобятся.

В продолжении вчерашней дискуссии скидываю свои небольшие наработки (КОТОРЫЕ НЕ ЛИШЕНЫ БАГОВ), в надежде, что кому-то что пригодятся. О них я писал и раньше на модикс.ру, но не все туда часто уж и заглядывают, поэтому продублирую. Да, этими дополнениями я пользуюсь и сам почти в каждом проекте)

Итак. Это все плаигины, поэтому разъяснять как их ставить — не буду. Описание, события, код.

Логирование отправляемых форм.

Можно достаточно легко и непринужденно вести статистику отправляемых форм (сохранять данные в базе). Для того чтобы сработал плагин, необходимо только добавить скрытое поле с именем tblname и названием таблицы, куда будем сохранять. (в случае с eForm, напоминаю, нужно скрывать стилями поля.)
События: OnLoadWebPageCache и OnBeforeLoadDocumentObject

//<?php
if (isset($_POST[tblname]))
{
$default = 'varchar(256)'; // Здесь задаем умолчание для типа полей
$config = array('comment'=>'varchar(256)'); //Здесь можем задать кастомные типы полей
$tbl = $modx->getFullTableName('log_'.$_POST['tblname']);
unset($_POST['tblname']);
$sql = 'CREATE TABLE IF NOT EXISTS '.$tbl.' (
  `id` int(11) NOT NULL AUTO_INCREMENT,';
  
  foreach ($_POST as $key => $poh)
  {

	  if ($config[$key]) $sql.=' `'.$key.'` '.$config[$key].', ';
	  else $sql.=' `'.$key.'` '.$default.', ' ;
  
  }
  $sql.='PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;';
$modx->db->query($sql);
$arr = array();
foreach ($_POST as $key=>$val) $arr[$key] = $modx->db->escape($val);
$modx->db->insert($arr,$tbl);
}


Запуск сниппета из фронтенда

Вот эту штуку накатал недавно, но реально очень классно помогает, в особенности, когда нужно что-то аяксить. Запускаем сниппет просто по его названию: site.com/snipName.Для того чтобы нас не поломали (найдя уязвимость в каких-то стандартных сниппетах), в настройки сниппета по-умолчанию добавляем строчку вида: {«shared»: «1» } Работает плагин на событии OnPageNotFound.
$table = $modx->getFullTableName('site_snippets');
$sn = $modx->db->escape($_REQUEST['q']);
$id = $modx->db->getValue('Select `id` from '.$table.' where `name`="'.$sn.'" and `properties` like "%shared%"');
if ($id>0)
{
$res = $modx->runSnippet($sn);
exit($res);
}


Ну и последний на сегодня — тырщик материалов

Очень полезное дополнение для контент-менеджеров. При копировании материалов с других сайтов, там попадаются картинки, ссылки на PDF и Word etc, которые де-факто висят на чужих сайтах, что приводит к более длительной загрузке страниц, возможной потери части контента, ну а phpthumb вообше не есть картинки с других источников. Решение глючное, но рабочее. Времени может сэкономить порядочно.
Событие: OnDocFormSave
//<?
/*
Captor 1.0a - Забираем автоматом контент с чужих сайтов
Событие в плагинах - OnBeforeDocFormSave
*/


if(!defined('MODX_BASE_PATH')){die('Ты кто такой? Давай, до свидания!');}
global $tmplvars,$content;
define('ROOT', $modx->config['base_path']);
define('EX', 'jpg,png,gif,jpeg,doc,xls,zip,pdf'); // Через запятую имена расширений (нижний регистр)
$folder=isset($folder) ? $folder : "assets/images/captor/"; // папка назначения стыренного контента
if(!is_dir(MODX_BASE_PATH.$folder)) mkdir(MODX_BASE_PATH.$folder);
// Функция траслита
function rus2translit($string) {
    $converter = array(
        'а' => 'a',   'б' => 'b',   'в' => 'v',
        'г' => 'g',   'д' => 'd',   'е' => 'e',
        'ё' => 'e',   'ж' => 'zh',  'з' => 'z',
        'и' => 'i',   'й' => 'y',   'к' => 'k',
        'л' => 'l',   'м' => 'm',   'н' => 'n',
        'о' => 'o',   'п' => 'p',   'р' => 'r',
        'с' => 's',   'т' => 't',   'у' => 'u',
        'ф' => 'f',   'х' => 'h',   'ц' => 'c',
        'ч' => 'ch',  'ш' => 'sh',  'щ' => 'sch',
        'ь' => '\'',  'ы' => 'y',   'ъ' => '\'',
        'э' => 'e',   'ю' => 'yu',  'я' => 'ya',
        
        'А' => 'A',   'Б' => 'B',   'В' => 'V',
        'Г' => 'G',   'Д' => 'D',   'Е' => 'E',
        'Ё' => 'E',   'Ж' => 'Zh',  'З' => 'Z',
        'И' => 'I',   'Й' => 'Y',   'К' => 'K',
        'Л' => 'L',   'М' => 'M',   'Н' => 'N',
        'О' => 'O',   'П' => 'P',   'Р' => 'R',
        'С' => 'S',   'Т' => 'T',   'У' => 'U',
        'Ф' => 'F',   'Х' => 'H',   'Ц' => 'C',
        'Ч' => 'Ch',  'Ш' => 'Sh',  'Щ' => 'Sch',
        'Ь' => '\'',  'Ы' => 'Y',   'Ъ' => '\'',
        'Э' => 'E',   'Ю' => 'Yu',  'Я' => 'Ya',
    );
    return strtr($string, $converter);
}
function str2url($str) {
    // переводим в транслит
    $str = rus2translit($str);
    // в нижний регистр
    $str = strtolower($str);
    // заменям все ненужное нам на "-"
    $str = preg_replace('~[^-a-z0-9_]+~u', '-', $str);
    // удаляем начальные и конечные '-'
    $str = trim($str, "-");
    return $str;
}
function clearUrl ($url){
	    $pieces = explode("#", $url);
		$url=$pieces[0];
		$pieces = explode("?", $url);
		$url=$pieces[0];
		return end(explode(".", $url));		 
}


function captor($value,$folder)
{
//Заветная регулярка
preg_match_all('#(?<!\])\bhttp://[^\s\[<]+\b#i', $value, $matches);
foreach ($matches[0] as $srcOrig) 
{
	$src =  urldecode($srcOrig);
	$info = pathinfo($src); 
	if (in_array(mb_strtolower($info['extension']),explode(',',EX)))
		{
	 // Операции по копированию
		$filename = @basename($src,'.'.$info['extension']);
		$name = ROOT.''.$folder.''.str2url(trim($filename)).''.mt_rand().'.'.$info['extension'];
		@copy($src,$name);
		$nameArr = explode('/',$name);
		$name = './'.$folder.''.array_pop($nameArr);
		$value = str_replace($srcOrig,$name,$value);				
		}
}
return $value;
}
// Забираем фотки из контентной части
$content = captor($content,$folder);

//Забираем фотки из ТВшек. Был какой-то глюк, нужно проверить
foreach($tmplvars as $key => $val)
{
if ($val[1]) $tmplvars[$key][1] = captor($val[1],$folder);
}


Если кому-то пригодится — буду рад. Если никому не пригодится, то прошу прощения за то что отнял время на прочтение этого топика) Всем добра!)

RESPONSIVE filemanager для Modx Evo (upd. 23.07.17)

Есть такой достойный бесплатный web file manager — RESPONSIVE filemanager. Сайт официальный сайт.
Чем он лучше kcfinder? сразу спросите вы.
Да много чем. Адаптивный под разные экраны, всякие фичи с редактированием картинок, аяксы и прочие плюшки, фильтр, сортировка, можно скрыть нужные папки и тд… Проще посмотреть демо на офф. сайте. Там же почитать GREAT FEATURES. Я нашел только один
Читать дальше →

ElFinder (менеджер картинок и файлов) как замена KcFinder

Вот тут Temus делится с нами интеграцией ElFinder с Modx Evo. Но он это дело забросил, а проект ElFinder активно развивается https://github.com/Studio-42/elFinder

На основе файлов Temus, я запилил последнюю версию ElFinder для Evo. Делюсь здесь, потому что с гитом до сих пор нет времени подружиться. Да и комплексы неполноценности постоянно мучают за свой код :)

Установка:
заменить папку mcpuk по адресу /site.ru/manager/media/browser/

скачать здесь

Постараюсь периодически обновлять данную штуку. Она интересная.

SimplePolls - для организации голосований

Написал я недавно для одного проекта компонент для организации голосований с такими возможностями:
  • голосования добавляются к документам — то есть можно при необходимости легко добавить одно или несколько голосований к статье, комментарии сделать и все такое;
  • можно разрешать голосования только для зарегистрированных пользователей;
  • результаты голосования могут быть скрыты до его завершения;
  • можно голосовать за один, можно за несколько вариантов;
  • к вариантам можно прикреплять картинки и выводить их с генерацией превью;
  • можно обнулять голосования и накручивать голоса;
  • можно использовать капчу;
  • можно голосовать при просмотре результатов;
  • можно блокировать повторные голоса по кукам или по ip;

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

FastImageTV

Аналог Revo-компонента FastUploadTV. Позволяет добавлять картинки в TV-параметры без вызова файлового менеджера. Разработку оплатил и разрешил поделиться с сообществом пользователь ilarion , за что ему спасибо. Также спасибо пользователю EGO , который до публикации этого топика наткнулся на компонент на гитхабе и прислал по этому случаю донат (:


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

Курс драг. метллов с сайта центробанка

Решил написать сниппет курса драг. метллов с сайта ЦБ на основе уже готового сниппета курса валют от Temus за что ему респект :)

Работает как простой сниппет без доп. параметров. По дефолту показывает в одну строку все 4 металла. Если нужен только отдельный металл, то добавляем чанк


[!KursMetall? &tpl=`имя чанка`!]


плейсхолдеры чанка соответствующие:

[+au+] - золото
[+ag+] - серебро
[+pt+] - платина
[+pd+] - палладий


Есть одна важная особенность в работе!!!!
В выходные цб не дает курсов. Поэтому необходимо сохранять кэш курсов за прошлые дни.
То есть если Вы прям сейчас запустите сниппет или в выходной, вы ничего не увидите. Надо вручную в сниппете ставить дату за ближайший день, сниппет создаст кэш и далее будет показывать данные из него, и при последующих проверках, если данные появятся они будут уже в новом кэш-файле. Для этого случая я оставил незакомментированную строку в сниппете, чтобы можно было руками поставить даты (даты там две). Думаю разберется, кому интересно.

ну и код сниппета:

<?php
$xmlURL = 'http://www.cbr.ru/scripts/xml_metall.asp?date_req1='.date('d/m/Y').'&date_req2='.date('d/m/Y');
//$xmlURL = 'http://www.cbr.ru/scripts/xml_metall.asp?date_req1=10/06/2016&date_req2=10/06/2016';

$tpl = isset($tpl) ? $modx->getChunk($tpl) : 'Au = [+au+] Р, Ag = [+ag+] Р, Pt = [+pt+] Р, Pd = [+pd+] Р';

//кэширование 6 часов
$filename = MODX_BASE_PATH.'assets/cache/kurs_metall.xml';
if (!file_exists($filename) || (file_exists($filename) && time() > filemtime($filename) + 60*60*6)) {
        $file = file_get_contents($xmlURL);
	
		$arr = split("\n", $file);
		$cnt = count($arr);	
	
        if ($file && $cnt>6) {
                file_put_contents($filename, $file);
                @chmod($filename, 0666);
        }
}



$xml = simplexml_load_file($filename); 
if ($xml != false){
	
	foreach ($xml->xpath('//Buy') as $key => $val) {
		if($key==0) $au = $val;
		if($key==1) $ag = $val;
		if($key==2) $pt = $val;
		if($key==3) $pd = $val;
		
	}	
			
		$output = str_replace(array('[+au+]','[+ag+]','[+pt+]','[+pd+]'),array($au,$ag,$pt,$pd),$tpl);
        return $output;

}
?>

FormLister - сниппет для работы с формами и пользователями

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

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

Jevix

Это замечательная система фильтрации и типографирования, Разработанная в Тематических Медиа для собственных проектов (в частности Хабрахабр), которая позволяет решить вопрос с фильтраций контента.
Она поможет образумить криворукого менеджера или злого скрипт-кидди, распихивающего везде XSS.

Возникла надобность в таком компоненте, поэтому я, долго не думая, воспользовался разработкой bezumkin . Чуть-чуть поправил и теперь можно использовать Jevix в Evo.

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

TV type SELECT не сохраняет значения

EVO 1.1b-d7.0.18
есть TV type select, значения берутся из multiTV
@EVAL return $modx->runSnippet('multiTV',array('docid'=>'3','tvName'=>'kurs','display'=>'all'));
значений около 20.
проблема такая — при выборе значения из выпадающего списка значения не сохраняются или сохраняются только если выбрать из первых пяти, точную закономерность не выявил…
Подскажите в чем может быть проблема?