Василий Столейков

Василий Столейков

С нами с 19 декабря 2012; Место в рейтинге пользователей: #23
Володя
09 ноября 2017, 10:45
2
+4
написать сниппет например next_wday
<?php

/** @var modX $modx */
/** @var array $scriptProperties */

//Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
$wday = $modx->getOption('wday', $scriptProperties, 'Friday', true);
$format = $modx->getOption('format', $scriptProperties, 'd.m.Y', true);
if (date('w') >= date('w', strtotime($wday))) {
    $date = date($format, strtotime("next ".$wday));
}
else {
    $date = date($format, strtotime($wday));
}

return $date;
вызываем как
{'next_wday'|snippet:[
'wday' => 'Friday',
'format' => 'd.m.Y'
]}
Василий Наумкин
07 ноября 2017, 00:29
3
+9
Ребята, у всех «зависающих» одна и та же проблема — баг в 2.6 с очисткой кэша ресурса, если он был получен через getOne или подобный метод. Вот простейший код, который генерирует ошибку.

Все уже в курсе, будет починено в 2.6.1. Вот исправление, которое можно сделать самостоятельно.
Волков Николай
20 октября 2017, 00:27
1
+2
jquery.com/upgrade-guide/3.0/#deprecated-document-ready-handlers-other-than-jquery-function

В общем, начиная с 3 версии в jQuery иначе реализовано многое и я сталкивался со случаями, когда не работает:
$(document).ready(function() {
Если я не ошибаюсь, то все из-за того, что раньше ready был event, а сейчас это Promise. Лично я пишу так:
$.when($.ready).then(function(){...});
Василий Наумкин
11 октября 2017, 10:28
2
+1
Нужно.

Причём, писать лучше массивом, потому что сейчас у тебя там JSON с ошибкой:
'includeTVs' => 'searching',
'where' => [
	'searching' => 1, 
	'Status.value:IN' => ['', 0, 2],
],
Тоже самое касается и join — все сниппеты pdoTools давно понимают указание массивов через Fenom.
Сергей Шлоков
15 сентября 2017, 12:06
1
+2
Вообще, логику в чанках лучше не определять. Если рассматривать MODX с точки зрения MVC концепции (насколько это возможно), то чанк — это вид. И среди программистов не принято в видах прописывать логику. Для этого есть контроллеры. В MODX это лучше делать в плагинах
// Плагин
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
            $fenom->addAccessorSmart("product", "data", Fenom::ACCESSOR_PROPERTY);
            $fenom->data = [
                "name" => '', // Тут имя определяете по вашему условию
            ];
    break;
}
А в чанке просто вызывать
Фильтры для {$.product.name}
Роман Ильин
12 сентября 2017, 23:09
13
+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, 10:11
1
+1
1. Быстрый ответ от PHP
2. Настроенный веб сервер (gzip, кэширование статики)
4. Оптимизированные картинки (не только сжатие, но и соответствие размеров в css реальному размеру картинки)
5. Оптимизированные скрипты и стили

Лично я не заморачиваюсь с подключением скриптов и стилей inline ради циферок от Google, просто размещаю ссылки на css в шапке, а javascript в подвале — как обычно.
Володя
01 сентября 2017, 09:53
4
+3
Тема очень обширна и возможны разные варианты. Можно использовать различные сборщики, например тут Василий описал детально сборку с помощью gulp. Кто то использует minifyx.

Могу поделиться своим решением на основе html-compressor.

Принцип работы прост, стили и скрипты в специальной разметке собираются в один файл и могут быть подключены, либо помещены прямо в тело страницы.

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



я ни кого не призываю использовать этот пакет, просто делюсь способом оптимизации.

ps. кстати данный пакет подключен и тут s6200.h3.modhost.pro/6/12010.html
но там нет оптимизации картинок потому результат не 100…

Василий Наумкин
08 августа 2017, 17:12
3
0
$(doсument).on('ready', function() {
	miniShop2.Message = {
		success: function() {},
		error: function() {},
		info: function() {},
	};
});
Я не имел в виду, что нужно прям свой файл загрузить после, хотя и так можно. Нужно просто перезаписать часть скрипта miniShop2 перед его первым использованием.
Евгений
15 июля 2017, 20:01
1
+1
Решение:
<?php
$id = $modx->resource->parent;
$count = $modx->getCount('modResource', array(
'parent' => $id,
'class_key' => 'Ticket',
));
return $count;