Илья Уткин

Илья Уткин

С нами с 15 декабря 2012; Место в рейтинге пользователей: #9
Илья Уткин
03 июля 2016, 13:12
3
+2
Возможно, вот такой вариант сможет и из Console обработать любое количество ресурсов:
<?php
$field = $modx->getOption('videogallery_field_image');

// Сколько ресурсов обрабатывать за раз
$step = 1;
// Если процесс уже остановлен, сбрасываем OFFSET
if (!isset($_SESSION['Console']['completed'])) {
    $_SESSION['console_offset'] = 0;
}
$offset = isset($_SESSION['console_offset']) && $_SESSION['console_offset'] ? $_SESSION['console_offset'] : 0;

$q = $modx->newQuery('modResource');
$q->innerJoin('modTemplateVarResource', 'modTemplateVarResource', 'modTemplateVarResource.contentid = modResource.id');
$q->innerJoin('modTemplateVar', 'modTemplateVar', 'modTemplateVar.id = modTemplateVarResource.tmplvarid');
$q->select(array(
    'modResource.id as resource_id',
    'modTemplateVar.id as tv_id',
    'modTemplateVar.name as tv_name',
    'modTemplateVarResource.value as tv_value',
    'modTemplateVarResource.id as id',
));
$q->where(array(
    'modTemplateVar.type' => 'videoGallery',
));

// Подсчитываем общее количество
$total = $modx->getCount('modResource', $q);

// Пропускаем все уже обработанные объекты
$q->limit($step, $offset);

$q->prepare();
$q->stmt->execute();
$rows = $q->stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($rows as $row) {
    // print_r($row);
    $data = $modx->fromJSON($row['tv_value']);
    if (is_array($data) && isset($data['video'])) {
        $old['fileurl'] = $data['image'];
        $old['filepath'] = str_replace(MODX_ASSETS_URL, MODX_ASSETS_PATH, $old['fileurl']);
        
        $resp = $modx->runProcessor('gallery/handle', array(
            'resource' => $row['resource_id'],
            'tv' => $row['tv_id'],
            'video' => $data['video'],
        ), array('processors_path' => MODX_CORE_PATH . 'components/videogallery/processors/mgr/'));
        
        $resp = $resp->response;
        // print_r($resp['object']['image'].PHP_EOL);
        
        if ($resp['success']) {
            if ($resource = $modx->getObject('modResource', array('id' => $row['resource_id']))) {
                $resource->setTVValue($row['tv_name'], $resp['object']['json']);
                $resource->save();
                
                // Если в настройках указано поле для хранения изображений - сохраним в него новый путь до картинки
                if ($field) {
                    if (stristr($field, 'tv.')) {
                        $resource->setTVValue(str_replace('tv.', '', $field), $resp['object']['image']);
                    } else {
                        $resource->set($field, $resp['object']['image']);
                    }
                    $resource->save();
                }
                
                // Удалим старое изображение
                if (file_exists($old['filepath']) && $old['fileurl'] != $resp['object']['image']) {
                    @unlink($old['filepath']);
                }
            }
        }
    }
}

// Меняем offset
$_SESSION['console_offset'] = $offset + $step;
if ($_SESSION['console_offset'] >= $total) {
  $sucsess = 100;
  $_SESSION['Console']['completed'] = true;
  unset($_SESSION['console_offset']);
} else {
  $sucsess = round($_SESSION['console_offset'] / $total, 2) * 100;
  $_SESSION['Console']['completed'] = false;
}
for ($i=0; $i<=100; $i++) {
    if ($i <= $sucsess) {
        print '=';
    } else {
        print '_';
    }
}
print "\n";
print $sucsess.'% ('.$_SESSION['console_offset'].')'."\n\n";
Илья Уткин
03 июля 2016, 11:38
0
Да, совершенно верно. Просто указывается
"inputTV":"img"
Илья Уткин
01 июля 2016, 17:29
0
Но на самом деле — вопрос актуальный — иногда хочется у ресурса сделать несколько галерей. Теги, конечно, спасают, но не сильно)
Илья Уткин
01 июля 2016, 17:22
+2
Я обычно ставлю FastUploadTV для всех ТВ, где нужна загрузка картинок. Его же и использую в MIGX.

Илья Уткин
01 июля 2016, 15:26
+3
Отправил автору пулл-реквест с этой фишкой. Надуюсь, одобрит и включит в пакет…
Илья Уткин
01 июля 2016, 10:57
0
А, пардон, оказывается, можно)))
Илья Уткин
01 июля 2016, 10:46
0
Еще бы возможность в любое место вставить ссылку на редактирование конкретного чанка… Я, например, как разработчик, в сайдбар вставляю чанк с каким-то текстом, а рядом ссылку «Редактировать». Тогда клиенту не надо будет объяснять, что такое чанк, как его найти и прочее…
Илья Уткин
26 июня 2016, 17:56
+1
[[+resource]] не выводит?
Илья Уткин
23 июня 2016, 16:31
0
Тут задействовано 3 объекта


Чтобы написать такой сниппет, нужно знать хотя бы основы xPDO
Илья Уткин
21 июня 2016, 10:22
+1
Да, уже убрана… странно… тогда не знаю)
Илья Уткин
20 июня 2016, 21:10
+1
Да чего там щупать? На видео всё видно. Надо брать!
Илья Уткин
20 июня 2016, 20:48
0
А как он, по-вашему, должен вывести заголовки нескольких ресурсов в одном месте? Один поверх другого?

Надо самостоятельно — в сниппете — разбить значение ТВ на кусочки и каждый кусочек использовать для получения заголовка.

Как-то так:

<?php // [[*author:getTitles]]
$output = array(); $input = explode('||', $input);
foreach ($input as $id) {
  if ($res = $modx->getObject('modResource', $id)) {
    $output[] = $res->pagetitle;
  }
}
return implode(', ',$output);
Илья Уткин
20 июня 2016, 20:38
+3
Супер! Кайф, правда…
Илья Уткин
20 июня 2016, 13:21
+1
Чтобы выполнялся процессор, надо сначала авторизоваться, чтобы куки соответствовали пользователю с соответствующими правами. Думаю, будет проще просто расширить этот процессор, убрав проверку прав. Ну или использовать какой-нибудь компонент для импорта.
Илья Уткин
20 июня 2016, 13:19
+1
А, ну и форма поиска, перед списком
<form method="get">
  <input name="user" value="[[#GET.user]]" placeholder="Имя пользователя">
  <input type="submit">
</form>
Илья Уткин
20 июня 2016, 13:18
+1
[[#GET.user:eq=``:then=``:else=`{"username:LIKE":"%[[#GET.user]]%"}`:toPlaceholder=`where`]]
[[!pdoUsers?
    &groups=`Users`
    &users=``
    &tpl=`tpl.Users.rating`
    &leftJoin=`{"Comment": {"class":"TicketComment","alias":"Comment", "on": "modUser.id = Comment.createdby AND Comment.parent = 0"}, "Vote": {"class":"TicketVote","alias":"Vote", "on": "modUser.id = Vote.owner AND Vote.value = 1"}}`
    &select=`{"Comment": "COUNT(DISTINCT Comment.id) as comments", "Vote": "COUNT(DISTINCT Vote.id) as votes"}`
    &sortby=`{"votes":"DESC", "comments":"DESC"}`
    &sortdir=`DESC`
    &where=`[[!+where]]`
]]
Илья Уткин
20 июня 2016, 10:38
0
Напишите в техподдержку — так вслепую сложно помочь
Илья Уткин
17 июня 2016, 16:09
0
А вот в инструкции от Сбербанка написано
Для подключения к системе магазин предоставляет:
1. HTML-страницу, с графикой и CSS и прочими подключаемыми объектами, которая показывает платежную форму. Требования к этой странице описаны в отдельном документе «Оформление платежной страницы».

Я думаю, надо обратиться в техподдержку сберабанка. Насколько я помню, они там предоставляют такую страницу, на которой можно вставить свой логотип, например. После чего оформленную страницу надо передать обратно специалистам сбербанка.
Илья Уткин
16 июня 2016, 16:04
+1
Нужно именно переключение контекста. Вот мой вариант такого плагина: Плагин для переключения контекстов при отсутствии нужного URL в текущем контексте