+1.13
141 читатель, 253 топика

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/modxupdatenotifer.html
Или установить через Extras

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

Telegram bot&MODX

0. Кому и зачем это нужно


Вообще никому. И незачем.

Но если вдруг кому-то придет в голову подключить какой-то магазин, написанный на Evo, к мессенжеру Telegram, то я скажу — это вполне возможно.

Речь сейчас не идет о чат-помощнике на сайте. Подобных решений в сети достаточно. Мне довелось немного попробовать как работает полноценный бот с базовой установкой MODX Evo. Ожидаемо все
Читать дальше →
  • avatar
  • 3
  • 1
  • +5
  • 1751

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. 04.09.18)

Есть такой достойный бесплатный 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 - для организации голосований

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

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