Всего 123 609 комментариев

Константин Ильин
25 октября 2023, 10:26
0
JS запрос к request.php(куда хотите его кладите в нем подключение index путь правьте), можете этот запрос повесить на клик кнопки
p = new URLSearchParams();
//тут передаем какие то параметры
p.set('action', 'runSnippet');
p.set('blabla', '1212');

fetch('/request.php', {
    method: 'POST',
    body: p
})
.then((response) => {
    return response.json();
})
.then(( r ) => {
    console.log( r);
   // тут получает ответ, делайте что угодно, например:
    document.querySelector('body').html(r.out);
});
PHP request.php
if(empty($_POST['action'])){
    return;
}

define('MODX_API_MODE', true);
require 'index.php';
$pdo = $modx->getService('pdoTools');
$resp = [
    'success' => 1
];
switch ($_POST['action']){
    case 'runSnippet':
        $resp['out'] = $modx->runSnippet('snippetBla', [ 'parents' => 1111] );
        echo json_encode($resp);return;
    break;
}
Игорь
25 октября 2023, 06:56
0
Решил частично проблему — просто у страницы поставил галочку «контейнер» и тогда страница из /page.html становится /page/
можно ещё окончание / убрать редиректом через htacess
Евгений
24 октября 2023, 23:09
0
заметил что не сохраняются страницы которые являются родительскими (то есть имеют вложенные страницы) очень странно. ресурсы этого же шаблона не являющиеся родителями спокойно сохраняются
Дмитрий
24 октября 2023, 14:02
0
Пока в голову пришло сделать только так
{var $dateCategory = '!pdoResources' | snippet : [
                'parents'=>'13',
                'class' => 'msCategory',
                'limit' => '0',
            	'select' => [
            		"msCategory" => "*"
            		,"Product" => "Product.id as product_id"
            	],
                'innerJoin' => [
            		"Product" => [ "class" => "msProduct", "on" => "Product.parent = msCategory.id AND Product.class_key = 'msProduct' AND Product.published = 1 AND Product.deleted = 0" ],
            		"Data" => [ "class" => "msProductData", "on" => "Product.id = Data.id" ],
            		"Vendor" => [ "class" => "msVendor", "on" => "Data.vendor = Vendor.id" ]
            	],
            	'where'=> ["Vendor.name:LIKE" => '%'~ $_modx->resource.pagetitle ~'%', "class_key" => "msCategory" ] ,
            	'sortdir' => 'asc',
            	'groupby' => 'msCategory.id'
                'tpl'=>'@INLINE {$parent},{$id},'
            ]}

                    {'!pdoMenu' | snippet:[
                        'parents' => 13,
                        'resources'=> $dateCategory,
                        'level' => 2,
                        'displayStart' => 0
                        'tplOuter' => '@INLINE <div class="brand-category__items">{$wrapper}</div>',
                        'tpl' => '@INLINE <li {$classes}><a href="{$link}?vendors={$_modx->resource.brand_id}">{$pagetitle}</a>{$wrapper}</li>',
                        'tplInner' => '@INLINE <ul class="brand-category__list {$classnames}">{$wrapper}</ul>',
                        'tplParentRow' => '@INLINE <div class="brand-category__item"><div class="brand-category__inner"><p class="brand-category__name">{$menutitle}</p>{$wrapper}</div></div>'
                    ]}
Может есть более правильный способ?
Fr3ddy
24 октября 2023, 12:27
0
Доброго времени суток, есть проблема — не добавляются опции

https://ibb.co/tLMjFV5

https://ibb.co/5hqJBRx
https://ibb.co/pWwsQMZ

msOptionsPrice2 2.5.22-beta
Minishop2 3.0.7
Игорь
24 октября 2023, 11:58
0
Помогите, не получается вывести pagetitle в
<h5 class="modal-title" id="orderModalLabel"></h5>
Сергей
24 октября 2023, 11:49
0
Увидел, что компонент обновился, может есть надежда еще. Автор огромная просьба выполнить пожелание первого комментария. Было бы максимально полезно, если бы адреса сохранялись автоматически при оформлении товара, а при повторном заказе данные бы подставлялись автоматически, как на крупных маркетплейсах.
Игорь
24 октября 2023, 11:42
0
Нашел другое решение и оно работает. От сюда решение modzone.ru/blog/2015/12/22/ajax-loading-of-content/

Создадим файл, на который будем отправлять AJAX запрос и который будет возвращать контент указанной страницы. Назовем его ajax.php и положим в папку assets.

ajax.php
<?php
// Если запрос не AJAX или не передано действие, выходим
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest' || empty($_REQUEST['action'])) {exit();}

$action = $_REQUEST['action'];

define('MODX_API_MODE', true);
require_once dirname(dirname(__FILE__)).'/index.php';

$modx->getService('error','error.modError');
$modx->getRequest();
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');
$modx->error->message = null;

$output = '';
switch ($action) {
    case 'getContent':
        // Если не передан id страницы, тоже выходим
        $id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : 0;
        if (empty($id)) {
            exit();
        };

        $object = $modx->getObject('modResource',$id);
        $output = $object->get('content');
        // Парсим теги MODX
        $maxIterations= (integer) $modx->getOption('parser_max_iterations', null, 10);
        $modx->getParser()->processElementTags('', $output, false, false, '[[', ']]', array(), $maxIterations);
        $modx->getParser()->processElementTags('', $output, true, true, '[[', ']]', array(), $maxIterations);
}


@session_write_close();
exit($output);

Создайте JavaScript файл, например script.js, и добавьте в него следующий код:

$(document).on('click', '.read-more', function(e) {
  e.preventDefault();
  var id = $(this).data('id') || 0;
  // Вставляем контент в тело модального окна
  $("#content").load("/assets/ajax.php", {action: "getContent", id: id}, function(response) {
    // Если ответ не пустой, открываем модальное окно
    if (response) {
      $("#mymodal").modal('show');
    }
  });
});
Подключите созданный JavaScript файл на вашем сайте.

<script src="путь/к/вашему/script.js"></script>
Добавление разметки для модального окна:
Добавьте на вашу страницу HTML код для модального окна Bootstrap:
<div class="modal fadeIn" id="mymodal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" aria-label="Close"><span aria-hidden="true">×</span></button>
        <h4 class="modal-title" id="myModalLabel">Модальное окно</h4>
      </div>
      <div id="content" class="modal-body"></div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default btn-close">Закрыть</button>
      </div>
    </div>
  </div>
</div>
Пример ссылки, где 42 это id страницы:

<a href="#" class="read-more" data-id="42">Подробнее</a>
Все, теперь страницы будут открываться без шаблона страницы.
Денис Усманов
23 октября 2023, 17:49
0
Засунуть в файл вряд-ли получится, так не передашь ID… вызывать в шаблоне страницы, где эта функция должна выполняться. Вызывается классом modalTrigger на кнопке необходимой, а выводится вызов в блоке с id modalAjax
Игорь
23 октября 2023, 17:29
0
это засунуть в js файл?
а вызывать как тогда… )
Игорь
23 октября 2023, 16:28
0
так… осталось понять как это применить…
Денис Усманов
23 октября 2023, 16:18
0
Простейший способ решения задачи: сделать запрашиваемый ресурс без шаблона.
Вот у меня скрипт 1 есть, мб поможет как:
$(document).on('click', '.modalTrigger', function(e) {
	e.preventDefault();
	$.ajax({  
	  type: "POST",  
	  url: '[[~ID]]', 
	  data: {parent: '[[*id]]'},
	  success:  function(data) { 
		if (data){
		    $('#modalAjax').html(data);
		}else{
		  AjaxForm.Message.error('Что-то пошло не так, попробуйте позже!');
		}
	  } 
	}); 
});
Игорь
23 октября 2023, 16:12
0
<a data-fancybox data-type="ajax" data-src="[[#42.content]]" href="#">Тест3</a>
контент подгрузил со страницы в моем случае в footer… получается это уже не ajax…

[[#42.content]] - грузит содержимое без шаблона. но не ajax..
Денис Усманов
23 октября 2023, 15:58
0
Попробуйте не [[~ID]], а [[#ID.content]]
perfkirill
23 октября 2023, 11:16
0
Вопрос пр msie2
Если мы импортируем новые товары и в столбце parent указываем строковый путь
«Каталог товаров|категория1|категория2»

И при этом «категория2» не создана, то модуль при импорте пропускает такие товары с ошибкой «Для импортируемого товара не указан родитель, действие отклонено.»

При этом в первой версии он сам создавал категории.

Как сделать так, чтобы он сам создавал категории?
Денис Усманов
23 октября 2023, 07:06
0
Может плагин какой реагирует на поле какое этого шаблона, мб поле какое от компонента какое то особенное, может смайлики где… много факторов.
Роман Л.
22 октября 2023, 16:07
0
Добрый день!
Подскажите как обычно решается проблема дублирования реальных и виртуальных URL при подключении категорий в связку seoFilter+mFilter2?
Допустим в каталоге есть категория1 с алисом category1 которая формирует URL site.ru/сatalog/сategory1.
Подключаем seoFilter+mFilter2 и добавляем туда фильтр по parent:categories.
При формировании полей и сео-правил появляются виртуальные URL site.ru/сatalog/сategory1 которые соответствено дублируют уже существующие адреса категорий.
Реальный URL при обновлении страницы перебивает виртуальный сформированный seoFilter и не подгружаются шаблоны от seoFilter.
С одной стороны простым решением будет категориям давать какие нибудь другие алиасы чтобы они не совпадали с виртуальнымы от seoFilter но их нужно будет прятать в sitemap и следить чтобы ссылки на них в сайте нигде не вылезли. Либо вообще отказаться от категорий и все товары закидывать в корень каталога, и убрать фильтр по категориям?
YanaShine
22 октября 2023, 15:04
0
Мое решение с исправлениями номера телефона, разделением суммы и проверкой на пустые формы

<?php
if($modx->event->name != 'msOnCreateOrder') return;

$token = $modx->getOption('mstelegram_token', null, false);

$recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
$contacts = $msOrder->Address;
$_products = $msOrder->getMany('Products');
$delivery = $msOrder->getOne('Delivery');
$payment = $msOrder->getOne('Payment');

// Преобразование суммы с разделением тысяч
$formattedCost = number_format($msOrder->cost, 0, '.', ' ');

// Проверка и преобразование телефона
$phone = $contacts->phone;
if (!empty($phone) && !preg_match('/^\+7/', $phone)) {
    // Заменяем "8" на "+7"
    $phone = str_replace("8", "+7", $phone);
}

// Список товаров в заказе
$i = 0;
$products = '';
foreach ($_products as $product) {
    if (!empty($product->count)) { // Проверка, что количество товара не пустое
        $i++;
        if ($i > 1) {
            $products .= "\n"; // Добавляем разделитель только после первого товара
        }
        $products .= "{$i}. {$product->name} ({$product->count} шт.)";
    }
}

// Текст сообщения
$message = "
Новый заказ #{$msOrder->num}
на сумму {$formattedCost} ₽.
Оплата: {$payment->name}
Доставка: {$delivery->name}
- - - - - - -
{$products}
- - - - - - -
Имя: {$contacts->receiver}
";
if (!empty($phone)) { // Добавляем телефон только если он не пустой
    $message .= "Телефон: {$phone}\n";
}
if (!empty($contacts->email)) { // Добавляем Email только если он не пустой
    $message .= "Email: {$contacts->email}\n";
}
if (!empty($contacts->street)) { // Добавляем Улица только если он не пустой
    $message .= "Улица: {$contacts->street}\n";
}
if (!empty($contacts->building)) { // Добавляем Дом только если он не пустой
    $message .= "Дом: {$contacts->building}\n";
}
if (!empty($contacts->room)) { // Добавляем Квартиру только если она не пуста
    $message .= "Квартира: {$contacts->room}\n";
}
if (!empty($contacts->comment)) { // Добавляем Комментарий только если он не пустой
    $message .= "Комментарий: {$contacts->comment}";
}

$message = urlencode($message);
foreach($recipients as $id){
    $id = trim($id);
    if(!$id) continue;
    $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
    $ch = curl_init();
    curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
    $result = curl_exec($ch);
    curl_close($ch);
}