По просьбе была создана статья, с помощью которой вы сможете в 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 на сегодняшний день.