text: <?php
  
  /**
   * Контроллер, отвечающий за работу с пользователями в панели управления
   *
   * @category YupeControllers
   * @package  yupe.modules.zendsearch.controllers
   * @author   YupeTeam <team@yupe.ru>
   * @license  BSD http://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F_BSD
   * @version  0.6
   * @link     https://yupe.ru
   *
   **/
  class ManageBackendController extends yupe\components\controllers\BackController
  {
  
      /**
       * @return array
       */
      public function accessRules()
      {
          return [
              ['allow', 'roles' => ['admin']],
              ['allow', 'actions' => ['index', 'create'], 'roles' => ['Zendsearch.ManageBackend.Index']],
              ['deny'],
          ];
      }
  
      /**
       * Инициализируемся, подключаем ZendLucene:
       *
       */
      public function init()
      {
          Yii::import('application.modules.zendsearch.vendors.*');
  
          require_once 'Zend/Search/Lucene.php';
  
          return parent::init();
      }
  
      /**
       * Index-экшен:
       *
       * @return void
       */
      public function actionIndex()
      {
          $this->render('index');
      }
  
      /**
       * Search index creation
       */
      public function actionCreate()
      {
          /**
           * Если это не AJAX-запрос - посылаем:
           **/
          if (!Yii::app()->getRequest()->getIsPostRequest() && !Yii::app()->getRequest()->getIsAjaxRequest()) {
              throw new CHttpException(404, Yii::t('ZendSearchModule.zendsearch', 'Page was not found!'));
          }
  
          try {
              // Папка для хранения индекса поиска
              $indexFiles = Yii::app()->getModule('zendsearch')->indexFiles;
              // Модели, включенные в индекс
              $searchModels = Yii::app()->getModule('zendsearch')->searchModels;
              // Лимит количества символов к описанию превью найденной страницы
              $limit = 600;
              SetLocale(LC_ALL, 'ru_RU.UTF-8');
              $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive();
              Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer);
              $index = new Zend_Search_Lucene(Yii::getPathOfAlias('application.'.$indexFiles), true);
  
              $messages = [];
  
              if (extension_loaded('iconv') === true) {
                  // Пробежаться по всем моделям и добавить их в индекс
                  foreach ($searchModels as $modelName => $model) {
                      if (!empty($model['path'])) {
                          Yii::import($model['path']);
                      }
                      if (!isset($model['module'])) {
                          $messages[] = Yii::t(
                              'ZendSearchModule.zendsearch',
                              'Update config file or module, Module index not found for model "{model}"!',
                              ['{model}' => $modelName]
                          );
                      } elseif (is_file(Yii::getPathOfAlias($model['path']).'.php') && Yii::app()->hasModule(
                              $model['module']
                          )
                      ) {
                          $criteria = isset($model['criteria']) ? $model['criteria'] : [];
                          $searchNodes = $modelName::model()->findAll(new CDbCriteria($criteria));
  
                          foreach ($searchNodes as $node) {
                              $doc = new Zend_Search_Lucene_Document();
                              $doc->addField(
                                  Zend_Search_Lucene_Field::Text(
                                      'title',
                                      CHtml::encode($node->{$model['titleColumn']}),
                                      'UTF-8'
                                  )
                              );
                              $link = str_replace(
                                  '{'.$model['linkColumn'].'}',
                                  $node->{$model['linkColumn']},
                                  $model['linkPattern']
                              );
                              $doc->addField(Zend_Search_Lucene_Field::Text('link', $link, 'UTF-8'));
                              $contentColumns = explode(',', $model['textColumns']);
                              $i = 0;
                              foreach ($contentColumns as $column) {
                                  $content = $this->cleanContent($node->$column);
                                  if ($i == 0) {
                                      $doc->addField(Zend_Search_Lucene_Field::Text('content', $content, 'UTF-8'));
                                      $description = $this->cleanContent($this->previewContent($node->$column, $limit));
                                      $doc->addField(
                                          Zend_Search_Lucene_Field::Text('description', $description, 'UTF-8')
                                      );
                                  } else {
                                      $doc->addField(Zend_Search_Lucene_Field::Text('content'.$i, $content, 'UTF-8'));
                                  }
                                  $i++;
                              }
                              $index->addDocument($doc);
                          }
                          $index->optimize();
                          $index->commit();
                      } else {
                          $messages[] = Yii::t(
                              'ZendSearchModule.zendsearch',
                              'Module "{module}" not installed!',
                              ['{module}' => $model['module']]
                          );
                      }
                  }
              } else {
                  $messages[] = Yii::t('ZendSearchModule.zendsearch', 'This module require "Iconv" extension!');
              }
  
              Yii::app()->ajax->raw(
                  empty($messages)
                      ? Yii::t('ZendSearchModule.zendsearch', 'Index updated successfully!')
                      : Yii::t('ZendSearchModule.zendsearch', 'There is an error!')
                      .': '
                      .implode("\n", $messages)
              );
          } catch (Exception $e) {
              Yii::app()->ajax->raw(
                  Yii::t('ZendSearchModule.zendsearch', 'There is an error!').":\n".$e->getMessage()
              );
          }
      }
  
      /**
       * @param $data
       * @param int $limit
       * @return string
       */
      private function previewContent($data, $limit = 400)
      {
          return substr($data, 0, $limit).'...';
      }
  
      /**
       * @param $data
       * @return string
       */
      private function cleanContent($data)
      {
          return strip_tags($data);
      }
  }
  