Как прикрепить изображение к комментарию?



Как загрузить изображение на сервер и прикрепить его к комментарию в 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" />

Вот и всё!
Вроде ничего сложного, но зато ой-как полезно, часто требуется такой функционал!
06 october 2016, 22:12    Василий Столейков   G+  
12    482 +3

Comments (4)

  1. Василий Столейков 06 october 2016, 22:22 # 0
    Попробую применить эту инструкцию… modx.pro/development/619-working-with-phpthumb/
    1. Василий Столейков 11 october 2016, 18:58 # 0
      Всё-таки применил этот рецепт, спасибо Василию.
      Обновил топик с готовыми инструкциями для будущего.
      1. Василий Столейков 12 october 2016, 00:10 # 0
        Ну и конечно же тут не хватает элементарных проверок на тип или содержимое файла, чтобы загружать можно было только изображения…
    2. Николай Загумённов 07 october 2016, 20:25 # +1
      Как-то приходилось сталкиваться с подобной задачей. Написал свое решение тут. Может будет полезно =)
      You need to login to create comments.