Всего 125 994 комментария

Algirdas
22 августа 2021, 13:17
0
С помощью
'defaultIconCaption' => '{$data.parent | resource : "pagetitle"}'
вывел, но можно ли настроить вид, как в первой версии?
Роман
22 августа 2021, 13:06
0
Мое предположение, что среди найденных товаров нет, такого товара у которого есть такой фильтр. Тогда встает вопрос, как скрывать такие фильтры?
Algirdas
22 августа 2021, 13:04
0


Вот такие баллуны можно вывести, как в первой версии компонента? Чтобы не по клику, а сразу названия были
Algirdas
22 августа 2021, 12:47
0
Если просто выводить карту, без фильтров, то всё отлично выводится

<div>
    {'!YandexMaps2' | snippet : [
        'parents' => 5,
        'class' => 'modDocument',
        'objectsInScope' => 1,
        'defaultBalloonContent' => '<div><strong>{$data.parent | resource : "pagetitle"}</strong></div>
                                    <div><p><a href="{$data.parent | resource : "uri"}">Подробнее</a></p></div>
        ',
    ]}
</div>
С выводом ссылок разобрался, в прошлый раз видимо что-то не то написал там. Но баллуны выводятся только если вызываешь сниппет без фильтров
Algirdas
22 августа 2021, 11:49
0
Развернул тестовый стенд на modhost. Из шаблона вызываю вот так:
{'!mFilter2' | snippet : [
    'parents' => 5,
    'limit' => 0,
    'tplOuter' => 'tpl.mFilter2.outer.Map',
    'tpl' => 'tpl.mSearch2.row.Map'
    'filters' => '
        tv|system,
    ',
    'tplFilter.outer.tv|system' => 'tpl.mFilter2.filter.select',
    'tplFilter.row.tv|system' => 'tpl.mFilter2.filter.option',
]}
tpl.mFilter2.outer.Map

<div class="row msearch2" id="mse2_mfilter">
    <div class="span3 col-md-4">
        <form action="[[~[[*id]]]]" method="post" id="mse2_filters">
            <div>
                [[+filters]]
            </div>
            [[+filters:isnot=``:then=`
                {*<button type="reset" class="btn btn-default hidden">[[%mse2_reset]]</button> *}
                <button type="submit" class="btn btn-success pull-right hidden">[[%mse2_submit]]</button>
                <div class="clearfix"></div>
            `]]
        </form>
    </div>

    <div class="span9 col-md-12">
        {'!YandexMaps2' | snippet : [
            'mode' => 'mfilter2',
            'class' => 'modDocument',
            'objectsInScope' => 1,
            'defaultBalloonContent' => '<div><b>pagetitle</b>: {$data.current | resource : "pagetitle"}</div>
                                        <div><b>tv</b>: {$data.current | resource : "system"}</div>
            ',
            'defaultIconContent' => 'test'
        ]}
        <div id="mse2_results">
            {$results}
        </div>
    </div>
</div>
tpl.mSearch2.row.Map

<div class="mse2-row">
    [[+idx]]. <a href="[[+uri]]">[[+pagetitle]]</a>[[+weight]]
    [[+intro]]
</div>

<div class="js-ym2-mse2-objects" style="display:none">{'!YandexMaps2' | snippet : [
    'parent' => $id,
    'scripts' => false,
    'tpl' => '@INLINE {(($objects | toJSON: 9) | replace: "{": "{ ") | replace: "[": "[ "}',
]}</div>

<!--msearch2_weight  ([[%mse2_weight]]: [[+weight]])-->
<!--msearch2_intro <p>[[+intro]]</p>-->
Почему-то не вылазят баллуны, вообще никак. То есть при клике на метку ничего не происходит. Еще не получилось в баллун встроить название ресурса и ссылку на него, как это работает в yandexMaps первой версии. Есть ощущение что в документации отражено далеко не всё, что может компонент. А больше и посмотреть негде (( Очень мало инфы по нему.

Еще не понял куда подключать этот код:
$(document).ready(function() {
    $(document).on('ymOnLoadMap', function(e, ym2, map) {
        map.controls
            .remove('fullscreenControl') // полный экран
            .remove('geolocationControl') // моя геопозиция
            .remove('rulerControl') // линейка
            .remove('trafficControl') // пробки
            .remove('searchControl') // поиск
            .remove('typeSelector') // слои
            .remove('zoomControl') // масштаб
        ;
    });
});
Куда бы я его не подключал, где по моим представлениям он может быть, нигде не сработало. Я не программист, поэтому может откровенную фигню творил ))

Пока не включил friendlyURL, ссылки под картой указывали на главную страницу, хотя у вас на демо странице оно вроде как работает и без этого.

Вообще меня почти полностью устраивал yandexMaps :)) Только фильтрацию нужную не смог там настроить и с выводом фильтров разобраться )
Максим
22 августа 2021, 10:44
0
У меня просто пример, не проверял. В примере многоточие стоят. Это означает, что там другой код должен быть. А именно — проверка на массив и т.п.
Может быть даже лучше в отдельный сниппет вынести.
{set $data = [
    'Фрезеровка' => 2,
    'Гравировка' => 123
]}
{foreach $options as $option}
    {if $option.value is array}
        {foreach $option.value as $key => $value}
            {if in_array($value, $data)}
                {set $option.value[$key]}
                    <a href="{$data[$value]|url}">{$value}</a>
                {/set}
        {/foreach}
        {$option.value | join: ', '}
    {/if}
    ...
{/foreach}
(не проверял)
Algirdas
21 августа 2021, 23:39
0
Ребята, кто купил компонент, техподдержка отвечает? А то что-то в этом треде давно автора не было. Перед покупкой хотелось бы пару вопросов задать, а то сейчас тестирую и пара вещей не работает, хотя должна вроде как.
Александр Туниеков
21 августа 2021, 10:30
0
2. А я добавил исключение
preg_match('/DISTINCT/i',
                        $fields)
В блоке
if ($fields == 'all' || $fields == '*' || empty($fields)) {
                        $fields = $this->modx->getSelectColumns($class, $alias);
                    } elseif(preg_match('/DISTINCT/i',
                        $fields)){
                    }else {
                        $fields = $this->modx->getSelectColumns($class, $alias, '',
                            array_map('trim', explode(',', $fields)));
                    }
3.
Это чудит xPDO.
В курсе. Если select строка, xPDO разбивает select по запятым и затем решает, что 1 это колонка и ставит апострофы.
Блок
if (is_string($fields) && strpos($fields, '(') !== false) {
                    // Commas in functions
                    $fields = preg_replace_callback('/\(.*?\)/', function($matches) {
                        return str_replace(",", "|", $matches[0]);
                    }, $fields);
                    $fields = explode(',', $fields);
                    foreach ($fields as &$field) {
                        $field = str_replace('|', ',', $field);
                    }
                    $this->query->select($fields);
                    $this->addTime('Added selection of <b>' . $class . '</b>: <small>' . str_replace('`' . $alias . '`.',
                            '', implode(',', $fields)) . '</small>', microtime(true) - $time);
                }
вообще не был бы нужен, если бы XPDO не чудила.

Но так как запрос простой и без логики, я бы не стал вообще использовать xPDO, а сделал бы маленький и лёгкий запрос (без кучи объектов xPDO)
У меня pdoTools в компонентах используется, чтобы изменить запрос не трогая сам компонент. Например из excelconvertrule
{
    "class": "MaterialZakupList",
    "leftJoin": {
        "MaterialZakup": {
            "class": "MaterialZakup",
            "on": "MaterialZakup.id = MaterialZakupList.order_id"
        },
        "gtsBAccount": {
            "class": "gtsBAccount",
            "on": "gtsBAccount.id = MaterialZakup.account_id"
        },
        "raschetsMaterial": {
            "class": "raschetsMaterial",
            "on": "raschetsMaterial.id = MaterialZakupList.mat_id"
        },
        "Orgs": {
            "class": "Orgs",
            "on": "Orgs.id = MaterialZakup.org_id"
        }
    },
    "select": {
        "MaterialZakupList": "*",
        "Orgs": "Orgs.shortname",
        "gtsBAccount": "gtsBAccount.label as account",
        "raschetsMaterial": "IF(MaterialZakupList.prihod_date IS NULL,'в дороге','получено') as status1,IF(MaterialZakupList.type_id = 3,raschetsMaterial.name,MaterialZakupList.tovar) as tovar1,raschetsMaterial.type,raschetsMaterial.metall,raschetsMaterial.ed_izm",
        "MaterialZakup": "MaterialZakup.date,MaterialZakup.document"
    },
    "sortby": {
        "MaterialZakupList.id": "ASC"
    }
}
При экспорте в excel без правок pdoTools на строке
IF(MaterialZakupList.prihod_date IS NULL,'в дороге','получено')
'в дороге' обрамляется апострофами.
Сергей Шлоков
21 августа 2021, 08:17
0
1. Видимо нужна foolproof защита.
2. Или используем твой вариант с таблицей в виде префикса или такой
'select'=>[
    'modResource'=>'DISTINCT pagetitle as pagetitle',
],
Напомню, что можно работать напрямую с запросами через базовый API.
$query = $modx->newQuery('modResource');
$query->query['distinct'] = 'DISTINCT';
...
3. Это чудит xPDO. Он формирует запрос, а не pdoFetch. А вообще очень странная конструкция. Я бы так даже не додумался написать. Для сравнения на SQL сервере я бы написал так
'select'=>[
    'parent', 
    'SUM(published) = COUNT(*) as all_published'
],
Для сравнения на клиенте так
'select'=>[
     'parent', 
     'SUM(published) as all_published',
     'COUNT(*) as count'
],
А потом в цикле проверил бы на равенство два последних поля.
Но так как запрос простой и без логики, я бы не стал вообще использовать xPDO, а сделал бы маленький и лёгкий запрос (без кучи объектов xPDO)
$table = $modx->getTableName('modResource');
$sql = "SELECT parent, SUM(published) = COUNT(*) as all_published FROM $table GROUP BY parent";
$statement = $modx->prepare($sql);
if ($statement->execute()) {
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);
}
4. Скорее всего тоже xPDO шалит. Проверю.
Михаил
21 августа 2021, 03:51
0
Здравствуйте! У меня заработало только так:

В шаблоне карточки товара:
[[!msOptionsPrice.option?
&product=`[[*id]]`
&name=`fillers`
&type=`2`
&where=`{"Option.key": "fillers"}`
&sortby=`{"msopModification.id": "ASC"}`
&limit=`100`
&tpl=`tpl.msOptionsFillers`
]]

Чанк tpl.msOptionsFillers:
{foreach $options as $name => $values}
       {foreach $values as $value} <label for="fillers_{$idx}">
            <input type="checkbox" name="options[{$name}][]" id="fillers_{$idx}" value="{$value}"><input type="hidden" name="options[]" value="[]"> {$value} <b style="color:red">(+{$modification.price} руб.)</b>
        </label> {/foreach}
{/foreach}

Но почему то не выводится добавочная цена {$modification.price}
Александр
21 августа 2021, 00:14
0
Что то подмена не срабатывает. array пишет во всех строках
Максим
20 августа 2021, 17:12
0
Ну тогда как было написано выше. Только не по id, а прям по названию проверять. Примерно как-то так.
{set $data = [
    'Фрезеровка' => 2,
    'Гравировка' => 123
]}
{foreach $options as $option}
    ...
    {if in_array($option.value, $data)}
        <a href="{$data[$option.value]|url}">{$option.value}</a>
    {else}
        {$option.value}
    {/if}
    ...
{/foreach}
Futuris
20 августа 2021, 10:29
+1
Внес свою лепту) Спасибо за ваш труд!
Александр
20 августа 2021, 09:57
0
Есть вывод характеристик в карточках товара, нужно чтобы часть этих характеристик в виде ссылок на ресурсы была. Характеристики эти из вкладки «опции товара» minishop2
Вот как то так: disk.yandex.ru/i/pYmShQ_blS7Olw
Характеристики выводятся через msProductOptions tpl:
{foreach $options as $option}
{$option.caption}:

{if $option.value is array}

{$option.value | join: ', '}
{else}
{$option.value}
{/if}


{/foreach}
Александр
20 августа 2021, 09:53
2
0
Нужно всего лишь в getResourcesTag добавить действующие tpl от pdoPage, а именно, достаточно основных. Если чего-то не будет хватать, просто посмотрите $scriptProperties и добавьте по образцу.
&pageNavTpl = `@INLINE <li class="page-item"><a class="page-link" href="[[+href]]">[[+pageNo]]</a></li>`
&pageActiveTpl = `@INLINE <li class="page-item active"><a class="page-link" href="[[+href]]">[[+pageNo]]</a></li>`
Игорь
19 августа 2021, 15:23
0
Спасибо за совет. А куда конкретно это добавлять? В какую строку? С поиском можете помочь разобраться? Куда Вам можно написать?
Сергей Шлоков
19 августа 2021, 14:44
0
Положил в копилку. Спасибо!