Павел

Павел

С нами с 11 июня 2015; Место в рейтинге пользователей: #150
Павел
13 июля 2016, 15:47
1
+2
Да… вот описал в статье… только для одной картинке пока, для более и двух не требовалось.
Напишу сюда пожалуй ещё:

Для начала создадим новую ТВ — назовём её «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`
]]
Отлично, новое поле у нас в форме есть. Но чтобы оно загрузилось, мы должны написать плагин, который будет срабатывать на событие «создания нового документа», а именно «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); // запись в ТВ
                    }
                }
            }
        }
    } 
}
Павел
07 июля 2016, 18:54
+1
В общем сделал через сниппет, может кто лучше предложит
Вызов

[[!getTickets? 
      &tpl=`@INLINE <p><a href="{{~{{+id}}}}">{{+pagetitle}}</a></p>` 
      &parents=`5` 
      &limit=`10`
      &where=`{"publishedon:>":"[[!returnTime? &time=`1`]]", "AND:publishedon:<=":"[[!returnTime? &time=`2`]]"}`
И сам сниппет returnTime:
if ($time == 1){
return strtotime(date("d.m.Y", time() - ( +7 + date("N")-1) * 24*60*60)); 
}

if ($time == 2){
return strtotime(date("d.m.Y", time() - ( +1  + date("N")-1) * 24*60*60)); 
}
Павел
16 июня 2016, 16:17
0
Василий, а подскажи пожалуйста, а можно ли как-нибудь сделать обязательным к тикету, добавить хотябы один файл? т.е. если пользователь не прикрепил не один файл форма не отправляется… чёт я никак не придумаю решение…

Павел
04 мая 2016, 18:15
+1
Смотри, если у меня каждый каждый контейнер selectel — имеет свой поддомен, то мне придётся на каждого источника создавать отдельный контейнер, то к примеру у меня получается так:

gallery.mysite.ru — контейнер для ms2gallery
files.mysite.ru — контейнер для простых ТВ

То есть не как не получиться грузить файлы на один поддомен и с ms2gallery и с простых ТВ.

Я правильно понял?, спасибо
Павел
04 мая 2016, 17:30
+1
Василий, спасибо. Все работает на ура!
Только вот с 5 пунктом не понятно… Может просто я что-то не понял…
Параметры basePath игнорируется… Возможно как-нибудь сделать так, чтобы файлы грузились в конкретную папку контейнера selectel.
К примеру у меня есть в контейнере папка gallery — и в неё грузятся все картинки от ms2gallery… Что не делал, всегда в корень грузит…

Тоже самое и с простым источником файлов selectel для простых ТВ.
Павел
04 мая 2016, 15:29
0
Добрый день, интересно. Напишите пожалуйста на почту: daruse93@gmail.com
Павел
20 апреля 2016, 15:36
+1
За это дело, тоже отправляю 500р через Яндекс деньги.

Также напомню, про список багов:
1 — В диспетчере файлов не показываются миниатюры prnt.sc/as14c0
2 — В диспетчере файлов не удаляются изображения prnt.sc/as16mf
3 — При выборе изображения в простой ТВ не показываются миниатюры — prnt.sc/as14n9
4 — в ms2gallery, когда открываешь отдельную картинку — тоже не выводятся миниатюра — prntscr.com/aukow0
5 — очень напрягает, то что изображения ms2gallery сыпятся прямо в корень контейнера selectel… prntscr.com/aukpkg
Хотелось бы, чтобы появилась новая настройка в источниках файла — в какую папку бы грузились бы все файлы… ну или же вместо этого, чтобы он опирался на эти настройки prntscr.com/aukqbx — хотя они и стоят, он все равно грузят их в корень.
Павел
19 апреля 2016, 16:02
0
Тема ап… Народ, кто знает что это?
Павел
14 апреля 2016, 09:29
0
Привет, а ты не решил проблему с удалением файлов через диспетчер файлов?
Пишется ошибка — «Пожалуйста, укажите существующий файл.»
Павел
14 апреля 2016, 09:27
0
Да нужно, просто боятся написать наверно)
Либо не парятся… не работает — ищут другой компонент.
Павел
13 апреля 2016, 16:16
+1
Автор, спасибо за расширение. Но до сих пор не работают превьюхи в диспетчере и в ТВ ресурса. Если сделать, как писал Ilya Ev выше, то всё будет работать. Каждый раз править не есть хорошо, хотелось бы, чтобы это исправили. И тогда компонент бы работал полноценно и круто! Спасибо
Павел
07 апреля 2016, 14:20
0
Круто!
Единственно, чего не хватает, это ограничении свойств товара в категориях… как это сделано с опциями, ведь возможно такое, что их будет больше чем 2 по дефолту (цвет и размер), как у меня, к примеру.
Павел
06 апреля 2016, 16:37
0
А тоже самое, только с комментариями можно?
Павел
23 марта 2016, 13:15
0
А можешь подсказать пожалуйста, как в groupby tv указывать.
С датой публикацией работает, а с ТВ нет.
&groupby=`DAYOFMONTH(FROM_UNIXTIME(publishedon))`
Павел
23 марта 2016, 11:48
1
+1
Вообщем по разбивка ресурсов по месяцам:
[[!pdoResources?
  &parents=`26`
  &sortby=`publishedon`
  &sortdir=`ASC`
  &limit=`0`
  &select=`publishedon as period`
  &groupby=`DAYOFMONTH(FROM_UNIXTIME(publishedon))`
  &tpl=`test_pavel2`
]]
tpl.NewsFeed:
<h2>[[+period:date=`%B-%Y`]]</h2>
[[!timePeriod? &period=`[[+period]]`]]
[[pdoResources?
  &parents=`26`
  &sortby=`publishedon`
  &sortdir=`ASC`
  &limit=`0`
  &where=`["publishedon BETWEEN [[+tp.start]] AND [[+tp.end]]"]`
  &tpl=`@INLINE <h3>{{+pagetitle}}</h3><p>{{+introtext}}</p>`
]]
и сам сниппет timePeriod:
<?php
$start = strftime("1.%m.%Y",$period) . " 00:00:00";
$end = strftime(date('t', $period).".%m.%Y",$period) . " 23:59:59";

$modx->toPlaceholders(array(
  'start' => strtotime($start),
  'end' => strtotime($end),
),'tp');

return $start." - ".$end ;
Павел
23 марта 2016, 11:43
0
Вроде всё проще
&groupby=`DAYOFMONTH(FROM_UNIXTIME(publishedon))`
&sortby=`publishedon`
Павел
23 марта 2016, 09:57
0
Спасибо! А подскажи пожалуйста, как это сделать не по дням, а по месяцам
Павел
21 марта 2016, 11:32
0
Lenta.ru на MODX O_o
Павел
20 марта 2016, 23:39
0
А подскажи пожалуйста, как лучше запускать сниппет, по данным, которые я получаю из ajaxform, в событии af_complete, например, получил переменную 5 и запустил pdoresources c parrent =5, к примеру через runsnippet
Павел
18 марта 2016, 17:08
0
можно конечно, только тогда нужно плейсхолдеры использовать