SEQUEL.ONE

SEQUEL.ONE

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

Как вставить системную настройку в extjs?

Всем привет.

Добиваю компонент, осталось подставить системную настройку в xtype: 'modx-combo-browser':

$modx->getOption('extras_source');
Вот код:

{
                    xtype: 'modx-combo-browser',
                    fieldLabel: _('extras_release_file'),
                    name: 'file',
                    id: config.id + '-file',
                    source: config.source || MODx.config.default_media_source,
                    anchor: '99%',
                    allowBlank: true,
                }
Как я понимаю, здесь source: config.source || MODx.config.default_media_source, вместо config.source нужно вставить системную настройку которая хранит id источника файлов.

Подскажите пожалуйста как это реализовать?
SEQUEL.ONE
12 марта 2019, 00:48
1
68
0

Как вывести в модальном окне таблицу с зависимыми данными extjs

Всем привет. Пытаюсь вывести в своём компоненте в модальном окне таблицу с релизами, кликнув по кнопке из actions на предмете из другой таблицы:

// Releases
        $array['actions'][] = [
            'cls' => '',
            'icon' => 'icon icon-archive',
            'title' => $this->modx->lexicon('extras_package_releases'),
            //'multiple' => $this->modx->lexicon('extras_packages_update'),
            'action' => 'releasesPackage',
            'button' => true,
            'menu' => true,
        ];
SEQUEL.ONE
10 марта 2019, 20:33
1
85
0

Как зайти в админку программно через API?

Всем привет. У меня довольно не стандартная задача. Мне нужно с сайта A отправить логин и пароль от админки сайта B в отдельном скрипте и при совпадении логина и пароля открывать скрытые данные, которые может получить только пользователь с админскими правами.

Вопрос. Можно ли это провернуть через API MODX и как лучше хранить данные для входа, в кукисах или сессии?
SEQUEL.ONE
02 марта 2019, 00:22
1
135
0

[Решено] Как на extjs в поле grid вывести изображение?

Всем привет. Совсем вылетело из головы как вывести в таблице изображение:

{
            header: _('image'),
            dataIndex: 'image',
            sortable: true,
            width: 100,
        }
Помню что как-то через renderTo, ещё Николай Ланец подсказывал, а начал искать и не смог найти :(

Может кто-то подсобить советом?

UPD: Сделал так:

{
            header: _('svideos_video_image'),
            dataIndex: 'image',
            sortable: true,
            width: 100,
            renderer: function(value){
                if(value)
                    return '<img width="50" src="/' + value + '">';
            }
        }
Работает как надо!
SEQUEL.ONE
01 ноября 2018, 23:47
2
152
+1

Добавить combobox в форму редактирования пользователя в админке

С добавлением поля практически справился. Создал плагин на события OnUserFormPrerender и OnUserFormSave с кодом:
<?php
switch($modx->event->name) {
	case 'OnUserFormPrerender':
		$modx->regClientStartupScript('/assets/components/orders/js/mgr/user_form/combo.js');
		$modx->regClientStartupScript('/assets/components/orders/js/mgr/user_form/tab.js');
	break;
	case 'OnUserFormSave':
		$profile = $user->getOne('Profile');
        $fields = $profile->get('extended');
        $fields['manager'] = $_POST['manager'];
        $profile->set('extended', $fields);
        $profile->save();
	break;
}

Два JS файла:
1. Для вывода новой вкладки
Ext.onReady(function() {
    var usertabs = Ext.getCmp('modx-user-tabs');
    usertabs.add({
        title: 'Модуль Заказы',
        layout: 'form',
        autoScroll: true,
        autoHeight: true,
        labelAlign: 'top',
        cls: 'main-wrapper',
        items: [
            {
                xtype: 'modx-orders-manager',
                name: 'manager',
                fieldLabel: 'Менеджер',
                width: 176,
            }
        ]
    });
});

2. Для combobox
MODx.combo.Manager = function (config) {
    config = config || {};
    Ext.applyIf(config, {
        name: 'manager',
        hiddenName: config.name || 'manager',
        displayField: 'name',
        valueField: 'id',
        fields: ['id', 'name'],
        pageSize: 9999,
        hideMode: 'offsets',
        emptyText: ' - ',
        url: MODx.config.assets_url+'components/orders/connector.php',
        baseParams: {
            action: 'mgr/manager/getlist',
            sort: 'name',
            dir: 'asc',
            combo: true,
            limit: 9999,
        }
    });
    MODx.combo.Manager.superclass.constructor.call(this, config);
};
Ext.extend(MODx.combo.Manager, MODx.combo.ComboBox);
Ext.reg('modx-orders-manager', MODx.combo.Manager);

В результате получилось вот так


Combobox выводится и данные сохраняются, но сделать чтобы после повторного открытия формы в combobox подставлялось уже сохраненное значение не получается.

И еще один вопрос, где подключить лексокон чтобы можно было вывести тексты из кода JS?
Владимир
25 сентября 2018, 00:38
1
285
+1

Добавление 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
2
648
+1

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



Всем привет. Возможно кто-то уже сталкивался с такой задачей, когда фильтры могут идти не только в одном блоке поочерёдно, но и находится выше контентной части (как показано на скриншоте). Как это можно реализовать простым и понятным путём? Не хочется городить велосипеды.
SEQUEL.ONE
22 сентября 2018, 00:51
3
592
+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
2
257
+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
2
485
+1

Как вывести API через чанк?

Всем привет. Столкнулся с проблемой при получения данных из API, данные выводятся через foreach(). Через var_dump() выводится всё как надо, но вот пытаюсь выводить это дело через $modx->getChunk() и у меня выводит только последний пункт из выборки. Вот код сниппета:

<?php
$tpl = $modx->getOption('tpl', $scriptProperties, 'tpl.PayPanel.rowTpl');
$plan = $modx->getOption('plan', $scriptProperties, 'vhost');
$host = $modx->getOption('paypanel_billmanager_url');
$format = $modx->getOption('paypanel_billmanager_format');
$login = $modx->getOption('paypanel_billmanager_login');
$password = $modx->getOption('paypanel_billmanager_password');

$url.= $host;
$url.= 'billmgr?out='.$format;
$url.= '&func=auth';
$url.= '&username='.$login;
$url.= '&password='.$password;

$json = file_get_contents($url);
$auth = json_decode($json);
$auth = (array)$auth->doc->auth;
$auth = $auth['$id'];

$api_url.= $host;
$api_url.= 'billmgr?auth='.$auth;
$api_url.= '&out='.$format;
$api_url.= '&func=pricelist.export';

$api_json = file_get_contents($api_url);
$api = json_decode($api_json);
$api = (array)$api->doc->pricelist;

foreach($api as $k => $v) {
    $group = (array)$v->itemtype_info->intname;
    $group = $group['$'];
    if($group == $plan) {
        $name = (array)$v->name;
        $name = $name['$'];
        $description = (array)$v->description_ru;
        $description = $description['$'];
        $addon = $v->addon;
        $price = (array)$v->price;
        unset($price['$currency']);
        
        foreach($price as $period => $p) {
            $p1 = (array)$p['0'];
            $cost1 = $p1['$cost'];
            $type1 = $p1['$type'];
            $length1 = $p1['$length'];
            $orderlink1 = $p1['$orderlink'];
            
            $p2 = (array)$p['1'];
            $cost2 = $p2['$cost'];
            $type2 = $p2['$type'];
            $length2 = $p2['$length'];
            $orderlink2 = $p2['$orderlink'];
            
            $p3 = (array)$p['2'];
            $cost3 = $p3['$cost'];
            $type3 = $p3['$type'];
            $length3 = $p3['$length'];
            $orderlink3 = $p3['$orderlink'];
            
            $p4 = (array)$p['3'];
            $cost4 = $p4['$cost'];
            $type4 = $p4['$type'];
            $length4 = $p4['$length'];
            $orderlink4 = $p4['$orderlink'];
            
            $modx->setPlaceholder('name', $name);
            $modx->setPlaceholder('description', $description);
            $modx->setPlaceholder('cost1', $cost1);
            $modx->setPlaceholder('type1', $type1);
            $modx->setPlaceholder('length1', $length1);
            $modx->setPlaceholder('orderlink1', $orderlink1);
            $modx->setPlaceholder('cost2', $cost2);
            $modx->setPlaceholder('type2', $type2);
            $modx->setPlaceholder('length2', $length2);
            $modx->setPlaceholder('orderlink2', $orderlink2);
            $modx->setPlaceholder('cost3', $cost3);
            $modx->setPlaceholder('type3', $type3);
            $modx->setPlaceholder('length3', $length3);
            $modx->setPlaceholder('orderlink3', $orderlink3);
            $modx->setPlaceholder('cost4', $cost4);
            $modx->setPlaceholder('type4', $type4);
            $modx->setPlaceholder('length4', $length4);
            $modx->setPlaceholder('orderlink4', $orderlink4);
            
            $output = $modx->getChunk($tpl);
        }
    }
}
return $output;
SEQUEL.ONE
09 мая 2018, 12:06
1
453
0