Русский язык в результатах поиска

Не так давно захотелось мне сделать русский язык в результатах поиска, а именно, чтобы количество найденных топиков и комментариев выводилось так: 3 топика, 11 комментариев.

Сделать это проще простого, однако в силу природной лени и версии 0.2 движка у меня, публиковать хак не хочу ;) Привожу текст хака здесь, вдруг кому понадобится (а кому надо — тот разберется).


Итак, сначала нам понадобится класс, который будет выполнять морфологию. Это запросто, вот его текст:

class International
{
	// Дата, дат, даты
	public static function GetLanguageItem($count, $singular, $plural, $genitive)
	{
		$returnValue = '';

		$num = sprintf("%02d", $count);
		$num = substr($num, strlen($num) - 2, 2);
		$last = substr($num, 1, 1);
		$prevLast = substr($num, 0, 1);

		switch($prevLast)
		{
			case 1:
			{
				$returnValue = $count.' '.$plural;
				break;
			}

			default:
			{
				switch($last)
				{
					case 0:
					{
						$returnValue = $count.' '.$plural;
						break;
					}
					case 1:
					{
						$returnValue = $count.' '.$singular;
						break;
					}
					case 2:
					case 3:
					case 4:
					{
						$returnValue = $count.' '.$genitive;
						break;
					}
					case 5:
					case 6:
					case 7:
					case 8:
					case 9:
					{
						$returnValue = $count.' '.$plural;
						break;
					}
				}
			}
		}

		return $returnValue;
	}
}


Итак, его можно использовать с любым текстом и числами, например:
print International::GetLanguageItem(25, 'кошка', 'кошек', 'кошки');


выведет на экран «25 кошек».

Класс International размещаем там, где нам удобнее. Я его закинул в файл /classes/actions/ActionSearch.class.php, это, конечно, не совсем правильно с точки зрения модульности, архитектуры и фэн шуя, но Вы уж сами решите ;)

Отлично, теперь покажу, что надо поправить в результатах поиска (актуально для версии со 102 редакции транка).

/classes/actions/ActionSearch.class.php (правим в самом конце)

$this->SetTemplateAction('results');
$this->Viewer_AddHtmlTitle($aReq['q']);
$this->Viewer_Assign('bIsResults', $this->bIsResults);

// Наши правки начались тут
$sTopicText = International::GetLanguageItem($aRes['aCounts']['topics'], 'топик', 'топиков', 'топика');
$sCommentText = International::GetLanguageItem($aRes['aCounts']['comments'], 'комментарий', 'комментариев', 'комментария');

$this->Viewer_Assign('sTopicText', $sTopicText);
$this->Viewer_Assign('sCommentText', $sCommentText);
// И вот тут закончились ;)

return $aRes;


Отлично, но теперь надо бы рассказать шаблону о том, какой он теперь модный ;)

У меня он находится в файле /templates/skin/habra/actions/ActionSearch/results.tpl, у обладателей редакции 0.3 — примерно там же, думаю, только надо заменить habra на new.

Находим тег ul и заменяем все содержимое на:
<ul id="sub-nav">
	{foreach from=$aRes.aCounts item=iCount key=sType name="sTypes"}
		<li {if $aReq.sType == $sType}class="current"{/if}><a href="/search/{$sType}/?q={$aReq.q}">{if $sType=="topics"}{$sTopicText}{elseif $sType=="comments"}{$sCommentText}{/if}</a>{if $smarty.foreach.sTypes.last}.{else},{/if}</li>
	{/foreach}
	</ul>


Профит :)

Заранее извиняюсь, если что-то непонятно. Думаю, хаки лучше накатывать тогда, когда есть общее понимание работы движка ;) По возможности отвечу на вопросы в комментах.

3 комментария

avatar
спасиб. дополню в свой модуль)
avatar
похорошему эту штуку вообще надо понапихать во многие места
avatar
Главное место, куда ее надо понапихать, думаю, называется SVN ;) Но это уж пусть создатель решает :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.