SEQUEL.ONE

SEQUEL.ONE

С нами с 16 июня 2015; Место в рейтинге пользователей: #84

LastModified и Office

Столкнулся с прoблемой компонента LastModified и Office. При включённом плагине перестаёт корректно работать авторизация. После ввода данных и нажатии на кнопку Вход не происходит смены чанков с не авторизованного на авторизованный и также с выходом. Ты вроде вышел, а отображается твоя учётка. При обновлении кэша браузера через CTRL + F5 всё нормально отображается. Может кто-нибудь подсказать как можно плагин допилить, чтобы сниппет Office не кэшировался?

<?php
/**
 * MODx Revolution plugin which handle request If-Modified-Since
 *
 * @package lastmodified
 * @var modX $modx MODX instance
 * @var integer $dtm Value of last update time of document
 * @var integer $ltm Value of HTTP_IF_MODIFIED_SINCE from request
 * @var string $rule Cache-control directive (public, private)
 * @var integer $maxage Cache max age in seconds
 * @var integer $expire Cache expire in seconds
 */
if ($modx->event->name == 'OnWebPagePrerender') {
    $dtm = ($modx->resource->get('editedon')) ? strtotime($modx->resource->get('editedon')) : strtotime($modx->resource->get('createdon'));
    if (empty($dtm)) {
        return '';
    }

    $rule = trim($modx->getOption('lastmodified.response'));

    if (!in_array($rule, ['private', 'public'])) { // 'no-cache'
        $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: wrong response directive value. Check configuration.');
        return '';
    }

    $maxage = ((int)$modx->getOption('lastmodified.maxage') > 0) ? (int)$modx->getOption('lastmodified.maxage') : 3600;
    $expire = ((int)$modx->getOption('lastmodified.expires') > 0) ? (int)$modx->getOption('lastmodified.expires') : 3600;

    if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
        $ltm = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
        if ($dtm <= $ltm) {
            $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
            header($protocol . ' 304 Not Modified');
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $dtm) . ' GMT');
            header('Cache-control: ' . $rule . ', max-age=' . $maxage);
            header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expire));
            exit();
        }
    }
    header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $dtm) . ' GMT');
    header('Cache-control: ' . $rule . ', max-age=' . $maxage);
    header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expire));
    return '';
}

/**
 * Update parent editedon field
 *
 * @var modX $modx MODX instance
 * @var modResource $parent Parent resource object
 */
if ($modx->event->name == 'OnDocFormSave') {

    if ($modx->getOption('lastmodified.update_start')) {

        $mainId = $modx->getOption('site_start');

        if ($mainId > 0 && $mainId !== $id) {

            $main = $modx->getObject('modResource', $mainId);

            if (!$main instanceof modResource) {
                $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: get wrong modResource instance for main page with id ' . $mainId . ' for document ' . $id. '.');
                return '';
            }

            $main->set('editedon', time());
            $main->save();

            unset($main);
        }

        unset($mainId);
    }

    if ($modx->getOption('lastmodified.update_parent')) {
        $level = ((int)$modx->getOption('lastmodified.update_level') > 0) ? (int)$modx->getOption('lastmodified.update_level') : 1;

        $parentIds = $modx->getParentIds($id, $level, ['context' => 'web']);

        foreach ($parentIds as $parentId) {
            if ($parentId === 0) {
                continue;
            }

            $parent = $modx->getObject('modResource', $parentId);

            if (!$parent instanceof modResource) {
                $modx->log(xPDO::LOG_LEVEL_ERROR, 'LastModified: get wrong modResource instance for parent with id ' . $parentId . ' for document ' . $id. '.');
                return '';
            }

            $parent->set('editedon', time());
            $parent->save();

            unset($parent);
        }

        return '';
    }
}
SEQUEL.ONE
02 октября 2018, 13:54
modx.pro
1 590
0

Добавление select с данными из другой таблицы в modExtra

Всем привет. Кто-нибудь на заготовке modExtra делал CоmboBox с данными из других таблиц? У меня есть файл вызывающий модальное окно с полями для заполнения:

assets/components/extras/js/mgr/widgets/categories.window.js
Extras.window.CreateCategory = function (config) {
    config = config || {};
    if (!config.id) {
        config.id = 'extras-category-window-create';
    }
    Ext.applyIf(config, {
        title: _('extras_category_create'),
        width: 550,
        autoHeight: true,
        url: Extras.config.connector_url,
        action: 'mgr/category/create',
        fields: this.getFields(config),
        keys: [{
            key: Ext.EventObject.ENTER, shift: true, fn: function () {
                this.submit()
            }, scope: this
        }]
    });
    Extras.window.CreateCategory.superclass.constructor.call(this, config);
};
Ext.extend(Extras.window.CreateCategory, MODx.Window, {

    getFields: function (config) {
        return [{
            xtype: 'textfield',
            fieldLabel: _('extras_category_name'),
            name: 'name',
            id: config.id + '-name',
            anchor: '99%',
            allowBlank: false,
        }, {
            xtype: 'textfield',
            fieldLabel: _('extras_category_repository'),
            name: 'repository_id',
            id: config.id + '-repository_id',
            anchor: '99%',
            allowBlank: true,
        }, {
            xtype: 'xcheckbox',
            boxLabel: _('extras_category_active'),
            name: 'active',
            id: config.id + '-active',
            checked: true,
        }];
    },

    loadDropZones: function () {
    }

});
Ext.reg('extras-category-window-create', Extras.window.CreateCategory);


Extras.window.UpdateCategory = function (config) {
    config = config || {};
    if (!config.id) {
        config.id = 'extras-category-window-update';
    }
    Ext.applyIf(config, {
        title: _('extras_category_update'),
        width: 550,
        autoHeight: true,
        url: Extras.config.connector_url,
        action: 'mgr/category/update',
        fields: this.getFields(config),
        keys: [{
            key: Ext.EventObject.ENTER, shift: true, fn: function () {
                this.submit()
            }, scope: this
        }]
    });
    Extras.window.UpdateCategory.superclass.constructor.call(this, config);
};
Ext.extend(Extras.window.UpdateCategory, MODx.Window, {

    getFields: function (config) {
        return [{
            xtype: 'hidden',
            name: 'id',
            id: config.id + '-id',
        }, {
            xtype: 'textfield',
            fieldLabel: _('extras_category_name'),
            name: 'name',
            id: config.id + '-name',
            anchor: '99%',
            allowBlank: false,
        }, {
            xtype: 'textfield',
            fieldLabel: _('extras_category_repository'),
            name: 'repository_id',
            id: config.id + '-repository_id',
            anchor: '99%',
            allowBlank: true,
        }, {
            xtype: 'xcheckbox',
            boxLabel: _('extras_category_active'),
            name: 'active',
            id: config.id + '-active',
        }];
    },

    loadDropZones: function () {
    }

});
Ext.reg('extras-category-window-update', Extras.window.UpdateCategory);
SEQUEL.ONE
22 сентября 2018, 17:03
modx.pro
5
1 997
+1

mFilter2 вывод фильтров в другом блоке



Всем привет. Возможно кто-то уже сталкивался с такой задачей, когда фильтры могут идти не только в одном блоке поочерёдно, но и находится выше контентной части (как показано на скриншоте). Как это можно реализовать простым и понятным путём? Не хочется городить велосипеды.
SEQUEL.ONE
22 сентября 2018, 00:51
modx.pro
3
2 160
+2

Как вывести секцию CDATA в XML?

Всем привет. Встала задача вывести в XML секцию CDATA, сам XML генерируется на PHP через массив. Вот пример того как это всё выводится:

<?php
/*
 * Выводим данные по всем репозиториям для дерева разделов
 */
require_once  dirname(__FILE__).'/response.class.php';
 
class ExtrasRepository extends ExtrasResponse{
    var $root = '<repositories/>';

	public function process(){
		$result = array(
			'repository'  => [
			    'id' => '4d4c3fa6b2b0830da9000001',
                'name' => 'Extras',
                'description' => '<img src="http://modxcms.com/assets/images/icons/ico_tools.png" alt="Add-ons" class="left" /> <h3>Want something not included in the MODx core install?</h3><p>Menu builders to image galleries, helper utilitis to podcasting and everything in between. These add-ons can help you build a site to <em>exactly</em> match your vision.</p>',
				'createdon' => '2011-02-04T18:05:07+0000',
                'rank' => 0,
                'packages' => 760,
                'tag' => '',
                'templated' => 0
            ],
		);

		return $this->toXML($result);
	}

}
return 'ExtrasRepository';
SEQUEL.ONE
17 сентября 2018, 11:53
modx.pro
2
1 215
+1

Добавление данных в таблицу базы из AjaxForm и FormIT

Всем привет. Делаю сейчас компонент, в котором пользователи добавляют свои блоги и на них могут подписываться. Застопорился на моменте когда нужно добавлять данные. Решил что через AjaxForm и FormIt надёжнее.

Вообщем делал следующим образом. Вызвал сниппет с такими параметрами:

{'!AjaxForm' | snippet : [
    'snippet' => 'FormIt',
    'form' => '@FILE components/ticketscommunity/form.tpl',
    'redirectTo' => 16,
    'hooks' => 'email,TicketsCommunityHooksBlog',
    'emailSubject' => 'Добавление нового блога "[[+name]]"',
    'emailTo' => 'admin@site.com',
    'validate' => 'alias:required',
    'validationErrorMessage' => 'В форме содержатся ошибки!',
    'successMessage' => 'Сообщение успешно отправлено'
]}
SEQUEL.ONE
16 сентября 2018, 13:59
modx.pro
2
1 460
+1

Создание блогов пользователями Tickets

Всем привет. Недавно встала задача сделать что-то типа соц. сети с возможностью создания приватных блогов, тоесть пользователь может создать свой блог, как категорию и добавлять от имени блога топики, а также нужен функционал для подписки этих пользователей к блогу.

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

И как вообще лучше это дело организовать? Может прозе сделать кастомными таблицами?
SEQUEL.ONE
15 августа 2018, 10:53
modx.pro
610
0

setup.options.php в последней версии modExtra

Всем привет. Сделал компонент на основе modExtra, но захотелось сделать установку компонентов по checkbox, но в новой версии нет файла setup.options.php и я не совсем понимаю как сделать при установке компонента форму, где можно было бы выбрать чекбоксами нужные компоненты для установки?
SEQUEL.ONE
02 августа 2018, 14:52
modx.pro
920
0

Как в modExtra сделать необязательные к заполнению поля?

Всем привет. Подскажите как в modExtra сделать необязательные к заполнению поля? Это же делается в файлах виджета ExtJS? Я сделал новые поля, но у меня все начинают помечаться в модальном окне под полями «Это поле обязательно для заполнения.»

Нужно чтобы помечалось поле name, остальные были свободны для добавления:

{
            xtype: 'textfield',
            fieldLabel: _('sonesites_item_name'),
            name: 'name',
            id: config.id + '-name',
            anchor: '99%',
            allowBlank: false,
            width: '95%',
        }, {
            xtype: 'textfield',
            fieldLabel: _('sonesites_item_domain'),
            name: 'domain',
            id: config.id + '-domain',
            anchor: '99%',
            allowBlank: false,
            width: '95%',
        },
Если я не ошибаюсь,, то это раньше делалось добавлением какого-то параметра в extjs, но вот какого я не помню :(
SEQUEL.ONE
21 июля 2018, 15:28
modx.pro
898
0

Ошибка Tickets после обновления MODX 2.6.4

При добавлении тикета через фронтенд, возникла проблема с созданием самого тикета. Во первых URI сохранился как /topics/%id-kakoy-to-text

Пропали все данные связанные с количеством просмотров, избранное и т.д. Все эти элементы неактивны и ничего не выводят.

После чего созданный тикет при переходе выдаёт 500 ошибку.

В админке список тикетов не подгружается.

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

Может кто-нибудь подсказать в чём дело?
SEQUEL.ONE
03 июля 2018, 08:12
modx.pro
613
0

Новый способ оплаты для minishop2 (Stripe)

7 2 500
Всем привет! Ищем исполнителя на написание дополнительного способа оплаты (Stripe) для miniShop2.

Вот их сайт stripe.com/

Система интегрирована в WooCommerce (плагин для Wordpress), ещё видел данный способ оплаты в компоненте для MODX от ModMore SimpleCart.

У системы есть API, через которое и нужно будет дёргать по JSON данные.

P.S. Данный компонент может популиризировать MODX, а также miniShop2 в Европе. К примеру в Германии, через него можно оплачивать с кредитных карт и разных европейских банковских систем типа giropay.

Пишите в скайп sequel.one или на почту admin@sequel.one
SEQUEL.ONE
30 июня 2018, 12:54
modx.pro
1 199
0