На момент написания было актуально для версии 2.7
Когда-то требовалось реализовать подобную функцию. К сожалению K2 не особо для этого предназначен, нужно вносить некоторые правки, но это вполне реализуемо. Так что если кому надо, вот один из относительно простых способов.
Найти файл шаблона item_comments_form.php в папке компонента com_k2 (components\com_k2\templates\default\) и перенести в templates/TEMPLATE/html/com_k2/default/item_comments_form.php
Код HTML:
<label class="commentImg" for="commentImg">Прикрепить изображение</label>
<input name="commentImg" type="file" id="commentImg">
Код php:
$comment->commentText = preg_replace("/\[img\](.*)\[\/img\]/Usi", "<img class=\"img-comment\" src=\"\\1\">", $comment->commentText);
Добавить следующий код сразу перед строкой "if (!$row->store())"
Код php:
require_once(JPATH_SITE . '/additions/Tool.class.php');
$response->fileRec = KellyTool::isFileRecieved('commentImg', array('jpg', 'jpeg', 'gif', 'png'));
$imgFile = false;
if ($response->fileRec) {
$mediaDir = '/media/k2/comments/';
$baseDir = JPATH_SITE . $mediaDir;
$imgFile = KellyTool::fileSafeMove('commentImg', $baseDir, 'comment_tmp', 'tmp');
if ($imgFile) {
$imageInfo = @getimagesize($imgFile['path']);
$imageTypeArray = array
(
1 => 'gif',
2 => 'jpg',
3 => 'png',
6 => 'bmp',
);
if (!$imageInfo or empty($imageTypeArray[$imageInfo[2]])) {
if (file_exists($imgFile['path'])) unlink($imgFile['path']);
$response->message = 'Недопустимый формат файла';
$response->cssClass = 'k2FormLogError';
echo $this->commentExit(json_encode($response));
$mainframe->close();
}
$imgExt = $imageTypeArray[$imageInfo[2]];
$imgName = KellyTool::uniName($baseDir, 'cimg', $imgExt);
if (!rename($imgFile['path'], $baseDir . $imgName)) {
if (file_exists($imgFile['path'])) unlink($imgFile['path']);
$response->message = 'Ошибка сохранения вложения';
$response->cssClass = 'k2FormLogError';
echo $this->commentExit(json_encode($response));
$mainframe->close();
}
$row->commentText .= '[img]' . JURI::root() . $mediaDir . $imgName . '[/img]';
}
}
Как видим изображения будут сохраняться в дирректорию со случайно сгенерированым уникальным именем (замечу возможно лучше следовало просто привязать изображения к идентификатору комментария т.к. оно всего одно)
На случай неудачного сохранения комментария (if (!$row->store()) { ... }) можно добавить в тело условия неудачного сохранения следующий код чтобы удалять изображение к неудачно сохраненному комментарию.
Код php:
if (!$row->store())
{
if ($imgFile and file_exists($imgFile['path'])) unlink($imgFile['path']);
...
}
Код php:
function commentExit($jsontxt) {
$escapers = array("\\", "/", "\"", "\n", "\r", "\t", "\x08", "\x0c");
$replacements = array("\\\\", "\\/", "\\\"", "\\n", "\\r", "\\t", "\\f", "\\b");
$result = str_replace($escapers, $replacements, $jsontxt);
$result = '<html><head><title>jnone</title><script type="text/javascript"> var json_response = "' . $result . '"</script></head><body></body></html>';
return $result;
}
В файле /media/k2/assets/js/k2.frontend.js заменить обработчик кнопки отправки формы комментария
Код php:
$K2('#comment-form').submit(function(event){
event.preventDefault();
$K2('#formLog').empty().addClass('formLogLoading');
var bEvent = function(response) {
$K2('#formLog').removeClass('formLogLoading').html(response.message).addClass(response.cssClass);
console.log(response)
if(typeof(Recaptcha) != "undefined"){
Recaptcha.reload();
}
if (response.refresh) {
window.location.reload();
}
}
K2sendFormByIFrame('comment-form', bEvent)
});
и наконец добавить функции отправки AJAX запроса через ifarme
Код JavaScript:
function K2getBody() {
return document.getElementsByTagName('body')[0]
}
function K2getIframeDocument(iframeNode) {
if (iframeNode.contentDocument)
return iframeNode.contentDocument
if (iframeNode.contentWindow)
return iframeNode.contentWindow.document
return iframeNode.document
}
function K2iFrameOnLoadEvent(iframeNode, event) {
if (iframeNode.attachEvent)
iframeNode.attachEvent('onload', event)
else if (iframeNode.addEventListener)
iframeNode.addEventListener('load', event, false)
else
iframeNode.onload = event
}
function K2sendFormByIFrame(formname, onload){
var iframe = document.createElement('iframe')
iframe.name = 'ajax-frame-' + Math.random(1000000)
iframe.style.display = 'none'
K2getBody().appendChild(iframe)
var form = document.getElementById(formname)
if (form == null) {
console.log('Form ' + formname + 'not found')
return false
}
form.target = iframe.name
var event = function() {
if (K2getIframeDocument(iframe).location.href == 'about:blank') return
if (!iframe.contentWindow.json_response) {
console.log ('json_response is not set [' + formname + ']')
return;
}
var response = K2getJSvalue(iframe.contentWindow.json_response)
K2getBody().removeChild(iframe)
onload(response)
}
K2iFrameOnLoadEvent(iframe,event)
form.submit()
}
function K2getJSvalue(value) {
var result = false
//alert(value)
if (typeof value != "string") {
alert('[K2getJSvalue] Value is not string : '+value)
return result
}
try {
result = window.JSON && window.JSON.parse ? JSON.parse(value) : eval('(' + value + ')')
} catch (E) {
alert('[K2getJSvalue] Incorect server response : ' + value)
}
return result
}
так же в CSS текущего шаблона добавить
Код CSS:
div.itemComments ul.itemCommentsList li .img-comment {
float: none;
display : block;
}
Картинки Рисунок №1 by nradiowave, Добавление изображений в комментарии для модуля K2 Joomla!, #k2 #joomla