Андрей П

Андрей П

С нами с 05 ноября 2015; Место в рейтинге пользователей: #291
Dmitry Rodionov
09 февраля 2017, 22:36
4
0
Прошу прощения за некромантию, но может кому-то пригодится решение без модификации сниппета, на вышеуказанном примере, без использования leftJoin:
&optionFilters=`{
	"ps_target:!=":"",
	"ps_type:!=":""
}`
&where=`["
	(ps_target.value='Витрины и мебель' OR ps_target.value='Ландшафт' OR ps_target.value='Автомойки') AND 
	(ps_type.value='Модульный' OR ps_type.value='Ландшафтный' OR ps_type.value='Карданный')
"]`
по сути optionFilters подключает нужные таблицы и дает не противоречащие условия, а все остальное прописывает внутри where
Василий Столейков
09 февраля 2017, 14:10
2
0
Логи же просто так сыпятся. Обновился — ошибки сами пропали, обычное дело, так всегда и бывает.
Смешно.
Зря ты так. А ведь бывает же. Например после недавнего обновления твоих компонентов перестали сыпаться некоторые ошибки. Раньше давно как-то тоже такое было и после обновления движка.

Ищи, где у тебя есть IN
Спасибо за наводку, буду дальше искать.

replace, где не передан третий параметр
Спасибо, буду искать. Его у меня много везде. Возможно не ругаются следующие конструкции:
{$title|replace:' ':''|replace:'Ё':'Е'|replace:' ':''} 
{$title|replace:\' \':\'\'|replace:\'Ё\':\'Е\'|replace:\' \':\'\'} // или в @INLINE чанках
Буду проверять.

Спасибо что ответил!
Максим Кузнецов
08 февраля 2017, 22:45
2
+2
Вы можете сделать выборку необходимых ресурсов с тв-полем через обычный pdoResources, подключив в includeTVs нужное MIGX-поле, после чего разобрать их в чанке при помощи фенома:

{set $migx_array = $migx_tv_name | fromJSON}

{foreach $migx_array as $migx_row}
	{$migx_row['название_колонки1_в_migx']}, {$migx_row['название_колонки2_в_migx']}, ...
{/foreach}
Максим Кузнецов
08 февраля 2017, 15:34
1
+2
1. Создаем сниппет (random_list):
<?php
	$total = intval($total);
	$list = explode("||", $input);
	
	$random_items = array_rand($list, $total);
	
	$result = '';
	for ($i = 1; $i <= $total; $i++) {
		$result .= '<li>' . $list[$random_items[$i - 1]] . '</li>';
	}
	
	return $result;

2. Вызываем:
<ul>
	[[!random_list? &input=`Значение1||2||3||десять||8` &total=`3`]]
</ul>
Андрей Коробков
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';
Виталий Серый
13 ноября 2016, 18:44
3
0
Код чанка написать между foreach.
Например:
{foreach $rows as $row}
	<div class="item">
		<div class="title">{$row.title}</div>
		<div class="desc">{$row.description}</div>
		<div class="image"><img src="{$row.image}" alt="{$row.title}" /></div>
	</div>
{/foreach}
Дмитрий Меркурьев
20 октября 2016, 14:11
1
0
А вызов slick как выглядит?
Для примера вызов в одном из проектов:
var $slickSlider = $('#slick-slider');
if ($slickSlider.length > 0){
	$slickSlider.slick({
		dots: true,
		speed: 300,
		slidesToShow: 4,
		slidesToScroll: 4,
		responsive: [
			{
				breakpoint: 1400,
				settings: {
					slidesToShow: 3,
					slidesToScroll: 3
				}
			},{
				breakpoint: 1168,
				settings: {
					slidesToShow: 2,
					slidesToScroll: 2
				}
			},{
				breakpoint: 900,
				settings: {
					slidesToShow: 1,
					slidesToScroll: 1
			}
			},{
				breakpoint: 768,
				settings: {
					slidesToShow: 2,
					slidesToScroll: 2
				}
			},{
				breakpoint: 560,
				settings: {
					slidesToShow: 1,
					slidesToScroll: 1
				}
			}
		]
	});
}
DocentBF
25 июня 2016, 20:36
4
+4
Можно переписать метод mSearch2.handleSort или подключить к mFilter2 cвой скрипт фронтенда или переопределить метод в другом js файле, например как-то так:
if (typeof(mSearch2) !== "undefined") {
mSearch2.initialized = false;
mSearch2.handleSort = function() {
    var params = this.Hash.get();
    if (params.sort) {
            var sorts = params.sort.split(mse2Config.values_delimeter);
            for (var i = 0; i < sorts.length; i++) {
                var tmp = sorts[i].split(mse2Config.method_delimeter);
                if (tmp[0] && tmp[1]) {
                    $('#mse2_sort option[data-sort="' + tmp[0] + '"][value="' + tmp[1] + '"]').attr('selected', 'selected').trigger('change');
                }
            }
        }
        $(document).off('click', this.options.sort_link);
        $(document).on('change', '#mse2_sort', function() {
            var selected = $(this).find('option:selected');
            var sort = selected.data('sort');
            sort += mse2Config.method_delimeter + selected.val();
            mse2Config.sort = (sort != mse2Config.start_sort) ? sort : '';
            var params = mSearch2.getFilters();
            mSearch2.Hash.set(params);
            mSearch2.load(params);
        });
    }
    mSearch2.initialize('body');
}
а select представить например так:
<select id="mse2_sort">
    <option value="asc" data-sort="resource|pagetitle">по умолчанию</option>
    <option value="asc" data-sort="ms|price">по возрастанию цены</option>
    <option value="desc" data-sort="ms|price">по убыванию цены</option>
</select>
Павел Гвоздь
13 февраля 2016, 08:48
3
+2
Феномом как-то так:
{if $_modx->resource.tags?}
	{foreach json_decode($_modx->resource.tags,1) as $tag}
		{var $tags[] = '<a href="">'~ $tag ~'</a>'}
	{/foreach}
	{$tags|join:", "}
{/if}
На стандартном синтаксисе хз, надо писать сниппет. Где-то в марте обновлю пакет, добавлю туда необходимый, для вывода стандартным синтаксисом, сниппет. Сейчас совершенно не до этого, тем более я уже давно не использую почти нигде стандартный синтаксис MODX, поэтому мне «не припекает» особо писать его.

Можешь сам для себя написать сниппет, он будет похож на код Fenom. Ничего сверхъестественного нет.
Василий Наумкин
30 ноября 2015, 14:40
3
+1
Сниппеты MODX могут возвращать исключительно строки, так уже повелось. $modx->fromJSON не нужен, Fenom умеет сам это делать:
{set $result = json_decode($_modx->runSnippet('snippet'), 1)}

Можно еще вот так:
{var $resources = $_modx->getResources(
    ['published' => 1, 'deleted' => 0],
    ['sortby' => 'id', 'sortdir' => 'ASC', 'limit' => 50]
)}
{foreach $resources as $resource}
    {$_modx->getChunk('@INLINE <p>{$id} {$pagetitle}</p>', $resource)}
{/foreach}
Но это только для ресурсов.