Наверх

Управление альбомом галереи на странице ресурса

В разделе «Репосты» расположены чужие статьи, которые мне понравились или показались полезными.

Чего мне всегда не хватало в Revo дак это удобной галереи для менеджера. Для Evo есть EvoGallery, где можно управлять альбомом прямо на странице документа. Менеджеру не нужно постоянно путаться, что редактирование документов осуществляется в дереве документов, а фотографии грузятся через модули. Все в одном месте, удобно. Причем галерея нужна на основе базы данных, а не просто файлы в папке, чтобы можно было указать описания для фотографий, метки, сортировать их итд.

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

Создадим новый тип galleryalbumview. Принцип работы будет такой: TV хранит ID альбома в галерее, редактирования ID не будет. При редактировании документа проблем не будет, т.к. в TV значение ID альбома уже будет, а для новых документов создавать альбомы и записывать его ID будем при первом сохранении документа.

Для этого в папке core/components/gallery/elements/tv/input/ создадим файл galleryalbumview.class.php
<?php
class GalleryAlbumViewInputRender extends modTemplateVarInputRender {
    public function getTemplate() {
        return $this->modx->getOption('gallery.core_path',null, $this->modx->getOption('core_path').'components/gallery/').'elements/tv/galleryalbumview.input.tpl';
    }
}
return 'GalleryAlbumViewInputRender';

В папке core/components/gallery/elements/tv создадим шаблон galleryalbumview.input.tpl

<div id="tv{$tv->id}-form"></div>
<input id="tv{$tv->id}" type="hidden" name="tv{$tv->id}" value="{$tv->value}"/>
{if $tv->value ne ''}
{literal}
<script type="text/javascript">
// <![CDATA[
Ext.onReady(function() {
        MODx.load({{/literal}
        xtype: 'gal-panel-album-items'
        ,border: false
        ,autoHeight: true
        ,autoScroll: true
        ,forceLayout: true
        ,width: Ext.getCmp('modx-panel-resource').getWidth() - 300
        ,album: '{$tv->value}'
        ,renderTo: 'tv{$tv->id}-form'
        ,tv: '{$tv->id}'
        ,tvValue: '{$tv->value}'

{literal}
        });
});     
// ]]>
</script>
{/literal}
{else}
<p>Please, save document before create gallery</p>
{/if}

В плагине GalleryCustomTV (ставится вместе с Gallery) допишем нужные нам js и css файлы, в итоге в конце плагина код должен быть таким:

$modx->controller->addJavascript($gallery->config['assetsUrl'].'js/mgr/tv/Spotlight.js');
$modx->controller->addJavascript($gallery->config['assetsUrl'].'js/mgr/gallery.js');
$modx->controller->addJavascript($gallery->config['assetsUrl'].'js/mgr/widgets/album/album.items.view.js');
$modx->controller->addJavascript($gallery->config['assetsUrl'].'js/mgr/widgets/album/album.tree.js');
$modx->controller->addJavascript($gallery->config['assetsUrl'].'js/mgr/tv/gal.browser.js');
$modx->controller->addJavascript($gallery->config['assetsUrl'].'js/mgr/tv/galtv.js');
$modx->controller->addJavascript($gallery->config['assetsUrl'].'js/mgr/utils/ddview.js');
$modx->controller->addJavascript($gallery->config['assetsUrl'].'js/mgr/utils/fileuploader.js');
$modx->controller->addJavascript($gallery->config['assetsUrl'].'js/mgr/widgets/album/album.panel.js');
$modx->controller->addCss($gallery->config['cssUrl'].'mgr.css');
$modx->controller->addCss($gallery->config['cssUrl'].'fileuploader.css');

Теперь у нас появился новый тип TV, создадим с данным типом TV, например GalleryAlbum и привяжем его к шаблону. Удобно такие автосозданные альбомы хранить в отдельном корневом альбоме в галерее, поэтому на вкладке «Параметры» создадим параметр galParentId со значением, к примеру, 1. Это ID родительского альбома (его необходимо предварительно создать).

Далее нам нужен плагин, который при сохранении документа будет создавать альбом в галерее и записывать его ID в TV.
Создадим плагин CreateGalleryAlbum, укажем событие OnDocFormSave

<?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') {
                $tvvalue = $tv->getValue($id);
                if (empty($tvvalue)) {
                    //Параметры TV
                    $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();
                    }
                    
                } else {
                    // TV уже есть, обновим название альбома
                    $resp = $modx->runProcessor('mgr/album/get',array('id'=>$tvvalue),$options);
                    if (!$resp->isError()) {
                        $album = $resp->getObject();
                        $album['name'] = $galleryName;
                        $modx->runProcessor('mgr/album/update',$album,$options);    
                    }

                }
            }
        }
        break;
}

Для удобства при изменении документа плагин меняет название альбома как заголовок страницы. Это сделано на всякий случай для удобного поиска в галерее нужного альбома, чтобы названия страниц соответствовали названиям альбомов

Для удобства можно через Form Customization вынести данный TV на отдельную вкладку.

Вот собственно и все. Скриншот конечного результата:


Источник: community.modx-cms.ru/blog/tips_and_tricks/8733.html


26 комментариев

  1. Саша Друмс 15 мая 2014, 17:01 # 0
    Привет, Илья.
    Может ты сталкивался с проблемой использования Gallery на мультиязычных сайтах?
    В контексте web альбомы нормально отображаются, а в других контекстах битые ссылки получаются т.к. phpthumb пытается их вывести через контекст web.
    1. Илья Уткин 15 мая 2014, 17:03 # 0
      Неа, я вообще еще не делал мультиязычных сайтов, поэтому не сталкивался с таким.
      1. Shin 17 мая 2014, 03:26 # 0
        У меня случилось такое в последней версии Gallery. Раньше такого не было. Сделал replace. Кривовато, конечно, но лезть в кишки не захотел.
      2. fred 30 ноября 2014, 16:47 # 0
        После обновления MODX до 2.3 в редактировании фоток все поломалось, они теперь просто списком выстраиваются и все, нельзя удалить перетащить, в общим ничего нельзя с ними сделать, при этом кнопки загрузки новых фоток остались но выглядят по другому, подскажите что это может быть?
        1. fred 30 ноября 2014, 17:02(Комментарий был изменён) # 0
          Обновил и Gallery, теперь все работает только мелочь одна бесит, у миниатюр рамки сдвинулись в сторону, точнее само фото выходит за пределы рамки и перекрывает ее.
          1. fred 30 ноября 2014, 17:58 # +1
            Решил и проблему со сдвинутой картинкой относительно рамки, уменьшил в настройках галереи размер миниатюры до 100 пкс
          2. Fesswood 02 апреля 2015, 10:06 # 0
            Добрый день, столкнулся со следующей проблемой:
            Если редактировать item галереи через дополнительные поля ресурса, то в textarea с именем description рендерится TinyMCE, может кто-нибудь сталкивался с такой проблемой?
            TinyMCE вместо простой textarea
            1. Илья Уткин 02 апреля 2015, 13:37 # 0
              Наверное, какой-то плагин на сайте вмешивается. Попробуйте лучше купить ms2Gallery. А то это решение все-таки похоже на какой-то костыль.
              1. Fesswood 03 апреля 2015, 04:33 # 0
                Полумеру я нашел, выключить галку Toggle Editor у ресурса) Ну а впредь, конечно использование ms2Gallery будет в приоритете.
            2. Ростислав 09 августа 2015, 18:17 # 0
              В документе выбираю нужный альбом галереи из выпадающего списка с помощью galleryalbumlist.
              Вопрос — а как присвоить своему tv-параметру значение поля «обложка альбома» из выбранного выше альбома?
              1. Илья Уткин 10 августа 2015, 07:26 # 0
                К сожалению, не знаю, я компонентом Gallery нечасто пользуюсь.
                1. Ростислав 10 августа 2015, 07:44 # 0
                  Ну тут, наверное, не только к Gallery вопрос.
                  Я не совсем точно сформулировал.
                  В общем, суть такова — нужно создать два tv-параметра с типом «выпадающий список» и, чтобы при выборе значения из первого списка, во втором списке динамически формировались значения, на основании значения, выбранного в первом списке.
                  Как это сделать на голом php+ajax я примерно представляю, но не могу переложить это на админку modx, в разрезе использования tv-параметров.
                  1. Илья Уткин 10 августа 2015, 07:52 # 0
                    А, я понял. Не видел решения такой проблемы… Хотя в сообществе такой вопрос периодически поднимается.
              2. Андрей 07 декабря 2015, 20:03 # +1
                Предлагаю обратить внимание на бесплатный компонент галереи Asset Manager.
                Он позволяет публиковать изображения с привязкой к ресурсу. Изображения кладет в папки: год->месяц->число
                Можно использовать с Tickets, для этого в настройках компонента в поле assman.class_keys указать [«Ticket»]
                Автор пишет, что обновление компонента почему-то не допускают в репозиторий модекс
                Поэтому, чтобы исправить баг меню в версии ModX 2.4.2, нужно из гитхаба автора переписать файл core/components/assman/controllers/BaseController.php.
                1. Илья Уткин 09 января 2016, 14:09 # 0
                  Да, сейчас существует не один компонент, который реализует такое поведение. Статейка старая, её писали, когда ничего такого еще не было)
                2. Игорь 28 декабря 2015, 08:10 # 0
                  все сделал как описано — но на вкладке документа загрузка фото дает ошибку. и фото не загружаются
                  в чем дело?
                  1. Илья Уткин 09 января 2016, 14:09 # 0
                    Не могу сказать, статейка старая, да и метод не мой — это только репост. Попробуйте лучше поставить ms2Gallery или Asset Manager
                  2. Виталий 30 марта 2016, 15:39 # 0
                    Добрый вечер.
                    У меня несколько альбомов, массово загрузил в них фото. Хочу описание фото сделать из названия фото. Накидал такое:
                    <?php
                    $resources = $modx->getCollection('galItem');
                    foreach ($resources as $k => $res) {
                     $desc =(str_replace('.jpg','',$res->get('name')));
                      $res->setTVValue('description', $desc);   
                    }
                    
                    
                    Что вместо setTVValue нужно?
                    1. Илья Уткин 30 марта 2016, 16:26 # 0
                      Просто set, думаю…
                    2. Евгений 20 августа 2016, 19:27 # 0
                      Здравствуйте!
                      Данная инструкция еще работает? Кто подскажет результат работы на последней gallery?
                      если нет какие альтернативы?
                      1. Евгений 07 июня 2018, 11:04 # 0
                        Не актуально, не тратьте время
                        1. serg 11 сентября 2018, 16:42 # 0
                          Евгений, Вам удалось решить этот вопрос? Была использована эта схема на Gallery 1.7.0, все работало, обновил до 1.7.1 из-за дыры в безопасности и работать ТВха перестала. Есть варианты?
                        2. Дима 02 декабря 2018, 19:32 # 0
                          А как галерею к конкретному ресурсу вывести на странице? Указывать конкретный номер альбома или каким в этом случае будет вызов?
                          1. Илья Уткин 03 декабря 2018, 08:38 # 0
                            В созданном ТВ будет храниться как раз ID нужного альбома, да.
                            1. Дима 03 декабря 2018, 14:29 # 0
                              Спасибо)
                          2. Игорь 24 июля 2023, 10:10 # 0
                            Проект tsknnmgc.beget.tech

                            Modx Gallery. Блок на главной — «ГАЛЕРЕЯ НАШИХ РАБОТ» содержит некоторое количество альбомов, внутри которых фотографии. Если выводить стандартным чанком «galAlbumRowWithCoverTpl», то выводятся заглавные картинки альбомов.

                            А как сделать при клике на альбом, чтобы открывалась галерея с фотографиями (содержимым альбома)…? не понимаю… Сейчас ссылка в чанке на это выглядит так…

                            <a href="[[+url:is=``:then=`[[+image]]`:else=`[[+url]]`]]" [[+link_attributes]]>
                            [[+image:notempty=`<img src="[[+image]]" [[+cls:notempty=`class="[[+cls]]"`]] alt="[[+title]]" />`]]


                            Как поменять ее в нужную сторону?

                            Авторизация

                            через сервис Loginza:


                            Шаблоны MODX

                            1 2 Дальше »

                            Объектная
                            модель
                            MODX