Nikita

Nikita

С нами с 18 февраля 2013; Место в рейтинге пользователей: #381
Руслан Алеев
20 ноября 2017, 16:13
2
+1
Здравствуйте!
1) в MODX есть несколько методов фильтрации символов в URL — я ставлю alphanumeric (только буквы и цифры), см. в «Системные настройки -> Дружественные URL -> Метод фильтрации символов в псевдонимах» и править friendly_alias_restrict_chars_pattern не нужно.
2) Чтобы поправить транслитерацию символов заходите в /public_html/core/components/translit/model/modx/translit/tables/russian.php и правите на нужное сочетание, но при обновлении, как выше обсуждалось, может слететь, хотя translit не обновлялся, по-моему, никогда :)
Роман Ильин
12 сентября 2017, 23:09
12
+2
Сниппет для удаления старых версий:

<?php
/**
 * versionCleanX
 *
 * @author Scott Pronych, September 27, 2013
 *
 * DESCRIPTION
 *
 * For use with VersionX to delete old content
 *
 * PROPERTIES:
 *
 * &contentType - can be resource, chunk, plugin, snippet, template, or templatevar
 * &maxVersions - integer value for max number of versions you would like to keep
 *
 * USAGE:
 *
 * [[!versionCleanX? &contentType=`resource` &maxVersions=`10`]]
 *
 */
 
$cx_type = $modx->getOption('contentType', $scriptProperties, 'resource');
$cx_max = (int) $modx->getOption('maxVersions', $scriptProperties, 5);
 
$GLOBALS['count'] = 1;
$GLOBALS['total'] = 0;
$GLOBALS['deleted'] = 0;
$GLOBALS['page_total'] = 0;
$GLOBALS['page_deleted'] = 0;
$GLOBALS['page_name'] = '';
$GLOBALS['prev_content_id'] = 0;
$GLOBALS['prev_version_id'] = 0;
 
switch ($cx_type) {
    case 'chunk':
        $name = 'name';
        break;
    case 'plugin':
        $name = 'name';
        break;
    case 'snippet':
        $name = 'name';
        break;
    case 'template':
        $name = 'templatename';
        break;
    case 'templatevar':
        $name = 'name';
        break;
    default:
        $name = 'title';
        $cx_type = 'resource';
}
 
$GLOBALS['db_name'] = 'modx_versionx_' . $cx_type;
 
function delete_row ($id) {
    global $modx;
    $query = "DELETE FROM `" . $GLOBALS['db_name'] . "` WHERE version_id = '" . $id . "'";
    $result = $modx->query($query);
    if (!is_object($result)) return false;
    else {
        $GLOBALS['deleted']++;
        $GLOBALS['page_deleted']++;
        $GLOBALS['page_total']++;
        $GLOBALS['total']++;
        $GLOBALS['count']++;
        return true;
    }
}
 
function log_row () {
    $GLOBALS['data'] .= '<tr><td>' . $GLOBALS['page_name'] . '</td><td>' . $GLOBALS['page_total'] . '</td><td>' . $GLOBALS['page_deleted'] . "</td></tr>\n";
    $GLOBALS['page_deleted'] = 0;
    $GLOBALS['page_total'] = 1;
    $GLOBALS['count'] = 1;
}
 
$query = "SELECT version_id, content_id, " . $name . " AS page_title FROM `" . $GLOBALS['db_name'] . "` ORDER BY content_id ASC, version_id DESC";
 
$GLOBALS['data'] = '';
$output = 'An error occurred: ';
$versionx = $modx->query($query);
if (!is_object($versionx)) {
   return $output . 'query error ' . print_r($modx->errorInfo(), true);
}
else {
 
while($row = $versionx->fetch(PDO::FETCH_ASSOC)) {
    // New content_id so reset
    if ($prev_content_id == 0) {
        $prev_content_id = $row['content_id'];
        $prev_version_id = $row['version_id'];
        $GLOBALS['total']++;
        $GLOBALS['page_total']++;
        $GLOBALS['count']++;
        $GLOBALS['page_name'] = $row['page_title'];
    }
    elseif ($prev_content_id != $row['content_id']) {
        if ($GLOBALS['count'] > $cx_max) {
            if (!delete_row($prev_version_id)) return $output .  'deleting row for ' . $GLOBALS['page_name'] . ' Row: ' . $prev_content_id . ' ' . print_r($modx->errorInfo(), true);
            $GLOBALS['page_total']--;
 
        }
        else {
            $GLOBALS['total']++;
            $GLOBALS['count']++;
        }
        log_row();
        $prev_content_id = $row['content_id'];
        $prev_version_id = $row['version_id'];
        $GLOBALS['page_name'] = $row['page_title'];
    }
    // Content count is over the max so delete previous row
    elseif ($GLOBALS['count'] > $cx_max) {
            delete_row($prev_version_id);
            $prev_content_id = $row['content_id'];
            $prev_version_id = $row['version_id'];
    }
    else {
        $GLOBALS['count']++;
        $GLOBALS['page_total']++;
        $GLOBALS['total']++;
        $prev_content_id = $row['content_id'];
        $prev_version_id = $row['version_id'];
    }
}
log_row();
 
if ($GLOBALS['data'] != '') {
$output = '<h3>VersionX Cleanup for ' . $GLOBALS['db_name'] . '</h3>
<p>Total records: <strong>' . $GLOBALS['total'] . '</strong>
Total deleted: <strong>' . $GLOBALS['deleted'] . '</strong></p>
<table class="table table-striped">
<thead>
<tr>
<th>Page name</th>
<th>Total found</th>
<th>Deleted</th>
</tr>
</thead>
<tbody>
' . $GLOBALS['data'] .  '</tbody></table>
';
}
else $output = 'Error: no data found.';
}
 
$query = "OPTIMIZE TABLE `" . $GLOBALS['db_name'] . "`";
$versionx = $modx->query($query);
if (!is_object($versionx)) {
   $output = 'Optimize error ' . print_r($modx->errorInfo(), true) . $output;
}
 
return $output;


Вызывать так:
[[!versionCleanX? &contentType=`resource` &maxVersions=`10`]]
Сергей
Сергей
01 сентября 2017, 00:14
9
0
Тщательно пережевав это modx.pro/help/7693/#comment-53831, решил свой вопрос — Как вывести два фото к каждому товару на странице категории:
в шаблоне категории вызываю список товаров так:
[[!pdoPage?
	&element=`msProducts`
	&loadModels=`gallery`
	&leftJoin=`{
		"360x270": {"class":"msProductFile","alias":"360x270", "on": "360x270.product_id = msProduct.id AND 360x270.path LIKE '%/360x270/' AND 360x270.rank=0"}
		,"360x270x1": {"class":"msProductFile","alias":"360x270x1", "on": "360x270x1.product_id = msProduct.id AND 360x270x1.path LIKE '%/360x270/' AND 360x270x1.rank=1"}
	}`
	&select=`{
		"msProduct":"*"
		,"360x270":"360x270.url as 360x270"
		,"360x270x1":"360x270x1.url as 360x270x1"
	}`
]]
и в чанке tpl.msProducts.row.php вывожу ДВА фото товара так:
<img src="[[+360x270:default=`[[++assets_url]]components/minishop2/img/web/ms2_small.png`]]">
<img src="[[+360x270x1:default=`[[++assets_url]]components/minishop2/img/web/ms2_small.png`]]">
Количество запросов снизилось вдвое, время загрузки страницы упало в полтора раза.
Извините, если кому наступил на мозоль, разжевав досконально, я знаю, что тут это не приветствуется...)))
Василий Наумкин
08 августа 2017, 17:12
3
0
$(doсument).on('ready', function() {
	miniShop2.Message = {
		success: function() {},
		error: function() {},
		info: function() {},
	};
});
Я не имел в виду, что нужно прям свой файл загрузить после, хотя и так можно. Нужно просто перезаписать часть скрипта miniShop2 перед его первым использованием.
Павел Романов
05 августа 2017, 20:16
2
+1
Делайте просто ссылками, а не select-ом:

<div class="sorting__cat sorting__cat-top" id="mse2_sort">
	<div class="selectheader">По умолчанию</div>
	<div class="selectbody" style="display:none;">
		<a href="#" data-sort="resource|menuindex" data-default="asc" class="sort" >По умолчанию</a>
		<a href="#" data-sort="resource|pagetitle" data-default="asc" class="sort" >Название (А - Я)</a>
		<a href="#" data-sort="resource|pagetitle" data-default="desc" class="sort" >Название (Я - А)</a>
		<a href="#" data-sort="ms|price" data-default="asc" class="sort" >Цена (по возрастанию)</a>
		<a href="#" data-sort="ms|price" data-default="desc" class="sort" >Цена (по убыванию)</a>
	</div>
</div>

selectbody выводите по клику или наведению на selectheader.
В сам selectheader помещайте текст через JS на основании .sort.active.

Ну или попробуйте переопределить свойство sort_link, добавив в вызов mFilter2 параметр:
&filterOptions=`{"sort_link:": "#mse2_sort option"}`
t.g
t.g
23 июля 2017, 22:47
2
+1
Делал AMP страници через подмену шаблона при наличии get параметра ?amp, только со страницами блога.
Пример url:
https://sitename.com/articles/articles-name.html?amp
Условие замены шаблона. (возможно кто-то подскажет как его немножко улучшить, не знал как взять id шаблона текущей страницы одним запросом)

$id = $modx->resource->get('id'); // Get current page id
$resource = $modx->getObject('modResource',$id); // Get current object
$template = $resource->get('template'); // Get current page template

if($template == 5 && isset($_GET['amp'])) {
    
    $modx->resource->set('template', 23); 
    
} 

$modx->resource->cacheable = false; // Disable cache
Важно выключить кэширование, чтобы изменение шаблона не закешировалось.
Повесил на событие (OnLoadWebDocument)

Валидацию с get параметром проходит.
search.google.com/test/amp
Роман Ильин
09 мая 2017, 09:24
2
0
Спасибо!

Нашел еще такой короткий вариант:
{$imgurl | phpthumbon : "w=556&h=376&zc=1&q=61"}

Небольшой вопрос вдогонку. Как в Fenom сделать конкатенацию строк?
Максим Кузнецов
10 апреля 2017, 08:29
2
+3
Не нужно 2 раза вызывать один и тот же сниппет:

{set $result = $_modx->runSnippet('!pdoResources', [
	'parents' => id родителя
])}

{if $result | length > 0}
	{$result}
{else}
	//если вывода нет
{/if}
Василий Stepanov
02 апреля 2017, 04:18
2
+1
Сделал вот так. Работает.
//собираем заголовки из категории ресурсов
$docfind = $modx->getCollection('modResource',array('parent' => '19'));
foreach ($docfind as $k => $res) {
    $title_m = $res->get('pagetitle');
    $titles[] = $title_m;
}

$path = 'http://www.amur.info/index.rss';
$ctx = stream_context_create(array('http' => array('timeout' => 6)));
$file = file_get_contents($path, 0, $ctx);

if ($file) {
    $rss = simplexml_load_string($file);
    $i = 0;
    foreach ($rss->channel->item as $item){
        $namespaces = $item->getNameSpaces(true);
        $yandex = $item->children($namespaces['yandex']); 
        
        $full_text = (string)$yandex->{'full-text'};       //полный текст статьи
        $title = $item->title;                             //заголовок статьи
        $pubdate = $item->pubDate;                         //дата публикации
        $link = $item->link;                               //ссылка на новость
        
	//создаем ресурсы в MODX, если ресурсов с такими заголовками еще нет
        if (in_array($title, $titles) == false) {
            $response = $modx->runProcessor('resource/create', array(
                'pagetitle' => $title,
                'longtitle' => $pubdate,
                'description' => $link,
                'introtext' => '',
                'content' => $full,
                'template' => $template,
            	'hidemenu' => 1,
            	'published' => 1,
            	'parent' => '19'
            ));
        }
        
        $i++;
        if ($i == 5) break;
    }
}
Aleksandr Suslov
15 февраля 2017, 14:51
1
0
Спасибо большое. Ссылка помогла.
Если вдруг найдется такой же неуч, как я вот правильный код вывода:

$user = $modx->getObject('modUser', 3);
$profile = $user->getOne('Profile');
$extended = $profile->get('extended');
$comn = $extended['company_name'];
print($comn);