Skip to content

Instantly share code, notes, and snippets.

@DireWereWolf
Last active August 14, 2017 11:19
Show Gist options
  • Select an option

  • Save DireWereWolf/2fefdcd21e66ff1212ebff5865b2da78 to your computer and use it in GitHub Desktop.

Select an option

Save DireWereWolf/2fefdcd21e66ff1212ebff5865b2da78 to your computer and use it in GitHub Desktop.

Revisions

  1. DireWereWolf revised this gist Jul 5, 2016. 1 changed file with 2 additions and 1 deletion.
    3 changes: 2 additions & 1 deletion gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -119,7 +119,8 @@ switch ($modx->event->name)

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

    Фикс галереи после проделанных манипуляций
    Фикс галереи после проделанных манипуляций (суть проблемы - не загружаются фотки в свежесозданный альбом, при рендеринге превьюшек в админке битые картинки)

    В файле
    \core\components\gallery\model\gallery\galalbum.class.php

  2. DireWereWolf created this gist Jul 5, 2016.
    138 changes: 138 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,138 @@
    Управление альбомом галереи на странице ресурса
    Tips & tricks
    Чего мне всегда не хватало в 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 на отдельную вкладку.

    Фикс галереи после проделанных манипуляций
    В файле
    \core\components\gallery\model\gallery\galalbum.class.php

    заменить

    / if directory doesnt exist, create it /
    if (!$mediaSource->createContainer($targetDir,'/')) {
    $this->xpdo->log(xPDO::LOG_LEVEL_ERROR,'[Gallery] Could not create directory (possibly already exists?): '.$targetDir);
    }

    на

    / if directory doesnt exist, create it /
    if ((!file_exists($this->getPath())) && (!@mkdir($this->getPath(), 0777))) {
    $this->xpdo->log(xPDO::LOG_LEVEL_ERROR,'[Gallery] Could not create directory (possibly already exists?): '.$this->getPath());
    }