easyComm. Добавляем поле изображение для автора отзыва

При использовании компонента easyComm встала задача прикрепления к сообщения файла, а точнее изображения. Да еще и так, что бы им удобно можно было управлять через админку. Итак, приступим к реализации поставленной задачи.

Шаг 1. Добавляем дополнительное поле. У меня поле будет называться photo.

EasyComm позволяет вам добавить дополнительные поля к объекту ecMessage, в том случае, если стандартных полей мало.

Механизм работы идентичен таковому в miniShop2 (тот, который использовался в версии 2.2 и ранее).

Рассмотрим добавление поля photo. Для этого необходимо:

  1. Создать папку "myplugin" (можете задать любое имя) в 2 каталогах: /core/components/easycomm/plugins/myplugin/ и /assets/components/easycomm/plugins/myplugin/
  2. В каталоге /core/components/easycomm/plugins/myplugin/ создать файлы index.php:
 return array( 'xpdo_meta_map' => array( 'ecMessage' => require_once dirname(__FILE__) .'/ecmessage.map.inc.php' ) ,'manager' => array( 'ecMessage' => MODX_ASSETS_URL . 'components/easycomm/plugins/myplugin/ecmessage.js' ) ); 

и ecmessage.map.inc.php:

 return array( 'fields' => array( 'photo' => NULL, ) ,'fieldMeta' => array( 'photo' => array( 'dbtype' => 'varchar' ,'precision' => '255' ,'phptype' => 'string' ,'null' => true ,'default' => NULL ), ) ,'indexes' => array( ) ); 

3. В каталоге /assets/components/easycomm/plugins/myplugin/ создать файл ecmessage.js:

 easyComm.plugin.myplugin = { getFields: function(config) { return { photo: { xtype: 'ec-image-field', fieldLabel: _('ec_message_photo'), anchor: '99%', source: MODx.config.default_media_source } } } ,getColumns: function() { return { photo: {width:50, sortable:true, name: 'photo',renderer: easyComm.utils.renderImage} } } }; 

здесь нужно обратить внимание на «xtype=ec-image-field», и на «renderer: easyComm.utils.renderImage». Первый — специальный тип ввода, который позволяет использовать файловый менеджер для выбора изображений и поддерживает превью, а второй — отображение картинки в списке.

 

4. Создать поля в таблице modx_ec_messages.

5. Добавить записи в словари системы ec_message_photo (пространство имен easycomm).

Шаг 2. Создать плагин, повесить его на событие OnEcMessageSave, код плагина:

 $conf_upload_dir = 'uploads/user_files/'; $conf_upload_path = MODX_BASE_PATH.$conf_upload_dir; $conf_upload_file_name = 'file_'.date('Y-m-d_H-i-s'); $conf_upload_input_name = 'photo'; $conf_upload_thumbs = array( '' => array('w' => 1280,'h' => 720,'zc' => 0, 'bg' => '#fff', 'far' => 0), '_thumb' => array('w' => 128,'h' => 72,'zc' => 0, 'bg' => '#fff', 'far' => 0) ); if($modx->event->name == 'OnEcMessageSave' && $mode == modSystemEvent::MODE_NEW) { // $mode: modSystemEvent::MODE_NEW, modSystemEvent::MODE_UPD // Объект: $ecMessage->toArray() if(isset($_FILES[$conf_upload_input_name]) && !empty($_FILES[$conf_upload_input_name]['tmp_name'])){ $file_info = getimagesize($_FILES[$conf_upload_input_name]['tmp_name']); if(empty($file_info)) { $modx->log(xPDO::LOG_LEVEL_WARN, 'Не могу сохранить файл'.$_FILES[$conf_upload_input_name]['name'].', так как он не является изображением'); return; } $extention = ''; switch (exif_imagetype($_FILES[$conf_upload_input_name]['tmp_name'])) { case IMAGETYPE_GIF: $extention = '.gif'; break; case IMAGETYPE_JPEG: $extention = '.jpg'; break; case IMAGETYPE_PNG: $extention = '.png'; break; } if(empty($extention)) { $modx->log(xPDO::LOG_LEVEL_WARN, 'Не могу сохранить файл'.$_FILES[$conf_upload_input_name]['name'].', так как его тип не поддерживается'); return; } // проверяем каталог if(!file_exists($conf_upload_path)){ $modx->log(xPDO::LOG_LEVEL_ERROR, 'Директория '.$conf_upload_path.' не существует'); return; } // перемещаем файл $file_name = $conf_upload_file_name.$extention; if(!move_uploaded_file($_FILES[$conf_upload_input_name]['tmp_name'], $conf_upload_path.$file_name)){ $modx->log(xPDO::LOG_LEVEL_ERROR, 'Не удалось переместить загруженный файл по пути '.$conf_upload_path.$file_name); return; } // подключаем phpthumb require_once MODX_CORE_PATH.'model/phpthumb/phpthumb.class.php'; foreach($conf_upload_thumbs as $curConfigKey => $curConfig){ // инициализируем $phpThumb = new phpThumb(); $phpThumb->setSourceFilename($conf_upload_path.$file_name); foreach ($curConfig as $k => $v) { $phpThumb->setParameter($k, $v); } // генерируем файл if ($phpThumb->GenerateThumbnail()) { if ($phpThumb->RenderToFile($conf_upload_path.$conf_upload_file_name.$curConfigKey.$extention)) { // устанавливаем права на файл, это опционально, зависит от сервера //chmod($conf_upload_path.$conf_upload_file_name.$curConfigKey.$extention, 0666); } } } // сохраняем изменения $ecMessage->set('photo', $conf_upload_dir.$file_name); $ecMessage->save(); } } 

Настройки работы плагина находятся в верхней его части. Он умеет сохранять загруженные изображения в каталог uploads/user_files/ (не забудьте его создать!!!) сжимать изображение до определенных размеров, и делать превьюшки. Правда не научил его пока работать с источниками файлов, это было не нужно. Вообще плагин — больше как пример, на ваших проектах код может быть совсем другой.

Шаг 3. Добавить поле photo в системные настройки ec_message_grid_fields и ec_message_window_layout.

Шаг 4. В чанке создания сообщения добавить поле photo

И добавить к форме, чтобы она могла отправлять файлы:

 enctype="multipart/form-data" 

На этом все! Теперь вы сможете прикреплять к своим отзывам фото и удобно администрировать их из админки!

Яндекс.Метрика Рейтинг@Mail.ru