<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Блог Ильи Уткина — RSS раздела «Шпаргалки»</title>
       <link>https://www.ilyaut.ru/cheats/</link>
       <description></description>
    <language>ru</language>
<item>
       <title><![CDATA[Поиск кода в шаблонах и чанках]]></title>
       <link>https://www.ilyaut.ru/cheats/search-for-code-in-templates-and-chunks/</link>
       <description><![CDATA[<pre class="prettyprint">&lt;?php
$query = 'FormIt';

$output = &#91;&#93;;

$snippets = $modx-&gt;getCollection('modSnippet', &#91;'snippet:LIKE' =&gt; '%' . $query . '%'&#93;);
foreach ($snippets as $snippet) {
    $output&#91;&#93; = sprintf('&lt;p&gt;Snippet &lt;a href=&quot;/manager/?a=element/snippet/update&amp;id=%s&quot;&gt;%s&lt;/a&gt;&lt;/p&gt;', $snippet-&gt;id, $snippet-&gt;name);
}

$templates = $modx-&gt;getCollection('modTemplate', &#91;'content:LIKE' =&gt; '%' . $query . '%'&#93;);
foreach ($templates as $template) {
    $output&#91;&#93; = sprintf('&lt;p&gt;Template &lt;a href=&quot;/manager/?a=element/template/update&amp;id=%s&quot;&gt;%s&lt;/a&gt;&lt;/p&gt;', $template-&gt;id, $template-&gt;templatename);
}

$chunks = $modx-&gt;getCollection('modChunk', &#91;'snippet:LIKE' =&gt; '%' . $query . '%'&#93;);
foreach ($chunks as $chunk) {
    $output&#91;&#93; = sprintf('&lt;p&gt;Chunk &lt;a href=&quot;/manager/?a=element/chunk/update&amp;id=%s&quot;&gt;%s&lt;/a&gt;&lt;/p&gt;', $chunk-&gt;id, $chunk-&gt;name);
}

$resources = $modx-&gt;getCollection('modResource', &#91;'content:LIKE' =&gt; '%' . $query . '%'&#93;);
foreach ($resources as $resource) {
    $output&#91;&#93; = sprintf('&lt;p&gt;Resource &lt;a href=&quot;/manager/?a=resource/update&amp;id=%s&quot;&gt;%s&lt;/a&gt;&lt;/p&gt;', $resource-&gt;id, $resource-&gt;pagetitle);
}

print implode(PHP_EOL, $output);</pre>]]></description>
       <pubDate>Вт 20 июл 2021 11:19:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Отправка писем через API MailGun]]></title>
       <link>https://www.ilyaut.ru/cheats/sending-emails-via-the-mailgun-api/</link>
       <description><![CDATA[Хук для FormIt — <strong>emailAPI</strong> вместо стандартного <strong>email</strong>



<pre class="prettyprint">&lt;?php
$tpl = $modx-&gt;getOption('emailTpl',$hook-&gt;formit-&gt;config,'');

/* get from name */
$emailFrom = $modx-&gt;getOption('emailFrom',$hook-&gt;formit-&gt;config,'');
if (empty($emailFrom)) {
    $emailFrom = !empty($fields&#91;'email'&#93;) ? $fields&#91;'email'&#93; : $modx-&gt;getOption('emailsender');
}
$emailFromName = $modx-&gt;getOption('emailFromName',$hook-&gt;formit-&gt;config,$emailFrom);

/* get subject */
$useEmailFieldForSubject = $modx-&gt;getOption('emailUseFieldForSubject',$hook-&gt;formit-&gt;config,true);
if (!empty($fields&#91;'subject'&#93;) &amp;&amp; $useEmailFieldForSubject) {
    $subject = $fields&#91;'subject'&#93;;
} else {
    $subject = $modx-&gt;getOption('emailSubject',$hook-&gt;formit-&gt;config,'');
}

/* check email to */
$emailTo = $modx-&gt;getOption('emailTo',$hook-&gt;formit-&gt;config,'');
$emailToName = $modx-&gt;getOption('emailToName',$hook-&gt;formit-&gt;config,$emailTo);
if (empty($emailTo)) {
    $hook-&gt;addError('emailTo',$modx-&gt;lexicon('formit.email_no_recipient'));
    $modx-&gt;log(modX::LOG_LEVEL_ERROR,'&#91;FormIt&#93; '.$modx-&gt;lexicon('formit.email_no_recipient'));
    return false;
}

/* compile message */
$origFields = $fields = $hook-&gt;getValues();

/** @var pdoFetch $pdoFetch */
$fqn = $modx-&gt;getOption('pdoFetch.class', null, 'pdotools.pdofetch', true);
$path = $modx-&gt;getOption('pdofetch_class_path', null, MODX_CORE_PATH . 'components/pdotools/model/', true);
if ($pdoClass = $modx-&gt;loadClass($fqn, $path, false, true)) {
    $pdoFetch = new $pdoClass($modx, &#91;&#93;);
} else {
    return false;
}
$message = $pdoFetch-&gt;getChunk($tpl, $fields);


$apiUrl = 'https://api.eu.mailgun.net/v3/domain.ru/messages';

$client = $modx-&gt;getService('rest', 'rest.modRest');

$headers = &#91;'Authorization' =&gt; 'Basic ' . base64_encode('api:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')&#93;;
$data = &#91;
    'from' =&gt; $emailFromName . ' &lt;' . $emailFrom . '&gt;',
    'to' =&gt; $emailTo,
    'subject' =&gt; $subject,
    'html' =&gt; $message
&#93;;



/* cc */
$emailCC = $modx-&gt;getOption('emailCC',$hook-&gt;formit-&gt;config,'');
if (!empty($emailCC)) {
    $emailCCName = $modx-&gt;getOption('emailCCName',$hook-&gt;formit-&gt;config,'');
    $emailCC = explode(',',$emailCC);
    $emailCCName = explode(',',$emailCCName);
    $data&#91;'cc'&#93; = array_shift($emailCCName) . ' &lt;' . array_shift($emailCC) . '&gt;';
}

/* bcc */
$emailBCC = $modx-&gt;getOption('emailBCC',$hook-&gt;formit-&gt;config,'');
if (!empty($emailBCC)) {
    $emailBCCName = $modx-&gt;getOption('emailBCCName',$hook-&gt;formit-&gt;config,'');
    $emailBCC = explode(',',$emailBCC);
    $emailBCCName = explode(',',$emailBCCName);
    $data&#91;'bcc'&#93; = array_shift($emailBCCName) . ' &lt;' . array_shift($emailBCC) . '&gt;';
}

$response = $client-&gt;post($apiUrl, $data, $headers)-&gt;process();

return !empty($response&#91;'id'&#93;);</pre>]]></description>
       <pubDate>Ср 09 июн 2021 16:00:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[mSearch2 с поиском по точному вхождению]]></title>
       <link>https://www.ilyaut.ru/cheats/msearch2-poisk-po-tochnomu-vhozhdeniyu/</link>
       <description><![CDATA[<pre class="prettyprint"><?php
/** @var modX $modx */
/** @var array $scriptProperties */
/** @var mSearch2 $mSearch2 */
if (!$modx->loadClass('msearch2', MODX_CORE_PATH . 'components/msearch2/model/msearch2/', false, true)) {return false;}
$mSearch2 = new mSearch2($modx, $scriptProperties);
$mSearch2->pdoTools->setConfig($scriptProperties);
$mSearch2->pdoTools->addTime('pdoTools loaded.');

if (empty($queryVar)) {$queryVar = 'query';}
if (empty($parentsVar)) {$parentsVar = 'parents';}
if (empty($minQuery)) {$minQuery = $modx->getOption('index_min_words_length', null, 3, true);}
if (empty($htagOpen)) {$htagOpen = '<b>';}
if (empty($htagClose)) {$htagClose = '</b>';}
if (empty($outputSeparator)) {$outputSeparator = "\n";}
if (empty($plPrefix)) {$plPrefix = 'mse2_';}
$returnIds = !empty($returnIds);
$fastMode = !empty($fastMode);

$class = 'modResource';
$found = array();
$output = null;
$query = !empty($_REQUEST&#91;$queryVar&#93;)
	? $mSearch2->getQuery(rawurldecode($_REQUEST&#91;$queryVar&#93;))
	: '';

if (empty($resources)) {
	if (empty($query) && isset($_REQUEST&#91;$queryVar&#93;)) {
		$output = $modx->lexicon('mse2_err_no_query');
	}
	elseif (empty($query) && !empty($forceSearch)) {
		$output = $modx->lexicon('mse2_err_no_query_var');
	}
	elseif (!empty($query) && !preg_match('/^&#91;0-9&#93;{2,}$/', $query) && mb_strlen($query,'UTF-8') < $minQuery) {
		$output = $modx->lexicon('mse2_err_min_query');
	}

	$modx->setPlaceholder($plPrefix.$queryVar, $query);

	if (!empty($output)) {
		return !$returnIds
			? $output
			: '';
	}
	elseif (!empty($query)) {
        $decodedQuery = str_replace(' ', '%', rawurldecode($_REQUEST&#91;$queryVar&#93;));
		$q = $modx->newQuery('modResource');
		$q->leftJoin('msProductData', 'Data', 'modResource.id = Data.id');
		$q->where(&#91;
			&#91;
				'deleted' => false,
				'published' => true,
			&#93;,
			&#91;
				'pagetitle:LIKE' => '%' . $decodedQuery . '%',
				'OR:longtitle:LIKE' => '%' . $decodedQuery . '%',
				'OR:description:LIKE' => '%' . $decodedQuery . '%',
				'OR:introtext:LIKE' => '%' . $decodedQuery . '%',
				'OR:content:LIKE' => '%' . $decodedQuery . '%',
				'OR:Data.article:LIKE' => '%' . $decodedQuery . '%'
			&#93;
		&#93;);
		$q->select('&#96;modResource&#96;.&#96;id&#96;');
		if ($q->prepare() && $q->stmt->execute()) {
        	$exact = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
        }
		
		$found = $mSearch2->Search($query);
		$ids = array_merge($exact, array_keys($found));
		$resources = implode(',', $ids);
		if (empty($ids)) {
			if ($returnIds) {
				return '';
			}
			elseif (!empty($query)) {
				$output = $modx->lexicon('mse2_err_no_results');
			}
			if (!empty($tplWrapper) && !empty($wrapIfEmpty)) {
				$output = $mSearch2->pdoTools->getChunk(
					$tplWrapper,
					array(
						'output' => $output,
						'total' => 0,
						'query' => $query,
						'parents' => $modx->getPlaceholder($plPrefix.$parentsVar),
					),
					$fastMode
				);
			}
			if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
				$output .= '&lt;pre class="mSearchLog">' . print_r($mSearch2->pdoTools->getTime(), 1) . '&lt;/pre&gt;';
			}
			if (!empty($toPlaceholder)) {
				$modx->setPlaceholder($toPlaceholder, $output);
				return;
			}
			else {
				return $output;
			}
		}
	}
}
elseif (strpos($resources, '{') === 0) {
	$found = $modx->fromJSON($resources);
	$resources = implode(',', array_keys($found));
	unset($scriptProperties&#91;'resources'&#93;);
}
/*----------------------------------------------------------------------------------*/
if (empty($returnIds)) {
	// Joining tables
	$leftJoin = array(
		'mseIntro' => array(
			'class' => 'mseIntro',
			'alias' => 'Intro',
			'on' => $class . '.id = Intro.resource'
		)
	);
	// Fields to select
	$resourceColumns = !empty($includeContent)
		? $modx->getSelectColumns($class, $class)
		: $modx->getSelectColumns($class, $class, '', array('content'), true);
	$select = array(
		$class => $resourceColumns,
		'Intro' => 'intro'
	);
	$groupby = $class.'.id, Intro.intro';
} else {
	$leftJoin = array();
	$select = array($class . 'id');
	$groupby = $class.'.id';
}

// Add custom parameters
foreach (array('leftJoin', 'select') as $v) {
	if (!empty($scriptProperties&#91;$v&#93;)) {
		$tmp = $modx->fromJSON($scriptProperties&#91;$v&#93;);
		if (is_array($tmp)) {
			$$v = array_merge($$v, $tmp);
		}
	}
	unset($scriptProperties&#91;$v&#93;);
}

// Default parameters
$default = array(
	'class' => $class,
	'leftJoin' => $leftJoin,
	'select' => $select,
	'groupby' => $groupby,
	'return' => !empty($returnIds)
		? 'ids'
		: 'data',
	'fastMode' => $fastMode,
	'nestedChunkPrefix' => 'msearch2_',
);
if (!empty($resources)) {
	$default&#91;'resources'&#93; = is_array($resources)
		? implode(',', $resources)
		: $resources;
}

// Merge all properties and run!
$mSearch2->pdoTools->setConfig(array_merge($default, $scriptProperties), false);
$mSearch2->pdoTools->addTime('Query parameters are prepared.');
$rows = $mSearch2->pdoTools->run();

$log = '';
if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
	$log .= '&lt;pre class="mSearchLog">' . print_r($mSearch2->pdoTools->getTime(), 1) . '&lt;/pre&gt;';
}

// Processing results
if (!empty($returnIds)) {
	$modx->setPlaceholder('mSearch.log', $log);
	if (!empty($toPlaceholder)) {
		$modx->setPlaceholder($toPlaceholder, $rows);
		return '';
	}
	else {
		return $rows;
	}
}
elseif (!empty($rows) && is_array($rows)) {
	$output = array();
	foreach ($rows as $k => $row) {
		// Processing main fields
		$row&#91;'weight'&#93; = isset($found&#91;$row&#91;'id'&#93;&#93;) ? $found&#91;$row&#91;'id'&#93;&#93; : '';
		$row&#91;'intro'&#93; = $mSearch2->Highlight($row&#91;'intro'&#93;, $query, $htagOpen, $htagClose);

		$row&#91;'idx'&#93; = $mSearch2->pdoTools->idx++;
		$tplRow = $mSearch2->pdoTools->defineChunk($row);
		$output&#91;&#93; .= empty($tplRow)
			? $mSearch2->pdoTools->getChunk('', $row)
			: $mSearch2->pdoTools->getChunk($tplRow, $row, $fastMode);
	}
	$mSearch2->pdoTools->addTime('Returning processed chunks');
	if (!empty($toSeparatePlaceholders)) {
		$output&#91;'log'&#93; = $log;
		$modx->setPlaceholders($output, $toSeparatePlaceholders);
	}
	else {
		$output = implode($outputSeparator, $output) . $log;
	}
}
else {
	$output = $modx->lexicon('mse2_err_no_results') . $log;
}

// Return output
if (!empty($tplWrapper) && (!empty($wrapIfEmpty) || !empty($output))) {
	$output = $mSearch2->pdoTools->getChunk(
		$tplWrapper,
		array(
			'output' => $output,
			'total' => $modx->getPlaceholder($mSearch2->pdoTools->config&#91;'totalVar'&#93;),
			'query' => $modx->getPlaceholder($plPrefix.$queryVar),
			'parents' => $modx->getPlaceholder($plPrefix.$parentsVar),
		),
		$fastMode
	);
}

if (!empty($toPlaceholder)) {
	$modx->setPlaceholder($toPlaceholder, $output);
}
else {
	return $output;
}</pre>]]></description>
       <pubDate>Чт 27 мая 2021 15:53:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Изменение заголовка ресурса в админке на лету (OnDocFormRender)]]></title>
       <link>https://www.ilyaut.ru/cheats/change-the-title-of-the-resource-in-the-admin-panel-on-the-fly/</link>
       <description><![CDATA[<pre class="prettyprint">
switch ($modx-&gt;event-&gt;name) {
    case 'OnDocFormRender':
        if ($mode != 'upd') return;
		if ($event = $modx-&gt;getObject('Event', &#91;'resource_id' =&gt; $resource-&gt;id&#93;)) {
			$modx-&gt;controller-&gt;addHtml('&lt;script&gt;Ext.onReady(function(){
				setTimeout(function(){
					Ext.getCmp(&quot;modx-resource-pagetitle&quot;).setValue(&quot;' . addslashes($event-&gt;title) . '&quot;);
					Ext.getCmp(&quot;modx-resource-description&quot;).setValue(&quot;' . addslashes(strip_tags($event-&gt;description)) . '&quot;);
				}, 300);
			});&lt;/script&gt;');
		}
        break;
}
</pre>]]></description>
       <pubDate>Ср 03 июн 2020 17:20:05 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Зависимые комбобоксы в форме ExtJS]]></title>
       <link>https://www.ilyaut.ru/cheats/dependent-combo-boxes-in-extjs-form/</link>
       <description><![CDATA[Чтобы обновить список внутри одного комбобокса, нужно добавить listener в другой комбобокс:



<pre class="prettyprint">
listeners   : {
	'select'    : {
		fn          : function(tf, nv, ov) {
			Ext.getCmp('mycomponent-panel-object-model_id').reset();
			Ext.getCmp('mycomponent-panel-object-model_id').baseParams.brand_id = tf.getValue();
			Ext.getCmp('mycomponent-panel-object-model_id').getStore().load();
		},
		scope       : this
	}
}
</pre>]]></description>
       <pubDate>Пн 01 июн 2020 11:24:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Combobox в виде динамических чекбоксов]]></title>
       <link>https://www.ilyaut.ru/cheats/combobox-for-dynamic-checkboxes/</link>
       <description><![CDATA[Поля в форме:



<pre class="prettyprint">{   /* При изменении значения этого комбобокса будут перестраиваться чекбоксы */
	xtype           : 'mycomponent-combo-select',
	fieldLabel      : _('mycomponent.select'),
	name            : 'select_id',
	anchor          : '99%',
	allowBlank      : false,
	listeners       : {
		'select'    : {
			fn          : function(tf, nv, ov) {
				if (Ext.get('mycomponent-checkbox-dynamic')) {
					Ext.get('mycomponent-checkbox-dynamic').parent().parent().remove();
				}
				Ext.getCmp('mycomponent-panel-checkboxes-panel').add({
					xtype       : 'mycomponent-checkbox-dynamic',
					fieldLabel  : _('mycomponent.checkboxes'),
					id          : 'mycomponent-panel-checkbox-dynamic',
					anchor      : '99%',
					select_id   : tf.value
				});
				Ext.getCmp('mycomponent-panel-checkboxes-panel').doLayout();
			},
			scope       : this
		},
</pre>]]></description>
       <pubDate>Пн 01 июн 2020 11:19:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Костыль для кеширования mFilter]]></title>
       <link>https://www.ilyaut.ru/cheats/caching-mfilter/</link>
       <description><![CDATA[Вызов <strong>mFilter2</strong> только если кеша нет:

<pre class="prettyprint">{var $get = ($.get | toJSON) | md5}
{* Проверяем, есть ли фильтр уже в кеше *}
{if !$filter = $_modx-&gt;cacheManager-&gt;get('msearch2/settings/' ~ $get ~ '/filters')}
    {set $filter = $_modx-&gt;runSnippet('!mFilter2', &#91;
        'class' =&gt; 'msProduct',
        'parents' =&gt; $_modx-&gt;resource.id,
        'element' =&gt; 'msProducts',
    &#93;)}

    {* Сохраняем фильтр в кеш *}
    {set $null = $_modx-&gt;cacheManager-&gt;set('msearch2/settings/' ~ $get ~ '/filters', $filter)}
{/if}

{* Подключаем JS-скрипты и прописываем config на странице *}
{'!mFilterJS' | snippet}

{* Показываем фильтр из кеша *}
{$filter}</pre>]]></description>
       <pubDate>Пт 13 дек 2019 09:08:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Парсинг новостей с картинками для сайта]]></title>
       <link>https://www.ilyaut.ru/cheats/parsing-news-with-pictures-for-the-website/</link>
       <description><![CDATA[<pre class="prettyprint">&lt;?php
$url = 'https://site.ru/type/news';

require_once(MODX_CORE_PATH . 'components/simplehtmldom/simple-html-dom.php');
$html = file_get_html($url);
$teasers = $html-&gt;find('.teaser');
$news = &#91;&#93;;
foreach ($teasers as $teaser) {
    $link = $teaser-&gt;find('a', 0);
    $date = $teaser-&gt;find('.date', 0);
    $parser = date_create_from_format('d.m.y', trim($date-&gt;plaintext));
    $publishedon = date_format($parser, 'Y-m-d');
    $news&#91;&#93; = &#91;'link' =&gt; 'https://site.ru' . $link-&gt;href, 'publishedon' =&gt; $publishedon, 'pagetitle' =&gt; $link-&gt;plaintext&#93;;
}
foreach ($news as $page) {
    $page&#91;'parent'&#93; = 15;
    $html = file_get_html($page&#91;'link'&#93;);
    $content = $html-&gt;find('.body', 0);
    $imgs = $content-&gt;find('img');
    foreach ($imgs as $img) {
        if (strpos($img-&gt;src, 'http') !== false) {
            $url = $img-&gt;src;
        } else {
            $url = 'https://site.ru' . $img-&gt;src;
        }
        $name = md5(uniqid()) . '.' . pathinfo($url, PATHINFO_EXTENSION);
        $path = MODX_BASE_PATH . 'assets/images/archive/' . $name;
        file_put_contents($path, file_get_contents($url));
        $img-&gt;src = '/assets/images/archive/' . $name;
        if (!isset($page&#91;'img'&#93;) || !$page&#91;'img'&#93;) {
            $page&#91;'tv1'&#93; = $img-&gt;src;
        }
    }
    if ($olds = $content-&gt;find('.field-field-old-filename',0)) {
        $olds-&gt;outertext = '';
    }
    $page&#91;'content'&#93; = $content-&gt;innertext;
    if (!$res = $modx-&gt;getObject('modResource', &#91;'parent' =&gt; $page&#91;'parent'&#93;, 'pagetitle' =&gt; $page&#91;'pagetitle'&#93;, 'publishedon' =&gt; strtotime($page&#91;'publishedon'&#93;)&#93;)) {
        if ($count = $modx-&gt;getCount('modResource', &#91;'parent' =&gt; $page&#91;'parent'&#93;, 'pagetitle' =&gt; $page&#91;'pagetitle'&#93;&#93;)) {
            $page&#91;'alias'&#93; = $page&#91;'pagetitle'&#93; . '-' . $count;
            print $page&#91;'alias'&#93; . ' - ';
        }
        $response = $modx-&gt;runProcessor('resource/create', $page);
        if ($response-&gt;isError()) {
            echo '&lt;p&gt;' . $page&#91;'pagetitle'&#93; . '&lt;/p&gt;';
            return $modx-&gt;error-&gt;failure($response-&gt;getMessage());
        } else {
            echo '&lt;p&gt;Resource created&lt;/p&gt;';
        }
    } else {
        echo '&lt;p&gt;Resource found&lt;/p&gt;';
    }
}
</pre>]]></description>
       <pubDate>Пн 17 июн 2019 16:07:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Правила сервера для MODX Cloud]]></title>
       <link>https://www.ilyaut.ru/cheats/server-rules-for-modx-cloud/</link>
       <description><![CDATA[<pre class="prettyprint">location ~* \.(?:ico|css|js|jpe?g|png|gif|svg|pdf|mov|mp4|mp3|woff)$ {
    try_files $uri $uri/ @modx-rewrite;     
    expires 7d;
    add_header Pragma public;
    add_header Cache-Control &quot;public&quot;;
    gzip_vary on;
}
if ($scheme != &quot;https&quot;) {
    return 301 https://www.webslite.com$request_uri;
}
if ($host != &quot;www.groepenkastmontagenoord.nl&quot;) {
    rewrite ^ https://www.webslite.com$request_uri permanent;
}
location / {
    try_files $uri $uri/ @modx-rewrite;
}
location = /robots.txt {
    try_files $uri $uri/ @modx-rewrite;
}</pre>]]></description>
       <pubDate>Чт 23 мая 2019 16:34:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Удалить все вирусы, найденные ai-bolit'ом]]></title>
       <link>https://www.ilyaut.ru/cheats/remove-all-viruses-found-ai-bolitom/</link>
       <description><![CDATA[<pre class="prettyprint">&lt;?php
@ini_set('display_errors', 1);
echo 'Start' . PHP_EOL;
$report_file = __DIR__ . '/report.json';
if (!file_exists($report_file)) {
    echo 'Report not found' . PHP_EOL;
    return;
}
$report_json = file_get_contents($report_file);
if (!$report = json_decode($report_json, true)) {
    echo 'Can not decode JSON' . PHP_EOL;
    return;
}
if (isset($report&#91;'php_malware'&#93;)) {
    foreach ($report&#91;'php_malware'&#93; as $php_malware) {
        echo $php_malware&#91;'fn'&#93; . PHP_EOL;
        //unlink($php_malware&#91;'fn'&#93;);
    }
} else {
    echo 'Php Malware not found' . PHP_EOL;
}
if (isset($report&#91;'js_malware'&#93;)) {
    foreach ($report&#91;'js_malware'&#93; as $js_malware) {
        echo $js_malware&#91;'fn'&#93; . PHP_EOL;
        //unlink($js_malware&#91;'fn'&#93;);
    }
} else {
    echo 'JS Malware not found' . PHP_EOL;
}
</pre>]]></description>
       <pubDate>Чт 25 апр 2019 20:09:51 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Добавление вкладки на страницу редактирования ресурса]]></title>
       <link>https://www.ilyaut.ru/cheats/add-tabs-to-the-edit-page-of-the-resource/</link>
       <description><![CDATA[Плагин



<pre class="prettyprint">&lt;?php
switch ($modx-&gt;event-&gt;name) {
    case 'OnDocFormRender':
        if ($mode == modSystemEvent::MODE_UPD) {
            $modx-&gt;controller-&gt;addLexiconTopic('core:user');
            $modx-&gt;controller-&gt;addLastJavascript($modx-&gt;getOption('assets_url') . 'components/resourceextender/mgr/resource/tab.js?v=1.0.0');
            
        }
        break;
}</pre>]]></description>
       <pubDate>Чт 18 апр 2019 09:06:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Добавляем запись лексикона для строки KB]]></title>
       <link>https://www.ilyaut.ru/cheats/add-an-entry-vocabulary-for-the-line-kb/</link>
       <description><![CDATA[<pre class="prettyprint">&lt;?php
$path = MODX_CORE_PATH . 'lexicon/';
$dirs = scandir($path);
unset($dirs&#91;0&#93;);
unset($dirs&#91;1&#93;);
foreach ($dirs as $dir) {
    $file = $path . $dir . '/file.inc.php';
    if (is_dir($path . $dir) &amp;&amp; file_exists($file)) {
        $content = file_get_contents($file);
        if (strpos($content, 'file_size_bytes') === false &amp;&amp;
            strpos($content, 'file_size_kilobytes') === false) {
            $content = str_replace(
                        '$_lang&#91;\'image_size\'&#93;',
                        '$_lang&#91;\'file_size_bytes\'&#93; = \'bytes\';' . PHP_EOL .
                        '$_lang&#91;\'file_size_kilobytes\'&#93; = \'KB\';' . PHP_EOL .
                        '$_lang&#91;\'image_size\'&#93;', $content);
            file_put_contents($file, $content);
        }
    }
}</pre>]]></description>
       <pubDate>Ср 10 апр 2019 10:36:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Поместить превью и keywords для SeoPRO перед контентом]]></title>
       <link>https://www.ilyaut.ru/cheats/place-the-thumbs-and-keywords-for-seopro-before-content/</link>
       <description><![CDATA[Файл

<code>assets/components/seopro/js/mgr/seopro.js</code>

Меняем:

<pre class="prettyprint">// ...
        var fieldDesc = new Ext.form.Label({
            forId: 'pagetitle',
            text: _('seopro.focuskeywords_desc'),
            cls: 'desc-under'
        });
        fp.insert(3,fieldDesc); /* было fp.add(field); */
        fp.insert(3,field); /* было fp.add(fieldDesc); */
        fp.doLayout();
    },
    addPanel: function() {
        var fp = Ext.getCmp('modx-resource-main-left');
        fp.insert(3, { /* было fp.add({ */
            xtype: 'panel',
// ...</pre>]]></description>
       <pubDate>Ср 10 апр 2019 10:16:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Загрузить все актуальные лексиконы для MODX 3]]></title>
       <link>https://www.ilyaut.ru/cheats/download-all-the-latest-lexicon-for-modx-3/</link>
       <description><![CDATA[Сначала регистрируемся на crowdin.com, полкчаем API-ключ.



Выполнять скрипт в SSH-консоли:



<pre class="prettyprint">mkdir core/lexicon/crowdin/
curl -o core/lexicon/crowdin/all.zip &quot;https://api.crowdin.com/api/project/modx-revolution/download/all.zip?login={login}&amp;account-key={api_key}&quot;
unzip core/lexicon/crowdin/all.zip -d core/lexicon/crowdin/
cp -R core/lexicon/crowdin/30/core/lexicon core
rm -rf core/lexicon/crowdin
</pre>]]></description>
       <pubDate>Ср 10 апр 2019 09:20:56 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[tvSuperSelect - выборка ресурсов по тегам с условием AND]]></title>
       <link>https://www.ilyaut.ru/cheats/tvsuperselect-sample-resources-with-tags-condition-and/</link>
       <description><![CDATA[Чтобы tvSuperSelect выбирал ресурсы, которые соответствуют сразу всем выбранным тегам, нужно создать копию сниппета <strong>tvssResources</strong>, назвать её, например, <strong>tvssResourcesAnd</strong>. В копию вносим следующие изменения:



<pre class="prettyprint">// ...
    if (!empty($orConditions)) { // Заменяем код внутри этого условия
        foreach ($tags as $i =&gt; $tag) {
            $leftJoin&#91;$alias . $i&#93; = array(
                'class' =&gt; 'tvssOption',
                'alias' =&gt; $alias . $i,
                'on' =&gt; $alias . $i . '.resource_id = ' . $class . '.id AND ' .
                        $alias . $i . '.tv_id = ' . $tv . ' AND ' .
                        $alias . $i . '.value = &quot;' . addslashes($tag) . '&quot;',
            );
            $where&#91;0&#93;&#91;$alias . $i . '.value:!='&#93; = null;
        }
    }
// ...</pre>]]></description>
       <pubDate>Пт 07 дек 2018 08:54:15 +0400</pubDate>
    </item>
  </channel>
</rss>