Владислав

Владислав

С нами с 11 августа 2015; Место в рейтинге пользователей: #1008
but1head
20 сентября 2016, 00:32
2
0
Примерно так
правда у меня еще куча своих функций и контроллеров под жирные проекты, да и раскидано это по разным файлам.

<?php
define('MODX_API_MODE', true);
require $_SERVER["DOCUMENT_ROOT"].'/index.php';
$modx->getService('error','error.modError');

$functions = new _modx($modx);
$functions->sendMail('mail@site.ru', 'subject', 'message');

class _modx {
	public $modx;
	function __construct(modX &$modx){
        $this->modx =& $modx;
		$this->pdoFetch = $this->modx->getService('pdofetch','pdoFetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', array());
	}

	function sendMail($email, $subject, $body = ''){
		$mail = $this->modx->getService('mail', 'mail.modPHPMailer');
	    $mail->setHTML(true);
	    $mail->address('to', trim($email));
	    $mail->set(modMail::MAIL_SUBJECT, trim($subject));
	    $mail->set(modMail::MAIL_BODY, $body);
	    $mail->set(modMail::MAIL_FROM, $this->modx->getOption('emailsender'));
	    $mail->set(modMail::MAIL_FROM_NAME, $this->modx->getOption('site_name'));
	    if (!$mail->send()) {
	        $modx->log(modX::LOG_LEVEL_ERROR,
	            'An error occurred while trying to send the email: ' . $mail->mailer->ErrorInfo
	        );
	    }
	    $mail->reset();
	}
}

А вот контроллер под ajax запросы
<?php
if(!is_ajax() && !$_POST['action']) die('Request error');
$action = strip_tags($_POST['action']);
require_once($_SERVER["DOCUMENT_ROOT"].'/***/api.php');
require_once($_SERVER["DOCUMENT_ROOT"].'/***/functions.php');


switch($action){

}



function is_ajax() {
	return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
}
Николай Загумённов
08 июня 2016, 23:50
4
+2
Спасибо Паше за помощь. Открыл для себя Ext.ComponentMgr.onAvailable.

Вот такой плагин получился и не надо создавать никаких comments2.grid.js.
<?php
switch ($modx->event->name) {
    case 'OnBeforeManagerPageInit':
        
        if ($action['namespace'] == 'tickets' && $action['controller'] == 'index') {
            $modx->controller->addHtml("<script type='text/javascript'>
                Ext.ComponentMgr.onAvailable('tickets-home-tabs', function() {
                    // Тут можно переопределять все что угодно
                });
            </script>");
        }
        break;
}
mekirile
26 мая 2016, 11:36
1
0
Цель успешного заказа правильнее вешать на колбек успешного заказа. На странице корзины должен быть скрипт:

miniShop2.Callbacks.Order.submit.response.success = function () {
yaCounterXXXXXXX.reachGoal('SUCORD'); // код вашего счётчика и идентификатор цели - успешный заказ.
}
Максим Кузнецов
01 мая 2016, 21:41
1
+1
Как вариант — написать плагин примерно следующего содержания:
<?php
	if ($modx->event->name == "OnDocFormRender" && $mode == "new") {
		if ($parent = intval($_REQUEST['parent'])) {
		
			if (isset($modx->controller)) {
				switch ($parent) {
					case '1':
						$newTemplate = '10';
						break;
					//...
				}

				$modx->controller->setProperty('template', $newTemplate);
			}
		}
	}
Максим Кузнецов
21 апреля 2016, 21:52
1
0
Чистый запрос, пожалуй, будет более уместным из-за отсутствия лишней передаваемой информации.

TV — Возможные значения (подойдет для одиночного и множественного списка):
@EVAL return $modx->runSnippet('name');

Код сниппета:
<?php
	$q = $modx->newQuery('modResource');
	//пример ограничения выборки
	$q->where(array(
		"parent" => "16",
		"template" => "10"
	));
	$q->sortby('pagetitle','ASC');

	$q->select(array(
		"modResource.id",
		"modResource.pagetitle",
	));

	$s = $q->prepare();
	$s->execute();

	//если тип тв - одиночный список, то можно также дописать "заглушку" без реального значения:
	//$data[] = "Выберите категорию из списка==";
	while($row = $s->fetch(PDO::FETCH_ASSOC)){
		$data[] = "{$row['pagetitle']}=={$row['pagetitle']}";
	}

	$output = implode("||", $data);
	return $output;
Василий Наумкин
24 марта 2016, 07:44
8
+2
Лично я закрываю служебные директории через веб-сервер на случай обнаружения новой уязвимости в MODX.

Например, как это было, когда движок некорректно обрабатывал запросы в несуществующий контекст в коннекторах. Там еще одна PHP авторизация не помогла бы, так как хакер получал доступ к API через обычные GET запросы к определённому файлу.

Именно поэтому я закрываю для доступа снаружи и админку, и коннекторы, и ядро. Причём, не через потенциально уязвимый движок, а средствами гораздо менее потенциально уязвимого Nginx.
location ~* ^/(core|manager|connectors)/ {
    auth_basic "Restricted Access";
    auth_basic_user_file /home/site/.htpasswd;
    try_files               $uri $uri/ @rewrite;
    location ~ \.php$ {
            include         fastcgi_params;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass    backend-site;
    }
}

А зачем нужна вот эта инструкция — большой вопрос.
Максим
22 декабря 2015, 20:23
2
0
Спасибо всем кто думал! Новый xtype подсмотрел и скопировал заменив соответствующие параметры! Но как всегда при копировании чужого кода нет понимания. Новое поле стало обязательным для заполнения. Как его сделать не обязательным?
Вот что получилось:
Ext.namespace('miniShop2.combo');
miniShop2.combo.Fundament = function(config) {
    config = config || {};
    Ext.applyIf(config, {
        name: config.name || 'fundament',
        fieldLabel: _('ms2_product_' + config.name || 'fundament'),
        hiddenName: config.name || 'fundament',
        description: '<b></b>'+_('ms2_product_fundament_help'),
        ValueField: 'id',
        anchor: '99%',
        fields: ['id','name'],
        pageSize: 20,
        url: miniShop2.config.connector_url,
        typeAhead: false,
        edittable: false,
        allowBlank: false,
        store: [[0, 'Брус'], [1, 'Сваи']]
    });
    miniShop2.combo.Vendor.superclass.constructor.call(this, config);
};
Ext.extend(miniShop2.combo.Fundament, MODx.combo.ComboBox);
Ext.reg('minishop2-combo-fundament', miniShop2.combo.Fundament);

//miniShop2.plugin.twidth = {
miniShop2.plugin.msfield = {
	getFields: function(config) {
		return {
			twidth: {xtype: 'minishop2-combo-autocomplete', description: '<b>[[+twidth]]</b><br />'+_('ms2_product_twidth_help')},
            theight: {xtype: 'minishop2-combo-autocomplete', description: '<b>[[+theight]]</b><br />'+_('ms2_product_theight_help')},
            tlength: {xtype: 'minishop2-combo-autocomplete', description: '<b>[[+tlength]]</b><br />'+_('ms2_product_tlength_help')},
            karkasDesc: {xtype: 'textarea', description: '<b>[[+karkasDesc]]</b><br />'+_('ms2_product_karkasDesc_help')},
            tlengthXm: {xtype: 'modx-combo-property-set', description: '<b>[[+tlengthXm]]</b><br />'+_('ms2_product_tlengthXm_help')},
            fundament: {xtype: 'minishop2-combo-fundament', description: '<b>[[+fundament]]</b><br />'+_('ms2_product_fundament_help')}
		}
	}
	,getColumns: function() {
		return {
			twidth: {width:30, sortable:false, editor: {xtype:'minishop2-combo-autocomplete', name: 'twidth'}},
            theight: {width:30, sortable:false, editor: {xtype:'minishop2-combo-autocomplete', name: 'theight'}},
            tlength: {width:30, sortable:false, editor: {xtype:'minishop2-combo-autocomplete', name: 'tlength'}},
            karkasDesc: {width:30, sortable:false, editor: {xtype:'textarea', name: 'karkasDesc'}},
            tlengthXm: {width:30, sortable:false, editor: {xtype:'modx-combo-property-set', name: 'tlengthXm'}},
            fundament: {width:30, sortable:false, editor: {xtype:'minishop2-combo-fundament', name: 'fundament'}}
		}
	}
};
Илья Уткин
24 июня 2015, 09:32
3
+1
У ресурса есть метод cleanAlias, который генерирует псевдоним:

$title = $data->get('pagetitle') . '-' . $data->get('id');
$alias = $data->cleanAlias($title);
$data->set('alias', $alias);
$modx->runProcessor('resource/update', $resource->toArray());
Максим Кузнецов
12 января 2015, 11:26
1
0
Выпадающий список данной структуры реализуется за счет тега optgroup. Пример:

<select>
  <optgroup label="Категория 1">
    <option value="1">Параметр 1</option>
    <option value="2">Параметр 2</option>
  </optgroup>
</select>
Т.е. нужно модифицировать формат вывода getResourse к данной структуре.