0.00
Рейтинг
0.00
Сила

Олег

Не работает поиск, несмотря на видимое отсутствие ошибки в запросе

Плагин добавляет несколько полей к таблице Topic, после этого по ним необходимо настроить поиск. Модифицировал ACEMySearch, добавил функции по образцу имеющейся GetTopicsIdByRegExp, выводил получившийся запрос — базой обрабатывается корректно, результаты есть, но на страницу поиска ничего не попадает. Например, поиск по дате подачи объявления(это как раз объект, который добавляется плагином к топику):

SELECT SQL_CALC_FOUND_ROWS DISTINCT topic_id
FROM new_topic
WHERE (
topic_driveType =1
AND topic_time1 = '2011-08-29'
)
ORDER BY topic_id ASC 
LIMIT 0 , 20

Функция, которая ищет(делал на основе ACEMySearch):

public function GetTopicsIdByTime($Times, &$iCount, $iCurrPage, $iPerPage, $aParams)
{
    $aResult=array();
    if (!$aParams['bSkipTags']) {
    if(isset($Times[1])){
	$sql = "
	SELECT DISTINCT topic_id
	FROM ".Config::Get('db.table.topic')."
	WHERE (topic_driveType= 0 AND topic_time1 = ? AND topic_time2 = ?)
	ORDER BY
          topic_id ASC
	LIMIT ?d, ?d
	";
      $aRows=$this->oDb->selectPage($iCount, $sql,
          $Times[0],$Times[1],
          ($iCurrPage-1)*$iPerPage, $iPerPage);
    }else{
	$sql = "
	SELECT DISTINCT topic_id
	FROM ".Config::Get('db.table.topic')."
	WHERE (topic_driveType= 1 AND topic_time1 = ?)
	ORDER BY
          topic_id ASC
	LIMIT ?d, ?d
	";
      $aRows=$this->oDb->selectPage($iCount, $sql,
          $Times[0],
          ($iCurrPage-1)*$iPerPage, $iPerPage);
    }
    }
    if ($aRows) {
      foreach ($aRows as $aRow) {
        $aResult[]=$aRow['topic_id'];
      }
    }
    return $aResult;
}

Думал, DBSimple как-то переделывает подставленное значение, но при специально допущенной ошибке в sql выводится запрос, аналогичный приведенному выше, на который находится ненулевой результат. Работает только простейшая функция поиска по 2 полям, которые могут иметь значения 0 и 1(по строкам и с like, и с "=" не работает). С чем такое еще м.б. связано?

Sphinx - есть ли возможность добавить поле в индекс из плагина?

Мой плагин добавляет 2 новых поля в таблицу топиков. По ним необходимо осуществлять поиск.

Как я понял, для этого необходимо создать новый полнотекстовый индекс в таблице и изменить конфигурационный файл sphinx. Но в каталоге livestreet я его не нашел(только тот, что используется при инсталляции). Хуков в классе search — тоже.

Необходимо менять системный конфигурационный файл sphinx, лежащий в /etc или есть способ сделать это в папке плагина?

Или для этих целей проще настроить ACEMySearch?

[solved]Не отправляется сообщение пользователям

Делаю плагин, в котором пользователям, выбранным по значению добавленного поля, отсылается сообщение — всё примерно как с отправкой сообщений подписчикам блога, но шаблон сообщения пришлось изменить. Для этого сделал модуль, наследующий Notify, и добавил свою функцию по образцу SendTopicNewToSubscribeBlog:

 public function SendNewMatch(ModuleUser_EntityUser $oUserTo, ModuleTopic_EntityTopic $oTopic, ModuleBlog_EntityBlog $oBlog, ModuleUser_EntityUser $oUserTopic) {
		/**
		 * Передаём в шаблон переменные
		 */
		$this->oViewerLocal->Assign('oUserTo',$oUserTo);
		$this->oViewerLocal->Assign('oTopic',$oTopic);
		$this->oViewerLocal->Assign('oBlog',$oBlog);
		$this->oViewerLocal->Assign('oUserTopic',$oUserTopic);
		/**
		 * Формируем шаблон
		 */
//ошибка
		$sBody=$this->oViewerLocal->Fetch(Plugin::GetTemplatePath(__CLASS__).'notify.new_match.tpl');
		/**
		 * Если в конфигураторе указан отложенный метод отправки, 
		 * то добавляем задание в массив. В противном случае,
		 * сразу отсылаем на email
		 */
		if(Config::Get('module.notify.delayed')) {
			$oNotifyTask=Engine::GetEntity(
				'Notify_Task', 
				array(
					'user_mail'      => $oUserTo->getMail(),
					'user_login'     => $oUserTo->getLogin(),
					'notify_text'    => $sBody,
					'notify_subject' => $this->Lang_Get('notify_subject_new_match').' «'.htmlspecialchars($oBlog->getTitle()).'»',
					'date_created'   => date("Y-m-d H:i:s"),
					'notify_task_status' => self::NOTIFY_TASK_STATUS_NULL,
				)
			);
			if(Config::Get('module.notify.insert_single')) {
				$this->aTask[] = $oNotifyTask;
			} else {
				$this->oMapper->AddTask($oNotifyTask);
			}
		} else {		
			/**
			 * Отправляем email
			 */
			$this->Mail_SetAdress($oUserTo->getMail(),$oUserTo->getLogin());
			$this->Mail_SetSubject($this->Lang_Get('notify_subject_new_match').' «'.htmlspecialchars($oBlog->getTitle()).'»');
			$this->Mail_SetBody($sBody);
			$this->Mail_setHTML();
			$this->Mail_Send();
		}
	}

Почему-то при заполнении тела письма шаблоном(oViewerLocal->Fetch) в браузер выводится этот шаблон и все дальнейшие шаги не выполняются. Если присвоить переменной $sBody простую текстовую строку, этого не происходит, но и письмо тоже не доставляется, но с этим уже позже разберусь

Изменение конфига плагина

Пытаюсь сделать страницу, на которой можно было бы изменить массив значений в конфигурационном файле плагина, расположенного в каталоге plugins/sport/config/config.php и содержащего один массив:
$config['sport'] = array('v1','v2','v3');
return $config;

При обработке попробовал использовать Config::Set, но ничего не произошло. Lang используется, потому что на странице настроек еще необходимо добавить русский перевод для каждого из значений массива.
if(!empty($_REQUEST))
		{
		  $res='';
		  foreach($_REQUEST as $rel)
		  {
		    $this->Lang_AddMessage($rel[0],$rel[1]);
		    $res[]=$rel[0];
		  }
		  var_dump($config['sport']);
		  Config::Set('plugin.sport.sport',$res);
		}

Или изменение конфигурационного файла иначе, как вручную, не предусмотрено?

Пытаюсь добавить поле БД и 2 метода к модулю User, не получается

До этого редактировал напрямую User.mapper.class.php и User.entity.class.php в движке, захотел от этого избавиться, сделал по образцу плагина l10n:
plugins/sport/classes/hooks/HookSport.class.php:
Читать дальше →

[РЕШЕНО]Использование хуков в плагине

Дочитал документацию и этот топик, пытаюсь добавить поле при регистрации, но, похоже, поставил функцию не там, где её ищет движок:

//PluginMyPlugin.class.php
public function Init() {
      $this->Hook_AddExecFunction('template_form_registration_end','add_field',10);
    }
    public function add_field($aVars) {
      var_dump("some additional field");
    }

В этом случае при регистрации появляется следующая ошибка:
Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'add_field' not found or invalid function name in /var/www/localhost/htdocs/live/engine/modules/hook/Hook.class.php on line 139

Также пробовал создавать внутри плагина каталог classes/hooks с файлом hookMyPlugin.class.php:
class PluginMyPlugin_HookMyPlugin extends Hook {
public function RegisterHook ()
{
  this -> AddHook('template_form_registration_end','RegEnd',__CLASS__,10);
}
public function RegEnd ($aVars) {
  //return $this -> Viewer_Fetch (Plugin::GetTemplatePath (__CLASS__) . 'reg_end.tpl');
  var_dump("Hook it!");
}
}

Но в этом случае совсем ничего не происходит. Если просто добавить хук в /classes/hooks в корневой каталог, то всё работает. Но хотелось бы расположить все файлы внутри каталога плагина