+1.13
140 читателей, 251 топик

Telegram bot&MODX

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


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

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

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

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. 05.06.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 - для организации голосований

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

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

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;

}
?>