Поиск на сайте.
На примере Open Real Estate 1.2.0 (версия фреймворка 1.1.10).
Скачайте Zend Framework 1.11.11 Minimal по ссылке http://www.zendframework.com/downloads/latest
Скопируйте файлы из архива ZendFramework-1.11.11-minimal/library/Zend/Search в protected/vendors/Zend/Search.
Затем скопируйте файл ZendFramework-1.11.11-minimal/library/Zend/Exception.php в protected/vendors/Zend
После операций копирования структура в protected/vendors/Zend должна быть такой:
Создайте в protected/components новый файл "SearchKeywords.php" с содержимым:
- <?php
- Yii::import('zii.widgets.CPortlet');
-
- class SearchKeywords extends CPortlet {
- protected function renderContent() {
- echo CHtml::beginForm(array('quicksearch/keywords/search'), 'get', array('style'=> 'inline')) .
- CHtml::textField('qs', '', array('placeholder'=> 'поиск...', 'class'=>'width175 search-input-new')) .
- CHtml::submitButton('Найти',array('style'=>'width:70px;')) .
- CHtml::endForm();
- }
- }
Откройте protected\views\site\index-search-form.php и в начало файла, до
- <form id="search-form" action="controller->createUrl('/quicksearch/main/mainsearch');?>" method="get">
добавьте:
- <span class="search"><div class="width135">Поиск по словам:</div> </span>
- <span class="search">
- <?php
- $this->widget('SearchKeywords', array());
- ?>
- </span>
На главной странице должно получиться так:
В protected\runtime\ создайте новую папку "search" и выставьте права на запись.
В protected\modules\quicksearch\controllers\ создайте новый файл "KeywordsController.php" с содержимым:
- <?php
- class KeywordsController extends ModuleUserController
- {
- private $_searchFiles = 'runtime.search';
-
- public function init(){
- Yii::import('application.vendors.*');
- require_once('Zend/Search/Lucene.php');
-
- Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('utf-8');
- Zend_Search_Lucene_Analysis_Analyzer::setDefault(
- new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive ()
- );
- parent::init();
- }
-
- public function actionCreate() {
- $search = new Zend_Search_Lucene(Yii::getPathOfAlias('application.' . $this->_searchFiles), true);
-
- $apartments = Apartment::model()
- ->cache(param('cachingTime', 1209600), Apartment::getImagesDependency())
- ->with(array('images'))
- ->findAll();
-
- foreach($apartments as $item){
- $searchDocument = new Zend_Search_Lucene_Document();
-
- $searchDocument->addField(Zend_Search_Lucene_Field::Text('title_ru', CHtml::encode($item->title_ru), 'utf-8'));
- $searchDocument->addField(Zend_Search_Lucene_Field::Text('link', Yii::app()->createUrl('/apartments/main/view', array('id' => $item->id, 'title' => $item->title_ru)), 'utf-8'));
- $searchDocument->addField(Zend_Search_Lucene_Field::Text('description_ru', CHtml::encode($item->description_ru), 'utf-8'));
- $searchDocument->addField(Zend_Search_Lucene_Field::Text('description_near_ru', CHtml::encode($item->description_near_ru), 'utf-8'));
-
- $search->addDocument($searchDocument);
- }
- $search->commit();
- echo 'Файлы успешно созданы';
- }
-
- public function actionSearch() {
- $qs = Yii::app()->getRequest()->getParam('qs', null);
-
- if ($qs) {
- $search = new Zend_Search_Lucene(Yii::getPathOfAlias('application.' . $this->_searchFiles));
- $items = $search->find($qs);
- $query = Zend_Search_Lucene_Search_QueryParser::parse($qs);
-
- $pages = new CPagination(count($items));
- $pages->pageSize = 3;
-
- $currentPage = Yii::app()->getRequest()->getQuery('page', 1);
- $first = (int) $currentPage*$pages->pageSize - $pages->pageSize;
- $results = array_slice($items, $first, $pages->pageSize);
-
- $this->render('search_result', compact('results', 'qs', 'query', 'pages'));
- }
- }
- }
Поиск по словам будет осуществляться в таблице "apartment" по полям: title_ru, description_ru и description_near_ru.
В protected\modules\quicksearch\views\ создайте новый файл "search_result.php" с содержимым:
- <?php $this->pageTitle .= ' - Результаты поиска'; ?>
- <h2>Результаты поиска для запроса: <strong>""</strong></h2>
-
- <?php if (!empty($results)): ?>
- <?php foreach($results as $item): ?>
- <p>Заголовок: <?php echo $query->highlightMatches(CHtml::encode($item->title_ru), 'utf-8'); ?></p>
- <p>Ссылка: <?php echo CHtml::link($query->highlightMatches(CHtml::encode($item->title_ru), 'utf-8'), CHtml::encode($item->link)); ?></p>
- <p>Описание: <?php echo $query->highlightMatches(CHtml::encode($item->description_ru), 'utf-8'); ?></p>
- <p>Что рядом: <?php echo $query->highlightMatches(CHtml::encode($item->description_near_ru), 'utf-8'); ?></p>
- <hr/>
- <?php endforeach; ?>
- <?php else: ?>
- <p class="error">По вашему запросу ничего не найдено.</p>
- <?php endif; ?>
-
- <?php
- if($pages){
- $this->widget('itemPaginator', array('pages' => $pages, 'header' => ''));
- }
- ?>
Выполните код метода actionCreate, набрав в url http://домен/quicksearch/keywords/create.
Если всё хорошо, то увидите сообщение "Файлы успешно созданы":
При поиске по слову "дом" получим:
При поиске по слову "квартира" получим: