По умолчанию в Vtiger CRM отсутствует функционал по удалению комментарией. Вы можете добавлять их, редактировать или отвечать на них. Но не удалять.
Ниже я приложил подробную инструкцию о том, как можно реализовать данную возможность. Для этого вам потрубется доступ к файлам CRM. Никаких изменений в базу данных не требуется.
Появление кнопки по удалению комментариев будет проверяться на права доступа к модулю. Т.е. вы можете отключить этот функционал у ролей или профилей пользователей
Первое, что нам нужно сделать - это отрисовать кнопку в наших шаблонах:
layouts/v7/modules/Vtiger/Comment.tpl после строки 76
А именно после этого блока:
{if $COMMENTS_MODULE_MODEL->isPermitted('EditView')}
{if $CHILDS_ROOT_PARENT_MODEL}
{assign var=CHILDS_ROOT_PARENT_ID value=$CHILDS_ROOT_PARENT_MODEL->getId()}
{/if}
<a href="javascript:void(0);" class="cursorPointer replyComment feedback" style="color: blue;">
{vtranslate('LBL_REPLY',$MODULE_NAME)}
</a>
{if $CURRENTUSER->getId() eq $COMMENT->get('userid')}
<a href="javascript:void(0);" class="cursorPointer editComment feedback" style="color: blue;">
{vtranslate('LBL_EDIT',$MODULE_NAME)}
</a>
{/if}
{/if}
Добавьте следующие строчки:
{if $COMMENTS_MODULE_MODEL->isPermitted('Delete')}
{if $CHILDS_ROOT_PARENT_MODEL}
{assign var=CHILDS_ROOT_PARENT_ID value=$CHILDS_ROOT_PARENT_MODEL->getId()}
{/if}
<a href="javascript:void(0);" class="cursorPointer deleteComment feedback" style="color: blue;">
{vtranslate('LBL_DELETE',$MODULE_NAME)}
</a>
{/if}
Также нам нужно добавить нашу кнопку в виджет комментариев
layouts/v7/modules/Vtiger/RecentComments.tpl после строчки 163
Найдите этот блок:
{if $CURRENTUSER->getId() eq $COMMENT->get('userid') && $IS_EDITABLE}
{if $IS_CREATABLE} {/if}
<a href="javascript:void(0);" class="cursorPointer editComment feedback" style="color: blue;">
{vtranslate('LBL_EDIT',$MODULE_NAME)}
</a>
{/if}
Вставьте следующие строчки:
{if $COMMENTS_MODULE_MODEL->isPermitted('Delete')}
{if $CHILDS_ROOT_PARENT_MODEL}
{assign var=CHILDS_ROOT_PARENT_ID value=$CHILDS_ROOT_PARENT_MODEL->getId()}
{/if}
<a href="javascript:void(0);" class="cursorPointer deleteComment feedback" style="color: blue;">
{vtranslate('LBL_DELETE',$MODULE_NAME)}
</a>
{/if}
Итак, кнопка есть, теперь нам остаётся сделать так, чтобы она работала. Для этого начнём с правки javascript файлов. Меняем следующий файл:
layouts/v7/modules/Vtiger/resources/Detail.js в районе строки 2908
Найдите этот блок:
detailContentsHolder.on('click','.editComment', function(e){
self.removeCommentBlockIfExists();
var currentTarget = jQuery(e.currentTarget);
var commentInfoBlock = currentTarget.closest('.singleComment');
var commentInfoContent = commentInfoBlock.find('.commentInfoContent');
var commentReason = commentInfoBlock.find('[name="editReason"]');
var editCommentBlock = self.getEditCommentBlock();
var fullComment = commentInfoContent.data('fullcomment');
if (fullComment) {
fullComment = app.helper.getDecodedValue(fullComment);
} else {
fullComment = commentInfoContent.text();
}
editCommentBlock.find('.commentcontent').text(fullComment);
editCommentBlock.find('[name="reasonToEdit"]').val(commentReason.text());
editCommentBlock.find('[name="is_private"]').val(commentInfoBlock.find('[name="is_private"]').val());
/*commentInfoContent.hide();
commentInfoBlock.find('.commentActionsContainer').hide();*/
editCommentBlock.appendTo(commentInfoBlock).show();
});
После него добавьте следующие строчки:
detailContentsHolder.on('click','.deleteComment', function(e){
var currentTarget = jQuery(e.currentTarget);
var commentInfoBlock = currentTarget.closest('.singleComment');
var commentInfoHeader = commentInfoBlock.find('.commentInfoHeader');
var commentId = commentInfoHeader.data('commentid');
var params = {
'module': 'ModComments',
'action': 'Delete',
'crmid':commentId
};
app.helper.showProgress();
app.request.post({data: params}).then(
function(err, data) {
if (err === null) {
commentInfoBlock.remove();
app.helper.showSuccessNotification({message:'Comment Deleted Successfully'});
} else {
app.helper.showErrorNotification({message: err.message});
}
app.helper.hideProgress();
});
});
Итак, яваскрипт теперь отсылает нам данные. Остаётся только удалить сам комментарий. Открываем файл
modules/ModComments/actions/Delete.php
И заменяем полностью в нём содержимое на то, что приведено ниже:
<?php
class ModComments_Delete_Action extends Vtiger_Delete_Action {
function checkPermission(Vtiger_Request $request) {
//throw new AppException(vtranslate('LBL_PERMISSION_DENIED'));
parent::checkPermission($request);
}
public function process(Vtiger_Request $request) {
$moduleName = $request->getModule();
$recordId = $request->get('crmid');
$recordModel = Vtiger_Record_Model::getInstanceById($recordId, $moduleName);
$moduleModel = $recordModel->getModule();
$recordModel->delete();
$response = new Vtiger_Response();
$response->setResult(array('success' => true));
return $response;
}
}
Теперь у каждого комментария у нас есть рабочая кнопка по его удалению.