+1.13
118 читателей, 205 топиков

FormLister 1.5: новые капчи

Писать про изменения и новые баги улучшения я не буду, потому как это не очень интересно — можно глянуть здесь. Главное, что добавлена поддержка Twig, чтобы облегчить работу со сложными формами и переделана работа с капчами, про капчи и напишу.

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

MODX.Evolution.updateNotify - Обновление Evo в пару кликов


Обновил плагин добавив в него функционал обновления.

Как работает:
Сравнивает текущую версию и версию на GitHub, если появилась новая версия показывает в админке информер. По клику обновить до версии # скачивается свежая версия, из которой удаляются файлы:
/assets/cache/siteManager.php, .htaccess, robots.txt
что б не затереть изменения которые в них могли внести.
И после чего запускается Install (оттуда автоматически удаляются все шаблоны, тв и чанки), так же что б не было сюрпризов.

— так же работает если изменили папку Manager на другую.
p.s. в Планах сделать мультиязычную версию.

Скачать можно тут: extras.evolution-cms.com/packages/core/modx.evolution.updatenotify.html
Или установить через Extras

Думаю после тестирования будет отправлен в плагины по умолчанию.

modxAccount - личный кабинет веб пользователя

Сниппет для регистрации, входа, напоминания пароля и личного кабинета пользователя.

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

Dmi3yy порекомендовал обратить внимание на класс modUsers от Agel_Nash. Из этого класса и позаимствовал некоторые методы, для упрощения работы.

Что может modxAccount.
Регистрация пользователя, с использованием всех доступных полей юзера, плюс, можно создавать свои настройки юзера в таблице web_user_settings, добавление аватарки, капча.
Восстановление пароля.
Личный кабинет.
Форма входа.

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

modxLoader - загрузчик классов и методов

modxLoader — это плагин для загрузки классов и методов, как из PHP так и через AJAX.

Использование данного класса достаточно просто и позволит разрабатывать новые сниппеты без записи их в админке, а вызывать сразу методы класса.

Удобство в том, что создав свой класс, можно использовать его без его объявления, а потом обращения к нужному методу, а так же инклюдов. А сразу выбираем метод.

Пример
$modx->load->controller('account/controller/login', $config);

'account/controller/login' — путь в папке assets/snippets/ до нужного сниппета и название класса контроллера (AccountControllerLogin).
По умолчанию, если не указан метод, вызывается метод класса index.

$config — параметры передаваемые в выбранный метод.

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

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

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

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

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

Можно достаточно легко и непринужденно вести статистику отправляемых форм (сохранять данные в базе). Для того чтобы сработал плагин, необходимо только добавить скрытое поле с именем 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. 18.09.16)

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



Я его немного допилил для Evo. Добавил проверку на авторизацию менеджера, прикрутил работу с TinyMCE 4, чтобы в Tiny при клике на ссылку можно было выбирать файлы из папки files, а при клике на иконку добавления картинки можно было выбирать картинку из папки images.

Установка несложная но мелочи придется отредактировать (только для Tiny MCE 4).

1. В скачиваемом архиве папка filemanager. Копируем эту папку в /manager/media/browser/
Если у вас версия движка одна из последних, значит здесь в админке в настройках ИНСТРУМЕНТЫ -> КОНФИГУРАЦИЯ -> ФАЙЛ БРАУЗЕР есть выбор папки файл-менеджера

выбираем папку filemanager
Если такого выбора у вас нет, значит необходимо предварительно переименовать старую папку mcpuk во что-нибудь другое, тем самым сохранив старый добрый kcfinder на всякий случай, а папку filemanager переименовать в mcpuk.
2. И еще один штрих настроить конфиг Tiny MCE 4.
Идем сюда /assets/plugins/tinymce4/tpl/ и находим файл tpl.tinymce4.config.html
Если такого файла нет, значит надо поставить последнюю версию TinyMCE 4 из сборки Дмитрия
Заменяем этот файл на файл из архива tpl.tinymce4.config.html. Открываем в редакторе и смотрим код на 6 и 8 строку
/manager/media/browser/filemanager/
Здесь надо папку указать соответствующую, если у вас mcpuk значит /manager/media/browser/mcpuk/, иначе оставляем по дефолту,
также и в 8 строчке
/manager/media/browser/mcpuk/plugin.min.js или по дефолту.

3. Создаем в папке assets/cache папку filemanager (для превьюшек).

Строго не судите, все на голом энтузиазме :)

4. UPD. Забыл допилить чтобы при выборе TV (image) — открывался файл менеджер. Тут изящным решением не получилось решить, придется немного добавить GET переменных в один файл, в дальнейшем возможно подскажут правильное решение, а пока открываем файл
/manager/includes/tmplvars.inc.php
находим строки примерно 143,149,213,219 с кодом
OpenServerBrowser('".MODX_MANAGER_URL."media/browser/{$which_browser}/browser.php?Type=images

OpenServerBrowser('".MODX_MANAGER_URL."media/browser/{$which_browser}/browser.php?Type=files

добавляем GET переменные после images и files чтобы получилось:
OpenServerBrowser('".MODX_MANAGER_URL."media/browser/{$which_browser}/browser.php?Type=images&field_id=tv".$field_id."&popup=1&relative_url=1

Скачать можно здесь (архив обновил 18.09.16) (баги что нашел поправил).

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 , который до публикации этого топика наткнулся на компонент на гитхабе и прислал по этому случаю донат (:


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