[FlatFilters] Первая бета ждёт смелых и отчаянных.

Приветствую! Мы строили, строили и наконец построили. Рад представить вашему вниманию первого реального конкурента mFilter2. Пока это только бета версия, поэтому кому-то может показаться, что функционала маловато, пожелания принимаются в комментариях.
Артур Шевченко
22 декабря 2023, 20:58
modx.pro
2
3 305
+11

Подключение к MODX API из внешнего файла

Всем привет
в пределах одного сервера все понятно
а как можно подключиться с удаленного сервера?
что бы скрипт выполнялся на удаленном сервере (не на сервере хостинга сайта),
и можно было пользоваться API MODX для обращений к базе и т.п.
Greza
22 декабря 2023, 18:04
modx.pro
385
0

minishop2.class.php 630 PHP warning: Invalid argument supplied for foreach()

Добрый день!

Прощу помочь со следующей проблемой:

Эта ошибка стала забивать весь журнал ошибок
/public_html/core/components/minishop2/model/minishop2/minishop2.class.php 630
PHP warning: Invalid argument supplied for foreach()
<div id="msGallery0">
  {if $files?} 
    <div id="productSlider" class="flexslider">
      <ul class="slides">
      {foreach $files as $file}
        <li>
          <a href="{$file['450x450']}" data-lightbox="roadtrip">
            <img src="{$file['450x450'] | phpthumbon : 'w=450&h=450&zc=C&f=webp'}" alt="" title="">
          </a>
        </li>
      {/foreach}
      </ul>
    </div>
    <div id="productCarousel" class="flexslider">
      <ul class="slides">
      {foreach $files as $file}
        <li>
          <a href="{$file['450x450']}">
            <img src="{$file['450x450'] | phpthumbon : 'w=100&h=100&zc=C&f=webp'}" alt="" title="">
          </a>
        </li>
      {/foreach}
      </ul>
    </div>
  {else}
    <img class="img-responsive" src="/theme/img/no-image-450.png" alt="" title="">
  {/if}  

</div>
Ругается, видимо на второй вызов {foreach $files as $file}

Как исправить?
adminixi
20 декабря 2023, 12:45
modx.pro
406
0

ecommerce.js - Электронная коммерция (Яндекс.Метрика и Google Analytics) для сайтов на базе MODX + miniShop2

Привет!

Хочу поделиться js скриптом, который позволяет передавать данные электронной коммерции в системы аналитики Яндекс.Метрика и Google Analytics.

Из особенностей отмечу то, что мое решение выполнено не в виде дополнения для MODX, а в виде одного js файла и не имеет в своем составе php кода (сниппетов и т.п.). Также я применил, пожалуй, не самый стандартный подход в том, как будут получаться данные о товарах на страницах сайта.
Наумов Алексей
20 декабря 2023, 12:03
modx.pro
7
1 161
+12

AjaxForm hooks, последовательность вызова email

Всех приветствую!
Столкнулся с такой проблемой. В зависимости от расположения хука email, он либо срабатывает либо нет,
1. 'hooks' => 'FormItSaveForm,email,amocrm,unisender', // работает
2. 'hooks' => 'FormItSaveForm,amocrm,unisender,email', // НЕ работает
3. 'hooks' => 'FormItSaveForm,amocrm,email,unisender', // НЕ работает
т/е почему-то в случаях 2,3 отправка писем не происходит, почему так?
И да, я проверял, отправка в АМО идет, т/е если предположить, что после не срабатывания одного хука другой тоже не работает, этот вариант отпадает.
И второй вопрос, разве хуки не НЕЗАВИСИМЫ? Т/е если один не срабатывает — остальные за ним тоже?

Спасибо!
Роман
20 декабря 2023, 09:05
modx.pro
1
483
0

Content Security Policy в Modx

День добрый!
Пришло сообщение от SEO-шников «На сайте отсутствует защита от атак перекрестного скриптинга Cross-Site Scripting и XSS».
Я в этом дуб дубом. Вроде почитал, но по-моему не понял особо. Нашел дополнение от Василия, но для Modx 3, у нас 2.8.3.
Нашел статью, где достаточно просто добавить строку в htaccess.
Кто сталкивался с такой задачей, кто знает как это решать, тыкните пожалуйста что и где почитать. Заранее спасибо!
Lori
18 декабря 2023, 16:49
modx.pro
1
483
0

В Office проблемка в вызове officeProfile на нескольких страницах

Здравствуйте. Заметил странное поведение Office при вызове контроллера officeProfile на нескольких страницах сайта. Есть отдельная страница профиля юзера, он прописана в настройках как office_profile_page_id, так же в настройках прописано обязательное заполнение полей office_profile_required_fields которые юзер не указывает при регистрации. То есть по ссылке авторизации юзер должен попадать в профиль и пока не заполнит эти поля в свой личный кабинет он не попадет, однако, если на странице личного кабинета кроме officeAuth так же вызывается officeProfile (есть необходимость внесения каких-то новых данных пользователем без перехода на страницу профиля), то при авторизации по ссылке из письма новый юзер попадает сразу в личный кабинет, игнорируя прописанную в настройках логику с заполнением обязательных полей на странице профиля.
Такое ощущение что office_profile_page_id перезаписывается при каждом новом вызове контроллера officeProfile, и когда мы вызываем его со страницы личного кабинета, office_profile_page_id так же меняется на ID кабинета, хоть в настройках и остается выставлено значение профиля. Проверил на 2-х сайтах с купленным Office — везде так. Может кто-нибудь проверить со своей стороны и посоветовать как это поправить или подсказать что я делаю не так?
Евгений
18 декабря 2023, 16:35
modx.pro
422
0

Scheduler 1.5.0

В рамках работы над MiniShop3 я подготовил новый релиз компонента Scheduler.
Николай Савин
17 декабря 2023, 12:15
modx.pro
1 495
+13

Помогите устранить ошибку в коде

Добрый день

Ошибка вот такая.

(ERROR @ httpdocs/core/cache/includes/elements/modplugin/32.include.cache.php: 122) PHP warning: max(): When only one parameter is given, it must be an array

Как её устранить или обойти, чтоб больше её не было.

И какой файл нужно для этого отредактировать?
Как я понимаю «32.include.cache.php» — это временный файл кэша и редактирование его, результата не даст.

Код из этого файла «32.include.cache.php»

<?php
switch ($modx->event->name) {
	case 'OnWebPageInit':
			$discounts = array(0);
			$now = new DateTime();
			$yearago = 0;
			$yearago = $now->modify('-1 year');
			$modx->setPlaceholder('disyearago', $yearago->format('d.m.Y'));
			$yearago = $yearago->format("Y-m-d H:i:s");
			$modx->setPlaceholder('yearago', $yearago);
			$user_id = $modx->user->get('id');
			if($user_id != 0){
				$profile = $modx->user->getOne('Profile');
			  //Скидка за ДР
			  //$dob = $profile->get('dob');
			  //if($dob && $dob != 0){
			  //	$discounts[] = 0;
			  //}
			  
			  //Скидки группам пользователей
			  //if($admin = $modx->user->isMember('Administrator')){
			  //$discounts[] = 0;
			  //}
			  
			  //Скидки от суммы покупок за год
			  $q = $modx->prepare("SELECT * FROM modx_ms2_orders WHERE user_id='$user_id' AND createdon > '$yearago'  ORDER BY createdon");
			  $q->execute();
			  $orders = $q->fetchAll(PDO::FETCH_ASSOC);
			  $yearcost = 0;
			  $i = 0;
			  $firstorder = 0;
			  if(count($orders)!=0){
				  foreach($orders as $order){
					  switch ($order[status]){
						  case 2:
						  case 3:
							  $yearcost = $yearcost + $order[cost];
							  if($i == 0){
								  $firstorder = new DateTime($order[createdon]);
								  $firstorder->modify('+1 year');
								  $firstorder = $firstorder->format('d.m.Y');
							  }
							  $i++;
							  break;
					  }
				  }
				  $extended = $profile->get('extended');
				  if($extended['yearcost'] != $yearcost){
					$extended['yearcost'] = $yearcost;
					$extended['firstorder'] = $firstorder;
					if($yearcost < 2500){
						$extended['userdiscount'] = 0;
					}
					if($yearcost >= 2500){
						$extended['userdiscount'] = 5;
					}
					if($yearcost >= 5000){
						$extended['userdiscount'] = 10;
					}
					if($yearcost >= 10000){
						$extended['userdiscount'] = 15;
					}
					$profile->set('extended', $extended);
					$profile->save();
				  }
				  $discountindicator = 0;
				  if($yearcost > 0){
						$discountindicator = $yearcost * 100 / 10000;
						if($discountindicator > 100){ $discountindicator = 100; }
				  }
				  $modx->setPlaceholder('discountindicator', $discountindicator);
			  }
			}
		break;
	case 'msOnGetProductPrice':
		if ($modx->context->key == 'mgr') {return;}
		//if($data['id'] == 154) {return;}
		/**
		 * Counts discount of current product for current user, based on rules in msDiscount component
		 * New price must be set in $modx->event->returnedValues['price']
		 *
		 * @var msProductData $product Object with product properties
		 * @var array $data Array with product properties. Can be empty!
		 * @var float $price Current price of product
		 */
		if (!isset($modx->event->returnedValues['price'])) {
			$modx->event->returnedValues['price'] = $price;
		}

		// Get link to product price
		$price = & $modx->event->returnedValues['price'];


		$values = & $modx->event->returnedValues;
		$product = $modx->getObject('msProduct', $data['id']);
		$id = $data['id'];
		$ccat  = $product->get('category');


		//Скидка пользователя
		$user_id = $modx->user->get('id');
		if($user_id != 0){
		  $profile = $modx->user->getOne('Profile');
		  $extended = $profile->get('extended');
		  if($ccat != 'special'){
		  $discounts[] = $extended['userdiscount'];
		  }

		}
		
		//Скидки на продукт
		$skidka = $product->get('skidka');
		$skidkauntill = $product->get('skidkauntill');
		if($$skidkauntill){
		$skidkauntill = new DateTime($skidkauntill);
		if($now < $skidkauntill){
			$discounts[] = $skidka;
			$modx->setPlaceholder('productskidka', $skidka);
		}
		}
		//Вычисляем скидку
		$discount = max($discounts);
		$multiplier = (100 - $discount)/100;
		$new_price = round($price * $multiplier);
		 $modx->setPlaceholder('new_price', $new_price);

		if ($new_price !== false) {
			$price = $new_price;
		}
		break;

}
return;
Asus0
15 декабря 2023, 10:12
modx.pro
397
0

Быстро пересоздать превью продуктов с выбором дапазона через Console

Кого не устраивает скорость пересоздания превью для продуктов через утилиту минишопа и необходимо пересоздать превью не для всех продуктов предлагаю вариант кода
Рекомендую:
1. отключить «Показывать ошибки» в консоле перед исполнением кода
2. увеличить max_execution_time php сервера для большого объема изображений

Актуально для больших каталогов и фотогалерей
SYAN
14 декабря 2023, 23:39
modx.pro
391
0