Финансовая поддержка VPS, бесплатные дополнения и docs Донаты оплачивают сервер и двигают бесплатные дополнения MODX и документацию. Поддержать

Всего 126 147 комментариев

Сергей Шлоков
Сергей Шлоков
Я не знаю возможностей битрикса, но обрати внимание как работают компьютерные интернет-магазины — там, например, нет выбора HDD через характеристику объема. Каждый HDD — это отдельная единица товара со всеми вытекающими возможностями учета остатка, отчетов по оборотам, указанием места хранения и т.д.Вот например. Внизу разделы: товары этой же фирмы, похожие товары. Очень удобно.
П.С Любую задачу можно решить нестандартно. Особенно, если программисту некому ставить задачу и все упирается в его знание матчасти. Собственный велосипед — это конечно гордость изобретателя, но проблема для пользователя.
Сергей Шлоков
Сергей Шлоков
Одеяла с разными характеристиками не могут быть одним товаром: у них разная закупочная цена, соответственно ведется учет остатков по каждому размеру. По крайней мере, так при грамотно организованном складском учете. При одинаковой цене можно вести одну карточку товара, например, с разными цветами — через ассортимент, аналогичный товар и т.п. (в разных программах по разному называется). А с разной ценой один товар — это неправильно!
Так что разбейте одеяла на размеры и никаких доработок делать не нужно.
Пашок
Пашок
Может быть есть мысль, как реализовать это? Вот у меня есть форма редактирования ресурса с фронтэнда, которая работает через FormIt, вот код вызова формита:
[[!FormIt?
&hooks=`formit2resource_vacancy,redirect`
&preHooks=`resource2formit_vacancy`
&resource2formitfields=`parent,pagetitle,content,createdby,specializations,zpot,zpdo,zpno,zpposle,vgrafik,vcity,vcompany,vphone,vmobphone,vemail`
&redirectTo=`2157`
&template=`13`
&validate=`
	pagetitle:required,
	content:required,
	vcity:required,
	vcompany:required,
	vgrafik:required,
	category1:required,
	vemail:email:required,
	iconfirm:required` ]]
Вот код сниппета «resource2formit_vacancy», который вызывается в формите как прэхук:
$error=true;
if(isset($_GET['rid'])) {
	if($doc = $modx->getObject('modResource', array('id'=>$_GET['rid']))) {
		$profile = $modx->user->getOne('Profile');
		if($doc->get('createdby') == $profile->get('id')) {
			$error=false;
		}
		$docarray = $doc->toArray();
		$fields = explode(',', $scriptProperties['resource2formitfields']);
		$fields[] = 'id';
		foreach($fields as $field)
		{
			if($doc->getFieldName($field) === null) {
				$tvValue = $doc->getTVValue($field);
				if($field == 'specializations') {
					if($tvValue !== null) {
						$specializations = explode("::", $tvValue);
						if(isset($specializations[0])) $hook->setValue('category1', str_replace(':','', $specializations[0]));
						if(isset($specializations[1])) $hook->setValue('category2', str_replace(':','', $specializations[1]));
						if(isset($specializations[2])) $hook->setValue('category3', str_replace(':','', $specializations[2]));
					}
				}
				else {
					if($tvValue !== null) {
						$hook->setValue($field, $tvValue);
					}
				}
			} else {
				if($field == 'content') {
					$content = $docarray[$field];
					$content = str_replace(array("<br />","<b>","</b>","<i>","</i>","<u>","</u>","<ul>","</ul>","<ol>","</ol>","<li>","</li>"),array("
","[b]","[/b]","[i]","[/i]","[u]","[/u]","[list]","[/list]","[list=1]","[/list]","[*]","[/*]"), $content);
					$hook->setValue($field, $content);
				}
				else {
					$hook->setValue($field, $docarray[$field]);
				}
				$fields_data .= $field.' ';
			}
		}
		$hook->setValue('fields', $fields_data);
	}
}
$hook->setValue('erroredit', $error);
return true;
В форме редактирования вакансии есть поля «специализация по вакансии», там выпадающий список select, который берёт список из ресурсов модэкса, вот код:
<h3>Специализация по вакансии:</h3>
<!-- Специализация по вакансии -->
<div style="font-size:10px; padding-bottom:5px;"><span class="error">[[+fi.error.category1:isnotempty=`Выберите хотя-бы основную специализацию по вакансии!`]]</span></div>
<div style="padding-bottom:5px;">
	<select name="category1" id="category1" data-placeholder="Выберите основную специализацию по вакансии*" class="chosen-select" style="width:100%;" onchange="selectchange2('#category1','#category2','#category3','#option1id','#option2id','#option3id');" tabindex="6">
		<option value=""></option>
		[[cats_options? &parent=`2151` &optionid=`option1id` &selname=`category1` &seloption=`[[+fi.category1]]`]]
	</select>
</div>
<div style="padding-bottom:5px;">
	<select name="category2" id="category2" data-placeholder="Выберите второстепенную специализацию по вакансии" class="chosen-select" style="width:100%;" onchange="selectchange2('#category2','#category1','#category3','#option2id','#option1id','#option3id');" tabindex="7">
		<option value=""></option>
		[[cats_options? &parent=`2151` &optionid=`option2id` &selname=`category2` &seloption=`[[+fi.category2]]`]]
	</select>
</div>
<br />
<script src="/js/chosen.jquery.js" type="text/javascript"></script>
<script type="text/javascript">
	var config = {
		'.chosen-select' : {max_selected_options: 1}
	}
	for (var selector in config) {
		$(selector).chosen(config[selector]).trigger('chosen:updated');
	}
</script>
<script type="text/javascript">
$(document).ready(function(){
	selectchange2('#category1','#category2','#category3','#option1id','#option2id','#option3id');
	selectchange2('#category2','#category1','#category3','#option2id','#option1id','#option3id');
});
</script>
<!-- Специализация по вакансии -->
А вот код сниппета «cats_options», который выводит список с вариантами выбора специализации по вакансии:
if(trim($parent) == '')
{
	$parent = '2151';
}
if(trim($optionid) == '')
{
	$optionid = 'id';
}
if(trim($selname) == '')
{
	$selid = '';
}
elseif(trim($seloption) != '' AND trim($selname) != '')
{
	$selid = trim($seloption);
}
elseif(trim($selname) != '' AND trim($_POST[$selname]) != '')
{
	$selid = (int) $_POST[$selname];
}
else
{
	$selid = '';
}

$parent1 = $modx->runSnippet('getResources',array('parents'=>$parent,'depth'=>0,'limit'=>0,'where'=>'{"isfolder:=":1}','sortby'=>'{"parent":"ASC","id":"ASC"}','tpl'=>'@INLINE [[+pagetitle]]==:[[+id]]:','outputSeparator'=>'||'));
if(trim($parent1) != '')
{
	$output = '';
	$array_parent1 = explode('||', $parent1);
	for($i=0; $i<count($array_parent1); $i++)
	{
		$data_array = array();
		$data_array = explode('==', $array_parent1[$i]);
		
		$id = str_replace(':','',$data_array[1]);
		$output .= '<option value="'.str_replace(':','',$data_array[1]).'" id="'.$optionid.str_replace(':','',$data_array[1]).'" '.($selid == $id ? ' selected="selected"' : '').'>'.$data_array[0].'</option>';
	}
}

return $output;
Мне нужно передать в сниппет «cats_options» каким-то образом данные, которые он выделит при редактировании ресурса. Точнее надо передать id ресурса, который будет «награждён» строкой «selected» при вызове списка «специализации по вакансии». Блин, ничего в голову не лезет, помоги пожалуйста.
Алексей
Алексей
они не равны друг другу (и так "==", и так "==="),
"==" проверка на равенство значений переменных
"===" проверка на соответствие типов переменных

PS: Пытаюсь воспроизвести что то подобное у себя на локалке
Пашок
Пашок
По поводу разницы между 17 и 4 — ответ в предыдущем комменте, в передаваемом в параметр сниппета плейсхолдере именно 17 символов… если передать 18 символов, он показывает string(18). Я думаю так — это особенность модэкса, видимо он сначала парсит весь код сниппетов не преобразуя параметры передаваемые в них, а потом уже работает с преобразованием параметров и ещё с чем-то.) Это ИМХО, не надо кидаться тухлыми помидорами, просто другого ничего на ум не приходит.
Пашок
Пашок
Это очень и очень странно, но когда я преобразую функцией bin2hex эту переменную, а потом в нотпад++ конверчу её обратно, получаю свой плейсхолдер, который передаю в параметр сниппету — [[+fi.category1]].
Блин, мистика какая-то, что происходит, друзья?)
Александр Рахимов
Александр Рахимов
День добрый.
Синхронизация с МоимСкладом по стандарту CommerceML изначально не поддерживает размеры (хоть они и есть в моемскладе). Там даже остатки по всем размерам будут суммироваться и приходить как один товар.

Есть вариант сделать синхронизацию по вашему сценарию, но это потребует доработки дополнения под ваш сайт и в этом случае синхронизация будет производится посредством REST API МойСклад. Так же возможно потребуется доработка дополнения minishop2