Артур Шевченко

Артур Шевченко

С нами с 24 мая 2019; Место в рейтинге пользователей: #7
Отправить деньги
Артур Шевченко
05 сентября 2022, 21:01
1
0
В общем, я установил UsersOnline и он не работает. Я посмотрел ошибки и завёл его. Вот код сниппета getOnlineUsers.
<?php
    /** @var array $scriptProperties */
    /** @var UsersOnline $UsersOnline */
    if (!$UsersOnline = $modx->getService('usersonline', 'UsersOnline', $modx->getOption('usersonline_core_path', null,
            $modx->getOption('core_path') . 'components/usersonline/') . 'model/usersonline/', $scriptProperties)
    ) {
        return 'Could not load UsersOnline class!';
    }
    if (!$pdo = $modx->getService('pdoTools')) {
        return $modx->lexicon('no_pdo');
    }
    $interval = $modx->getOption('timeInterval', $scriptProperties, -1);
    if ($interval == -1) {
        $interval = $modx->getOption('usersonline_time_span');
    }
    $contexts = $modx->getOption('contexts', $scriptProperties, null);
    
    $innerJoin = array();
    /*$innerJoin = $modx->getOption('innerJoin', $scriptProperties, '');
    $innerJoin = $modx->fromJSON($innerJoin);*/
   
    $innerJoin['UsersOnline'] = array(
        'class' => 'userOnline',
        'on'    => 'modUser.id = UsersOnline.user_id',
    );
    $select = array();
    /*if($select = $modx->getOption('select', $scriptProperties, '')){
         $select = $modx->fromJSON($select);
    }*/    
    $select['UsersOnline'] = '*';
    $time = time();
    $startTime = $time - $interval;
    $where = array();
    /*if($where = $modx->getOption('where', $scriptProperties, '')){
        $where = $modx->fromJSON($where);
    }*/
    
    $where[] = array(
        'UsersOnline.lastvisit:>=' => $startTime,
        'UsersOnline.lastvisit:<=' => $time,
    );
    $contextsArray = array();
    if($contexts != null){
        $contextsArray = explode(',', $contexts);
    }
    if (!empty($contextsArray)) {
        $where[] = array(
            'UsersOnline.context_key:IN' => $contextsArray,
        );
    }
    $scriptProperties['where'] = $modx->toJSON($where);
    $scriptProperties['innerJoin'] = $modx->toJSON($innerJoin);
    $scriptProperties['select'] = $modx->toJSON($select);
    $output = $modx->runSnippet('pdoUsers', $scriptProperties);
    return $output;
Вот вызов.
[[!getOnlineUsers?
    &contexts=`web`
]]
Артур Шевченко
05 сентября 2022, 14:23
0
Очевидно же документация на UsersOnline отсылает к документации на pdoUsers.
Артур Шевченко
04 сентября 2022, 22:45
+1
Есть msAddFields, чтобы плагины не писать.
Артур Шевченко
02 сентября 2022, 21:55
0
Нужно запустить парсер для одной конкретной страницы, причём если ты собираешься делать это в сниппите, запустить парсер нужно будет после того как он уже отработает, т.е. сделать двойную работу. Не кажется ли тебе, что это несколько нерационально? Если не кажется, то тебе нужно найти пример запуска парсера для отдельной страницы где-то на просторах интернета, так как таких кейсов не встречал.
Артур Шевченко
02 сентября 2022, 13:15
+1
Это как минимум логически неверно. Нужен не сниппет, а плагин на cобытие OnWebPagePrerender
Артур Шевченко
02 сентября 2022, 13:12
0
<form action="[[*id]]" method="post" class="ajax_form af_example" enctype="multipart/form-data">
<div class="form-group">
<label for="chetest">Поле checkbox <span class="required">*</span>:</label>
<div class="controls">
<span class="error_chetest">[[!+fi.error.chetest]]</span>
<span><input type="checkbox" name="chetest[]" id="chetest" value="Вариант1" [[!+fi.chetest:FormItIsChecked=`Вариант1`]]>Вариант1</span>
<span><input type="checkbox" name="chetest[]" id="chetest" value="Вариант2" [[!+fi.chetest:FormItIsChecked=`Вариант2`]]>Вариант2</span>
<input type="hidden" name="chetest_control" value="">
</div>
</div>
Вешаешь на chetest обработчик события change, если хотя бы один из чекбоксов выбран в chetest_control записываешь 1, если ни один не выбран 0, после этого делаешь так
$('[name="chetest_control"]').trigger('change');
И валидируешь chetest_control. По-другому чекбоксы валидировать нельзя, т.к. если чекбокс не выбран на сервер ничего не передаётся, я попробовал обойти, но нет до AjaxForm всё равно не доходит сообщение об ошибке и вообще информация о том, что есть какой-то там чекбокс.
Артур Шевченко
02 сентября 2022, 11:48
0
А если не секрет — зачем?
Артур Шевченко
02 сентября 2022, 00:54
0
Скорее всего вот так должно работать:
$(document).on('keypress change', '.error', function () {
            var key = $(this).attr('name'); 
            key = key.replace(/[\[\]]/g, '');
            $(this).removeClass('error');
            $('.error_' + key).html('').removeClass('error');
        });
Артур Шевченко
01 сентября 2022, 10:34
0
Надо бы в другой раздел написать Работа называется. А там желающие оценят.
Артур Шевченко
31 августа 2022, 22:12
+1
Вот кусок кода который скрывает ошибки. Проверьте вёрстку.
Артур Шевченко
31 августа 2022, 20:46
0
Лезть в исходники необязательно, повесь на checkbox и radio обработчик события change и скрывай ошибки.
Артур Шевченко
30 августа 2022, 18:54
0
Или так
$data = new FormData();
$data.append('alias', JSON.stringify(ali));
...
body: $data
А на сервере $alias = json_decode($_POST['alias'],1);
Артур Шевченко
30 августа 2022, 16:27
0
Дополню, одного minishop'а для полноценного перехода на Modx 3 мало, нужно ещё и другие компоненты переводить: калькуляторы доставки, модули оплаты и прочие плюшки. Поэтому если на релиз самого MiniShop3 можно рассчитывать осенью, то что с остальным непонятно. В этой связи идёт работа не только над MiniShop3, но и над улучшением MiniShop2.
Артур Шевченко
30 августа 2022, 12:32
0
А ты проверял есть на сервере $_POST['alias']?
Артур Шевченко
29 августа 2022, 18:50
0
Имей в виду, если обновишь minishop2 все эти изменения слетят.
Артур Шевченко
29 августа 2022, 18:48
0
У меня на андройде долгое нажатие открывает контекстное меню и открыть на редактирование получается, но сохранить изменения не получается, т.к. окно слишком низко и кнопки сохранить просто не видно и прокрутить не получается. Да и вообще на телефоне админка работает ужасно, не представляю как ей можно продуктивно пользоваться. Рекомендую не мучаться и работать с ПК.
Артур Шевченко
29 августа 2022, 18:42
0
Если нужно передать несколько значений из чекбоксов с одинаковым именем, то имя должно быть my_tv[] и на сервере искать $_POST['my_tv'] — это будет массив.
Артур Шевченко
29 августа 2022, 18:38
0
Есть вероятность что дело в типе поля в БД оно просто не вывозит такое количество символов.