Как в MODX загрузить несколько изображений к ресур
Приветствую
Какие можно организовать загрузку нескольких изображений к конкретному ресурсу таким образом, чтобы это было удобно, просто и работало корректно? Разумеется, можно использовать MIGX, но может быть существуют стандартные варианты реализации сего действия или другие способы реализации.
Как я это вижу:
— создаю ресурс (id ресурса === 2, к примеру)
— в ресурсе есть поле
— в поле перетаскиваю изображения
— изображения загружаются в папку /site/images/resource-2/
Какие можно организовать загрузку нескольких изображений к конкретному ресурсу таким образом, чтобы это было удобно, просто и работало корректно? Разумеется, можно использовать MIGX, но может быть существуют стандартные варианты реализации сего действия или другие способы реализации.
Как я это вижу:
— создаю ресурс (id ресурса === 2, к примеру)
— в ресурсе есть поле
— в поле перетаскиваю изображения
— изображения загружаются в папку /site/images/resource-2/
Комментарии: 5
Клиенты не всегда любят платные компоненты, всегда просят альтернативу (это похоже у них какая то психологическая составляющая — за альтернативу подчас платят дороже). На последнем проекте использовал Gallery + инструкцию отсюда. В ней есть правда косяки:
— при дубликате ресурса (клиенты очень любят это делать) — новый ресурс привязан к галереи оригинала
— если удалена галерея ресурса, то косяк с сохранением.
Исправления (приведу полный код):
Плагин CreateGalleryAlbum:
Файл core/components/gallery/elements/tv/input/galleryalbumview.class.php
— при дубликате ресурса (клиенты очень любят это делать) — новый ресурс привязан к галереи оригинала
— если удалена галерея ресурса, то косяк с сохранением.
Исправления (приведу полный код):
Плагин 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';
Забыл написать — CreateGalleryAlbum нужно еще подписать на событие OnResourceDuplicate.
Что то меня минусанули — что не так — ребята, объясните?
Что то меня минусанули — что не так — ребята, объясните?
Ну странно вы реагируете на ответы. Вам предложили решение, которое один в один решает проблему, да, платное. Но проблему решает. А вы в ответ начали, что клиенты не одобряют, нужно тоже самое, но бесплатно, и ушли в рассуждения о том, что в Gallery вот примерно так, но чуть-чуть по другому и простыни кода. Я не минусовал, но я честно не понял вашего ответа.
Что именно странного? Человек спросил, ему ответили ссылкой на платный компонент… Если человек работает на заказе клиента — 90% цена обговорена заранее и вряд ли будет изменена. Из своего опыта:
— нужен личный кабинет — предлагаю Office (естественно цену на него), цитата:
— Нужны скидки для minishop2 — на выбор Discontrol / msDiscount. «Знающий» со стороны клиента подсказывает — используй модификатор цены. Мне то не проблема это сделать — только оплачено должно быть, НО — Discontrol стоит 990р, msDiscount 1490р, а велосипед получается и дороже и менее понятен для управления.
— Нужна была бонусная программа — уговорил на msBonus… Вот тут, правда, лучше бы сам написал — очень много времени пришлось потратить на исправление косяков (не откажешься же, когда компонент уже куплен).
И это из самого ближайшего.
Иван, а что именно вы не поняли? Почему я предложил это решение или само решение?
— нужен личный кабинет — предлагаю Office (естественно цену на него), цитата:
а зачем нужен Office? есть же LoginОбъясняю, что потребуется дополнительно столько то времени и денег, объясняю, что дешевле взять Office и настроить. В итоге делал велосипеды на Login.
— Нужны скидки для minishop2 — на выбор Discontrol / msDiscount. «Знающий» со стороны клиента подсказывает — используй модификатор цены. Мне то не проблема это сделать — только оплачено должно быть, НО — Discontrol стоит 990р, msDiscount 1490р, а велосипед получается и дороже и менее понятен для управления.
— Нужна была бонусная программа — уговорил на msBonus… Вот тут, правда, лучше бы сам написал — очень много времени пришлось потратить на исправление косяков (не откажешься же, когда компонент уже куплен).
И это из самого ближайшего.
Иван, а что именно вы не поняли? Почему я предложил это решение или само решение?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.