Антон Соловьёв
С нами с 14 января 2013; Место в рейтинге пользователей: #563TinyMCE + Tickets + выбор главной картинки в TV
            Добрый день. Понадобился функционал удобного редактора textarea во фронтенде Tickets, а также сделать возможность пользователю выбрать главную картинку для тикета.
Вот что получилось:

Инструкция под катом
        
        
        
        
    Вот что получилось:

Инструкция под катом
Redis Cache (xPDORedisCache)
            Решил попробовать использовать redis кэш для modx
создал класс xPDORedisCache, особо не заморачивался переписал мемкеш класс, но возникает проблема, идет пустая выдача и в логе:
UPD: 2016-04-10
Решение далось легко, забыл указать сериализацию
$this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
Устанавливается в /core/xpdo/cache/
в настройках cache_handler = cache.xPDORedisCache
Доступные опции:
redis_server — строка с данными для подключения 'localhost:6379'
redis_auth — пароль для аутентификации
redis_db — целое число >= 0
cache_prefix — по желанию, по сути если задать в redis_db разные значения для разных сайтов, будет то, что надо
Код xpdorediscache.class.php ниже:
        
        
        
        
    создал класс xPDORedisCache, особо не заморачивался переписал мемкеш класс, но возникает проблема, идет пустая выдача и в логе:
modExtensionPackage::loadCache() is not a valid static method.в общем логе:[Fri Apr 08 23:00:11 2016] [error] [client 130.193.37.24] PHP Warning:  Invalid argument supplied for foreach() in /var/www/core/model/modx/modcontext.class.php on line 101
[Fri Apr 08 23:00:11 2016] [error] [client 130.193.37.24] PHP Warning:  array_merge(): Argument #2 is not an array in /var/www/core/model/modx/modx.class.php on line 2306
[Fri Apr 08 23:00:11 2016] [error] [client 130.193.37.24] PHP Fatal error:  Class 'modUser_' not found in /var/www/core/xpdo/xpdo.class.php on line 770Есть какие идеи куда копать?UPD: 2016-04-10
Решение далось легко, забыл указать сериализацию
$this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
Устанавливается в /core/xpdo/cache/
в настройках cache_handler = cache.xPDORedisCache
Доступные опции:
redis_server — строка с данными для подключения 'localhost:6379'
redis_auth — пароль для аутентификации
redis_db — целое число >= 0
cache_prefix — по желанию, по сути если задать в redis_db разные значения для разных сайтов, будет то, что надо
Код xpdorediscache.class.php ниже:
Идеальный сервер для новичков
            Хотел поделиться с новичками инструкцией по настройке сервера на Ubuntu 14.04.


Статья для новичков от новичка.
В этой статье я не претендую на Правильный хостинг для MODX Revolution от Василия. В своей статье Василий советует использовать Ajenti, мне же больше нравится VestaCP, её мы и установим.
В статье мы первоначально настроим сервер, установим хостинг панель, проверим потребляемые ресурсы. Так-же подходит любым CMS.
В качестве сервера я использовал VDS Разминка за 90р/месяц от firstvds.ru (Реферальная ссылка). Выбрал только из-за цены.
Сам я пользуюсь хостингом от modhost.pro:
В конечном итоге мы получим готовый рабочий сервер с простой хостинг панелью, настраиваемыми бекапами, свистелками.
        
        
        
        
    
Статья для новичков от новичка.
В этой статье я не претендую на Правильный хостинг для MODX Revolution от Василия. В своей статье Василий советует использовать Ajenti, мне же больше нравится VestaCP, её мы и установим.
В статье мы первоначально настроим сервер, установим хостинг панель, проверим потребляемые ресурсы. Так-же подходит любым CMS.
В качестве сервера я использовал VDS Разминка за 90р/месяц от firstvds.ru (Реферальная ссылка). Выбрал только из-за цены.
Сам я пользуюсь хостингом от modhost.pro:

В конечном итоге мы получим готовый рабочий сервер с простой хостинг панелью, настраиваемыми бекапами, свистелками.
Создаю свой компонент, нужна ваша помощь
Здравствуйте. Делаю свой компонент биллинга, простой сниппет с ценами. С MODX 2.3.3 перестали работать выводы полей с записями из таблицы бд. Всё создано, прописаны поля таблиц, но данные не выводятся. Вот что находится в файле отвечающим за вывод списка записей из базы /www/test.site.ru/core/components/billings/processors/mgr/billing/getlist.php
<?php
/**
 * Get a list of Billings
 *
 * @package billings
 * @subpackage processors
 */
/* setup default properties */
$isLimit = !empty($scriptProperties['limit']);
$start = $modx->getOption('start',$scriptProperties,0);
$limit = $modx->getOption('limit',$scriptProperties,20);
$sort = $modx->getOption('sort',$scriptProperties,'name');
$dir = $modx->getOption('dir',$scriptProperties,'ASC');
$query = $modx->getOption('query',$scriptProperties,'');
/* build query */
$c = $xpdo->newQuery('Hosting');
if (!empty($query)) {
    $c->where(array(
		'id:LIKE' => '%'.$query.'%',
		'OR:vid:LIKE' => '%'.$query.'%',
        'OR:name:LIKE' => '%'.$query.'%',
        'OR:cost:LIKE' => '%'.$query.'%',
		'OR:sort:LIKE' => '%'.$query.'%',
		'OR:hdd:LIKE' => '%'.$query.'%',
		'OR:domains:LIKE' => '%'.$query.'%',
		'OR:db:LIKE' => '%'.$query.'%',
		'OR:ftp:LIKE' => '%'.$query.'%',
		'OR:id_price:LIKE' => '%'.$query.'%',
    ));
}
$count = $modx->getCount('Hosting',$c);
$c->sortby($sort,$dir);
if ($isLimit) $c->limit($limit,$start);
$billings = $modx->getIterator('Hosting', $c);
/* iterate */
$list = array();
foreach ($billings as $billing) {
    $billingArray = $billing->toArray();
    $list[]= $billingArray;
}
return $this->outputArray($list,$count);Взято из дополнения Doodles и переделано под свои запросы. Есть мысли как заставить это работать? Буду очень признателен.        Новые версии MODX: 2.3.0 и 2.2.15
            Наконец-то вышла давно ожидаемая стабильная версия MODX 2.3.0 — вот запись в официальном блоге и перевод. Полный список изменений на английском можно посмотреть здесь, а скачать вот здесь.
С этого момента 2.3.0 становится актуальной рабочей веткой MODX, а 2.2.х устаревает. В связи с чем у меня к вам просьба начать тестировать наши основные дополнения на предмет работы в новом MODX. Точно знаю, что есть проблемы у miniShop2 из-за необычного расположения в меню, может и еще что всплывет.
Для тестирования можно использовать бесплатный аккаунт на нашем хостинге. По вопросам, касающихся платных дополнений обращаться как обычно — в поддержку магазина.

Сообщения об ошибках всех дополнений в MODX 2.3 прошу писать в одной этой теме. Из других мест комментарии буду переносить сюда, или вовсе удалять.
        
        
        
    С этого момента 2.3.0 становится актуальной рабочей веткой MODX, а 2.2.х устаревает. В связи с чем у меня к вам просьба начать тестировать наши основные дополнения на предмет работы в новом MODX. Точно знаю, что есть проблемы у miniShop2 из-за необычного расположения в меню, может и еще что всплывет.
Для тестирования можно использовать бесплатный аккаунт на нашем хостинге. По вопросам, касающихся платных дополнений обращаться как обычно — в поддержку магазина.

Сообщения об ошибках всех дополнений в MODX 2.3 прошу писать в одной этой теме. Из других мест комментарии буду переносить сюда, или вовсе удалять.
Вирусы на старых версиях MODX Revo
            Всем привет!
Не знаю, можно ли здесь создавать темы подобного плана…
В общем, у нас веб-студия. Делаем сайты на MODX. После создания сайта, они остаются у нас на сервере.
Сегодня получили жалобу: с айфона и айпада, сайт загружается нормально, но при клике на любую ссылку идет переход в Apple Store на приложение AviaSales.
Если заходить с Андроида (телефон/планшет) зараженный сайт предлагает «обновить браузер».
Запуск антивируса на сервере — нужных вирусов не нашел…
        
        
        
        
    Не знаю, можно ли здесь создавать темы подобного плана…
В общем, у нас веб-студия. Делаем сайты на MODX. После создания сайта, они остаются у нас на сервере.
Сегодня получили жалобу: с айфона и айпада, сайт загружается нормально, но при клике на любую ссылку идет переход в Apple Store на приложение AviaSales.
Если заходить с Андроида (телефон/планшет) зараженный сайт предлагает «обновить браузер».
Запуск антивируса на сервере — нужных вирусов не нашел…
Отправляем заголовки Last-Modified и Not Modified
            Написал небольшой плагинчик для отправки браузеру заголовка Last-Modified и, если браузер спросит If modified since — ответа 304 Not Modified
        
        
        
        
    
        создание секции tickets через процессоры
            Интересует создание секции tickets через процессоры.
Нашел статью о процессорах в MODX — хочу применить на практике.
        
        
        
        
    Нашел статью о процессорах в MODX — хочу применить на практике.
Создание своего события в MODX
            Сижу посматриваю исходники minishop. Заинтересовался созданием собственных событий в MODX.
Если да, то каким образом теперь его отследить?
        
        
        
        
    $response = $this->ms2->invokeEvent('msOnBeforeAddToOrder', array(
'key' => $key,
'value' => $value,
'order' => $this
));Правильно ли я понял что вот данный кусок кода и вызывает событие?Если да, то каким образом теперь его отследить?
Расширенные поля пользователей
            Небольшая пошаговая инструкция, как научиться сохранять любые интересующие данные о юзере в специальное поле extended.
На самом деле, это никакой не секрет. Во многих объектах MODX есть специальное поле типа JSON, которое хранится в БД как текст, например, properties у modResource и extended у modUserProfile.
При работе с объектами xPDO, JSON текст из этих полей превращается в массивы. То есть, общий принцип выглядит так:
        
        
        
        
    На самом деле, это никакой не секрет. Во многих объектах MODX есть специальное поле типа JSON, которое хранится в БД как текст, например, properties у modResource и extended у modUserProfile.
При работе с объектами xPDO, JSON текст из этих полей превращается в массивы. То есть, общий принцип выглядит так:
// id нужного пользователя
$user_id = 15;
// Получаем объект modUser
if ($user = $modx->getObject('modUser', $user_id)) {
	// Получаем связанный с ним профиль пользователя
	if ($profile = $user->getOne('Profile')) {
		// Получаем специальное поле extended
		$extended = $profile->get('extended');
		// Добавляем новое значение
		$extended['mykey'] = 'mydata';
		// И сохраняем обратно в профиль
		$profile->set('extended', $extended);
		$profile->save();
	}
}Самое приятное, что эти данные вы можете не только просмотреть на странице пользователя, но и изменить.