Евгений Шеронов

Евгений Шеронов

С нами с 20 мая 2015; Место в рейтинге пользователей: #30
Андрей Степаненко
12 февраля 2019, 07:17
2
0
Схема работы с RESTfull для modx реализована по документации

Что нужно сделать, пошагово:
Создаем index файл для обработки запросов
rest/index.php
https://gist.github.com/webnitros/b8e56c0482a797c926e69ff507a72aa9
Создаем контроллер: пример файла контроллера для получения способов оплаты из minishop
rest/Controllers/payment.php
https://gist.github.com/webnitros/bc2cf0417df58a945202a55683519d1e
В конфиге nginx прописываем вот так:
location /rest/ {
                try_files $uri @modx_rest;
        }
        location @modx_rest {
                rewrite ^/rest/(.*)$ /rest/index.php?_rest=$1&$args last;
        }
Обащение происходит
https://mysite.ru/rest/payment
Вернет массив данных в json формате

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

Дальше уже включаем фантазию и разбираемся с классом rest.modRestService

И тут вот чтобы не ошибатся
yadi.sk/i/MyAlG1dNdIEOWQ

MyController — это название основного префикса? и прописывается он в rest/index.php
То есть если у вас контроллер называется вот так resource то класс для него будет
MyControllerResource
rest/Controllers/resource.php
Кстати контроллер работает имено в связке vue с modx
Денис
21 мая 2018, 15:01
3
+3
Создайте плагин на событие OnManagerPageBeforeRender с следующим кодом:

switch ($modx->event->name) {
    case 'OnManagerPageBeforeRender':
        if($controller->config['controller'] == "security/user") {
            $controller->addHTML('
                <script>
                    Ext.ComponentMgr.onAvailable("modx-panel-users", function () {
                        this.items[1].items[1].baseParams = {
                            action: "security/user/getList",
                            usergroup: MODx.request["usergroup"] ? MODx.request["usergroup"] : "",
                	    sort: "id"
                        };
                    });
                </script>
            ');
        }
    break;
}
Hetzerok
14 ноября 2017, 16:47
1
0
По умолчанию отправляет через mail(), однако может отправлять и через SMTP — нужно проверить системные настройки почты.
В качестве хука email выступает метод email() класса fiHooks. Расположен он в файле formit/model/formit/fihooks.class.php.
Сергей Шлоков
27 октября 2017, 07:06
1
+1
Не хотел отвечать — думал ты стебаешься. А сейчас думаю, ты скорее всего до конца не вник. Не имеет значения, что ты укажешь — паттерн или стили или еще чего с фигурными скобками. ignore не работает из-за специфики парсинга MODX. Попробуй добавить в примере выше (доступ я давал) в секцию HEAD следующий код
{ignore}<style>body {color: red}</style>{/ignore}
Fenom выдаст ошибку компиляции.
Василий Наумкин
10 октября 2017, 12:39
6
+5
Если покопаться в MODX API то можно научиться выводить любой ресурс в плагине на нужном событии:
$modx->resource = $modx->getObject('modResource', $modx->getOption('site_start'));
$modx->resource->set('content', $pdoTools->runSnippet('@FILE snippets/get_panel.php'));
$modx->request->prepareResponse();
Здесь, как видно, еще и замена контента на свой идёт, на лету.

Можно так на лету и виртуальные ресурсы делать, со своими pagetitle и прочими свойствами. При желании, можно вообще весь сайт без ресурсов сделать =)
Борис
05 сентября 2017, 16:30
1
0
Поправил описание, добавил примеры.
Максим Кузнецов
19 мая 2017, 00:31
1
+2
Оум, спасибо..)

Ну, контексты здесь больше не для визуального разграничения, а для того, чтобы менеджерам не мозолить глаза техническими страницами (контекст для них спрятан).
По виджетам тоже настройка довольно простая, вроде даже рассказывать нечего… Разве только дефолтный shopStats переписан.
Если есть какой-то конкретный вопрос по модулю — спрашивайте, расскажу.)

Из интересного там, на мой взгляд, комплексный маршрутизатор характеристик — т.к. ассортимент товаров разнообразный, вставал вопрос с отображением в списках товаров только нужных параметров, при этом не плодя под каждый вариант свой чанк/шаблон/категорию. В итоге все удалось решить при помощи 1 плагина + селектора для категории.
Ну да тут в двух словах не описать.

Надеюсь, как закрою большую часть проектов, доберусь написать какой-нибудь комплексный гайд по созданию сайта, с учетом fenom-a и относительно свежих решений..)
Максим Кузнецов
09 апреля 2017, 13:08
3
+2
Вообще, для сео это совсем не критично, т.к:
— если вам необходимо добавить страницы пользователей в sitemap, то это можно сделать в рамках pdoUsers
— если вам необходимы динамичные заголовки и мета-теги, то можно сделать примерно так:

1. В плагине создаем плейсхолдер user_id

2. В мета-тегах проверяем его наличие:
{block 'meta'}
	{var $user_id = $_modx->getPlaceholder('user_id')} 

	{if $user_id | length > 0}
		{var $user_name = $_modx->getPlaceholder('user_name')}
		{var $pagetitle = $user_name ~ ' / Профиль пользователя'}
	
		<title>{$pagetitle ~' :: '~ $_modx->config.site_name}</title>
		...
	{else}
		{parent}
		//обычный набор мета-тегов
	{/if}
{/block}
— надеюсь логика понятна..)

Что же до примера со вторым вариантом, то примерно вот так:

1. Создание страницы пользователя (тикетом)
<?php
	if ($modx->event->name == 'OnUserActivate') {
		if ($user) {
			if ($profile = $user->getOne('Profile')) {
				$user_id = $user->get('id');
				$fullname = $profile->get('fullname');

				/* Можно распределять пользователей в зависимости от их группы */
				if ($user->isMember('Users')) {
					//указываем родителя и шаблон
					$parent = 21;
					$template = 28;
				}
	
				if (isset($parent)) {	
					//Дополнительно может потребоваться проверка на то, создана ли уже страница для пользователя 
					//(на случай, если у вас возможна повторная активация-деактивация пользотвалея 
					$page = $modx->getObject('modResource', array(
						'parent' => $parent,
						'createdby' => $user_id
					));
		
					if (!$page) {
						/* Формируем uri по айди пользователя */
						$parent_alias = $modx->getObject('modDocument', $parent)->get('alias');
						$parent_alias .= '/' . $user_id;
					
						$ticket = $modx->newObject('modDocument');
					
						$ticket->set('parent', $parent);
						$ticket->set('template', $template);
						$ticket->set('class_key', 'Ticket');
						$ticket->set('show_in_tree', 0);
						$ticket->set('published', 1);
						$ticket->set('author', $user_id);
						$ticket->set('createdby', $user_id);
						$ticket->set('pagetitle', $fullname);
						$ticket->set('uri_override', 1);
						$ticket->set('uri', $parent_alias);
						$ticket->set('alias', $user_id);

						$ticket->save();
					}
				}
			}
		}
	}

2. Синхронизируем данные (в одну сторону — от пользователя к странице). Соответственно, если есть потребность редактировать поля пользователя из админки через его страницу, потребуется еще один плагин.
<?php
	if ($modx->event->name == 'OnUserFormSave' && $mode != 'new') {
		if ($user) {
			if ($profile = $user->getOne('Profile')) {
				$user_id = $user->get('id');

				if ($user->isMember('Users')) {
					$parent = 21;
				}
				
				if (isset($parent)) {
					//Ищем страницу пользователя
					$page = $modx->getObject('modResource', array(
						'parent' => $parent,
						'createdby' => $user_id
					));
					
					if ($page) {
						$extended = $profile->get('extended');
						
						//Обновляем дефолтное поле страницы
						$page->set('pagetitle', $profile->get('fullname'));
						
						//Обновляем тв-поле
						if (isset($extended['phone'])) {
							$page->setTVValue('user_phone', $extended['phone']);
						}

						//Дополнить требуемыми полями по вкусу %)
					
						$page->save();
					}
				}
			}
		}
	}
Дмитрий
18 марта 2017, 16:07
1
0
Я пару месяцев назад тоже делал поиск по ресурсам, но так так SimpleSearch мало что умеет, а нужно было делать примерно такую штуку

написал, как и предложил Олег в комментарии выше, заполнение параметров в WHERE в pdoResources. Можно попробовать сделать примерно такое же, только для Tickets.
Код конечно, так себе, но работает неплохо. Из 4000 ресурсов выборка идет довольно быстро.
<?php
$pdo = $modx->getService('pdoTools');
$query = $modx->newQuery('modResource');
$query->select('modResource.id');
$query->leftJoin('modTemplateVarResource', 'TAG', 'modResource.id=TAG.contentid');
$query->leftJoin('modTemplateVarResource', 'RATING', 'modResource.id=RATING.contentid');

if (($_GET['search'] != '')) {
    $search = $_GET['search'];
    $string = array(
        array(
            'modResource.pagetitle:LIKE' => '%' . $search . '%',
            'OR:modResource.content:LIKE' => '%' . $search . '%'
        ),
        array(
            'modResource.template:=' => 4
        )
    );
} else {
    $string = array(
        'modResource.template:=' => 4
    );
}
if ($_GET['cat'] != 0) {
    if ($_GET['cat']!=5046){
        $cat = $_GET['cat'];
        $categories = array(
            'AND:modResource.parent:=' => $cat
        );
    } else {
        $cat = array(5030,5031,5032,5037,5038,5039,5040,5041);
        $categories = array(
            'AND:modResource.parent:IN' => $cat
        );
    }
} else {
    $categories = array(
    );
}

if ($_GET['tag'] != '0') {
    $tag = $_GET['tag'];
    $tags = array(
        'AND:TAG.tmplvarid:=' => 1,
        'AND:TAG.value:LIKE' => '%' . $tag . '%'
    );
} else {
    $tags = array(
    );
}

$pdoWhere = '';
$sortby = 'createdon';
switch ($_GET['searchlast']) {
    case 0:
        $query->sortby('modResource.createdon', 'ASC');
        $sortby = 'createdon';
        $rating = array();
        break;
    case 1:
        $rating = array(
            'AND:RATING.tmplvarid:=' => 43
        );
        $query->sortby('RATING.value', 'DESC');
        $sortby = 'HitsPage';
        break;
    case 2:
        $rating = array();
        $sortby = 'starSum';
        break;
    case 3:
        $rating = array();
        $pdoWhere = '{"atention:=":"1"}';
        break;
}

$where = array_merge($string, $categories, $tags, $rating);
$query->distinct();
$query->where($where);
$query->prepare();
$query->stmt->execute();
$res = $query->stmt->fetchAll(PDO::FETCH_COLUMN, 0);
$ids = implode(',', $res);

//$raw = $query->toSQL();
//return $raw;

if (($ids!='')){
$output = $pdo->runSnippet('pdoPage', array(
'parents' => '5009',
 'limit' => 15,
 'hideContainers' => 1,
 'pageLimit' => 11,
 'tplPageWrapper' => '@INLINE {$prev}{$pages}{$next}',
 'tplPageActive' => '@INLINE <li><span class="pagenav">{$pageNo}</span></li>',
 'tplPage' => '@INLINE <li><a href="{$href}" class="pagenav">{$pageNo}</a></li>',
 'tplPagePrev' => '@INLINE <li class="pagination-prev"><a href="{$href}">Назад</a></li>',
 'tplPageNext' => '@INLINE <li class="pagination-next"><a href="{$href}">Вперед</a></li>',
 'tplPagePrevEmpty' => '@INLINE <li class="pagination-prev"><span class="pagenav">Назад</span></li>',
 'tplPageNextEmpty' => '@INLINE <li class="pagination-next"><span class="pagenav">Вперёд</span> </li>',
 'resources' => $ids,
 'includeTVs' => 'HitsPage,isVideo,starSum,atention',
 'where' => $pdoWhere,
 'sortby' => $sortby,
 'sortdir' => 'DESC',
 'prepareTVs' => 1,
 'processTVs' => 1,
 'tpl' => '@FILE:chunks/infocenter/search.row.tpl'
));
$output .= '<div class="k2Pagination">
                    <ul>
                        {$_modx->getPlaceholder("page.nav")}
                    </ul>
                    <div class="clr"></div>
                </div>';
}
else {
    $output = '<h3>Ничего не найдено. Попробуйте упростить запрос</h3>';
}
return $output;