Я хотел бы сделать пользовательский модуль со списком тегов. Если щелкнуть тег, посетитель перейдет на страницу категории, на которой будут показаны статьи с этим тегом.
Я не эксперт по Joomla, я думал о решении, подобном такой гиперссылке, которое я бы добавил к тегам внутри модуля:
href="http://mywebsite.com/index.php/itemlist/tag/tokio%20city?category=places"
Это возможно? Или как мне достичь этого результата?
Спасибо!
Это немного сложнее, чем просто строка запроса в URL, так как вам также нужно настроить шаблон.
Если вы хотите сделать его как можно более простым, я бы порекомендовал создать новый шаблон K2, используя переопределения шаблонов и отредактировав шаблон категории, чтобы он считывал параметры строки запроса и отображал только статьи, уже отфильтрованные по категории и, более того, по тег через строку запроса.
Это просто краткое руководство, теперь немного подробнее:
1) Создайте новый шаблон K2, используя переопределения шаблонов.
В вашем шаблоне, если он еще не существует, создайте структуру папок /templates/your_template/html/com_k2/templates/default
, «По умолчанию» можно заменить любым именем, если вы хотите иметь больше шаблонов K2, но вы должны установить новый шаблон для каждой категории, которую вы имеете вручную.
Теперь возьмите содержимое из «/ components / com_k2 / templates / default» и скопируйте его в новую папку в вашем шаблоне. Теперь K2 использует шаблоны из вашего /templates/your_template/html/com_k2/
папка. Не стесняйтесь гуглить больше деталей, если вы не понимаете переопределения шаблонов, это очень важно при настройке шаблона.
2) Отредактируйте файл представления категорий, чтобы приспособить список к строкам запроса
Файл, который вас сейчас интересует, находится в /templates/your_template/html/com_k2/templates/default/category.php
, Откройте этот файл и попытайтесь понять, что там важно:
Line 141
<?php foreach($this->leading as $key=>$item): ?>
Line 169
<?php foreach($this->primary as $key=>$item): ?>
Line 197
<?php foreach($this->secondary as $key=>$item): ?>
Line 226
<?php foreach($this->links as $key=>$item): ?>
Это то, что имеет значение. В этих четырех циклах foreach есть все элементы. Затем вы можете заключить содержимое каждого из этих циклов в условие if, чтобы проверить, имеет ли он нужный тег, указанный в URL.
Чтобы показать вам пример, это код для <div id="itemListPrimary">
, Вы можете заменить весь этот div в файле category.php следующим кодом, и он будет работать безупречно. Я только что написал и проверил это.
<div id="itemListPrimary">
<?php foreach ($this->primary as $key=>$item): ?>
<?php
# Get the value of the "tag" query string
$jInput = JFactory::getApplication()->input;
$myTag = $jInput->get('tag', null, 'STRING'); // Joomla 1.6+
//$myTag = JRequest::getVar('tag'); // for Joomla 1.5
# If the tag is empty, the query string is not specified and we'll go standard way without any tag filter
if (empty($myTag)) {
// Define a CSS class for the last container on each row
if ((($key+1)%($this->params->get('num_secondary_columns'))==0) || count($this->secondary)<$this->params->get('num_secondary_columns'))
$lastContainer= ' itemContainerLast';
else
$lastContainer='';
?>
<div class="itemContainer<?php echo $lastContainer; ?>"<?php echo (count($this->secondary)==1) ? '' : ' style="width:'.number_format(100/$this->params->get('num_secondary_columns'), 1).'%;"'; ?>>
<?php
// Load category_item.php by default
$this->item=$item;
echo $this->loadTemplate('item');
?>
</div>
<?php if(($key+1)%($this->params->get('num_secondary_columns'))==0): ?>
<div class="clr"></div>
<?php endif;
# Otherwise the tag is set so we'll filter the articles by the tag
} else {
# Get an array of all the tags that the current article in the loop has
$articleTags = array();
foreach ($item->tags as $tag) {
$articleTags[] = $tag->name;
}
# Check if the article has the tag specified in the URL as a query string
if (in_array($myTag, $articleTags)) {
# Now the default content of the foreach loop comes as written in the default K2 category.php template
// Define a CSS class for the last container on each row
if ((($key+1)%($this->params->get('num_secondary_columns'))==0) || count($this->secondary)<$this->params->get('num_secondary_columns'))
$lastContainer= ' itemContainerLast';
else
$lastContainer='';
?>
<div class="itemContainer<?php echo $lastContainer; ?>"<?php echo (count($this->secondary)==1) ? '' : ' style="width:'.number_format(100/$this->params->get('num_secondary_columns'), 1).'%;"'; ?>>
<?php
// Load category_item.php by default
$this->item=$item;
echo $this->loadTemplate('item');
?>
</div>
<?php if(($key+1)%($this->params->get('num_secondary_columns'))==0): ?>
<div class="clr"></div>
<?php endif;
}
} ?>
<?php endforeach; ?>
</div>
3) Понять, как будут работать URL
URL моей типичной категории:
http://mywebsite.com/category-name
Чтобы показать только статьи с указанным тегом, используйте:
http://mywebsite.com/category-name?tag=your-tag
Например, если вы хотите показывать только статьи с тегом «Город Токио», используйте:
http://mywebsite.com/category-name?tag=Tokio City
Готово.
Это основы того, что вам нужно. Это все, что вам нужно, если вы используете только первичные статьи (без ведущих и второстепенных или ссылок). Конечно, есть еще много вещей, о которых вы можете позаботиться:
Но это было бы намного больше кода, и я хотел бы сделать его простым & читабельно для вас. Я думаю, что дал вам более чем достаточно для начала, так что давай, сделай это, удачи 🙂
Других решений пока нет …