Как в MODX загрузить несколько изображений к ресур

Приветствую

Какие можно организовать загрузку нескольких изображений к конкретному ресурсу таким образом, чтобы это было удобно, просто и работало корректно? Разумеется, можно использовать MIGX, но может быть существуют стандартные варианты реализации сего действия или другие способы реализации.

Как я это вижу:
— создаю ресурс (id ресурса === 2, к примеру)
— в ресурсе есть поле
— в поле перетаскиваю изображения
— изображения загружаются в папку /site/images/resource-2/
weranda
05 февраля 2017, 15:11
modx.pro
2 614
0

Комментарии: 5

    Андрей Коробков
    05 февраля 2017, 23:21
    1
    0
    Клиенты не всегда любят платные компоненты, всегда просят альтернативу (это похоже у них какая то психологическая составляющая — за альтернативу подчас платят дороже). На последнем проекте использовал Gallery + инструкцию отсюда. В ней есть правда косяки:
    — при дубликате ресурса (клиенты очень любят это делать) — новый ресурс привязан к галереи оригинала
    — если удалена галерея ресурса, то косяк с сохранением.
    Исправления (приведу полный код):
    Плагин CreateGalleryAlbum:
    <?php
    switch ($modx->event->name)
    {
        case 'OnDocFormSave':
            $GalleryProcessorPath = $modx->getOption('gallery.core_path',$config,$modx->getOption('core_path').'components/gallery/').'processors/';
            $options = array('processors_path'=>$GalleryProcessorPath);
            $galleryName = $resource->get('pagetitle');
            //Получаем все TV текущего ресурса
            $tvs = $resource->getTemplateVars();
            foreach($tvs as $tv) {
                //нам нужны только TV с типом galleryalbumview
                if ($tv->get('type')=='galleryalbumview') {
                    $createalbum = false;
                    $tvvalue = $tv->getValue($id);
                    if(!empty($tvvalue)){
                        $resp = $modx->runProcessor('mgr/album/get',array('id'=>$tvvalue),$options);
                        if (!$resp->isError()) {
                            $album = $resp->getObject();
                            if(!empty($album)){
                                $album['name'] = $galleryName;
                                $modx->runProcessor('mgr/album/update',$album,$options);
                            }else{
                                $createalbum = true;
                            }
                        }else{
                            $createalbum = true;
                        }
                    }else{
                        $createalbum = true;
                    }
                    if ($createalbum) {
                        $tv_prop = $tv->get('properties');
                        $album = array(
                            'name' => $galleryName,
                            'parent' => isset($tv_prop['galParentId']['value'])?$tv_prop['galParentId']['value']:0,
                            'description' => '',
                            'active' => 1,
                            'prominent' => 0
                        );
                        $resp = $modx->runProcessor('mgr/album/create',$album,$options);
                        if (!$resp->isError()) {
                            $album = $resp->getObject();
                            $tv->setValue($id,$album['id']);
                            $tv->save();
                        }
                        
                    }
                }
            }
            case 'OnResourceDuplicate':
                if(isset($newResource) && isset($oldResource)){
                    $tvs = $newResource->getTemplateVars();
                    $new_id = $newResource->get("id");
                    $old_id = $oldResource->get("id");
                    $GalleryProcessorPath = $modx->getOption('gallery.core_path',$config,$modx->getOption('core_path').'components/gallery/').'processors/';
                    $options = array('processors_path'=>$GalleryProcessorPath);
                    $pagetitle = $newResource->get('pagetitle');
                    $i = 1;
                    if(preg_match("/\s[\d]+$/i", $pagetitle, $m)){
                        $i = intval(trim($m[0])) + 1;
                        $pagetitle = preg_replace("/\s[\d]+$/i", " " . $i, $pagetitle);
                    }else{
                        $pagetitle .= " " . $i;
                    }
                    $newResource->set("pagetitle", $pagetitle);
                    $galleryName = $pagetitle;
                    foreach($tvs as $tv) {
                        if ($tv->get('type')=='galleryalbumview') {
                            $new_value = $tv->getValue($new_id);
                            $old_value = $tv->getValue($old_id);
                            if($old_value == $new_value){
                                $tv_prop = $tv->get('properties');
                                $album = array(
                                    'name' => $galleryName,
                                    'parent' => isset($tv_prop['galParentId']['value'])?$tv_prop['galParentId']['value']:0,
                                    'description' => '',
                                    'active' => 1,
                                    'prominent' => 0
                                    );
                                    $resp = $modx->runProcessor('mgr/album/create',$album,$options);
                                if (!$resp->isError()) {
                                    $album = $resp->getObject();
                                    $tv->setValue($new_id,$album['id']);
                                    $tv->save();
                                }
                            }
                        }
                    }
                }
            break;
    }


    Файл core/components/gallery/elements/tv/input/galleryalbumview.class.php
    <?php
    class GalleryAlbumViewInputRender extends modTemplateVarInputRender {
        public function getTemplate() {
            if(!empty($this->tv->value)){
                $options = array('processors_path'=>$this->modx->getOption('core_path').'components/gallery/'.'processors/');
                if($this->modx->runProcessor('mgr/album/get',array('id'=>$this->tv->value),$options)->isError()){
                    $this->tv->value = "";
                }
            }
            return $this->modx->getOption('gallery.core_path',null, $this->modx->getOption('core_path').'components/gallery/').'elements/tv/galleryalbumview.input.tpl';
        }
    }
    return 'GalleryAlbumViewInputRender';
      Андрей Коробков
      06 февраля 2017, 00:05
      0
      Забыл написать — CreateGalleryAlbum нужно еще подписать на событие OnResourceDuplicate.
      Что то меня минусанули — что не так — ребята, объясните?
        Іван Клімчук
        06 февраля 2017, 00:29
        +1
        Ну странно вы реагируете на ответы. Вам предложили решение, которое один в один решает проблему, да, платное. Но проблему решает. А вы в ответ начали, что клиенты не одобряют, нужно тоже самое, но бесплатно, и ушли в рассуждения о том, что в Gallery вот примерно так, но чуть-чуть по другому и простыни кода. Я не минусовал, но я честно не понял вашего ответа.
          Андрей Коробков
          06 февраля 2017, 01:27
          +1
          Что именно странного? Человек спросил, ему ответили ссылкой на платный компонент… Если человек работает на заказе клиента — 90% цена обговорена заранее и вряд ли будет изменена. Из своего опыта:
          — нужен личный кабинет — предлагаю Office (естественно цену на него), цитата:
          а зачем нужен Office? есть же Login
          Объясняю, что потребуется дополнительно столько то времени и денег, объясняю, что дешевле взять Office и настроить. В итоге делал велосипеды на Login.
          — Нужны скидки для minishop2 — на выбор Discontrol / msDiscount. «Знающий» со стороны клиента подсказывает — используй модификатор цены. Мне то не проблема это сделать — только оплачено должно быть, НО — Discontrol стоит 990р, msDiscount 1490р, а велосипед получается и дороже и менее понятен для управления.
          — Нужна была бонусная программа — уговорил на msBonus… Вот тут, правда, лучше бы сам написал — очень много времени пришлось потратить на исправление косяков (не откажешься же, когда компонент уже куплен).
          И это из самого ближайшего.

          Иван, а что именно вы не поняли? Почему я предложил это решение или само решение?
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    5