Блог

Запуск сниппета из админки MODX

  • Евгений Ц.
  • Нет комментариев

В этом материале я приведу лишь абстрактный пример того, как сделать "кнопку" для запуска сниппетов из админ панели MODX. О более конкретном применении у себя я возможно расскажу немного позже.

Для начала создадим сниппет, и назовём его например mySnippet:

<?php
if (!$modx->user->isAuthenticated('mgr')) return;
return "<h2>Привет, я сниппет!<h2>";

Теперь создадим ресурс myResource содержащий вызов сниппета.

[[!mySnippet]]

Ресурс должен быть с пустым шаблоном. Так же следует снять галочку "Доступен для поиска" и установить "Скрыть из меню".

Скрипт, который выведет модальное окно и выполнит загрузку нашего ресурса:

function buildWindow() {
    var u=location.protocol + '//' + location.host + '/myresource';
    var win = new Ext.Window({
    id: 'my_window'
    , title : 'Run mySnippet'
    , width : 600
    , height: 500
    , layout: 'fit'
    ,buttons: [{
	    text: 'Закрыть' || _('cancel')
	    ,scope: this
	    ,handler: function() {win.close();}
    }]
    ,autoLoad: {
        url : u
    }
    });
    win.show();
}
Ext.onReady(buildWindow);

Если в url вы используете расширения, например .html, то в строке 2 должно быть myresource.html

Далее:

1. Наводим мышь на шестерёнку в верхнем правом углу и выбираем "Меню"

2. Выбираем "Добавить пункт"

3. Родителем указываем "Верхнее меню" и в "Ключ словаря" заполняем название раздела, в моём примере он называется "Мои сниппеты"

4. Добавляем еще один пункт, но теперь родителем выбираем пункт созданный на предыдущем этапе - "Мои сниппеты". В "Ключ словаря" заполняем название сниппета. В "Обработчик" вставляем скрипт, код которого я приводил выше. Тэги <script></script> не нужны.

Перезагружаем страницу, и вот что в итоге должно получиться:

ВНИМАНИЕ!!! Если вы захотите вставить javascript в обработчик на верхнем уровне меню, не создавая подпунктов, то обязательно заключите весь код в тэги {literal}...{/literal}. Для подпунктов этого делать не нужно.

Запускаем сниппет. Если всё правильно, то вы должны увидеть это:

Обработка форм

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

Код javascript будет выглядеть следующим образом:

Ext.onReady(function () {
	var my_url = location.protocol + '//' + location.host + '/myresource';
	var myForm = new Ext.FormPanel({
		xtype: 'modx-formpanel',
		columnWidth: 1,
		layout: 'form',
		id: 'my_form',
		bodyPadding: 50,
		labelWidth: 150,
		items: [{
			xtype: 'textfield',
			name: 'firstname',
			fieldLabel: 'Ваше имя',
			anchor: '80%',
		        },{
			xtype: 'textfield',
			name: 'lastname',
			fieldLabel: 'Ваша фамилия',
			anchor: '80%'
		        },{
			html: '<h3>Какие фрукты Вы любите?</h3>',
			style: 'margin-top:20px; text-align:center',
			anchor: '100%'
		        },{
			xtype: 'checkbox',
			inputValue: 'яблоки',
			boxLabel: 'Яблоки',
			name: 'fruit',
			anchor: '50%'
		        },{
			xtype: 'checkbox',
			inputValue: 'груши',			
			boxLabel: 'Груши',
			name: 'fruit',
			anchor: '50%'
		        },{
			xtype: 'checkbox',
			inputValue: 'апельсины',			
			boxLabel: 'Апельсины',
			name: 'fruit',
			anchor: '50%'
		        }]
	    });
	    var win = new Ext.Window({
		    id: 'my_window',
		    title: 'Fruits',
		    width: 600,
		    height: 500,
		    layout: 'fit',
		    items: [myForm],
		    buttons: [{
			text: 'Оправить',
			cls: 'primary-button',
			handler: function () {
			    var formData=JSON.stringify(myForm.getForm().getValues());
			    Ext.Ajax.request({
				url: my_url,
				params: {
				    json: formData
				},
				success: function (data) {
				    Ext.MessageBox.alert('Сообщение', data.responseText);
				}
			    });
			}
		       },{
			text: 'Закрыть',
			scope: this,
			handler: function () {
				win.close();
			}
		}]
	});
	win.show();
});

Ну и сниппет должен соответственно принять и обработать данные:

<?php
if (!$modx->user->isAuthenticated('mgr')) return;
$res=json_decode($_POST['json']);
if (!$res->firstname || !$res->lastname) return "Заполните все поля";
is_array($res->fruit) ? $ilike="Вы любите ".implode(", ",$res->fruit) : $ilike="Вы любите только ".$res->fruit;
if (!$res->fruit) $ilike="Вы не любите фрукты";
$a="Здравствуйте, ".$res->firstname." ".$res->lastname."! ".$ilike;
return $a;

В итоге выглядеть это должно так:

И после отправки формы:

На этом всё.

Комментарии ()

    Оставить комментарий

    *Ваш email адрес не будет опубликован.

    Введите сумму 7 + 7 =