Всего 123 794 комментария

Vladimir
20 июня 2023, 23:57
0
в какое место именно в моем случае в sendredirect
Vladimir
20 июня 2023, 23:50
0
пришлите доки ссылку
Dan
Dan
20 июня 2023, 20:44
0
Да в mail.php. Прочитайте и поймете, в доке все есть
Vladimir
20 июня 2023, 20:43
0
Можете немного расширенно рассказать куда что вставлять?
Vladimir
20 июня 2023, 20:39
0
Хорошо я почитаю а куда именно вставлять код в mail.php или куда еще?
Dan
Dan
20 июня 2023, 20:13
0
Да, отправка идет. Увидел во вкладке Network в DevTools. Так у вас нет редиректа в коде. Почитайте про modx sendredirect. И добавьте его в код в случае успешной отправки
mekirile
20 июня 2023, 20:01
0
Кто-нибудь выгружает Штрикоды к товарам?
Vladimir
20 июня 2023, 19:57
0
И во всех ли формах на Главной странице mail.php true.
Vladimir
20 июня 2023, 19:57
0
Хорощо приложу код. ТО есть вы хотите сказать что отправка форм идет нормально?? Не так ли?? Вот прикладываю код mail.php что лежал в корне? То есть код формы обрабатывается.
<?php

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

/**@var modX $modx */
define('MODX_API_MODE', true);
require_once 'index.php';

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

$to = 'webklweb@yandex.ru, sale@subelement.ru, macco@inbox.ru';//почта для заявок
$email = 'noreply@site.ru';
$sitename  = 'Элемент';
$subject   = "Новая заявка с сайта \"$sitename\"";

if($_FILES)
{
  $filename = array();
  $i = 0;
  foreach ($_FILES["file"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
      $filename[$i][0] = $_FILES["file"]["tmp_name"][$key];
      $filename[$i][1] = $_FILES["file"]["name"][$key];
      $i++;
    }
  }
}

function table_tr($title,$value){
  if ($value=='') return false;
  return "
  <tr>
    <td width='200' height='40' bgcolor='#eee' style='padding: 5px;'>
      $title
    </td>
    <td width='300' style='padding: 5px;'>
      $value
    </td>
  </tr>";
}
function checkbox($array){
  $check = implode(", ", $array);
  $check = substr($check, 1);
  return $check;
}

$message="<table border='1'>";



if (isset($_POST['form'])){
  $message .= table_tr('Форма',$_POST["form"]);
  $amo_mess = 'Форма: '.$_POST["form"].';'. PHP_EOL;
}
if (isset($_POST['name'])){
  $message .= table_tr('Имя',$_POST["name"]);
  $amo_mess .= 'Имя: '.$_POST["name"].'; '. PHP_EOL;
}
if (isset($_POST['phone'])){
  $message .= table_tr('Телефон',$_POST["phone"]);
  $amo_mess .= 'Телефон: '.$_POST["phone"].'; '. PHP_EOL;
}
if (isset($_POST['email'])){
  $message .= table_tr('Email',$_POST["email"]);
  $amo_mess .= 'Email: '.$_POST["email"].';'. PHP_EOL;
}
if (isset($_POST['volume'])){
  $message .= table_tr('Объем емкости',$_POST["volume"]);
  $amo_mess .= 'Объем емкости: '.$_POST["volume"].'; '. PHP_EOL;
}
if (isset($_POST['scope'])){
  $message .= table_tr('Сфера применения',$_POST["scope"]);
  $amo_mess .= 'Сфера применения: '.$_POST["scope"].'; '. PHP_EOL;
}
if (isset($_POST['drawing'])){
  $message .= table_tr('У меня есть проект/чертеж',$_POST["drawing"]);
  $amo_mess .= 'У меня есть проект/чертеж: '.$_POST["drawing"].'; '. PHP_EOL;
}
if (isset($_POST['question'])){
  $message .= table_tr('Вопрос',$_POST["question"]);
  $amo_mess .= 'Вопрос: '.$_POST["question"].'; '. PHP_EOL;
}
if (isset($_POST['question1'])){
  $message .= table_tr('Что планируете постороить',$_POST["question1"]);
  $amo_mess .= 'Что планируете постороить: '.$_POST["question1"].'; '. PHP_EOL;
}
if (isset($_POST['question2_1'])){
  $message .= table_tr('Ширина',$_POST["question2_1"]);
  $amo_mess .= 'Ширина: '.$_POST["question2_1"].'; '. PHP_EOL;
}
if (isset($_POST['question2_2'])){
  $message .= table_tr('Длина',$_POST["question2_1"]);
  $amo_mess .= 'Длина: '.$_POST["question2_2"].'; '. PHP_EOL;
}
if (isset($_POST['question2_3'])){
  $message .= table_tr('Высота',$_POST["question2_3"]);
  $amo_mess .= 'Высота: '.$_POST["question2_3"].'; '. PHP_EOL;
}
if (isset($_POST['question3'])){
  $message .= table_tr('Готов ли проект, эскиз',$_POST["question3"]);
  $amo_mess .= 'Готов ли проект, эскиз: '.$_POST["question3"].'; '. PHP_EOL;
}
if (isset($_POST['question4'])){
  $message .= table_tr('Сроки изготовления',$_POST["question4"]);
  $amo_mess .= 'Сроки изготовления: '.$_POST["question4"].'; '. PHP_EOL;
}
if (isset($_POST['question5'])){
  $message .= table_tr('Адрес',$_POST["question5"]);
  $amo_mess .= 'Адрес: '.$_POST["question5"].'; '. PHP_EOL;
}

if (isset($_POST['page'])){
  $message .= table_tr('Страница',$_POST["page"]);
  //$amo_mess = '<p>Страница: '.$_POST["page"].'; </p>';
}

 if ($_SESSION['site_utm'] && is_array($_SESSION['site_utm'])) {
          foreach ($_SESSION['site_utm'] as $key => $value) {
            $message .= table_tr($key, $value);
            $amo_mess .= ''.$key.': '.$value.'; '. PHP_EOL;
          }
  }


$message .="</table>";


$responce['status'] = send_mail($to, $message, $email, $filename,$subject);


    
    
       //amo
//ПРЕДОПРЕДЕЛЯЕМЫЕ ПЕРЕМЕННЫЕ
$responsible_user_id = 2294887; //id ответственного по сделке, контакту, компании
$lead_name = 'Заявка с сайта subelement.ru'; //Название добавляемой сделки
$lead_status_id = '32775721';//'32681458'; //id этапа продаж, куда помещать сделку

$contact_name = urldecode($_POST['name']); //Название добавляемого контакта
$contact_phone = urldecode($_POST["phone"]); //Телефон контакта
$contact_email = urldecode($_POST['email']); //Емейл контакта
//АВТОРИЗАЦИЯ
$user=array(
	'USER_LOGIN'=>'ay@steelar-zmk.ru', #Ваш логин (электронная почта)
	'USER_HASH'=>'b113966441f86ef98df904001ec3aa6629176f85' #Хэш для доступа к API (смотрите в профиле пользователя)
);
$subdomain='podarki';
#Формируем ссылку для запроса
$link='https://'.$subdomain.'.amocrm.ru/private/api/auth.php?type=json';
$curl=curl_init(); #Сохраняем дескриптор сеанса cURL
#Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
curl_setopt($curl,CURLOPT_URL,$link);
curl_setopt($curl,CURLOPT_POST,true);
curl_setopt($curl,CURLOPT_POSTFIELDS,http_build_query($user));
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
$out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
$code=curl_getinfo($curl,CURLINFO_HTTP_CODE); #Получим HTTP-код ответа сервера
curl_close($curl);  #Завершаем сеанс cURL
$Response=json_decode($out,true);
//echo '<b>Авторизация:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';
//ПОЛУЧАЕМ ДАННЫЕ АККАУНТА
$link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/accounts/current'; #$subdomain уже объявляли выше
$curl=curl_init(); #Сохраняем дескриптор сеанса cURL
#Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
curl_setopt($curl,CURLOPT_URL,$link);
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
$out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
$code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
curl_close($curl);
$Response=json_decode($out,true);
$account=$Response['response']['account'];
//echo '<b>Данные аккаунта:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';
//ПОЛУЧАЕМ СУЩЕСТВУЮЩИЕ ПОЛЯ
$amoAllFields = $account['custom_fields']; //Все поля
$amoConactsFields = $account['custom_fields']['contacts']; //Поля контактов
//echo '<b>Поля из амо:</b>'; echo '<pre>'; print_r($amoConactsFields); echo '</pre>';
//ФОРМИРУЕМ МАССИВ С ЗАПОЛНЕННЫМИ ПОЛЯМИ КОНТАКТА
//Стандартные поля амо:
$sFields = array_flip(array(
		'PHONE', //Телефон. Варианты: WORK, WORKDD, MOB, FAX, HOME, OTHER
		'EMAIL' //Email. Варианты: WORK, PRIV, OTHER
	)
);
//Проставляем id этих полей из базы амо
foreach($amoConactsFields as $afield) {
	if(isset($sFields[$afield['code']])) {
		$sFields[$afield['code']] = $afield['id'];
	}
}
//ДОБАВЛЯЕМ СДЕЛКУ
$leads['request']['leads']['add']=array(
	array(
		'name' => $lead_name,
		'status_id' => $lead_status_id, //id статуса
		'responsible_user_id' => $responsible_user_id, //id ответственного по сделке
		//'date_create'=>1298904164, //optional
		//'price'=>300000,
		//'tags' => 'Important, USA', #Теги
		//'custom_fields'=>array()
		'custom_fields'=>array(
          array(
            'id' => 382333,
            'values' => array(
              array(
                'value' => isset($_COOKIE['roistat_visit']) ? $_COOKIE['roistat_visit'] : null,
              )
            )
          )
        )
	)
);
$link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/leads/set';
$curl=curl_init(); #Сохраняем дескриптор сеанса cURL
#Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
curl_setopt($curl,CURLOPT_URL,$link);
curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST');
curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($leads));
curl_setopt($curl,CURLOPT_HTTPHEADER,array('Content-Type: application/json'));
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
$out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
$code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
$Response=json_decode($out,true);
//echo '<b>Новая сделка:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';
if(is_array($Response['response']['leads']['add']))
	foreach($Response['response']['leads']['add'] as $lead) {
		$lead_id = $lead["id"]; //id новой сделки
		$responce['lead'] = $lead_id;
	};
//ДОБАВЛЯЕМ СДЕЛКУ - КОНЕЦ
//ДОБАВЛЕНИЕ КОНТАКТА
$contact = array(
	'name' => $contact_name,
	'linked_leads_id' => array($lead_id), //id сделки
	'responsible_user_id' => $responsible_user_id, //id ответственного
	'custom_fields'=>array(
		array(
			'id' => $sFields['PHONE'],
			'values' => array(
				array(
					'value' => $contact_phone,
					'enum' => 'MOB'
				)
			)
		),
		array(
			'id' => $sFields['EMAIL'],
			'values' => array(
				array(
					'value' => $contact_email,
					'enum' => 'WORK'
				)
			)
		)
	)
);
$set['request']['contacts']['add'][]=$contact;
#Формируем ссылку для запроса
$link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/contacts/set';
$curl=curl_init(); #Сохраняем дескриптор сеанса cURL
#Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
curl_setopt($curl,CURLOPT_URL,$link);
curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST');
curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($set));
curl_setopt($curl,CURLOPT_HTTPHEADER,array('Content-Type: application/json'));
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
$out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
$code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
//CheckCurlResponse($code);
$Response=json_decode($out,true);
//ДОБАВЛЕНИЕ КОНТАКТА - КОНЕЦ

//ДОБАВЛЕНИЕ Примечания
$note = array(
	'element_id' => $lead_id,
            'element_type' => '2',
            'text' => $amo_mess,
            'note_type' => '4',
            'responsible_user_id' => $responsible_user_id,
            'created_by' => $responsible_user_id,
);
$set['request']['notes']['add'][]=$note;
#Формируем ссылку для запроса
$link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/notes/set';
$curl=curl_init(); #Сохраняем дескриптор сеанса cURL
#Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
curl_setopt($curl,CURLOPT_URL,$link);
curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST');
curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($set));
curl_setopt($curl,CURLOPT_HTTPHEADER,array('Content-Type: application/json'));
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
$out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
$code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
//CheckCurlResponse($code);
$Response=json_decode($out,true);
//ДОБАВЛЕНИЕ Примечания - КОНЕЦ

//amo
        


    echo json_encode($responce);
    exit;

// Вспомогательная функция для отправки почтового сообщения с вложением
function send_mail($to, $body, $email, $filename,$subject)
{
  $boundary = "--".md5(uniqid(time())); // генерируем разделитель
  $headers = "From: ".$email."\r\n";   
  $headers .= "MIME-Version: 1.0\r\n";
  $headers .="Content-Type: multipart/mixed; boundary=\"".$boundary."\"\r\n";
  $multipart = "--".$boundary."\r\n";
  $multipart .= "Content-type: text/html; charset=\"utf-8\"\r\n";
  $multipart .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";

  $body = $body."\r\n\r\n";

  $multipart .= $body;
  foreach ($filename as $key => $value) {
    $fp = fopen($value[0], "r"); 
    $content = fread($fp, filesize($value[0]));
    fclose($fp);
    $file .= "--".$boundary."\r\n";
    $file .= "Content-Type: application/octet-stream\r\n";
    $file .= "Content-Transfer-Encoding: base64\r\n";
    $file .= "Content-Disposition: attachment; filename=\"".$value[1]."\"\r\n\r\n";
    $file .= chunk_split(base64_encode($content))."\r\n";
  }
  $multipart .= $file."--".$boundary."--\r\n";
  
  $responce['status'] = mail($to, $subject, $multipart, $headers);
  return $responce['status'];
}
Ответте на два первых вопроса и как сделать чтобы после отправка форм шел редирект на maccoikt.beget.tech/?q=good, maccoikt.beget.tech/good
Dan
Dan
20 июня 2023, 19:27
0
код самого сниппета не нужен))) я имел в виду код вызова этого сниппета в шаблоне, который определен и категории Класс 10. Если это код из самого первого коммента, то тяжело сказать в чем проблема, ибо никаких строгих условий для выборки я не вижу. Единственное — это указание родителя, значит все таки у некоторых товаров из Класс 8 все таки привязка к 2 категориям. Или второй скрин — это не страница Категории Класс 10, а родительской категории для обоих видов (класс 8 и класс 10)
Dan
Dan
20 июня 2023, 19:21
+2
Ну вижу я то, что и вы явно видите, что на mail.php идет отправка и что он возвращает status:true, но я не могу знать код обработчика mail.php и мне лень искать код js. Не проще ли вам все таки приложить код, нежели заставлять других его угадывать и искать?
Vladimir
20 июня 2023, 18:14
+1
Вам метод оплаты нужно зарегистрировать в системе, код ниже, код регистрации нужно запускать в консоли, Console это пакет для запуска php кода в админке (https://extras.modx.com/package/console), только моё название оплаты «EpayHalykBank» замените на ваше, а так же название файла «epayhalykbank.class.php» только в конце должно быть ".class.php" обязательно
if ($miniShop2 = $modx->getService('miniShop2')) {
    $miniShop2->addService('payment', 'EpayHalykBank',
        '{core_path}components/minishop2/custom/payment/epayhalykbank.class.php'
    );
}
В целом можете написать в тг @invictusmaneobart
Vladimir
20 июня 2023, 18:07
0
Вам метод оплаты нужно зарегистрировать в системе, код ниже, код регистрации нужно запускать в консоли, Console это пакет для запуска php кода в админке (https://extras.modx.com/package/console), только моё название оплаты «EpayHalykBank» замените на ваше, а так же название файла «epayhalykbank.class.php» только в конце должно быть ".class.php" обязательно
if ($miniShop2 = $modx->getService('miniShop2')) {
    $miniShop2->addService('payment', 'EpayHalykBank',
        '{core_path}components/minishop2/custom/payment/epayhalykbank.class.php'
    );
}
В целом можете написать в тг @invictusmaneobart
Николай Савин
20 июня 2023, 17:39
0
Класс оплаты, мало просто положить в нужный каталог. Его нужно зарегистрировать в системе. Подробнее читайте в документации
Giant Dad
20 июня 2023, 16:22
0
копирую Ваш код, регистрирую через $this->modx, но при создании оплаты, класс-обработчик всё равно не появляется disk.yandex.ru/d/xq_rjkOVRfquHQ только стандартный PayPal. Подскажите, пожалуйста, в чём может быть проблема
inkeri21
20 июня 2023, 15:57
0
Это полностью код сниппет msProduct

<?php
/** @var modX $modx */
/** @var array $scriptProperties */
/** @var miniShop2 $miniShop2 */
$miniShop2 = $modx->getService('miniShop2');
$miniShop2->initialize($modx->context->key);
/** @var pdoFetch $pdoFetch */
$fqn = $modx->getOption('pdoFetch.class', null, 'pdotools.pdofetch', true);
$path = $modx->getOption('pdofetch_class_path', null, MODX_CORE_PATH . 'components/pdotools/model/', true);
if ($pdoClass = $modx->loadClass($fqn, $path, false, true)) {
    $pdoFetch = new $pdoClass($modx, $scriptProperties);
} else {
    return false;
}
$pdoFetch->addTime('pdoTools loaded.');

if (isset($parents) && $parents === '') {
    $scriptProperties['parents'] = $modx->resource->id;
}

// Start build "where" expression
$where = array(
    'class_key' => 'msProduct',
);
if (empty($showZeroPrice)) {
    $where['Data.price:>'] = 0;
}
// Add grouping
$groupby = array(
    'msProduct.id',
);

// Join tables
$leftJoin = array(
    'Data' => array('class' => 'msProductData'),
    'Vendor' => array('class' => 'msVendor', 'on' => 'Data.vendor=Vendor.id'),
);

$select = array(
    'msProduct' => !empty($includeContent)
        ? $modx->getSelectColumns('msProduct', 'msProduct')
        : $modx->getSelectColumns('msProduct', 'msProduct', '', array('content'), true),
    'Data' => $modx->getSelectColumns('msProductData', 'Data', '', array('id'), true),
    'Vendor' => $modx->getSelectColumns('msVendor', 'Vendor', 'vendor.', array('id'), true),
);

// Include thumbnails
if (!empty($includeThumbs)) {
    $thumbs = array_map('trim', explode(',', $includeThumbs));
    foreach ($thumbs as $thumb) {
        if (empty($thumb)) {
            continue;
        }
        $leftJoin[$thumb] = array(
            'class' => 'msProductFile',
            'on' => "`{$thumb}`.product_id = msProduct.id AND `{$thumb}`.rank = 0 AND `{$thumb}`.path LIKE '%/{$thumb}/%'",
        );
        $select[$thumb] = "`{$thumb}`.url as `{$thumb}`";
        $groupby[] = "`{$thumb}`.url";
    }
}

// Include linked products
$innerJoin = array();
if (!empty($link) && !empty($master)) {
    $innerJoin['Link'] = array(
        'class' => 'msProductLink',
        'on' => 'msProduct.id = Link.slave AND Link.link = ' . $link,
    );
    $where['Link.master'] = $master;
} elseif (!empty($link) && !empty($slave)) {
    $innerJoin['Link'] = array(
        'class' => 'msProductLink',
        'on' => 'msProduct.id = Link.master AND Link.link = ' . $link,
    );
    $where['Link.slave'] = $slave;
}

// Add user parameters
foreach (array('where', 'leftJoin', 'innerJoin', 'select', 'groupby') as $v) {
    if (!empty($scriptProperties[$v])) {
        $tmp = $scriptProperties[$v];
        if (!is_array($tmp)) {
            $tmp = json_decode($tmp, true);
        }
        if (is_array($tmp)) {
            $$v = array_merge($$v, $tmp);
        }
    }
    unset($scriptProperties[$v]);
}
$pdoFetch->addTime('Conditions prepared');

// Add filters by options
$joinedOptions = array();
if (!empty($scriptProperties['optionFilters'])) {
    $filters = json_decode($scriptProperties['optionFilters'], true);
    foreach ($filters as $key => $value) {
        $option = preg_replace('#\:.*#', '', $key);
        $key = str_replace($option, $option . '.value', $key);
        if (!in_array($option, $joinedOptions)) {
            $leftJoin[$option] = array(
                'class' => 'msProductOption',
                'on' => "`{$option}`.product_id = Data.id AND `{$option}`.key = '{$option}'",
            );
            $joinedOptions[] = $option;
            $where[$key] = $value;
        }
    }
}

// Add sort by options
if (!empty($scriptProperties['sortbyOptions'])) {
    $sorts = array_map('trim', explode(',', $scriptProperties['sortbyOptions']));
    foreach ($sorts as $sort) {
        $sort = explode(':', $sort);
        $option = $sort[0];
        if (preg_match("#\b{$option}\b#", $scriptProperties['sortby'], $matches)) {
            $type = 'string';
            if (isset($sort[1])) {
                $type = $sort[1];
            }
            switch ($type) {
                case 'number':
                case 'decimal':
                    $sortbyOptions = "CAST(`{$option}`.`value` AS DECIMAL(13,3))";
                    break;
                case 'int':
                case 'integer':
                    $sortbyOptions = "CAST(`{$option}`.`value` AS UNSIGNED INTEGER)";
                    break;
                case 'date':
                case 'datetime':
                    $sortbyOptions = "CAST(`{$option}`.`value` AS DATETIME)";
                    break;
                default:
                    $sortbyOptions = "`{$option}`.`value`";
                    break;
            }
            $scriptProperties['sortby'] = preg_replace("#\b{$option}\b#", $sortbyOptions, $scriptProperties['sortby']);
            $groupby[] = "`{$option}`.value";
        }

        if (!in_array($option, $joinedOptions)) {
            $leftJoin[$option] = array(
                'class' => 'msProductOption',
                'on' => "`{$option}`.product_id = Data.id AND `{$option}`.key = '{$option}'",
            );
            $joinedOptions[] = $option;
        }

    }
}

$default = array(
    'class' => 'msProduct',
    'where' => $where,
    'leftJoin' => $leftJoin,
    'innerJoin' => $innerJoin,
    'select' => $select,
    'sortby' => 'msProduct.id',
    'sortdir' => 'ASC',
    'groupby' => implode(', ', $groupby),
    'return' => !empty($returnIds)
        ? 'ids'
        : 'data',
    'nestedChunkPrefix' => 'minishop2_',
);
// Merge all properties and run!
$pdoFetch->setConfig(array_merge($default, $scriptProperties), false);
$rows = $pdoFetch->run();

// Process rows
$output = array();
if (!empty($rows) && is_array($rows)) {
    $c = $modx->newQuery('modPluginEvent', array('event:IN' => array('msOnGetProductPrice', 'msOnGetProductWeight')));
    $c->innerJoin('modPlugin', 'modPlugin', 'modPlugin.id = modPluginEvent.pluginid');
    $c->where('modPlugin.disabled = 0');

    $modifications = $modx->getOption('ms2_price_snippet', null, false, true) ||
        $modx->getOption('ms2_weight_snippet', null, false, true) || $modx->getCount('modPluginEvent', $c);
    if ($modifications) {
        /** @var msProductData $product */
        $product = $modx->newObject('msProductData');
    }
    $pdoFetch->addTime('Checked the active modifiers');

    $opt_time = 0;
    foreach ($rows as $k => $row) {
        if ($modifications) {
            $product->fromArray($row, '', true, true);
            $tmp = $row['price'];
            $row['price'] = $product->getPrice($row);
            $row['weight'] = $product->getWeight($row);
            // A discount here, so we should replace old price
            if ($row['price'] < $tmp) {
                $row['old_price'] = $tmp;
            }
        }
        $row['price'] = $miniShop2->formatPrice($row['price']);
        $row['old_price'] = $miniShop2->formatPrice($row['old_price']);
        $row['weight'] = $miniShop2->formatWeight($row['weight']);
        $row['idx'] = $pdoFetch->idx++;

        $opt_time_start = microtime(true);
        $options = $modx->call('msProductData', 'loadOptions', array(&$modx, $row['id']));
        $row = array_merge($row, $options);
        $opt_time += microtime(true) - $opt_time_start;

        $tpl = $pdoFetch->defineChunk($row);
        $output[] = $pdoFetch->getChunk($tpl, $row);
    }
    $pdoFetch->addTime('Time to load products options', $opt_time);
}

$log = '';
if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
    $log .= '<pre class="msProductsLog">' . print_r($pdoFetch->getTime(), 1) . '</pre>';
}

// Return output
if (!empty($returnIds) && is_string($rows)) {
    $modx->setPlaceholder('msProducts.log', $log);
    if (!empty($toPlaceholder)) {
        $modx->setPlaceholder($toPlaceholder, $rows);
    } else {
        return $rows;
    }
} elseif (!empty($toSeparatePlaceholders)) {
    $output['log'] = $log;
    $modx->setPlaceholders($output, $toSeparatePlaceholders);
} else {
    if (empty($outputSeparator)) {
        $outputSeparator = "\n";
    }
    $output['log'] = $log;
    $output = implode($outputSeparator, $output);

    if (!empty($tplWrapper) && (!empty($wrapIfEmpty) || !empty($output))) {
        $output = $pdoFetch->getChunk($tplWrapper, array(
            'output' => $output,
        ));
    }

    if (!empty($toPlaceholder)) {
        $modx->setPlaceholder($toPlaceholder, $output);
    } else {
        return $output;
    }
}
Vladimir
20 июня 2023, 15:53
0
Но там же формы все видны -а раз есть форма то есть сабмит и файлы формы и action- просто можете сказать куда сейчас action идет — своим более опытным глазом — с форм главной страницы?
inkeri21
20 июня 2023, 15:51
0
Спасибо. В Категории смотрела, галочки стоят верные. У 8 класса и у 10 класса.
Dan
Dan
20 июня 2023, 15:48
0
Если товары minishop2, то скорее всего msProducts.
Найдите шаблон подкатегории и посмотрите какой сниппет вызван на том месте, где выводятся товары?
Если в вызове нет условий выборки с помощью where, а выводятся просто товары из этой подкатегории, то подозреваю, что у ваших товаров, которые есть и в классе 8 и в классе 10 указано две категории.
Зайдите в админке в любой товар, который повторяется на обеих страницах классов, и перейдите во вкладку Категории. Скорее всего там галочкой отмечены обе.
inkeri21
20 июня 2023, 15:41
0
Возможно этот более верный

<div class="row">
  [[pdoResources?
  &parents=`1012`
  &resources=`1014,1020,1022`
  &tpl=`category_submenu_cust_tpl`
  &includeTVs=`image`
  &processTVs=`1`
  &tvPrefix=``
  &limit=`48`
  &depth=`1`
  &sortby=`parent`
  ]]
</div>