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