Помогите с типом данных параметра в сниппете
При передаче параметра в сниппет он передаётся не как тип данных (int), а как (string), при всём при этом тип данных никак не хочет меняться, то есть если меняем тип данных (любым из известных мне способов) в переменной оказывается символ «0» и всё тут… к тому-же заметил ещё такое: если сравниваешь эту переменную с другой (по идее на взгляд одно и то-же число там) — они не равны друг другу (и так "==", и так "==="), плюс к тому-же var_dump() показывает мне вот такую картину об этой переменной — string(17) «2159». Отсюда можно понять, что там 17 символов, хотя на взгляд — 4. Другие же переменные, полученные из базы в этом сниппете var_dump() определяет верно — string(4) «2158».
Комментарии: 9
Это очень и очень странно, но когда я преобразую функцией bin2hex эту переменную, а потом в нотпад++ конверчу её обратно, получаю свой плейсхолдер, который передаю в параметр сниппету — [[+fi.category1]].
Блин, мистика какая-то, что происходит, друзья?)
Блин, мистика какая-то, что происходит, друзья?)
Шиза какая-то. Похоже на проблему с кодировкой, но чисел оно обычно не касается, тем более разница 17 и 4 вообще непонятная.
Попробуй сделать trim(), а потом intval().
Попробуй сделать trim(), а потом intval().
Пытался, не помогло. На всякий сделал ещё разок — всё также… int(0)
По поводу разницы между 17 и 4 — ответ в предыдущем комменте, в передаваемом в параметр сниппета плейсхолдере именно 17 символов… если передать 18 символов, он показывает string(18). Я думаю так — это особенность модэкса, видимо он сначала парсит весь код сниппетов не преобразуя параметры передаваемые в них, а потом уже работает с преобразованием параметров и ещё с чем-то.) Это ИМХО, не надо кидаться тухлыми помидорами, просто другого ничего на ум не приходит.
Помоему важное уточнение не упомянул — этот плейсхолдер, который я передаю в качестве параметра в сниппет, создаётся в &preHooks сниппета FormIt.
Даже не знаю, чем помочь.
Может быть есть мысль, как реализовать это? Вот у меня есть форма редактирования ресурса с фронтэнда, которая работает через 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: Пытаюсь воспроизвести что то подобное у себя на локалке
Выше в комменте скинул полный код, дабы было легче воспроизвести. ;)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.