Помогите с типом данных параметра в сниппете

При передаче параметра в сниппет он передаётся не как тип данных (int), а как (string), при всём при этом тип данных никак не хочет меняться, то есть если меняем тип данных (любым из известных мне способов) в переменной оказывается символ «0» и всё тут… к тому-же заметил ещё такое: если сравниваешь эту переменную с другой (по идее на взгляд одно и то-же число там) — они не равны друг другу (и так "==", и так "==="), плюс к тому-же var_dump() показывает мне вот такую картину об этой переменной — string(17) «2159». Отсюда можно понять, что там 17 символов, хотя на взгляд — 4. Другие же переменные, полученные из базы в этом сниппете var_dump() определяет верно — string(4) «2158».
Пашок
24 октября 2013, 12:35
modx.pro
1 292
0

Комментарии: 9

Пашок
24 октября 2013, 17:32
0
Это очень и очень странно, но когда я преобразую функцией bin2hex эту переменную, а потом в нотпад++ конверчу её обратно, получаю свой плейсхолдер, который передаю в параметр сниппету — [[+fi.category1]].
Блин, мистика какая-то, что происходит, друзья?)
    Василий Наумкин
    24 октября 2013, 17:44
    0
    Шиза какая-то. Похоже на проблему с кодировкой, но чисел оно обычно не касается, тем более разница 17 и 4 вообще непонятная.

    Попробуй сделать trim(), а потом intval().
      Пашок
      24 октября 2013, 17:49
      0
      Пытался, не помогло. На всякий сделал ещё разок — всё также… int(0)
        Пашок
        24 октября 2013, 17:53
        0
        По поводу разницы между 17 и 4 — ответ в предыдущем комменте, в передаваемом в параметр сниппета плейсхолдере именно 17 символов… если передать 18 символов, он показывает string(18). Я думаю так — это особенность модэкса, видимо он сначала парсит весь код сниппетов не преобразуя параметры передаваемые в них, а потом уже работает с преобразованием параметров и ещё с чем-то.) Это ИМХО, не надо кидаться тухлыми помидорами, просто другого ничего на ум не приходит.
          Пашок
          24 октября 2013, 17:55
          0
          Помоему важное уточнение не упомянул — этот плейсхолдер, который я передаю в качестве параметра в сниппет, создаётся в &preHooks сниппета FormIt.
            Василий Наумкин
            24 октября 2013, 19:44
            0
            Даже не знаю, чем помочь.
              Пашок
              25 октября 2013, 10:43
              0
              Может быть есть мысль, как реализовать это? Вот у меня есть форма редактирования ресурса с фронтэнда, которая работает через 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» при вызове списка «специализации по вакансии». Блин, ничего в голову не лезет, помоги пожалуйста.
          Алексей
          24 октября 2013, 23:34
          0
          они не равны друг другу (и так "==", и так "==="),
          "==" проверка на равенство значений переменных
          "===" проверка на соответствие типов переменных

          PS: Пытаюсь воспроизвести что то подобное у себя на локалке
            Пашок
            25 октября 2013, 10:46
            0
            Выше в комменте скинул полный код, дабы было легче воспроизвести. ;)
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            9