Как в плагине задать путь к файлу шаблона плагина?

Прикручиваю комменты к записям в плагине, уперся в отправку уведомлений. Вот кусок кода, который отсылает уведомление автору записи о новом комменте.

$this->Subscribe_Send('question_new_answer',$oQuestion->getId(),'notify.comment_new.tpl',$this->Lang_Get('notify_subject_comment_new'),array(
				'oQuestion' => $oQuestion,
				'oComment' => $oCommentNew,
				'oUserComment' => $this->oUserCurrent,
			),$aExcludeMail);


Файл notify.comment_new.tpl забирается из шаблона сайта. Подскажите, пожалуйста, как правильно прописать, чтобы подтягивался файл из шаблона плагина.

28 комментариев

avatar
  • ort
  • +2
avatar
Спасибо!
avatar
Можно еще вопрос? Мучаю чекбокс подписки на новые комменты. У автора записи чекбокс активен и письма ему идут, но при попытке снять чекбокс или подписаться на комменты под другим юзером вылетает «системная ошибка, повторите позже».

Что сделал:

В PluginQuestions.class.php добавил новый тип:

/**
     * Добавляем в подписку новые типы
     */
    $this->Subscribe_AddTargetType('question_new_comment',array());


В файле аналогичном файлу topic.tpl поставил sTargetType='question'. Вот все содержимое файла:

{include file='header.tpl' menu='questions'}

{include file="{$aTemplatePathPlugin.questions}question.tpl"}
{include
	file='comment_tree.tpl'
	iTargetId=$oQuestion->getId()
	iAuthorId=$oQuestion->getUserId()
	sAuthorNotice=$aLang.topic_author
	sTargetType='question'
	iCountComment=$oQuestion->getCountComment()
	sDateReadLast=$oQuestion->getDateRead()
	sNoticeCommentAdd=$aLang.topic_comment_add
	bAllowSubscribe=true
	oSubscribeComment=$oQuestion->getSubscribeNewComment()
	aPagingCmt=$aPagingCmt}

{include file='footer.tpl'}


Методом исключения выяснил, что функция CheckTarget в Subscribe.class.php возвращает false. Подскажите, в чем может быть проблема? Может что-то упускаю или еще что-то добавить нужно?
avatar
Еще требуется в модель Subscribe через наследование добавить метод проверки таргета, по аналогии с CheckTargetTopicNewComment, т.е. называться он должен CheckTargetQuestionNewComment
avatar
Спасибо!
avatar
Еще вопросик по $oComment->getTarget():

В профиле пользователя вывожу его комменты. Первый коммент обрывается на

<li class="comment-link">
					<a href="{if $oConfig->GetValue('module.comment.nested_per_page')}{router page='comments'}{else}{$oQuestion->getUrl()}#comment{/if}{$oComment->getId()}" title="{$aLang.comment_url_notice}">
						<i class="icon-synio-link"></i>
					</a>
				</li>


не срабатывает $oQuestion->getUrl().

Обнаружил, что $oComment->getTarget() возвращает null. На сколько понял из-за того, что он не устанавливается здесь. Подскажите, в чем может быть проблема?
avatar
вот так это делается в плагине фриланс:
class PluginFreelance_ModuleComment extends PluginFreelance_Inherit_ModuleComment {


	/**
	 * Обработка заказов
	 *
	 * @param      $aCommentId
	 * @param null $aAllowData
	 *
	 * @return mixed
	 */
	public function GetCommentsAdditionalData($aCommentId,$aAllowData=null) {
		$aResult=parent::GetCommentsAdditionalData($aCommentId,$aAllowData);

		if (is_null($aAllowData)) {
			$aAllowData=array('vote','target','favourite','user'=>array());
		}
		func_array_simpleflip($aAllowData);

		$aTargetId=array();
		foreach ($aResult as $oComment) {
			if (isset($aAllowData['target']) and $oComment->getTargetType()=='freelance_order') {
				$aTargetId[]=$oComment->getTargetId();
			}
		}
		if ($aTargetId) {
			$aTargets=$this->PluginFreelance_Main_GetOrderItemsByFilter(array('id in'=>$aTargetId,'#index-from-primary'));

			foreach ($aResult as $oComment) {
				if (isset($aTargets[$oComment->getTargetId()])) {
					$oComment->setTarget($aTargets[$oComment->getTargetId()]);
				} else {
					$oComment->setTarget(null);
				}
			}
		}

		return $aResult;
	}
}
avatar
Спасибо!
avatar
Вопрос по избранному: в PluginQuestions.class.php пытаюсь добавить EnumType:

$this->addEnumType(Config::Get('db.table.favourite_tag'), 'target_type', 'question');
    $this->addEnumType(Config::Get('db.table.favourite_tag'), 'target_type', 'answer');


но ловлю ошибку:

SQL Error: Invalid default value for 'target_type' at C:\xampp\htdocs\livestreet\engine\modules\database\Database.class.php line 228
Array ( [code] => 1067 [message] => Invalid default value for 'target_type' [query] => ALTER TABLE `prefix_favourite_tag` MODIFY `target_type` enum('answer','question','topic','comment','talk') NOT NULL DEFAULT NULL [context] => C:\xampp\htdocs\livestreet\engine\modules\database\Database.class.php line 228 )

Как ее обойти?
avatar
Это ошибка в логике LS из-за того, что в prefix_favourite_tag не выставлено значение по дефолту. Здесь нужно самому реализовать метод addEnumType из модуля Database с фиксом это проблемы.
Вот такой метод должен работать:
public function addEnumType($sTableName,$sFieldName,$sType,$aConfig=null) {
		$sTableName = str_replace('prefix_', Config::Get('db.table.prefix'), $sTableName);
		$sQuery="SHOW COLUMNS FROM  `{$sTableName}`";

		if ($aRows=$this->GetConnect($aConfig)->select($sQuery)) {
			foreach ($aRows as $aRow){
				if ($aRow['Field'] == $sFieldName) break;
			}
			if (strpos($aRow['Type'], "'{$sType}'") === FALSE) {
				$aRow['Type'] =str_ireplace('enum(', "enum('{$sType}',", $aRow['Type']);
				$sQuery="ALTER TABLE `{$sTableName}` MODIFY `{$sFieldName}` ".$aRow['Type'];
				$sQuery.= ($aRow['Null']=='NO') ? ' NOT NULL ' : ' NULL ';
				if ($aRow['Null']=='NO' and is_null($aRow['Default'])) {
					$aRow['Default']='';
				}
				$sQuery.= is_null($aRow['Default']) ? ' DEFAULT NULL ' : " DEFAULT '{$aRow['Default']}' ";
				$this->GetConnect($aConfig)->select($sQuery);
			}
		}
}
avatar
Так а запросом при создании таблиц плагина нельзя? Или это просто фикс для всех таблиц?
avatar
нельзя, т.к. для такого запроса нужно знать текущие значения поля enum
avatar
Не знаю на сколько правильно сделал, но все равно ловлю ошибку:

SQL Error: Invalid default value for 'target_type' at Z:\home\livestreet\www\plugins\questions\classes\modules\favourite\Favourite.class.php line 43
Array ( [code] => 1067 [message] => Invalid default value for 'target_type' [query] => ALTER TABLE `prefix_favourite_tag` MODIFY `target_type` enum('question','topic','comment','talk') NOT NULL DEFAULT '' [context] => Z:\home\livestreet\www\plugins\questions\classes\modules\favourite\Favourite.class.php line 43 ) 


Сделано следующее: в PluginQuestions.class.php вызвал так $this->PluginQuestions_ModuleFavourite_addEnumType (Config::Get('db.table.favourite_tag'), 'target_type', 'question');

В свой Favourite.class.php добавил:

public function addEnumType($sTableName,$sFieldName,$sType,$aConfig=null) {
		$sTableName = str_replace('prefix_', Config::Get('db.table.prefix'), $sTableName);
		$sQuery="SHOW COLUMNS FROM  `{$sTableName}`";

		if ($aRows=$this->Database_GetConnect($aConfig)->select($sQuery)) {
			foreach ($aRows as $aRow){
				if ($aRow['Field'] == $sFieldName) break;
			}
			if (strpos($aRow['Type'], "'{$sType}'") === FALSE) {
				$aRow['Type'] =str_ireplace('enum(', "enum('{$sType}',", $aRow['Type']);
				$sQuery="ALTER TABLE `{$sTableName}` MODIFY `{$sFieldName}` ".$aRow['Type'];
				$sQuery.= ($aRow['Null']=='NO') ? ' NOT NULL ' : ' NULL ';
				if ($aRow['Null']=='NO' and is_null($aRow['Default'])) {
					$aRow['Default']='';
				}
				$sQuery.= is_null($aRow['Default']) ? ' DEFAULT NULL ' : " DEFAULT '{$aRow['Default']}' ";
				$this->Database_GetConnect($aConfig)->select($sQuery);
			}
		}
	}


43-я строка: $this->Database_GetConnect($aConfig)->select($sQuery);
avatar
Ааа, все, отбой: прописал $aRow['Default']='topic'; и все завелось. Спасибо!
avatar
Параллельно может подскажете как в модальном окне изменения своих тегов заставить автокомплит выбирать теги из тегов плагина, а не из тегов топиков. Или без переписывания js здесь не обойтись?
avatar
там вроде в форме передаются target_type и target_id
avatar
Я потому и думал, что может проще есть путь и я что-то упускаю. Передаются, но у инпута класс autocomplete-tags-sep, который вызывает aRouter['ajax']+'autocompleter/tag/', который в свою очередь запускает GetTopicTagsByLike и ищет теги среди тегов топиков.

Я менял класс инпута на свой, чтобы вызвать ActionAjax.class.php и в нем поискать в тегах вопросов. На сколько сегодня разобрался в вопросе, то в таком случае необходимо в хук добавить свой модальник, прописать его вызов в js и уже в нем (в модальнике) поправить класс инпута на свой.

Оффтоп: а как Вы код инлайн выводите? ))
avatar
Оффтоп: а как Вы код инлайн выводите? ))
ALT + иконка code в редакторе
avatar
А как в таком случае:

{insert name="block" block=tagsFavouriteQuestion params=$aBlock.params}


подключить файл шаблона плагина?
avatar
Нужен параметр plugin в params: $aBlock.params.plugin='myplugin'
avatar
Не работает. Пробую так:

{$aBlockParams.user=$oUserProfile}
	{$aBlockParams.plugin='questions'}
	{insert name="block" block=tagsFavouriteQuestion params=$aBlock.params}


и так:

{$aBlockParams.user=$oUserProfile}
	{insert name="block" block=tagsFavouriteQuestion params=$aBlock.params.plugin='questions'}


Что не так пишу?
avatar
{insert name='block' block='tagsFavouriteQuestion' params=[
            'user' => $oUserProfile,
            'plugin' => 'questions'
        ]}
avatar
Спасибо!
avatar
Ну и последний, надеюсь, вопрос: в каком месте происходит вызов обновления прямого эфира в момент добавления коммента?

Прикрутил блок прямого эфира, но новый коммент появляется/поднимается вверх только после обновления страницы. Переключение вкладок работает, обновление блока тоже. Если страницу не обновлять, а жмякнуть обновление блока, тоже все нормально работает, а вот автоматом после добавления коммента эфир не обновляется.
avatar
Нашел. В связи с этим переформулирую вопрос: может есть какой способ проще вызвать обновление блока или же только переписыванием себе ls.comments.add и this.load с заменой (curItemBlock.data('type')=='comment')?
avatar
Отбой, не подумал про хуки…
avatar
Уже начал переживать, что что-то vOFFka давно ничего не спрашивал. Рад, что всё в процессе :-)
avatar
Праздники :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.