Наумов Алексей

Наумов Алексей

С нами с 31 марта 2013; Место в рейтинге пользователей: #13
Наумов Алексей
29 мая 2020, 09:25
+1
Я делаю так (именно для создания вкладки у ресурса!):
1. Плагин на OnDocFormRender, для новых ресурсов вкладку не показываю:
<?php
/** @var array $scriptProperties */
switch ($modx->event->name) {
    case 'OnDocFormRender':
        /** @var modResource $resource */
        if ($mode == 'new') {
            return;
        }
...
2. Далее подключаю все нужные js файлы, их у компонента много может быть, я для пример 2 показываю, но по факту их 10+:
$url = $easyComm->config['assetsUrl'];
$modx->controller->addJavascript($url . 'js/mgr/easycomm.js');
.... и остальные файлы
 $modx->controller->addLastJavascript($url . 'js/mgr/widgets/page.panel.js');
3. Далее есть сценарий, что установлен AjaxManager, тогда 2 варианта создания вкладки, немного разных:
if ($modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
            $modx->controller->addHtml('
			<script type="text/javascript">
				Ext.onReady(function() {
					window.setTimeout(function() {
						var tabs = Ext.getCmp("modx-resource-tabs");
						if (tabs) {
							tabs.add({
								xtype: "ec-panel-page",
								id: "ec-panel-page",
								title: _("ec"),
								record: {
									id: ' . $resource->get('id') . '
								}
							});
						}
					}, 10);
				});
			</script>');
        }
        else {
            $modx->controller->addHtml('
			<script type="text/javascript">
				Ext.ComponentMgr.onAvailable("modx-resource-tabs", function() {
					this.on("beforerender", function() {
						this.add({
							xtype: "ec-panel-page",
							id: "ec-panel-page",
							title: _("ec"),
							record: {
								id: ' . $resource->get('id') . '
							}
						});
					});
					Ext.apply(this, {
							stateful: true,
							stateId: "modx-resource-tabs-state",
							stateEvents: ["tabchange"],
							getState: function() {return {activeTab:this.items.indexOf(this.getActiveTab())};
						}
					});
				});
			</script>');
        }
4. ec-panel-home это уже панель вашего компонента, описана в page.panel.js, который был подключен на странице в плагине, ну типа:
easyComm.panel.Page = function (config) {
    config = config || {};
    Ext.apply(config, {
        baseCls: 'modx-formpanel',
        layout: 'anchor',

        hideMode: 'offsets',
        items: [ а здесь все содержимое, вкладки, формы и т.д. ]
    });
    easyComm.panel.Page.superclass.constructor.call(this, config);
};
Ext.extend(easyComm.panel.Page, MODx.Panel);
Ext.reg('ec-panel-page', easyComm.panel.Page);
Наумов Алексей
27 мая 2020, 13:43
0
В принципе да.
А далее просто в зависимости от домена выводите нужные контакты к примеру и т.п.
Наумов Алексей
27 мая 2020, 12:18
0
Если сайты одинаковы — конечно да.
Делал, не раз.
Просто настраиваете, чтобы сайт открывался по всем вашим доменам, это даже скорее не к MODX вопрос, а к хостингу.
Наумов Алексей
26 мая 2020, 16:24
+1
Странно… думаю, что miniShop не заточен для такого использования.
А что если: сделать запрос с json_response, получить информацию о заказе, а потом отправить серверу еще один запрос с №заказа, и уже так сказать, со второй попытки, отрендерить чанк.
Наумов Алексей
26 мая 2020, 16:07
+1
Да, вот она и разгадка:
$scriptProperties = array(
    'json_response' => 1, // ТА-ДАМ
    'max_count' => 1,
    'allow_deleted' => 0,
    'allow_unpublished' => 0
);
Наумов Алексей
26 мая 2020, 16:00
0
Я просмотрел код miniShop2, что-то не вижу, чтобы он отправлял в вывод ответ и прекращал работу php… Например success
А каких-нибудь плагинов на ms*** нет активных у сайта, которые могут так делать?
Наумов Алексей
26 мая 2020, 15:45
0
{$_modx->runSnippet('!pdoMenu', [
    'parents' => $_modx->runSnippet('!getparents'),
    'level' => 1,
    'sortby' => $sortby,
    'tplOuter' => 'chunk'
    'tpl' => 'chunk'
    'tplHere' => 'chunk'

])}
Наумов Алексей
26 мая 2020, 13:13
0
{'pdoMenu' | snippet : [
...
'tpl' => 'tplHideSomeChilds'
]}

tplHideSomeChilds:
<li {$classes}>
    <a href="{$link}" {$attributes}>{$menutitle}</a>
    {if $id != 1532}
        {$wrapper}
    {/if}
</li>
Наумов Алексей
26 мая 2020, 12:05
0
Два сценария:
1. Включить в pdoMenu проверку прав (параметр checkPermissions) и настроить их. Работает, но подтормаживает, т.к. много запросов в БД.
2. Лучше просто пересмотреть верстку, и для авторизованных сделать блок (пример из документации):
{if $_modx->user.id > 0}
    Привет, {$_modx->user.fullname}!
{else}
    Вам нужно авторизоваться!
{/if}
Наумов Алексей
25 мая 2020, 13:18
0
Далек от SqLite.
А какое практическое применение? Какая выгода в сценарии MODX + SqLite?
Наумов Алексей
25 мая 2020, 09:35
0
Так это Связи в чистом виде, многие-ко многим. Вот только оба ресурса должны быть товарами…
Наумов Алексей
20 мая 2020, 12:31
0
Создаем отдельный чанк для параметра tpl у pdoMenu:
{if $id = 1532}
<li><h3>Заголовок</h3></li>
{/if}
<li {$classes}><a href="{$link}" {$attributes}>{$menutitle}</a>{$wrapper}</li>
где 1532 id ресурса «Все о подписках».
Наумов Алексей
19 мая 2020, 12:28
+1
Попробуй оформить заказ, не указывая почту.
Напоминает попытку сделать поле email необязательным.
Если почта не указывается — генерируется случайная.
Наумов Алексей
13 мая 2020, 09:55
+1
Создай сниппет ".uri", который ничего не делает.
Наумов Алексей
08 мая 2020, 13:35
0
Можно при не нажатой галочке поле отключить (disabled) и присваивать «пустое» значение например "-".
При установке галочки поле включаем, если значение дефис — очищаем, предоставляя возможность его заполнить.
Наумов Алексей
29 апреля 2020, 16:35
+1
Создаем значит сниппет FileDownload
В нем любым алгоритмом, который сможете найти по запросу «php обратимое шифрование» зашифровываете имя файла, после чего выводите ссылку /download?file=ЗАШИФРОВАННЫЙ_ПУТЬ
На странице /download другой сниппет читает GET параметр и отдает файл, на эту тему читаем к примеру статью habr.com/ru/post/151795/
Наумов Алексей
29 апреля 2020, 16:28
+1
Может поискать узкие места на сайте, возможно есть что оптимизировать?
А насчет конфигурации VPS… если сайт простой, то и 512 мБ памяти хватит, а если тяжелый, может 4 Гб нужно, данных мало :)

Большой совет — попробовать максимально в кеш данные класть, какие-то промежуточные наборы данных, готовые куски верстки и т.д.

У VDS еще такая проблемка, что при резких всплесках нагрузки нет большого запаса, вы явно ограничены памятью и процессором. В случае обычного хостинга, как правило, считаются средние нагрузки за какой-то период и кратковременные всплески проходят хорошо.