Все для создания и продвижения сайтов

Верстка, программирование, SEO

Загрузка изображения в TV для Tickets в MODX Revo

Рассмотрим, как расширить компонент Tickets для MODX Revo, чтобы можно было грузить изображения через простое поле "input" с типом "file" на сервер, а также взяв его путь и записав в нужное TV-поле.

Для начала создадим новую ТВ - назовём её "photo" (тип: изображение).

Затем давайте откопируем tpl для создания новых тикетов "tpl.Tickets.form.create" и назовём его "tpl.Tickets.form.create.my".

А теперь зайдём в эту tpl и добавим новое поле в нужное место.

<div class="form-group">
	<label for="ticket-photo">Изображение</label>
	<input type="file" class="form-control" name="photo" id="ticketphoto"/>
	<span class="error" id="error_ticketphoto"></span>
</div>

Также добавим атрибут "enctype" в тег формы, чтобы она могла поддерживать загрузку файлов на сервер

<form class="well create" method="post" action="" id="ticketForm" enctype="multipart/form-data" >

Вызов сниппета соответственно такой:

[[TicketForm?
	&tplFormCreate=`tpl.Tickets.form.create.my`
]]

После этих действий у нас на сайте должно появиться форма с новым полем.

Загрузка изображения через форму в TV для компонента Tickets В MODX Revo

Отлично, новое поле у нас в форме есть. Но чтобы оно загрузилось, мы должны написать плагин, который будет срабатывать на событие "создания нового документа", а именно "OnDocFormSave".

Данный плагин будет получать глобальный массив $_FILES, с помощью которого будем получать все данные загруженного файла, а затем переносить этот файл в нужное место с новым именем и с дальнейшей записью его пути в нашу TV.

Сам плагин (событие - OnDocFormSave)

<?php
if ($modx->event->name == 'OnDocFormSave') {
      if($mode == 'new'){  
        if (!empty($_FILES)) { 
            
            $id = $resource->get('id');
            $folder = 'uploads'; // имя папки куда грузить, должна быть создана (в корне сайта)
            $path = MODX_BASE_PATH.'/'.$folder.'/'; // Путь от корня до нужного места
            $tv_name = 'photo'; // имя нашей тв
            
            // все значения файла
            $nameFile = $_FILES['photo']['name'];
            $typeFile = $_FILES['photo']['type'];
            $tmpNameFile = $_FILES['photo']['tmp_name'];
            $sizeFile = $_FILES['photo']['size']; 
            
            $limit_size = 3*1024*1024; // 3 Mb - максимальный размер загружаемого файла
            $file_types = array("jpeg", "jpg", "gif", "png"); // доступные расширения для загрузки
            $extensionFile = substr(strrchr($nameFile, '.'), 1); // получаем расширение файла
            
            $NewNameFile = 'id_'.$id.'_'.date("m_d_y").'.'.$extensionFile;  // наше новое имя файла
            
            if(is_uploaded_file($tmpNameFile)) // проверяем зашёл ли файл
            {
                if($limit_size > $sizeFile)
                { // Проверка на размер
                    if(in_array($extensionFile, $file_types)){ // проверка на тип
                         move_uploaded_file($tmpNameFile, $path.$NewNameFile); // загрузка файла
                         $resource->setTVValue($tv_name, $folder.'/'.$NewNameFile); // запись в ТВ
                    }
                }
            }
        }
    } 
}

После этих действий можете загружать изображения через Tickets, пути которых записываются в нужное вам TV ресурса. В плагине все комментировал, вопросов быть не должно, а если есть, пишите комментарии.

Загрузка изображения через форму в TV для компонента Tickets В MODX Revo

Спасибо автору данного компонента!

Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.