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

Андрей
08 апреля 2023, 16:38
0
сделал по аналогии
файл
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest' || empty($_POST['action'])) {
		return;
	}

	define('MODX_API_MODE', true);

	require dirname(dirname(dirname(__FILE__))) . '/index.php';
	
	$modx->getService('error','error.modError');
	$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
	$modx->setLogTarget('FILE');
	
	
	if ($_POST['action'] == "getList" && isset($_POST['parent'])) {
		//Получаем значение для второго селектора
		$snippetParams = array();
		$snippetParams['parents'] = intval($_POST['parent']);
		$snippetParams['tpl'] = 'option.item';
		$snippetParams['showUnpublished'] = '1';
		$snippetParams['depth'] = '0';

		//Дописать параметры для сниппета получающего результаты по вкусу			

		$snippetResult = $modx->runSnippet('pdoResources', $snippetParams);

		$result = array($snippetResult, 'success');
	}
	else {
		$result = array('Некорректный запрос', 'error');
	}
	
	if (!empty($result)) {
		die(json_encode($result));
	}
скрипт
<script type="text/javascript">
    	$(document).on('change', 'select[name="vid_vzn"]', function(e) {
    		if ($(this).val() != '') {
        			$.ajax({
        				type: "POST",
        				url: "assets/lk/getlist.php",
        				data: {
        				    action: 'getList', 
        				    parent: $("select[name='vid_vzn']").val()
           		         },

        			success: function(response) {
        				var data = eval(response);
        
        				switch (data[1]) {
        					case 'success':
    						//Если все ок - вставляем результат во второй селектор
    						$("select[name='god']").val("").html("<option value='' selected disabled>Выберите значение из списка</option>" + data[0])
    
        						break;
       							
        						
        					}
        				}
        			});
    		}
    	});
    </script>
html
<div class="form-group">
		<label for="vid_vzn" class="col-sm-4 control-label">Вид взноса</label>
		<div class="col-sm-8">
			 <select class="form-control" name="vid_vzn" id="vid_vzn">
			 [[!pdoResources?
			    &parents=`1469`
			    &depth=`0`
			    &limit=`0`
			    &showUnpublished=`1`
			    &tpl=`@INLINE <option value="[[+id]]">[[+pagetitle]]</option>`
			    &sortby=`pagetitle`
			    &sortdir=`ASC`
			]]
			 </select>
		</div>
	</div>
	<div class="form-group">
		<label for="god" class="col-sm-4 control-label">Выберите год</label>
		<div class="col-sm-8">
			<select name="god">
			    <option value="" selected disabled>Год</option>
			</select>
		</div>
	</div>
удалил вот это кусок, он у меня ошибку вызвал, по идее если все норм он не должен влиять на работу.
case 'error':
							//Если не ок - выводим ошибку (используется jGrowl)
    							$.jGrowl(data[0], {theme: 'error', position: 'center'});
    							
    							break;
при переключении первого списка появляется только вот это «Выберите значение из списка», а сам список пустой.
элементы неопубликованные и контейнеры, но я вроде бы добавил параметры чтобы они попадали в выборку, да и пробовал публиковать — все равно ничего не дает.
Vladimir
08 апреля 2023, 13:53
2
0
[РЕШЕНО] Суть в том чтобы в админке появились только те характеристики у товара которые есть, это значит поставить все уникальные характеристики для категории, нужно было именно такое решение, сделал сам. А если не нужно их указывать в админке для редактирования, то да проще будет вывести их список через pdoResources указав класс msCategoryOption

Буду рад кто исправит это код(КОД РАБОЧИЙ), чтобы был чище, так как делался на быструю руку решить задачу, а так же не было знаний для реализации этой задачи.
<?php

function prepareSqlQuery($sqlQuery){
	global $modx;
	return $modx->query($sqlQuery);
}


function extractResultsFromQueryObject($sqlQueryResult, $itemsToRetreive, $multiDimensionRetreive=false){
	global $modx;
	$results = array();

	if (is_object($sqlQueryResult)) {
		while ($row = $sqlQueryResult->fetch(PDO::FETCH_ASSOC)) {
			if($multiDimensionRetreive){
				foreach($itemsToRetreive as $key => $value){
					array_push($results, $row[$key], $row[$value]);
				}	    		
			} else {
				foreach($itemsToRetreive as $itemToRetreive){
					array_push($results, $row[$itemToRetreive]);
				}
			}
		}
	}
	return $results;
}


$prepareSqlQueryOfRetreiveCategories = prepareSqlQuery('SELECT modx_site_content.id FROM `modx_site_content` WHERE modx_site_content.class_key = "msCategory"');
$categoriesIds = extractResultsFromQueryObject($prepareSqlQueryOfRetreiveCategories, array('id'));

if(count($categoriesIds) > 0){

	foreach($categoriesIds as $categoryId){

		$productsQueryObject = prepareSqlQuery('SELECT modx_site_content.id FROM `modx_site_content` WHERE modx_site_content.class_key = "msProduct" AND modx_site_content.parent = "'.$categoryId.'"');
		$productsIds = extractResultsFromQueryObject($productsQueryObject, array('id'));

		if(count($productsIds) > 0){
			$productsIds = implode(",", $productsIds);

			$distinctProductOptionsSqlQuery = prepareSqlQuery('SELECT DISTINCT modx_ms2_product_options.key FROM `modx_ms2_product_options` WHERE modx_ms2_product_options.product_id IN ('.$productsIds.")");
			$distinctProductOptions = extractResultsFromQueryObject($distinctProductOptionsSqlQuery, array('key'));

			$uniqueOptions = "";
			$uniqueOptionsLength = count($distinctProductOptions);
			foreach ($distinctProductOptions as $idx => $value) {
				if($idx >= $uniqueOptionsLength - 1){
					$uniqueOptions .= "'$value'";
				} else{
					$uniqueOptions .= "'$value',";
				}
			}


			$uniqueOptionsIdsSqlQuery = prepareSqlQuery('SELECT modx_ms2_options.id,modx_ms2_options.key FROM `modx_ms2_options` WHERE modx_ms2_options.key IN ('.$uniqueOptions.')');
			$uniqueOptionsIds = extractResultsFromQueryObject($uniqueOptionsIdsSqlQuery, array('id'));


			/* #################################### ##################################### */
			foreach($uniqueOptionsIds as $idx => $uniqueOptionId){
				if (!$cop = $modx->getObject('msCategoryOption', array('option_id' => $uniqueOptionId, 'category_id' => $categoryId))) {
					$table = $modx->getTableName('msCategoryOption');
					$sql = "INSERT INTO {$table} (`option_id`,`category_id`,`active`) VALUES ({$uniqueOptionId}, {$categoryId}, 1);";
					$stmt = $modx->prepare($sql);
					$stmt->execute();
				} else {
					$q = $modx->newQuery('msCategoryOption');
					$q->command('UPDATE');
					$q->where(array('option_id' => $uniqueOptionId, 'category_id' => $categoryId));
					$q->set(array('active' => 1));
					$q->prepare();
					$q->stmt->execute();
				}            
				
			}
			/* #################################### ##################################### */
			echo 'Done';
		}
	}
}
Павел Гвоздь
07 апреля 2023, 19:03
+3
рассмотрите возможность в будущем интеграции с Планировщиком (пакет scheduler) — он уже из коробки поддерживается в новых версиях MiniShop
Хорошая идея! Сделаю скоро.
Павел Гвоздь
07 апреля 2023, 19:02
0
Любой платный компонент можно установить на тестовом тарифе Modhost и проверить самостоятельно, подходит ли он вам.
Никита
07 апреля 2023, 18:57
0
Добрый день, подскажите как решить проблему или куда смотреть. Сайт на MODX Revolution 2.8.3pl, мультиязычный(Polylang 1.3.0), на всех языках все корректно отображается, кроме одного. Думали что проблема в словарях, но после очистки всех данных этого языка, проблема осталась.

/core/components/polylang/handlers/tools/polylangtools.class.php

PHP warning: array_merge(): Expected parameter 1 to be an array, string given
Евгений
07 апреля 2023, 18:55
+1
Даже лучше чем fastuploadtv
Евгений
07 апреля 2023, 18:52
0
Тех. поддержки походу нет, кто ни будь сталкивался с тем что не работает импорт из csv? логи не указывают что есть проблема с импортом.
Дима Касаткин
07 апреля 2023, 18:30
+4
Вот благодаря таким компонентам магазины с MODX + MiniShop = TOP!
@Павел Гвоздь рекспект!

По пункту из поста про CRON-задание: рассмотрите возможность в будущем интеграции с Планировщиком (пакет scheduler) — он уже из коробки поддерживается в новых версиях MiniShop, а значит есть шанс, что CRON для него уже будет настроен в рабочем магазине, который владелец захочет улучшить за счет нового компонента! Давайте объединять и упрощать экосистему там, где возможно без побочных эффектов!
Андрей Шевяков
07 апреля 2023, 18:12
+2
Спасибо за компонент!
Только ради такой возможности уже компонент очень нужный:
– Выслать промокод на следующий заказ через 2 недели после отправки заказа клиенту.
Купили дополнение, для новой версии сайта ювелирной тематики. Старая версия очень хорошо на промо-кодах отрабатывает. Надеемся с этим дополнением еще прибавит клиентов.
Алексей
07 апреля 2023, 14:11
0
А понял. По картинке такие опции есть.

Я при оформлении указал — оплачу в банке. Может завтра, когда мне это будет удобно.
Еще бы минишопом по-простому счета формировались, обычные счета как из 1с-ки, чтоб самому не делать.
Александр Мельник
07 апреля 2023, 12:19
0
я согласен с вами.
Если человек выбирает способ оплаты — сразу (не важно как он будет назван на сайте) он должен сразу перейти на страницу банка и оплатить.
Если же человек осознанно выбирает, что мол хочу оплатить по счету в банке, а после этого через 5 минут получает письмо — скорее оплатие нам, то любого нормального и солидного покупателя это будет раздражать. Я при оформлении указал — оплачу в банке. Может завтра, когда мне это будет удобно.

Именно это я и хотел выснить у автора, позволяет ли его программа гибко настраивать, кому будет отправлено письмо напоминание а кому нет.
Компонент то получился интересным, но на мой взгляд, слабо описаны его возможности и настройки.
Кто то захочет купить, а в итоге его ожидания будут обмануты.
Я внимательно прочел инструкцию и не могу сказать, что понимаю все аспекты и настройки этого компонента. И не могу рекомендовать его например своим клиентам к покупке, поскольку не понимаю его возможности.
Я скажу им мол давайте купим. потратим средства, а этот комопнентй будет всем покупателям рассылать через 5 минут письма и раздражать серьезных покупателей, которые хотят оплатить счет официально через банк.
Алексей
07 апреля 2023, 10:37
0
А если я получаю через 5 минут письмо с напоминанием, что нужно оплатить это тоже вызывает отторжение. Я только сделал заказ, а мне уже напоминают, что пора и деньги заносить, а то ты уже целых пять минут как не платишь)
Клиенту лучше не давать время на «подумать», надо быстро платить, сразу после оформления перекидывает на эквайринг, а там Сберпэй в пару кликов работает.
Алексей
07 апреля 2023, 10:31
0
Если я приобрел товар на сайте, то это уже значит, что товар в наличии.
Если я через 5 минут вдруг получу письмо с информацией, что товар в наличии я посчитаю, что с сайтом что то не так.
Надо пробовать. Решение платить за секунду принимается. Бывает если клиент заказал и не оплатил, значит ждёт звонок или емайл. Если не оплатил, я через 3 минуты отправляю емайл «Заказ передан в доставку» с призывом к действию: «Оплатить прямо сейчас и сегодня заказ будет отправлен».

Если не помогло, то менеджер звонит (только по очень выгодным заказам). Сразу не оплатили, может через день-два оплатят, когда почту проверит.

Часто заказ делают одновременно на нескольких сайтах, и оплатят тому, кто первый свяжется.
Konstantin
07 апреля 2023, 07:08
0
Это modrestcontroller core/model/modx/rest/
Александр Туниеков
07 апреля 2023, 06:11
0
Точки с запятой нет после инструкии $this->modx->log(1, print_r($success_page,1))
надо
$this->modx->log(1, print_r($success_page,1));
Александр Туниеков
07 апреля 2023, 06:01
0
А в MODX whereCondition вообще есть? я только xPDOQuery::where в гугле нахожу
Prihod
07 апреля 2023, 00:03
0
UPD 2.2.0-pl

Добавлено
  • Системная опция «Параметр груза для каждого места отправки» (msnovaposhta.default_options_seat).
Исправлено
  • Применение опции: «Добавлять стоимость доставки»
  • Создание ТТН
Важно! Если создание ТТН происходит в автоматическом режиме то необходимо настроить значения по умолчанию для системной опции "Параметр груза для каждого места отправки" (msnovaposhta.default_options_seat)
Артур Шевченко
06 апреля 2023, 23:32
0
Я тоже такого метода не знаю. Смотри доку.
Konstantin
06 апреля 2023, 22:13
0
Не работает. Fatal error: Uncaught Error: Call to undefined method SkladApiProductActions::whereCondition()