Изменить код tagLinks [РЕШЕНО]

Добрый день!

У меня к статьям идет ТВ параметр «основная категория» Способ ввода — выбор из списка. Например, «спорт ==10», «дети ==15». Где цифра — это номер документа данной категории. И в шаблонах страниц через GetField по этому id выводится шапка данной категории (ну и еще много чего можно). Также есть ТВ-параметр «дополнительные категории и подкатегории» с мультивыбором по этому же принципу, т.е. одна статья может относится к разным подкатегориям, по которым также фильтруются доки. Но условно говоря, это теги. И вот такой момент — TagLinks показывает сами цифры, что логично. Нужно отобразить названия, и чтобы при клике открывалась данная категория, а не страница вывода по тегу (один шаблон вывода по тегу vs шаблоны категории/подкатегории с соответствующей атрибутикой).

С формированием ссылки разобралась — по id категории формирует ссылку на нее и отправляет.
А вот с заменой цифр на названия пока не получается.
$tags = array();
$tvarray = explode($delimiter, $get_tags);
foreach ($tvarray as $tag) {
if (!empty($tag)) {
if ($caseSensitive) {
$tags[trim($tag)] = trim($tag);
} else {
$tags[strtolower(trim($tag))] = trim($tag);
}
}
}
$tvarray = array_values($tags);
$cnt = count($tvarray);
for ($x=0;$x<$cnt;$x++) {
$url = urlencode(trim($tvarray[$x]));
$cnd_separator = ($x!=($cnt-1)) ? $separator : '';
  $link .= '<a href="'.$doc_path.'">'.trim($tvarray[$x]).'</a>'; 
}


Cдела такую конструкцию, подстмотрев функцию в Getfields
foreach ($tvarray as $tag) {
	  $tag = gfGetFieldContent($modx,$tag,'pagetitle'); /* $tag, напомню, в данном случае номер - id */
}

Вставляю между $tvarray и $cnt. Также цифры показывает…
Не знаю, что придумать, подскажите, пожалуйста
Спасибо!

6 комментариев

avatar
Либо дергать по одному docs.evolution-cms.com/Develop/API/getDocument
Либо получить массив доков docs.evolution-cms.com/Develop/API/getDocuments
  • Shin
  • 0
avatar
$tvarray=array(1,4,44,"В этот массив может попасть текст?");//массив id-шников документов
if(!empty($tvarray)){//если этот массив будет пустой, то возникнет ошибка при запросе в БД
	$ids=array();//новый массив с валидными значениями для запроса в БД; можно упустить этот момент и использовать в коде $tvarray вместо $ids если уверены что в нем только числа
	foreach($tvarray as $cur_id){
		$ids[]=intval($cur_id);
	}
	//запрос в БД для получения id и pagetitle документов
	$res=$modx->db->select('id,pagetitle',$modx->getFullTableName('site_content'),'id IN ("'.implode('","',$ids).'")');
	if($res and $modx->db->getRecordCount($res)>0){//запрос выполнился и есть результаты
		while($row=$modx->db->getRow($res)){//$row['id'] - id документа , $row['pagetitle'] - pagetitle документа
			$docUrl=$modx->makeUrl($row['id']);//урл документа
			echo '<a href="'.$docUrl.'">'.$row['pagetitle'].'</a>';//выводим ссылку на документ
		}
	}
}
Комментарий отредактирован 2017-10-11 20:09:56 пользователем o_oleksandr
avatar
Очень здорово! Целый код, работает! ))))
Да, только цифры могут попасть, спасибо!
Единственный момент, вы знаете — отображаются подряд без пробелов и запятых, но ссылки разные.
Пытаюсь добавить в этот код запятыме.

$tags = array();
$tvarray = explode($delimiter, $get_tags);
foreach($tvarray as $cur_id){
	$ids[]=intval($cur_id);
}
//запрос в БД для получения id и pagetitle документов
$res=$modx->db->select('id,pagetitle',$modx->getFullTableName('site_content'),'id IN ("'.implode('","',$ids).'")');
if($res and $modx->db->getRecordCount($res)>0){//запрос выполнился и есть результаты
	while($row=$modx->db->getRow($res)){//$row['id'] - id документа , $row['pagetitle'] - pagetitle документа
	$docUrl=$modx->makeUrl($row['id']);//урл документа		
$cnt = count($cur_id);
for ($x=0;$x<$cnt;$x++) {
$cnd_separator = ($x!=($cnt-1)) ? $separator : '';
                }
echo '<a href="'.$docUrl.'">'.$row['pagetitle'].'</a>'.trim($cur_id[$x]).$cnd_separator;
	}
}


Показывает либо 0 либо 1 после каждого тега (и последнего тоже) — смотря куда вставить код
$cnt = count($cur_id);
for ($x=0;$x<$cnt;$x++) {
$cnd_separator = ($x!=($cnt-1))? $separator: ''; //? $separator указывается в вызове сниппета
}
avatar
Попробуйте вот так:
if(empty($get_tags)){
	return;
}
$separator=isset($separator)?$separator:'';
$tags = array();
$tvarray = explode($delimiter, $get_tags);
foreach($tvarray as $cur_id){
	$ids[]=intval($cur_id);
}
//запрос в БД для получения id и pagetitle документов
$res=$modx->db->select('id,pagetitle',$modx->getFullTableName('site_content'),'id IN ("'.implode('","',$ids).'")');
if($res and $modx->db->getRecordCount($res)>0){//запрос выполнился и есть результаты
	$links=array();
	while($row=$modx->db->getRow($res)){//$row['id'] - id документа , $row['pagetitle'] - pagetitle документа
		$docUrl=$modx->makeUrl($row['id']);//урл документа
		$links[]='<a href="'.$docUrl.'">'.$row['pagetitle'].'</a>';
	}
	echo implode($separator,$links);
}
avatar
Работает!!! Спасибо сердечное!)))
avatar
lowercase хоть сама добавила
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.