Вопросы

Получить и посчитать все заполненные поля из MIGX

Прошу помощи в решении задачи: есть готовый сниппет, который считает заполненные TV-поля и затем выводит их в указанное кол-во столбцов. Необходимо переделать его под работу с MIGX.

<?php
//передаваемые в сниппет параметры
//id - id ресурса с которого берем нужные поля
//tvInput - id полей для проверки, через запятую
//cols_count - количество выводимых колонок
//tpl - шаблон вывода
$id = $id;
$tvInput = explode(',',$tvs);
$cols_count = $cols;
$tpl = $tpl;

if (!isset($tvInput)) { return false; } // Если не указаны TV, прекращаем выполнение кода
if (!isset($id)) { $id = $modx->resource->get('id'); } // По-умолчанию текущий ресурс
if (!isset($cols_count)) { $cols_count = 2; } // Количество колонок по-умолчанию
if (!isset($tpl)) { $tpl = 'object_params'; } // Шаблон по-умолчанию

$criteria = $modx->newQuery('modTemplateVarResource', [
              'contentid' => $id,
              'tmplvarid:IN' => $tvInput,
              'value:!=' => ''
            ]);
$docs = $modx->getCollection('modTemplateVarResource', $criteria);

//выводим по колонкам
//default_elems_at_col - количество элементов в колонке
$output = '';
$count = count($docs);
$default_elems_at_col = floor($count / $cols_count);
$continue_default = false;

/* 
  как работает:
  например: 52 элемента на 5 колонок
  $default_elems_at_col - количество элементов в колонке по умолчанию floor(52 / 5) = 10
  остается 2 элемента (52 - 50), которые необходимо распределить по колонкам, т.е.
  $real_default_elems_at_col = 11 (для первых двух колонок)
  $continue_default - переменная, чтобы прекратить лишние вычисления на итерациях, когда лишних элементов не осталось
*/
$output .= '<div class="params params_cols-' . $cols_count . '">';
for ($i = 0; $i < $cols_count; $i++) {
  if (!$continue_default) {
    $real_default_elems_at_col = $default_elems_at_col + 1;
    if ( ($real_default_elems_at_col * ($i + 1) + ($cols_count - $i - 1) * $default_elems_at_col) > $count ) {
      $real_default_elems_at_col = $default_elems_at_col;
      $continue_default = true;
    }
  } 

  $output .= '<div class="params__column">';
  for ($j = 0; $j < $real_default_elems_at_col; $j++) {
    $current_doc = current($docs)->toArray();
    $tvId = $current_doc["tmplvarid"];
    $value = $current_doc["value"];
    
    $output .= $modx->getChunk($tpl, [
                'tvId' => $tvId,
                'value' => $value
               ]);

    //если следующего элемента нет - выходим из цикла
    if (!next($docs)) {
      break;
    }
  }
  $output .= '</div>';
}
$output .= '</div>';
return $output;
Т.е. вместо

$criteria = $modx->newQuery('modTemplateVarResource', [
              'contentid' => $id,
              'tmplvarid:IN' => $tvInput,
              'value:!=' => ''
            ]);
$docs = $modx->getCollection('modTemplateVarResource', $criteria);
нужно получить и посчитать непустые поля MIGX, думаю в этом направлении:
$criteria = $modx->runSnippet('getImageList',array(
'tvname'=> $tvInput, 
'tpl'=>'@CODE: [[+name]]==[[+value]]',
'outputSeparator'=>'||',
'docid' => $id
));
а вместо
$tvId = $current_doc["tmplvarid"];
$value = $current_doc["value"];

$output .= $modx->getChunk($tpl, [
            'tvId' => $tvId,
            'value' => $value
           ]);


должно быть что-то вроде
$tvName = $current_doc["name"];
$value = $current_doc["value"];

$output .= $modx->getChunk($tpl, [
            'tvName' => $tvName,
            'value' => $value
           ]);
Спасибо.
Евгений
04 марта 2019, 13:09
modx.pro
1 613
0

Дополнительные поля + mfilter2

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

[[!mFilter2?
&element=`msProducts`
&class=`msProduct`
&tplOuter=`mFilter2.outer.custom`
&tpls=`doElement`
&includeContent=`1`
&includeTVs=`do-phone,do-mail`
&filters=`resource|parent:categories`
&tplFilter.outer.resource|parent=`tpl.mFilter2.filter.select`
&tplFilter.row.resource|parent=`tpl.mFilter2.filter.option`
]]
в doElement.tpl

....
<div class="col-md-12 do-btn">
Телефон: [[+tv.do-phone]]
E-mail:  [[+tv.do-mail]]
<a class="price-buy-now5"><span class="uencin_ponug">[[msProductOptions?product=`[[+id]]`&onlyOptions=`do-phone`]] [[msProductOptions?product=`[[+id]]`&onlyOptions=`do-mail`]]</span><span class="nolva_kepin" style="cursor:pointer;">Показать контакты</span></a>
</div>
...
Поля эти нужны только для отображения, не для фильтрации, но отображаться они не хотят (((

И еще 1 момент, решил поменять заглушки стандартные минишоповские MS2 которые для картинок, просто залил в папку со стандартными, свои картинки, после чего заглушки вообще не отображаются. Пути не менял, кеш чистил, отображаться так же ни в какую не хочет
Александр
03 марта 2019, 23:40
modx.pro
1 516
0

Вызов pdoPage, лимит показа айтемов

Есть сайт www.pivden.media/
При нажатии кнопки «Больше новостей» выплывают еще айтемы новостей, но остается белое пространство, а если увеличивать отображение айтемов, то и на главной странице они увеличиваются (без нажатии кнопки) и так же остается белое пространство. Как сделать так чтобы отображение айтемов на главной странице было одно количество, а при нажатии кнопки другое?

&parents=`15`
&ajaxMode=`button`
&limit=`10`
&tpl=`postsTpl`
&ajaxTplMore=`pagination`
&sortdir=`DESC`
&processTVs=`1`
&includeTVs=`PostImage, HitsPage`
&includeTVList=`PostImage, HitsPage`
]]

Вот вызов кнопки. Изначально лимит 10. То есть отображается 10 новостей и при нажатии кнопки всплывает еще 10 новостей. Нужно увеличить количество только при нажатии кнопки, как это сделать? Буду благодарна за помощь!

Ольга
03 марта 2019, 21:32
modx.pro
1 246
0

Условие вызова pdoMenu

Добрый день
Подскажите а как правильно создать условие?
{'!pdoMenu' | snippet : [
    {if 'limit' > 5 && 'hereClass'}
        'parents' => '7',
        'level' => '1',
        'offset' => '1',
        'limit' => '5',
        'hereClass' => 'active',
        'tplOuter' => '@INLINE <ul class="topMenu_items_prod">{$wrapper}</ul>',
        'tpl' => '@INLINE <li><a {$classes} href="{$link}">{$menutitle}</a></li>'
    {else}
        'parents' => '7',
        'level' => '1',
        'limit' => '5',
        'hereClass' => 'active',
        'tplOuter' => '@INLINE <ul class="topMenu_items_prod">{$wrapper}</ul>',
        'tpl' => '@INLINE <li><a {$classes} href="{$link}">{$menutitle}</a></li>'
    {/if}
]}
Сергей
02 марта 2019, 22:11
modx.pro
1 921
0

Нужно, чтобы зарегистрированный пользователь мог менять свой статус

Вот вроде простая идея, но не могу понять, с какой стороны подступиться.
Нужно, чтобы у зарегистрированного пользователя была возможность менять свой статус: «Занят» или «Свободен».
Ну и чтобы можно было выводить на сайте статус пользователей.
Сложно ли такое сделать на Modx? Дайте, пожалуйста, направление, куда копать.
kadykoff
02 марта 2019, 20:16
modx.pro
806
0

Сортировка товаров в категории minishop в бекенде

Хочу переопределить поле и порядок сортировки для товаров в категории minishop, подскажите пожалуйста, как это сделать?
Через кастомный класс? Плагин? Куда хоть копать… ничего не нагугливается (все больше про фронтенд), документация молчит. Спасибо.
Антон Тарасов
02 марта 2019, 12:22
modx.pro
1 448
0

Ошибка pdotools при обработке документов с типом "статический ресурс"

Имеется:
pdotools 2.12.1-pl
Включен pdoParser

Документ с типом ресурса «Статический ресурс» и содержимым: assets/image/xxxxxx.png
Шаблон документа: _blank (пустой)
Для данного ресурса MODX сгенерировал alias: xxxxxx, соответствующий url — xxxxxx.html

При заходе на страницу xxxxxx.html генерируется ошибка
[2019-03-02 12:04:11] (ERROR @ /home/public_html/core/components/pdotools/model/pdotools/pdotools.class.php : 989) Unexpected token '?' in expression in 57711373d6560f14ce2720fe95a67f92 line 3, near '{?' <- there

Понятно, что это не совсем стандартная ситуация (по хорошему, сам MODX не должен плодить страницы с такими урлами...).

Если переключиться на родной парсер MODX ошибок нет.

Как решить?
Bert
02 марта 2019, 12:11
modx.pro
1 949
0

Как зайти в админку программно через API?

Всем привет. У меня довольно не стандартная задача. Мне нужно с сайта A отправить логин и пароль от админки сайта B в отдельном скрипте и при совпадении логина и пароля открывать скрытые данные, которые может получить только пользователь с админскими правами.

Вопрос. Можно ли это провернуть через API MODX и как лучше хранить данные для входа, в кукисах или сессии?
SEQUEL.ONE
02 марта 2019, 00:22
modx.pro
1
1 695
0

Как выполнить ресолвер только при обновлении с 3 на 4 версию компонента?

Добрый день! В моем компоненте планируются большие правки базы и нужно при обновлении на новую версию компонента внести изменения в базу (скопировать данные из одной таблицы в другую), но нужно выполнить это только 1 раз, при обновлении с 3 на 4 версию, не выполнять при новой установке и не выполнять при деинсталляции и установки заново. Как это сделать? Или может можно как нибудь в ресолвере получить номер обновляемой( предыдущей) версии и номер устанавливаемой?
Александр Туниеков
01 марта 2019, 19:45
modx.pro
1
1 071
0

Цели Яндекс и Fenom

Добрый день!

Никак не могу вставить цели в ссылки на сайте с Fenom.
Подскажите, как это правильно сделать?

Ссылки в вызове:
{'!pdoPage' | snippet : [    
    'tpl' => '@INLINE <div class="media">
          <div class="media-body">
            <h4 class="media-heading">{$pagetitle}</h4>
            <p class="text-muted"><span class="glyphicon glyphicon-calendar"></span> {$publishedon | date_format : "%d.%m.%Y г."}</p>
            {$content}    
<p class=" article_decoration_last article_decoration_before">
       
        
 <a href="{$introtext}" target="_blank" rel="noopener noreferrer" onclick="ym(**********,'reachGoal','mainpage{$id}');">
        Читать подробности>>
  </a>
        
        
        </p>
          </div>
        </div>',    
    'limit' => 15,
   'sortby' => 'publishedon',
   'sortdir' => 'DESC', 
  ]}
  </div>
  {$_modx->getPlaceholder('page.nav')}
тег {ignore} не помог
adminixi
01 марта 2019, 09:09
modx.pro
3
1 363
+2