Как прикрепить изображение к комментарию?
Как загрузить изображение на сервер и прикрепить его к комментарию в Tickets?
Написал плагин загрузки фотки и обрезки её с помощью встроенного в MODX phpThumb (спасибо Василию за готовый код, который я только кастомизировал под мои нужды).
Перенёс в категорию "Пошаговые инструкции", т.к. вопрос превратился в конкретную инструкцию.
Запишу эту инструкцию для себя будущего, может и кому-нибудь ещё понадобится…
1. В теге формы добавления комментария добавляем аттрибут enctype для загрузки файлов:
<form id="comment-form" action="" method="post" enctype="multipart/form-data">
...
<input type="file" name="image">
...
</form>
2. Создаём плагин на OnBeforeCommentSave и в нём обрабатываем наше поле с изображением:
<?php
switch ($modx->event->name) {
case 'OnBeforeCommentSave':
// Выбираем расширенное поле properties
$properties = $modx->event->params['TicketComment']->get('properties');
if(!empty($_FILES['image'])){
// Вначале загружаем файл на сервер в папку assets/images/reviews/
$uploaddir = MODX_BASE_PATH.'assets/images/reviews/';
$uploadfile = $uploaddir . basename($_FILES['image']['name']);
if (move_uploaded_file($_FILES['image']['tmp_name'], $uploadfile)) {
$src = $uploadfile; // Исходник
$hash = hash_file('md5', $src); // хэш файла (для генерации имени превьюшки)
$dst = MODX_BASE_PATH.'assets/images/reviews/'.$hash._.time().'.jpg'; // Уменьшенная копия (название из хэша и текущей отметки времени)
$params = array(
'w' => 100 , // Ширина
'h' => 120, // Высота
'bg' => 'ffffff', // Фон
'q' => 100, // Качество в %
'zc' => 'C', // Обрезка, TL - это Top Left, есть еще C - center, BR - Bootom Right и т.д.
'f' => 'jpg', // Формат изображения
);
// Подключаем обёртку MODX, которая выставит системные настройки в класс phpThumb
$phpThumb = $modx->getService('modphpthumb','modPhpThumb', MODX_CORE_PATH . 'model/phpthumb/', array());
// Указываем исходник
$phpThumb->setSourceFilename($src);
// Выставляем параметры
foreach ($params as $k => $v) {
$phpThumb->setParameter($k, $v);
}
// Генерируем уменьшенную копию
if ($phpThumb->GenerateThumbnail()) {
// Выводим готовое изображение сразу на экран
//return $phpThumb->OutputThumbnail();
// Или сохраняем в файл
if (!$phpThumb->renderToFile($dst)) {
$modx->log(modX::LOG_LEVEL_ERROR, 'Could not save rendered image to'.$dst);
} else {
// сохраняем путь превьюшки в расширенное поле
$properties['image'] = str_replace(MODX_BASE_PATH,'',$dst);
// удаляем оригинал
unlink($src);
}
}
else {
// Если возникла ошибка - пишем лог работы в журнал MODX
$modx->log(modX::LOG_LEVEL_ERROR, "ОШИБКА генерации превьюшки: ".print_r($phpThumb->debugmessages, 1));
}
}
else {$modx->log(modX::LOG_LEVEL_ERROR, "Возможная атака с помощью файловой загрузки!\n" );}
};
// Сохранение
if(!empty($properties)) {
$modx->event->params['TicketComment']->set('properties', $properties);
}
break;
}
3. Вставляем в чанке комментария фотку (у меня на феноме):
// Если есть фотка, загружаем, иначе - заглушка
<img src="{if $properties.image}{$properties.image}{else}assets/templates/teplo/img/no-user.jpg{/if}" alt="" align="left" />
Вот и всё!
Вроде ничего сложного, но зато ой-как полезно, часто требуется такой функционал!
Поблагодарить автора
Отправить деньги
Комментарии: 5
Попробую применить эту инструкцию… modx.pro/development/619-working-with-phpthumb/
Всё-таки применил этот рецепт, спасибо Василию.
Обновил топик с готовыми инструкциями для будущего.
Обновил топик с готовыми инструкциями для будущего.
Ну и конечно же тут не хватает элементарных проверок на тип или содержимое файла, чтобы загружать можно было только изображения…
Большое спасибо за подробную инструкцию
Как-то приходилось сталкиваться с подобной задачей. Написал свое решение тут. Может будет полезно =)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.