Тематика: По цвету: Красный Желтый Зеленый Синий Оранжевый Розовый Серый Белый Черный Мульти

Ваш сайт на CMS Joomla? Добавьте его в галерею Joomfans!

Вы можете совершенно бесплатно добавить ваш веб-сайт в нашу галерею сайтов. Подробнее...

Галерея Добавить

Главная Статьи Блог Фильтрация и разбор контента по тексту статьи в CMS Joomla 2.5
Фильтрация и разбор контента по тексту статьи в CMS Joomla 2.5

joomla-25-filter-content

По просьбе была создана статья, с помощью которой вы сможете в CMS Joomla 2.5 фильтровать контент по тексту статьи. Ранее была написана статья использовав которую можно было осуществлять данные действия в CMS Joomla 1.5. Разработчики CMS Joomla опять же не сделали данный функционал в новых версиях CMS Joomla 1.6, 1.7 и 2.5.

Если у вас есть огромное количество материалов (статей) в CMS Joomla, которые присвоены одной категории, и вы хотите разграничить и раскидать материалы по разным категориям, то прочитав данную статью, вы сможете с легкостью это сделать.

Полная предыстория и описание для чего нужен данный функционал, вы можете прочитать в предыдущей статье.

1 filtr content25

Итак, для создания данной функции поиска по содержимому контента, нам необходимо изменить (отредактировать) 7 файлов:

 

  • administrator/components/com_content/models/articles.php
  • administrator/components/com_content/models/featured.php
  • administrator/components/com_content/views/articles/tmpl/default.php
  • administrator/components/com_content/views/articles/tmpl/modal.php
  • administrator/components/com_content/views/featured/tmpl/default.php
  • administrator/language/ru-RU/ru-RU.ini
  • administrator/language/en-GB/en-GB.ini

Шаг 1

Открываем файл: administrator/components/com_content/models/articles.php, далее переходим к 75 строке и после:

$this->setState('filter.search', $search);

Вставляем строки:

$search_content = $this->getUserStateFromRequest($this->context.'.filter.content', 'filter_content');
$this->setState('filter.content', $search_content);

Далее в этом же файле после строки (118):

$id	.= ':'.$this->getState('filter.search');

Вставляем код (с 119 строки):

$id	.= ':'.$this->getState('filter.content');

После этого в этом же файле, переходим к 223 строке и после:

// Filter by search in title.
		$search = $this->getState('filter.search');
		if (!empty($search)) {
			if (stripos($search, 'id:') === 0) {
				$query->where('a.id = '.(int) substr($search, 3));
			}
			elseif (stripos($search, 'author:') === 0) {
				$search = $db->Quote('%'.$db->escape(substr($search, 7), true).'%');
				$query->where('(ua.name LIKE '.$search.' OR ua.username LIKE '.$search.')');
			}
			else {
				$search = $db->Quote('%'.$db->escape($search, true).'%');
				$query->where('(a.title LIKE '.$search.' OR a.alias LIKE '.$search.')');
			}
		}

Вставляем следующий код (с 238 строки):

// Filter by search in content.
		$search_content = $this->getState('filter.content');
		if (!empty($search_content)) {
			if (stripos($search_content, 'id:') === 0) {
				$query->where('a.id = '.(int) substr($search_content, 3));
			}
			elseif (stripos($search_content, 'author:') === 0) {
				$search_content = $db->Quote('%'.$db->escape(substr($search_content, 7), true).'%');
				$query->where('(ua.name LIKE '.$search_content.' OR ua.username LIKE '.$search_content.')');
			}
			else {
				$search_content = $db->Quote('%'.$db->escape($search_content, true).'%');
				$query->where('(a.introtext LIKE '.$search_content.' OR a.fulltext LIKE '.$search_content.')');				
			}
		}

Сохраняем и закрываем этот файл.

Шаг 2

Теперь необходимо добавить поиск по избранным материалам, для этого открываем файл: administrator/components/com_content/models/featured.php, после переходим к 112 строке и после:

// Filter by search in title
		$search = $this->getState('filter.search');
		if (!empty($search)) {
			if (stripos($search, 'id:') === 0) {
				$query->where('a.id = '.(int) substr($search, 3));
			} else {
				$search = $db->Quote('%'.$db->escape($search, true).'%');
				$query->where('a.title LIKE '.$search.' OR a.alias LIKE '.$search);
			}
		}

Вставляем следующий код (с 122 строки ):

// Filter by search in content
		$search_content = $this->getState('filter.content');
		if (!empty($search_content)) {
			if (stripos($search_content, 'id:') === 0) {
				$query->where('a.id = '.(int) substr($search_content, 3));
			} else {
				$search_content = $db->Quote('%'.$db->escape($search_content, true).'%');
				$query->where('a.introtext LIKE '.$search_content.' OR a.fulltext LIKE '.$search_content);
			}
		}

Сохраняем и закрываем этот файл.

Шаг 3

Теперь нам необходимо добавить поле поиска в административную часть CMS Joomla 2.5. Для этого откройте файл: administrator/components/com_content/views/articles/tmpl/default.php, перейдите к 26 строке, и после:

<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_DESC'); ?>" />

Вставьте следующий код:

<label class="filter-search-lbl" for="filter_content"><?php echo JText::_('JSEARCH_FILTER_CONTENT_LABEL'); ?></label>
<input type="text" name="filter_content" id="filter_content" value="<?php echo $this->escape($this->state->get('filter.content')); ?>" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_CONTENT_DESC'); ?>" />

Теперь нам необходимо добавить событие на кнопку сброса, чтобы при нажатии на кнопку сброса, наш введенный текст сбрасывался. Для этого перейдите в этом же файле к 32 строке (она у вас изменится после добавления кода представленного выше) и замените код:

<button type="button" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>

на

<button type="button" onclick="document.id('filter_search').value='';document.id('filter_content').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>

или же просто в исходную (первоначальную) кнопку, добавьте событие:

document.id('filter_content').value='';

Сохраняем и закрываем этот файл.

Шаг 4

Открываем файл administrator/components/com_content/views/articles/tmpl/modal.php, и переходим к 28 строке. После кода:

<label for="filter_search">
				<?php echo JText::_('JSEARCH_FILTER_LABEL'); ?>
			</label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" size="30" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_DESC'); ?>" />

Вставляем следующий код (с 33 строки):

<label for="filter_content">
				<?php echo JText::_('JSEARCH_FILTER_CONTENT_LABEL'); ?>
			</label>
			<input type="text" name="filter_content" id="filter_content" value="<?php echo $this->escape($this->state->get('filter.content')); ?>" size="30" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_CONTENT_DESC'); ?>" />

После в 40-й строке добавляем событие на кнопку сброса. Для этого замените строку:

<button type="button" onclick="document.id('filter_search').value='';this.form.submit();">
				<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>

на

<button type="button" onclick="document.id('filter_search').value='';document.id('filter_content').value='';this.form.submit();">
				<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>

Сохраняем и закрываем этот файл.

Шаг 5

Открываем файл вывода избраных материалов: administrator/components/com_content/views/featured/tmpl/default.php, после чего переходим к 25 строке и после:

<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_DESC'); ?>" />

Вставляем следующий код (с 27 строки):

<label class="filter-search-lbl" for="filter_content"><?php echo JText::_('JSEARCH_FILTER_CONTENT_LABEL'); ?></label>
			<input type="text" name="filter_content" id="filter_content" value="<?php echo $this->escape($this->state->get('filter.content')); ?>" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_CONTENT_DESC'); ?>" />

Далее необходимо добавить событие на кнопку сброса. Для этого перейдите к (уже) 30-й строке, и замените:

<button type="button" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>

на

<button type="button" onclick="document.id('filter_search').value='';document.id('filter_content').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>

Сохраняем и закрываем этот файл.

Шаг 6

Теперь нам необходимо добавить языковые константы в языковые файлы CMS Joomla 2.5. Для этого открываем файлы: administrator/language/ru-RU/ru-RU.ini и administrator/language/en-GB/en-GB.ini. Далее переходим в самый конец этих файлов и вставляем следующие строчки

В файле administrator/language/ru-RU/ru-RU.ini:

JSEARCH_FILTER_CONTENT_LABEL="Фильтр по контенту: "
COM_CONTENT_FILTER_SEARCH_CONTENT_DESC="Функция позволяет искать определенные слова в теле статьи"

В файле administrator/language/en-GB/en-GB.ini:

JSEARCH_FILTER_CONTENT_LABEL="Filter by content: "
COM_CONTENT_FILTER_SEARCH_CONTENT_DESC="The function allows to search for specific words in the article body"

На этом мы закончили! Теперь нам нужно проверить наш новый фильтр поиска по содержимому контента в CMS Joomla 2.5. Для проверки открываем пункт меню Материалы => Менеджер материалов.

Далее вписываем в наше новое созданное поле, необходимое ключевое слово, которое может содержатся в самом материале. В нашем примере это ключевой запрос «Резервного копирования». После ввода данного ключевого слова, мы можем видеть, что поиск по контенту удался успешно и у нас отобразились материалы, которые содержут данное ключевое слово в теле самой статьи:

2 filtr content25


Теперь открываем любую из найденных статей, переходим к редатору текста и видим, что в самой статье есть ключевое слово «Резервного копирования».


3 filtr content25

Как это все может пригодится? Очень просто. В нашем примере все статьи находятся в категории «Софт». Нам необходимо разбить все статьи по определенным категориям, но так как на сайте мы имеем в общем количестве 15600 материалов (статей), то вручную это делать НЕРЕАЛЬНО и собственно не логично.


Желательно перед выбором и фильтрацией сразу установить количество строк отображаемых материалов на «Все», чтобы мы могли одним махом перенести все наши материалы в новую категорию. После фильтрации выбираем необходимые материалы и переносим их в нужную категорию. В нашем примере категория называется «Резервное копирование (Backup)».

4 filtr content25

Вот и все!


В данной статье использовались:

  • Дистрибутив CMS Joomla 2.5.1
  • Русский язык для CMS Joomla 2.5.1 v3 (от Joomlaportal)

Данное решение также может быть использовано в CMS Joomla 1.6.x и Joomla 1.7.x. При модифицировании файлов, может быть только различие в нумерации строк. Точно такое же решение, только для CMS Joomla 1.5.25 вы можете прочитать в статье - Фильтрация и разбор контента Joomla 1.5 по тексту статьи


Если вы не хотите заморачиваться с модифицированием файлов, можете просто скачать уже готовый файл с нашего сервера - скачать файл. Будьте внимательны! Файлы предназначены для CMS Joomla 2.5.1 и русского языка 2.5.1 v3.


Будьте внимательны при обновлении CMS Joomla. Т.к. если в новых обновлениях будут затронуты модифицированные файлы, то вы просто автоматически перезапишите все файлы которые редактировали!


Внимание! такого функционала вы не добьетесь ни одним из существующих компонентов CMS Joomla на сегодняшний день.

Посмотреть инструкцию по созданию полей фильтрации для CMS Joomla 1.5

Автор: Joomfans.com
Копирование информации без размещения активной и индексируемой ссылки - ЗАПРЕЩЕНО!

Партнеры

 

Комментарии

0Дмитрий09.02.2012 23:47#1
Поставил, работает.
Полностью согласен с автором, по поводу отсутствия данного функционала в стандартных версиях. От души благодарю за помощь.
P.S. Не ищет скрытые символы, теги. Но думаю этого можно добиться спец. плагинами.
0Очередной вебмастер10.02.2012 02:41#2
Спасибо за труды. Полезный материал.
0chelovek28.01.2014 11:02#3
А можно ли тот же фокус сделать для списка материалов категории во фронтэнде? Там тоже фильтрация осуществляется либо по заголовку, либо по автору, либо по хитам.
0chelovek03.02.2014 10:42#4
Отвечаю на свой же вопрос. В файле com_content\mod els\articles.php ищем комментарий // Default to 'title' if parameter is not valid (в Joomla 3.2 это 517 строка) и в строке ниже заменяем a.title на a.introtext либо a.fulltext.

Литература

8 видеоуроков по…

На днях популярная и известная студия по разработке шаблонов и…

Joomla!…

Если вы часто создаете сайты на CMS Joomla! 1.6, 1.7 или 2.5 то вы…

10 легких шагов к…

Прочитав книгу Хагена Графа «10 легких шагов к освоению Joomla! 3.0»…

Joomla! 2.5 -…

Книга «Joomla! 2.5 - Руководство для начинающего пользователя»…

Инструменты

Akeeba SiteDiff

При создании сайта, всегда есть вероятность того что он будет взломан…

Morph Framework

Последняя обновленная и уже совершенно бесплатная версия фреймворка…

CodeLobster PHP…

Очень мощный и многофункциональный редактор РНР, HTML, CSS,…

JB Zen Grid Framework…

Последняя обновленная версия фреймворка Zen Grid от студии…