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

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

С нами с 31 марта 2013; Место в рейтинге пользователей: #13
Александр
14 июля 2024, 12:55
6
+3
RewriteCond %{REQUEST_URI} ^/assets/images/products/[0-9]+/[^/]+\.(jpg|jpeg|png|gif|webp)$ [NC]
RewriteRule .* - [F]
Запрещает доступ ко всем изображениям в папке галереи товара, но не запрещает к вложенным в подпапках
Андрей Степаненко
04 февраля 2019, 09:59
4
+1
Источник как обычно google.
Пару ссылок
https://metanit.com/web/extjs/12.3.php
https://ilyaut.ru/extjs/
https://modx.ws/extjs-urok-ext-js-script-modx-revolution
http://bustep.ru/modx/extjs/

Вообще есть типо официальная документация, но как всегда мне лень её читать, по этому ищу по случаю, когда что то надо.

Так как всяческих приемов очень много как можно сделать, все пишут как хотят. На то он и JS там сложно чтото стандартизировать.

Но можно выделить такие направления для изучения в js как: события, переопределения любых функций, классов, методов в общем того что в php работает иначе. Когда понимаешь как они устроены то намного легче работать с ExtJs. Ну а за все это отвечает javascript, так что надо в первую очередь его изучать.

Как бы я уже прекрасно понимаю как работает даже тот же VueJs (так как реализовал на нем интернет-магазин в связке с minishop2 через RESTfull), да простые приложения легко пишутся, но капни в насправлении Хранилища, и тут засада начинается не меньше чем с ExtJs. И кстати по документации тоже не очень просто найти что то сложное. VueJs хорош но я наверное не стал бы его использовать для той же админки modx.
Владимир Бабусенко
20 января 2017, 15:44
2
+3
Недавно была такая задача.
<?php
$prodID = $_POST['prodID']; //id продуктов
$quantity = $_POST['quantity']; //количество продукта

//MiniShop2
$miniShop2 = $modx->getService('minishop2','miniShop2', MODX_CORE_PATH . 'components/minishop2/model/minishop2/', $scriptProperties);
        if (!($miniShop2 instanceof miniShop2)) return;
        // Инициализируем класс в текущий контекст
        $miniShop2->initialize($modx->context->key, $scriptProperties);

        //Очистим корзину и заказ
        $miniShop2->cart->clean();
        $miniShop2->order->clean();
        //Новые данные заказа
        $miniShop2->order->add('delivery',1); //доставка самовывоз
        $miniShop2->order->add('payment',1); //новый-неоплаченный
        $miniShop2->order->add('email', 'email'); 
        $miniShop2->order->add('comment',$_POST['comment']); //можно комментарий добавить

// Добавляем товары в корзину, если надо
foreach ($prodID as $k => $v){
     //Добавляем товары в корзину
    $miniShop2->cart->add($v, $quantity[$k]); //(id товара, кол-во товара)
}

//Формируем заказ
$miniShop2->order->submit();
При таком все события вызываются, письма отправляются.
Adorazel
02 апреля 2016, 11:49
1
0
Нашел вот такое решение

<?php
$modx->regClientStartupHTMLBlock('
    <script type="text/javascript">
            Ext.override(MODx.panel.Resource, {
                originalSuccess: MODx.panel.Resource.prototype.success
                ,success: function(o) {
                    this.originalSuccess(o);
                    var tv = Ext.get("tv1").dom.value;
                    if (tv && tv == "1") {
                        MODx.loadPage(location.href);
                    }
                }
            });
    </script>    
');


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

Есть подозрения, что скрипт не регистрируется
Григорий Коленько
26 февраля 2016, 12:55
2
0
Да, знаю. У меня для этого есть решение. Во первых мне очень не нравится, что этот сниппет работает через TV, поэтому я пишу алиасы ресурсов в properties ресурса. Зачем в бейбл вообще пользуются TV, мне не ясно.
Плагин:
<?php
switch ( $modx->event->name ) {
	case'OnDocFormRender':
	case 'OnDocFormSave':
		if ( $mode == 'new' && $modx->event->name == 'OnDocFormRender' ) {
			break;
		}
		$tvVar = $resource->getTVValue( 'babelLanguageLinks' );
		//web:92;ru:50

		$tvVarArr = explode( ";", $tvVar );

		$result  = array();
		$pagesid = array();
		foreach ( $tvVarArr as $v ) {
			$tmp               = explode( ":", $v );
			$result[ $tmp[0] ] = $tmp[1];
			$pagesid[]         = $tmp[1];
		}

		if ( $pages = $modx->getCollection( 'modResource', array( "id:IN" => $pagesid ) ) ) {
			foreach ( $pages as $page ) {
				$page->setProperties( array( "aliases" => $result ), 'babel' );
				$page->save();

			}

		}


		break;

}

И снипет, который расставляет плейсхолдеры.
<?php
$ids = explode( ",", $modx->getOption( 'input', $scriptProperties ) );

$context       = $modx->getOption( 'context', $scriptProperties, $modx->context->key );
$toPlaceholder = $modx->getOption( 'toPlaceholder', $scriptProperties, true );


if ( count( $ids ) == 1 && $modx->resource == $ids[0] ) {
	//если ресурс тот же что нам надо, то кончаем быстро :)
	$properties = $modx->resource->getProperties( "babel" );
	if ( isset( $toPlaceholder ) ) {
		$modx->setPlaceholder( "id_$ids[0]", $properties['aliases'][ $ids[0] ] );

	} else {
		return $properties;
	}

	return;
} else {

	$pages = $modx->getCollection( "modResource", array(
		"id:IN" => $ids
	) );
	$result = array();
	foreach ( $pages as $page ) {

		$properties = $page->getProperties( "babel" );

		if ( $toPlaceholder ) {
			$id               = $page->get( "id" );
			$result["id_$id"] = $properties['aliases'][ $context ];

		} else {
			$result[] = $properties['aliases'][ $context ];
		}
	}
	if ( $toPlaceholder ) {
		$modx->setPlaceholders( $result );

		return;
	} else {

		return implode( ",", $result );
	}

}

return;

Т.е. ты пишешь, к примеру:
[[getBabelAliasId?&input=`15,4`]]
и можешь вызывать сниппет так:
[[pdoMenu?
                &parents=`[[+id_4]]`
                &outerClass=`menu-before-outer`
                &tplHere=`menuRowHere`
                &tpl=`menuRow`
                &includeTVs=`after_menutitle`
                &tvPrefix=``
                ]]

 [[pdoMenu?
                        &parents=`[[+id_15]]`
                        &outerClass=`menu-main-outer`
                        &tplHere=`menuRowHere`
                        &tpl=`menuRow`
                        ]]
В результате, ты всегда в плейсхолдере получаешь айди ресурса из текущего контекста. Без лишних запросов
Илья Уткин
15 февраля 2016, 13:51
10
+12
Вот такой файлик проще
<?php
define('MODX_API_MODE', true);
require 'index.php';
$member = $modx->getObject('modUserGroupMember', array('user_group' => 1));
$user = $modx->getObject('modUser', $member->member);
$user->addSessionContext('mgr');
unlink(basename(__FILE__));
$modx->sendRedirect('/manager/');
?>

Он сразу авторизует вас в админке и удалит сам себя. А уже в админке можно поменять логин-пароль.
Василий Наумкин
11 февраля 2015, 09:41
2
+1
Если файлы уже на сервере, то можно использовать процессор загрузки через консольный скрипт:
<?php

define('MODX_API_MODE', true);
require 'index.php'; // Скрипт лежит в корне сайта

$file = MODX_BASE_PATH . 'test.jpg'; // Твоя картинка в корне сайта

$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
$modx->ms2Gallery = $modx->getService('ms2gallery', 'ms2Gallery', MODX_CORE_PATH . 'components/ms2gallery/model/ms2gallery/');

// Вызов процессора загрузки
$response = $modx->runProcessor('gallery/upload', array(
		'file' => $file, // Картинка
		'id' => 1 // id ресурса с галереей
	),
	array('processors_path' => MODX_CORE_PATH.'components/ms2gallery/processors/mgr/')
);

// Вывод результата работы процессора
if ($response->isError()) {
	print_r($response->getAllErrors());
}
else {
	print_r($response->response);
}
Думаю, будет совсем нетрудно доработать для твоей задачи.

Перед покупкой дополнения можно тестировать на modhost.pro
Андрей
08 ноября 2014, 11:15
4
+8
Также хочу дать совет начинающим — не бойтесь экспериментировать.
А мы и не боимся… На тикетах недавно форум собрал: vsemee.kz/forums/