Андрей Коробков

Андрей Коробков

С нами с 10 января 2017; Место в рейтинге пользователей: #281
Андрей Коробков
06 февраля 2017, 20:55
0
Подытожу, сниппет ages с выводом текста:
<?php
$cases = array(2, 0, 1, 1, 1, 2);
$titles = array('год', 'года', 'лет');
$age = DateTime::createFromFormat('Y-m-d H:i:s', $input)
     ->diff(new DateTime('now'))
     ->y;
$title = $titles[($age % 100 > 4 && $age % 100 < 20) ? 2 : $cases[min($age % 10, 5)]];
return $age . " " . $title;
и вызов [[+tv.birthday:ages]]
Андрей Коробков
06 февраля 2017, 20:18
+3
А в панели разработчика на вкладке «Network» есть галочка «Disable cache» — используйте во время разработки
Андрей Коробков
06 февраля 2017, 11:23
0
загляните в консоль — у вас какой то скрипт Modernizr требует, а он не подключен
Андрей Коробков
06 февраля 2017, 10:20
0
[[+tv.birthday:ages]] [[+tv.birthday:ages: имя_сниппета]]
Андрей Коробков
06 февраля 2017, 01:38
0
Во первых, для диагностики отключите сжатие скриптов, во вторых — попробуйте подключить версию jquery в районе <3 (2.2, 1.12).
Сам пробовал 3-ю версию — были баги. И посмотрите в консоль.
Андрей Коробков
06 февраля 2017, 01:27
+1
Что именно странного? Человек спросил, ему ответили ссылкой на платный компонент… Если человек работает на заказе клиента — 90% цена обговорена заранее и вряд ли будет изменена. Из своего опыта:
— нужен личный кабинет — предлагаю Office (естественно цену на него), цитата:
а зачем нужен Office? есть же Login
Объясняю, что потребуется дополнительно столько то времени и денег, объясняю, что дешевле взять Office и настроить. В итоге делал велосипеды на Login.
— Нужны скидки для minishop2 — на выбор Discontrol / msDiscount. «Знающий» со стороны клиента подсказывает — используй модификатор цены. Мне то не проблема это сделать — только оплачено должно быть, НО — Discontrol стоит 990р, msDiscount 1490р, а велосипед получается и дороже и менее понятен для управления.
— Нужна была бонусная программа — уговорил на msBonus… Вот тут, правда, лучше бы сам написал — очень много времени пришлось потратить на исправление косяков (не откажешься же, когда компонент уже куплен).
И это из самого ближайшего.

Иван, а что именно вы не поняли? Почему я предложил это решение или само решение?
Андрей Коробков
06 февраля 2017, 00:05
0
Забыл написать — CreateGalleryAlbum нужно еще подписать на событие OnResourceDuplicate.
Что то меня минусанули — что не так — ребята, объясните?
Андрей Коробков
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';
Андрей Коробков
05 февраля 2017, 23:01
0
лучше на fenom переходите
Андрей Коробков
05 февраля 2017, 22:55
+1
да, но чтобы при каждом вызове страницы менялся вывод — сделайте вызов некешированным (в начале !):
[[!pdoResources?
&limit=`7`
&parents=`47`
&depth=`0`
&sortby=`RAND()`
&tpl=`arena_item`
&includeTVs=`images`
]]
Андрей Коробков
05 февраля 2017, 22:51
0
pdoResources sortby
Для случайно сортировки укажите «RAND()»
вы это имели ввиду?
Андрей Коробков
05 февраля 2017, 22:48
0
Изучите фильтры phx, а лучше переходите на fenom
Андрей Коробков
05 февраля 2017, 22:46
+1
До 10:
[[+idx:lt=`10`:then=`0[[+idx]]`:else=`[[+idx]]`]]
попробуйте, должно сработать
Андрей Коробков
05 февраля 2017, 22:40
0
В чанке, там, где нужен номер [[+idx]] (или на fenom {$idx}) — нумерация идет от 1, чтобы в начале были 0:
[[+idx:lt=`100`:then=`[[+idx:lt=`10`:then=`00[[+idx]]`:else=`0[[+idx]]`]]`:else=`[[+idx]]`]]
тут до 1000
Андрей Коробков
05 февраля 2017, 22:29
0
Используйте плейсхолдер idx
Андрей Коробков
05 февраля 2017, 19:54
0
Еще можете попробовать переписать tpl и tplWrapper на fenom, должно прилично ускорить.
Андрей Коробков
05 февраля 2017, 19:35
+1
Вариант с жестким кешированием на день/несколько дней не подойдет?
Генерируете по крону в файл, на странице sitemap.xml сниппет с примерным содержанием:
<?php
return file_get_contents('pach_to_file');
Андрей Коробков
05 февраля 2017, 19:25
0
Пишите в файл номер запуска, при запуске скрипта считывайте, как только $docs будет пустой (как вариант, количество меньше 200) — в файл пишите 0 и так по кругу, ваш offset будет номер запуска*200.

Чтобы снизить нагрузку
Используйте PDO вместо xPDO. Если вам значение именно в 1 надо — два запроса — select — получить id ресурсов с нужными шаблонами, update — обновить значение. А если этот тв используется только у этих шаблонов, так и id ресурсов получать не обязательно.
Андрей Коробков
05 февраля 2017, 16:34
0
Надо будет попробовать.
Оказывается есть ResizeImageOnUpload — в описании DirectResize2 ссылочка на него! Не знал, попробовал — работает.
Андрей Коробков
29 января 2017, 09:36
0
Похоже это баг firefox — не срабатывает live submit (а может не только live и не только submit, не проверял), если у парента:
transform-style: preserve-3d;
В общем, уберите у .buttons это свойство (и с ним связанные) и все заработает, а уменьшение при нажатие попробуете сделать не через z-трансляцию, а через scale.