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

Баха Волков
09 апреля 2023, 19:28
1
+10
За внедрение линтеров получу много проклятий, наверное, но так действительно лучше
Zulya
09 апреля 2023, 16:17
1
0
Надеюсь, кому-нибудь пригодится. Оказывается если в ТВ стоит значение по умолчанию, то при нем tvFilters не будет работать, даже после сохранения и смены на другое значение, не пишется в бд. Я убрала значение по умолчанию, и вручную указала значения ТВ в ресурсах. После все сработало.
Zulya
09 апреля 2023, 10:34
1
0
Здравствуйте!
Когда я добавляю &tvFilters=`companytype==mfo` к запросу pdoResources, то ничего не выводит, убираю tvFilters, снова выводит список ресурсов. Подскажите пожалуйста, где моя ошибка, почему tvFilters не работает? Спасибо!

[[pdoResources:default=`Ничего не найдено`?
			&parents=`47`
			&includeTVs=`address,tel,logo,companytype`
			&tvFilters=`companytype==mfo`
			&processTVs=`1`
			&limit=`10`
			&loadModels=`easycomm`
			&where=`{"class_key":"modDocument"}`
			&leftJoin=`{
			"ecThread": {
			"class": "ecThread",
			"on": "modResource.id = ecThread.resource"
						}
					   }`
			&select=`{
			"modResource": "*",
			"ecThread": "ecThread.rating_simple AS rating, ecThread.count AS reviews"
				}`
			&tpl=`topcompanies`
			&sortby=`{"rating":"DESC", "reviews":"DESC"}`
			]]
Vladimir
08 апреля 2023, 18:56
1
0
Из того что написано в описании могу дать такой пример.
Будет конкретный пример, распишу по лучше, ниже создаст только 1 ресурс.
<?php

$newResourceParentId = 2;
$newResourceUrl = 'super-product-1337';
$newResourcePageTitle = 'Лучший продукт в своём роде';
$newResourceTemplate = 8;

$createNewResource = $modx->runProcessor('resource/create', array(
    'parent' => $newResourceParentId,
    'pagetitle' => $newResourcePageTitle,
    'alias' => $newResourceUrl,
    'template' => $newResourceTemplate,
    'published' => 1
));

if ($createNewResource->isError()) {
    echo "Не могу создать страницу с таким заголовком='$newResourcePageTitle'
";
    return;
}
Артур Шевченко
08 апреля 2023, 18:42
0
Для чего вам массовое создание страниц?
Андрей
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/