Last active
November 1, 2017 17:49
-
-
Save jerrydeakins/df742fba64823b95636c to your computer and use it in GitHub Desktop.
Навигация по автометкам (ModX Revo)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
А вот вызов pdoResources, для создания блога и фильтрации по автометке. | |
[[!pdoResources? | |
&parents=`[[*id]]` | |
&tvFilters=`[[!tagLinks? &get=`1`]]` | |
&tpl=`@INLINE <div class="row"> | |
<div class="cols col-10 intro"> | |
<h2><a href="{{+link}}">{{+pagetitle}}</a> ({{+publishedon}})</h2> | |
<div>{{!tagLinks? &tags=`{{+tv.autotag}}`}}</div> | |
{{+introtext}} <a href="{{+link}}">читать дальше..</a> | |
</div> | |
</div>` | |
]] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/*Для создания, собственно меток, логично использовать штатный tv параметр с типом autotag (автометка), поэтому вначале, | |
создаю его и как нибудь называю. Не задумываясь особенно, назвал его по названию типа — autotag. | |
Добавляю созданный tv в шаблон для вывода постов и с ним — все. | |
Для вывода меток, делаю два сниппета, один для создания облака меток — tagCloud, | |
второй для вывода меток в блоге и в самом посте — tagLinks.*/ | |
$base = $modx->config['base_url']; | |
$tvname = $modx->getOption('tvname', $scriptProperties, "autotag"); | |
$output = ""; | |
$content_type = $modx->getObject('modContentType', array('mime_type' => 'text/html')); | |
if(substr_count($_SERVER["REQUEST_URI"], $content_type->get('file_extensions'))) { | |
$parent = $modx->resource->parent; | |
$url = $modx->makeUrl($modx->resource->parent); | |
}else{ | |
$parent = $modx->resource->id; | |
$url = $modx->resource->uri; | |
} | |
$q = $modx->newQuery('modTemplateVarResource'); | |
$q->select('DISTINCT(`modTemplateVarResource`.`value`)'); | |
$q->innerJoin('modTemplateVar', 'tv', "tv.id = modTemplateVarResource.tmplvarid"); | |
$q->innerJoin('modResource', 'res', 'res.id=modTemplateVarResource.contentid'); | |
$q->where(array( | |
'tv.name' => $tvname, | |
'res.context_key' => $modx->resource->context_key, | |
'res.parent' => $parent | |
) | |
); | |
if($q->prepare() && $q->stmt->execute()) { | |
while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) { | |
$result[] = $row['value']; | |
} | |
} | |
if($result) { | |
$result = implode($result, ','); | |
$result = array_unique(explode(',', $result)); | |
foreach($result as $value) { | |
$output .= "<a href='{$base}{$url}?tag={$value}'>{$value}</a> "; | |
} | |
} | |
return $output; | |
/*Этот сниппет выводит список уникальных значений меток, в виде ссылок, с GET параметром, который потом будет использоваться, | |
для фильтрации вывода ресурсов: | |
[[!tagCloud:default=`Пока нет меток`? &tvname=`autotag`]] | |
<a href="/path/?tag=метка">метка</a> | |
<a href="/path/?tag=опятьметка">опятьметка</a> | |
<a href="/path/?tag=ещеметка">ещеметка</a> | |
Что в нем происходит: | |
Из таблицы с классом «modTemplateVarResource», выбираю все tv с типом «autotag» и именем «autotag», | |
связанные с ресурсами находящимися в текущем контексте, родителем для которых, в случае вывода в блоге, | |
является ресурс где вызывается сниппет, а в случае вывода в статье — родитель статьи. | |
Так как в одной автометке, может быть много значений, перечисленных через запятую, то сначала, на уровне запроса, | |
убираю повторяющиеся множественные значения, затем разбиваю результирующий массив по запятым и из него, так же, | |
убираю повторяющиеся значения. В конце формирую ссылки.*/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
$tags = $modx->getOption('tags', $scriptProperties); | |
$get = $modx->getOption('get', $scriptProperties, '0'); | |
$base = $modx->config['base_url']; | |
$content_type = $modx->getObject('modContentType', array('mime_type' => 'text/html')); | |
if(substr_count($_SERVER["REQUEST_URI"], $content_type->get('file_extensions'))) { | |
$url = $modx->makeUrl($modx->resource->parent); | |
}else{ | |
$url = $modx->resource->uri; | |
} | |
if(!$get){ | |
if(!$tags) {return '';} | |
$tags = explode(',',$tags); | |
foreach($tags as $value) { | |
$output[] = "<a href='{$base}{$url}?tag={$value}'>{$value}</a>"; | |
} | |
return implode(' ',$output); | |
}else{ | |
return (!empty($_GET['tag']))? "autotag==%{$_GET['tag']}%" : ''; | |
} | |
/*Этот сниппет, выводит список ссылок, для блога и ресурса, а так же передает GET-параметр в вызов pdoResources, | |
для фильтрации по меткам. В принципе, это разные задачи, но я решил не плодить сниппеты. | |
Что в нем происходит: | |
Сниппет может принимать в качестве параметров два значения: | |
[[!tagLinks? &tags=`[[*autotag]]`]] | |
и | |
[[!tagLinks? &get=`1`]] | |
В первом случае, сниппет разбивает полученную автометку на отдельные значения, заворачивает их в ссылки, | |
как в tagCloud и выводит. Для того, чтобы можно было выводить метки и в блоге и в самой статье, в начале сниппета | |
получаю расширение для типа html и проверяю его наличие в адресной строке. Если адрес заканчивается на .html, | |
то в url попадает адрес родителя (для статьи). | |
Во втором случае, когда передается параметр &get=`1`, сниппет смотрит в адресную строку и если там есть значение метки, | |
то передает его в вывод, оформляя подходящим для фильтрации образом.*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Источник: https://modx.pro/howto/5357-navigation-automedon/