При использовании компонента easyComm встала задача прикрепления к сообщения файла, а точнее изображения. Да еще и так, что бы им удобно можно было управлять через админку. Итак, приступим к реализации поставленной задачи.
Шаг 1. Добавляем дополнительное поле. У меня поле будет называться photo.
EasyComm позволяет вам добавить дополнительные поля к объекту ecMessage, в том случае, если стандартных полей мало.
Механизм работы идентичен таковому в miniShop2 (тот, который использовался в версии 2.2 и ранее).
Рассмотрим добавление поля photo. Для этого необходимо:
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"
На этом все! Теперь вы сможете прикреплять к своим отзывам фото и удобно администрировать их из админки!