Категории в Вопросах и ответах
Обещаный пример пример адаптации категорий.
Добавляем категории к плагину Вопросы и ответы (далее Qa :). Данный пример реализован тут.
Сразу к делу.
Для начала нужно добавить в таблицы prefix_category и prefix_category_relation полю target_type новый тип qa, выполняем запросы:
Добавляем префикс для определение хуком экшена. В plugins\category\config\config.php находим
и добавляем
Находим
И добавляем экшен для категорий QA
Добавляем блоки для Qa
Открываем plugins\category\classes\hooks\HookCategory.class.php и регистрируем хуки в public function RegisterHook() {, добвляем строчки:
Создаем экшен для категорий Qa файл plugins\category\classes\actions\ActionQa.class.php с содержимым
Добавляем файл шаблона для экшена. Создаем plugins\category\templates\skin\default\actions\ActionQa\ в него копируем index.tpl из plugins\qa\templates\skin\default\actions\ActionQa\.
Создаем папки модуля plugins\category\classes\modules\qatopic\ и мапера plugins\category\classes\modules\qatopic\mapper. Создаем фай модуля plugins\category\classes\modules\qatopic\Qatopic.class.php c содержмым:
Создаем файл мапера plugins\category\classes\modules\qatopic\mapper\Qatopic.mapper.class.php с содержимым
далее осталось добаить хуки в экшен и шаблон add.tpl плагина Qa. Открываем экшен плагина Qa plugins\qa\classes\actions\ActionQa.class.php и добавляем хуки.
Находим строчку
и после нее добавляем
Находим строчку
и перед ней добавляем
Нахдим строчку
и добавляем
Открываем plugins\qa\templates\skin\default\actions\ActionQa\add.tpl находим
И добавляем
Все.
Добавляем категории к плагину Вопросы и ответы (далее Qa :). Данный пример реализован тут.
Сразу к делу.
Для начала нужно добавить в таблицы prefix_category и prefix_category_relation полю target_type новый тип qa, выполняем запросы:
ALTER TABLE `prefix_category` CHANGE `target_type` `target_type` ENUM( 'topic', 'qa' ) DEFAULT 'topic'
ALTER TABLE `prefix_category_relation` CHANGE `target_type` `target_type` ENUM( 'topic', 'qa' ) DEFAULT 'topic'
Добавляем префикс для определение хуком экшена. В plugins\category\config\config.php находим
'blog'=>array('title'=>'Топики','prefix'=>'topic'),
и добавляем
'qa'=>array('title'=>'Вопросы и ответы','prefix'=>'qa'),
Находим
Config::Set('router.page.category_topic', 'PluginCategory_ActionTopic');
И добавляем экшен для категорий QA
Config::Set('router.page.category_qa', 'PluginCategory_ActionQa');
Добавляем блоки для Qa
Config::Set('block.rule_index_blog', array(
'action' => array(
'index','blog','topic'
),
'blocks' => array(
'right' => array(
'stream'=>array('priority'=>100),
'Category'=>array('params'=>array('plugin'=>'category'),'priority'=>150),
'tags'=>array('priority'=>50),
'blogs'=>array('params'=>array(),'priority'=>1),
)
),
'clear' => false,
));
Открываем plugins\category\classes\hooks\HookCategory.class.php и регистрируем хуки в public function RegisterHook() {, добвляем строчки:
$this->AddHook('template_form_add_qa_begin','CategorySelect');
$this->AddHook('qa_add_after','TopicEditAfter');
$this->AddHook('qa_edit_show','TopicEditAfter');
$this->AddHook('qa_edit_after','TopicEditAfter');
Создаем экшен для категорий Qa файл plugins\category\classes\actions\ActionQa.class.php с содержимым
<?php
class PluginCategory_ActionQa extends ActionPlugin {
protected $sMenuItemSelect='qa';
protected $oUserCurrent=null;
public function Init() {
$this->oUserCurrent=$this->User_GetUserCurrent();
$this->SetDefaultEvent('last');
}
protected function RegisterEvent() {
$this->AddEventPreg('/^([\w\-\_]+)$/i','EventCategory');
$this->AddEventPreg('/^([\w\-\_]+)$/i','/^(page(\d+))?$/i','EventCategory');
}
protected function EventCategory() {
$sCategoryUrl=$this->sCurrentEvent;
if (!($oCategory=$this->PluginCategory_Category_GetCategoryByUrl($sCategoryUrl))){
return Router::Action('error');
}
$sPage=$this->GetParam(0);
if (preg_match("/^page(\d+)$/i",$sPage,$aMatch)) {$iPage=$aMatch[1];} else {$iPage=1;}
$aResult = $this->PluginCategory_Qatopic_GetTopicsAll($iPage, Config::Get('plugin.qa.per_page'),$oCategory);
$aTopics = $aResult['collection'];
$aId=array();
if (!empty($aTopics)){
foreach ($aTopics as $oTopic){
$aId[]=$oTopic->getId();
}
}
$aPaging = $this->Viewer_MakePaging($aResult['count'], $iPage, Config::Get('plugin.qa.per_page'), 4, Router::GetPath('qa') . $sCategoryUrl);
$this->Viewer_Assign('aTopics', $aTopics);
$this->Viewer_Assign('aPaging', $aPaging);
$this->Viewer_Assign('oCategory', $oCategory);
$this->AddBlock($aId);
$this->SetTemplateAction('index');
}
public function AddBlock($aId) {
$this->Viewer_ClearBlocks('right');
$this->Viewer_AddBlock('right','Category',array('plugin'=>'category'),100);
$this->Viewer_AddBlock('right','qacommentsonline',array('plugin'=>'qa'),50);
$this->Viewer_AddBlock('right','qatags',array('plugin'=>'qa','topics_id'=>$aId),1000);
}
public function EventShutdown() {
$this->Viewer_Assign('sMenuItemSelect',$this->sMenuItemSelect);
$this->Viewer_Assign('sTemplateCategoryPath',rtrim(Plugin::GetTemplatePath('category'),'/'));
$this->Viewer_Assign('sTemplateQaPath',rtrim(Plugin::GetTemplatePath('qa'),'/'));
$this->Viewer_Assign('sTemplateCategoryWebPathPlugin',rtrim(Plugin::GetTemplateWebPath(__CLASS__),'/'));
}
}
?>
Добавляем файл шаблона для экшена. Создаем plugins\category\templates\skin\default\actions\ActionQa\ в него копируем index.tpl из plugins\qa\templates\skin\default\actions\ActionQa\.
Создаем папки модуля plugins\category\classes\modules\qatopic\ и мапера plugins\category\classes\modules\qatopic\mapper. Создаем фай модуля plugins\category\classes\modules\qatopic\Qatopic.class.php c содержмым:
<?php
class PluginCategory_ModuleQatopic extends Module {
protected $oMapperTopic;
protected $oUserCurrent = null;
public function Init() {
$this->oMapperTopic = Engine::GetMapper(__CLASS__);
$this->oUserCurrent = $this->User_GetUserCurrent();
}
public function GetTopicsAll($iPage, $iPerPage, $oCategory) {
$aArrayId=array();
$aArrayId[]=$oCategory->getId();
$aArrayId=$this->PluginCategory_Category_GetCategoryArrayIdTree($oCategory->getType(),$oCategory->getId(),$aArrayId);
$data = $this->oMapperTopic->GetArrayQaTopicsByCetegory($iPage, $iPerPage, $aArrayId, $oCategory->getType());
if (!empty($data['collection'])){
$data['collection'] = $this->PluginQa_Qatopic_GetTopicsAdditionalData($data['collection']);
foreach ($data['collection'] as $oTopic){
$oTopic->setCategory($oCategory);
}
}
return $data;
}
}
?>
Создаем файл мапера plugins\category\classes\modules\qatopic\mapper\Qatopic.mapper.class.php с содержимым
<?php
class PluginCategory_ModuleQatopic_MapperQatopic extends Mapper {
public function GetArrayQaTopicsByCetegory($iPage, $iPerPage, $aArrayId, $sShowType) {
$aReturn=array();
$aReturn['collection'] = null;
$aReturn['count'] = 0;
if (!is_array($aArrayId) or count($aArrayId) == 0) {
return $aReturn;
}
$sql = "SELECT
count(*) as count
FROM
".Config::Get('plugin.category.table.category_relation')."
WHERE
category_id IN(?a) AND target_type = ?";
$iCount = 0;
if ($aRow = $this->oDb->selectRow($sql, $aArrayId, $sShowType)) {
$iCount=$aRow['count'];
}
$sql = "SELECT
t.topic_id,
cr.target_id, cr.category_id
FROM
".Config::Get('db.table.qa_topic')." as t
JOIN ".Config::Get('plugin.category.table.category_relation')." AS cr ON cr.target_id=t.topic_id
WHERE
cr.category_id IN(?a) AND cr.target_type = ?
ORDER BY t.topic_date_add DESC LIMIT ?d, ?d";
$aTopics = array();
if ($aRows = $this->oDb->select($sql, $aArrayId, $sShowType, ($iPage - 1) * $iPerPage, $iPerPage)) {
foreach ($aRows as $aRow) {
$aTopics[] = $aRow['topic_id'];
}
}
$aReturn['collection'] = $aTopics;
$aReturn['count'] = $iCount;
return $aReturn;
}
}
?>
далее осталось добаить хуки в экшен и шаблон add.tpl плагина Qa. Открываем экшен плагина Qa plugins\qa\classes\actions\ActionQa.class.php и добавляем хуки.
Находим строчку
if ($this->PluginQa_Qatopic_AddTopic($oTopic)) {
и после нее добавляем
$this->Hook_Run('qa_add_after', array('oTopic'=>$oTopic));
Находим строчку
if (!$this->ACL_IsAllowEditTopic($oTopic, $this->oUserCurrent)) {
и перед ней добавляем
$this->Hook_Run('qa_edit_show',array('oTopic'=>$oTopic));
Нахдим строчку
if ($this->PluginQa_Qatopic_UpdateTopic($oTopic)) {
и добавляем
$this->Hook_Run('qa_edit_after', array('oTopic'=>$oTopic));
Открываем plugins\qa\templates\skin\default\actions\ActionQa\add.tpl находим
<form action="" method="POST" enctype="multipart/form-data">
И добавляем
{hook run='form_add_qa_begin'}
Все.
19 комментариев
возможный вариант решения livestreet.ru/blog/FreeModules/8397.html#comment124925
по вопросу, незнаю — не сталкивался, бросайте в личку доступы как будет время посмотрю в чем может быть проблема