Файл: system/controllers/tags/actions/index.php
Строк: 101
<?php
class actionTagsIndex extends cmsAction {
public function run($target = '', $tag_name = ''){
// ничего нет - показываем список тегов
if(!$target && !$tag_name){
return $this->displayTags();
}
// передан только $target, значит это тег
if(!$tag_name){
$tag_name = $target;
$target = '';
}
// субъект в формате controller_name-subject_name
if($target && !preg_match('/^([a-z0-9_]+-{1}[a-z0-9_]+)$/', $target)){
cmsCore::error404();
}
$tag_name = urldecode($tag_name);
// получаем тег
$tag = $this->model->getTagByTag($tag_name);
if(!$tag){
cmsCore::error404();
}
// получаем все субъекты тега
$targets = $this->model->getTagTargets($tag['id']);
if(!$targets){
cmsCore::error404();
}
$menu_items = cmsEventsManager::hookAll('tags_search_subjects', array($tag, $targets));
if (!$menu_items) { cmsCore::error404(); }
// субъект по умолчанию - первый из списка
if(!$target){
foreach ($menu_items as $controller_name => $_menu_items) {
if(empty($_menu_items)){ continue; }
$first_subject = array_keys($_menu_items);
$target = $first_subject[0];
// редиректим на правильный урл
$this->redirect(href_to('tags', $target, urlencode($tag_name)), 301);
}
}
list($target_controller, $target_subject) = explode('-', $target);
if(!cmsCore::isControllerExists($target_controller) || !cmsController::enabled($target_controller)){
cmsCore::error404();
}
$page_url = href_to($this->name, $target, urlencode($tag_name));
// результат поиска получаем только по переданному контроллеру
$controller = cmsCore::getController($target_controller, $this->request);
$list_html = $controller->runHook('tags_search', array($target_subject, $tag, $page_url));
if (!$list_html) { cmsCore::error404(); }
foreach ($menu_items as $menu_item) {
$this->cms_template->addMenuItems('results_tabs', $menu_item);
}
$seo_title = sprintf(LANG_TAGS_SEARCH_BY_TAG, $tag['tag']);
$seo_keys = $seo_title;
$seo_desc = $seo_title;
$seo_h1 = $seo_title;
$seo_data = array(
'tag' => $tag['tag'],
'ctype_title' => isset($menu_items[$target_controller][$target]['title']) ? $menu_items[$target_controller][$target]['title'] : null
);
$seo_title_pattern = $tag['tag_title'] ? $tag['tag_title'] : $this->options['seo_title_pattern'];
$seo_desc_pattern = $tag['tag_desc'] ? $tag['tag_desc'] : $this->options['seo_desc_pattern'];
$seo_h1_pattern = $tag['tag_h1'] ? $tag['tag_h1'] : $this->options['seo_h1_pattern'];
if($seo_title_pattern){
$seo_title = string_replace_keys_values_extended($seo_title_pattern, $seo_data);
}
if($seo_desc_pattern){
$seo_desc = string_replace_keys_values_extended($seo_desc_pattern, $seo_data);
}
if($seo_h1_pattern){
$seo_h1 = string_replace_keys_values_extended($seo_h1_pattern, $seo_data);
}
if ($this->cms_user->is_admin){
$this->cms_template->addToolButton(array(
'class' => 'edit',
'icon' => 'edit',
'title' => LANG_TAGS_TAG_EDIT,
'href' => href_to('admin', 'controllers', array('edit', 'tags', 'edit', $tag['id']))
));
$this->cms_template->addToolButton(array(
'class' => 'page_gear',
'icon' => 'wrench',
'title' => LANG_TAGS_SETTINGS,
'href' => href_to('admin', 'controllers', array('edit', 'tags'))
));
}
$this->cms_template->addHead('<link rel="canonical" href="'.href_to_abs($this->name, $target, urlencode($tag_name)).'"/>');
return $this->cms_template->render('search', array(
'seo_title' => $seo_title,
'seo_keys' => $seo_keys,
'seo_desc' => $seo_desc,
'seo_h1' => $seo_h1,
'html' => $list_html
));
}
private function displayTags() {
return $this->cms_template->render('tags', $this->getTagsWidgetParams($this->options));
}
}