Создание и сопровождение сайтов

Блог. Yii. Подсказки по yii. Глава десятая.

Поиск

Подсказки по Yii. Глава десятая.

  1. Мета тэги.

    Можно использовать в шаблоне вывод переменных и в коде (представлении или контроллере) указывать их значения:

    1. <meta name="description" content="pageDescription); ?>" />  
    2. <meta name="keywords" content="pageKeywords); ?>" />  

    А можно использовать метод registerMetaTag:

    1. Yii::app()->clientScript->registerMetaTag('описание сайта''description');  
    2. Yii::app()->clientScript->registerMetaTag('ключевые слова сайта''keywords');  

     

  2. Поиск на сайте.

    На примере 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 должна быть такой:

    yii-tips-10-01

    Создайте в protected/components новый файл "SearchKeywords.php" с содержимым:

    1. <?php  
    2. Yii::import('zii.widgets.CPortlet');  
    3.   
    4. class SearchKeywords extends CPortlet {  
    5.     protected function renderContent() {  
    6.         echo CHtml::beginForm(array('quicksearch/keywords/search'), 'get'array('style'=> 'inline')) .  
    7.         CHtml::textField('qs'''array('placeholder'=> 'поиск...''class'=>'width175 search-input-new')) .  
    8.         CHtml::submitButton('Найти',array('style'=>'width:70px;')) .  
    9.         CHtml::endForm();  
    10.     }  
    11. }  

    yii-tips-10-02

    Откройте protected\views\site\index-search-form.php и в начало файла, до

     

    1. <form id="search-form" action="controller->createUrl('/quicksearch/main/mainsearch');?>" method="get">  

     

    добавьте:

    1. <span class="search"><div class="width135">Поиск по словам:</div> </span>  
    2. <span class="search">  
    3. <?php   
    4. $this->widget('SearchKeywords'array());   
    5. ?>  
    6. </span>  

    На главной странице должно получиться так:

    yii-tips-10-03

    В protected\runtime\ создайте новую папку "search" и выставьте права на запись.

    В protected\modules\quicksearch\controllers\ создайте новый файл "KeywordsController.php" с содержимым:

     

    1. <?php  
    2. class KeywordsController extends ModuleUserController  
    3. {  
    4.     private $_searchFiles = 'runtime.search';  
    5.       
    6.     public function init(){  
    7.         Yii::import('application.vendors.*');  
    8.         require_once('Zend/Search/Lucene.php');  
    9.           
    10.         Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('utf-8');  
    11.         Zend_Search_Lucene_Analysis_Analyzer::setDefault(  
    12.             new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive ()  
    13.         );  
    14.         parent::init();   
    15.     }  
    16.    
    17.     public function actionCreate() {      
    18.         $search = new Zend_Search_Lucene(Yii::getPathOfAlias('application.' . $this->_searchFiles), true);  
    19.    
    20.         $apartments = Apartment::model()  
    21.             ->cache(param('cachingTime', 1209600), Apartment::getImagesDependency())  
    22.             ->with(array('images'))  
    23.             ->findAll();  
    24.           
    25.         foreach($apartments as $item){  
    26.             $searchDocument = new Zend_Search_Lucene_Document();  
    27.    
    28.             $searchDocument->addField(Zend_Search_Lucene_Field::Text('title_ru', CHtml::encode($item->title_ru), 'utf-8'));  
    29.             $searchDocument->addField(Zend_Search_Lucene_Field::Text('link', Yii::app()->createUrl('/apartments/main/view'array('id' => $item->id, 'title' => $item->title_ru)), 'utf-8'));     
    30.             $searchDocument->addField(Zend_Search_Lucene_Field::Text('description_ru', CHtml::encode($item->description_ru), 'utf-8'));     
    31.             $searchDocument->addField(Zend_Search_Lucene_Field::Text('description_near_ru', CHtml::encode($item->description_near_ru), 'utf-8'));  
    32.    
    33.             $search->addDocument($searchDocument);  
    34.         }  
    35.         $search->commit();  
    36.         echo 'Файлы успешно созданы';  
    37.     }  
    38.    
    39.     public function actionSearch() {  
    40.         $qs = Yii::app()->getRequest()->getParam('qs', null);  
    41.           
    42.         if ($qs) {  
    43.             $search = new Zend_Search_Lucene(Yii::getPathOfAlias('application.' . $this->_searchFiles));  
    44.             $items = $search->find($qs);  
    45.             $query = Zend_Search_Lucene_Search_QueryParser::parse($qs);   
    46.               
    47.             $pages = new CPagination(count($items));  
    48.             $pages->pageSize = 3;  
    49.               
    50.             $currentPage = Yii::app()->getRequest()->getQuery('page', 1);             
    51.             $first = (int) $currentPage*$pages->pageSize - $pages->pageSize;                                  
    52.             $results = array_slice($items$first$pages->pageSize);  
    53.                
    54.             $this->render('search_result', compact('results''qs''query''pages'));  
    55.         }  
    56.     }  
    57. }  

     

    yii-tips-10-04

    Поиск по словам будет осуществляться в таблице "apartment" по полям: title_ru, description_ru и description_near_ru.

    yii-tips-10-05

    В protected\modules\quicksearch\views\ создайте новый файл "search_result.php" с содержимым:

     

    1. <?php $this->pageTitle .= ' - Результаты поиска'; ?>   
    2. <h2>Результаты поиска для запроса: <strong>""</strong></h2>  
    3.   
    4. <?php if (!empty($results)): ?>  
    5.     <?php foreach($results as $item): ?>                    
    6.         <p>Заголовок: <?php echo $query->highlightMatches(CHtml::encode($item->title_ru), 'utf-8'); ?></p>  
    7.         <p>Ссылка: <?php echo CHtml::link($query->highlightMatches(CHtml::encode($item->title_ru), 'utf-8'), CHtml::encode($item->link)); ?></p>  
    8.         <p>Описание: <?php echo $query->highlightMatches(CHtml::encode($item->description_ru), 'utf-8'); ?></p>  
    9.         <p>Что рядом: <?php echo $query->highlightMatches(CHtml::encode($item->description_near_ru), 'utf-8'); ?></p>  
    10.         <hr/>  
    11.     <?php endforeach; ?>  
    12. <?php else: ?>  
    13.     <p class="error">По вашему запросу ничего не найдено.</p>  
    14. <?php endif; ?>  
    15.   
    16. <?php  
    17. if($pages){  
    18.     $this->widget('itemPaginator'array('pages' => $pages'header' => ''));  
    19. }  
    20. ?>  

     

    yii-tips-10-06

    Выполните код метода actionCreate, набрав в url http://домен/quicksearch/keywords/create.

    Если всё хорошо, то увидите сообщение "Файлы успешно созданы":

    yii-tips-10-07

    При поиске по слову "дом" получим:

    yii-tips-10-08

    При поиске по слову "квартира" получим:

    yii-tips-10-09

     

Обсудить статью на форуме