Forked from DireWereWolf/gist:2fefdcd21e66ff1212ebff5865b2da78
Created
August 14, 2017 11:19
-
-
Save roman-murashov/5a474b3296f1921fcde8ca801eaaf46b to your computer and use it in GitHub Desktop.
MODX Gallery
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Управление альбомом галереи на странице ресурса | |
| 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()); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment