Владимир

Владимир

Был в сети 30 апреля 2025, 08:19
Заказы не принимаю
Максим Кузнецов
Максим Кузнецов
Илья Уткин
Илья Уткин
Я понимаю, что уже есть новая версия с дополнительными сниппетами. Но для истории сохраню код, как вывести тикеты по тегу
[[!pdoPage?
    &element=`getTickets`
    &parents=`0`
    &loadModels=`tvsuperselect`
    &select=`{
        "tvTags":"tvTags.value as tag"
    }`
    &leftJoin=`{
        "tvTags":{"class":"tvssOption", "on":"Ticket.id = tvTags.resource_id"}
    }`
    &where=`{ "tvTags.value":"[[!+vp.tag]]" }`
    &tpl=`tpl.Ticket`
    &includeContent=`1`
    &includeTVs=`img,tags`
    &tvPrefix=`tv.`
]]
[[!+page.nav]]
Максим Кузнецов
Максим Кузнецов
Что касается порядкового номера — просто создайте произвольную системную настройку, например «Всего отправлено сообщений» (formit_total) и дергайте ее непосредственно в хуке:

$formit_total = $modx->getObject('modSystemSetting', 'formit_total');
$new_total = intval($formit_total->get('value')) + 1;

$formit_total->set('value', $new_total);
$formit_total->save();
$modx->cacheManager->refresh(array('system_settings' => array()));
Константин
Константин
Недавно делал на сайте вот так:

Вызов сниппета через AjaxForm
[[!AjaxForm?
	&snippet=`QuickOrder`
	&form=`order.form`
]]

И вот сам сниппет QuickOrder
<?php
$errors = array();

if ( empty( trim( $_POST['total'] ) ) OR !is_numeric( trim( $_POST['total'] ) ) ) {
    $errors['total'] = 'Вы не заполнили кол-во человек';
}

if ( empty( trim( $_POST['phone'] ) ) ) {
    $errors['phone'] = 'Вы не заполнили телефон';
}

if ( !empty( $errors ) ) {
    return $AjaxForm->error( 'В форме содержатся ошибки!', $errors );
} else {
    $miniShop2 = $modx->getService( 'minishop2','miniShop2', MODX_CORE_PATH . 'components/minishop2/model/minishop2/', $scriptProperties );

    if ( !( $miniShop2 instanceof miniShop2 ) ) {
        return $AjaxForm->error( 'Ошибка скрипта!' );
    }
    
    $miniShop2->initialize($modx->context->key, $scriptProperties);
    
    $miniShop2->order->add( 'receiver', trim( $_POST['receiver'] )  );
    $miniShop2->order->add( 'email', trim( $_POST['email'] ) );
    $miniShop2->order->add( 'delivery', 1 ); // id метода доставки
    $miniShop2->order->add( 'payment', 1 ); // id метода оплаты
    
    $miniShop2->cart->add($_POST['id'], $modx->getOption('count', $_POST, 1), $modx->getOption('options', $_POST, array()));
    
    return $AjaxForm->success( 'Форма успешно отправлена. Сейчас вы перейдете на страницу оплаты.' );
}

JS Callback для отправки формы:
$( document ).on('af_complete', function( event, response ) {
    if( response.success ) {
        response.form[0].submit();
    }
})
Максим Кузнецов
Максим Кузнецов
Для fenom:
{set $canonical_url = $_modx->makeUrl($_modx->resource.id, '', '', 'full')}

<link rel="canonical" href="{$canonical_url}" />
<meta property="og:url" content="{$canonical_url}" />


Тегами modx:
<link rel="canonical" href="[[~[[*id]]? &scheme=`full`]]" />
<meta property="og:url" content="[[~[[*id]]? &scheme=`full`]]" />

Или, например, вот так (не помню для чего, но как-то возникла проблема с предыдущим вариантом, которая решилась нижеописанным примером):
[[++site_url]][[*id:isnot=`[[++site_start]]`:then=`[[~[[*id]]]]`]]
Максим Кузнецов
Максим Кузнецов
Можно расписать плагин для такой ситуации:
<?php
	if ($modx->event->name != "OnHandleRequest" || $modx->context->key == 'mgr') {
		return;
	}
		
	if ($_SERVER['REQUEST_URI'] != '/') {
		$uri = strtok(substr($_SERVER['REQUEST_URI'], 1), '?');
		
		if ($uri == 'index.php') {
			//Заменяем страницы вида /index.php?id= на чпу-шные
			$id = intval($_GET['id']);
			
			if ($modx->getCount('modResource', array('id' => $id))) {
				$modx->sendRedirect($modx->makeUrl($id), array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
			}
			else {
				//Если url не чпу, то обработка OnPageNotFound не срабатывает и необходимо дублировать определение страницы переадресации
				$error_id = intval($modx->getOption('error_page'));
				
				if ($error_id > 0 && $modx->getCount('modResource', array('id' => $error_id))) {
					$redirect_page = $modx->makeUrl($error_id);
				}
				else {
					$start_id = intval($modx->getOption('site_start'));
					$redirect_page =$modx->makeUrl($start_id);
				}
				
				$modx->sendRedirect($redirect_page, array('responseCode'  => 'HTTP/1.1 404 Not Found'));
			}

		}
	}
— написал на скорую руку, если что — поправляйте %)