Skip to content

Instantly share code, notes, and snippets.

@jerrydeakins
Last active November 1, 2017 17:49
Show Gist options
  • Save jerrydeakins/df742fba64823b95636c to your computer and use it in GitHub Desktop.
Save jerrydeakins/df742fba64823b95636c to your computer and use it in GitHub Desktop.
Навигация по автометкам (ModX Revo)
А вот вызов 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>`
]]
<?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»,
связанные с ресурсами находящимися в текущем контексте, родителем для которых, в случае вывода в блоге,
является ресурс где вызывается сниппет, а в случае вывода в статье — родитель статьи.
Так как в одной автометке, может быть много значений, перечисленных через запятую, то сначала, на уровне запроса,
убираю повторяющиеся множественные значения, затем разбиваю результирующий массив по запятым и из него, так же,
убираю повторяющиеся значения. В конце формирую ссылки.*/
<?php
/*Если захотелось вывести, например в сайдбаре, статьи связанные с текущей, по меткам, то можно использовать вот такой сниппет*/
$tpl = $modx->getOption('tpl', $scriptProperties);
$limit = $modx->getOption('limit', $scriptProperties, 5);
$tvname = $modx->getOption('tvname', $scriptProperties, "autotag");
$tvvalue = $modx->resource->getTVValue($tvname);
$base = $base = $modx->config['base_url'];
$currentid = $modx->resource->id;
$output = '';
$q = $modx->newQuery('modResource', array(
'context_key' => $modx->resource->context_key,
'parent' => $modx->resource->parent
));
$q->select('pagetitle,introtext,publishedon,uri,tvres.value as autotag');
$q->innerJoin('modTemplateVarResource', 'tvres', "tvres.contentid = modResource.id");
$q->innerJoin('modTemplateVar', 'tv', "tv.id = tvres.tmplvarid");
$q->limit($limit);
$q->where(array(
'modResource.id:!=' => $currentid,
'tv.name' => $tvname,
'tvres.value:REGEXP' => str_replace( ',', '|', $tvvalue)
)
);
if($q->prepare() && $q->stmt->execute()) {
while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
$output .= $modx->getChunk($tpl, array(
'url' => $base.$row['uri'],
'date' => date("Y-m-d H:i:s", $row['publishedon']),
'pagetitle' => $row['pagetitle'],
'text' => $row['introtext']
));
}
}
return $output;
/*Здесь, я выбираю записи из таблицы с классом modResource, с которыми связана автометка имеющая, хотя бы одно значение,
такое же как у текущей.
Вызов:
[[!tagRelated:default=`Пока нет связанных постов`?
&tpl=`RELATED`
&limit=`4`
&tvname=`autotag`
]]
Чанк RELATED:
<div>
<a href="[[+url]]">[[+pagetitle]]</a> <span class="date">[[+date]]</span><br />
<div class="sidetext">[[+text:notags:ellipsis=`100`]]</div>
</div>*/
@jerrydeakins
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment