Алексей Ерохин

Алексей Ерохин

Был в сети 15 апреля 2025, 15:28
Заказы не принимаю
1 вариант. Делать без процессора через newObject
2 вариант. Сделать политику на основе AdministratorTemplate, включить нужные разрешения — для создания документа new_document, дать доступ анонимам к контексту web c этой политикой, и еще могут понадобиться add_children, new_document_in_root, publish_document
Можно так, можно в скрипт добавить проверку — передавать в адресной строке параметр, если он передан принудительно обновлять кеш.

if(empty($response) || $request['refresh']==1) { 
        /*получаем фото с ВК*/
        $query = file_get_contents('https://api.vk.com/method/photos.get?owner_id=-'.$owner_id.'&album_id='.$album_id.'&rev='.$rev.'&extended='.$extended.'&feed_type='.$feed_type.'&count='.$count);
        $result = json_decode($query, true); // Декодируем полученный json массив
        
        $response = $result['response'];
        $photos= $modx->cacheManager->set('vk_photos',$response, 86400, [xPDO::OPT_CACHE_KEY => 'vk_photos']
    }
Надо будет вызвать страницу с get-параметром refresh=1
Некоторые правки
<?php
// VK API
    $owner_id = $modx->getOption('owner_id', $scriptProperties, '0'); // Группа
    $album_id = $modx->getOption('album_id', $scriptProperties, '0'); // Альбом
    $rev = $modx->getOption('rev', $scriptProperties, '1'); // 1 - новые сверху
    $extended = $modx->getOption('extended', $scriptProperties, '0'); // Расширенные поля
    $feed_type = $modx->getOption('feed_type', $scriptProperties, 'photo'); // photo, photo_tag
    $count = $modx->getOption('count', $scriptProperties, ''); // Количество загружаемых фото
    $class = $modx->getOption('class', $scriptProperties, '');
    $tpl = $modx->getOption('tpl', $scriptProperties, '@INLINE <li><img src="[[+src_bigxx]]"></li>');
    
    $response= $modx->cacheManager->get('vk_photos', [xPDO::OPT_CACHE_KEY => 'vk_photos']);
    if(empty($response)) { 
        /*получаем фото с ВК*/
        $query = file_get_contents('https://api.vk.com/method/photos.get?owner_id=-'.$owner_id.'&album_id='.$album_id.'&rev='.$rev.'&extended='.$extended.'&feed_type='.$feed_type.'&count='.$count);
        $result = json_decode($query, true); // Декодируем полученный json массив
        
        $response = $result['response'];
        $photos= $modx->cacheManager->set('vk_photos',$response, 86400, [xPDO::OPT_CACHE_KEY => 'vk_photos']
    }
    
    $output = '';
    $pdo = $modx->getService('pdoTools');
    
    $modx->setPlaceholder($totalVar, count($response));
    $response = array_slice($response, $offset, $limit, true);
    
    foreach ($response as $res) {    
        $res['class'] = $class;
        $output .= $pdo->getChunk($tpl, $res);
    }
    return $output;
Файл с кешем лежит тут core/cache/vk_photos/
Хотя теперь не должны повторяться, это было из-за ошибки в коде.

Но лучше все-таки писать в кеш, чтобы не запрашивать каждый раз все фото. Кеш сбрасывать плагином на очистку кеша сайта, или передавая определенный параметр на страницу (refresh=1), ну или кеш, например, на сутки делать.

$photos= $modx->cacheManager->get('vk_photos', [xPDO::OPT_CACHE_KEY => 'vk_photos']);
if(empty($photos)) { 
/*получаем фото с ВК*/
$query = file_get_contents('https://api.vk.com/method/photos.get?owner_id=-'.$owner_id.'&album_id='.$album_id.'&rev='.$rev.'&extended='.$extended.'&feed_type='.$feed_type.'&count='.$count);
    $result = json_decode($query, true); // Декодируем полученный json массив
    
    $response = $result['response'];
$photos= $modx->cacheManager->set('vk_photos',$response, 86400, [xPDO::OPT_CACHE_KEY => 'vk_photos']
}
Ошибочку в коде у себя нашел,
$response = array_slice($response,$offset, $limit, true);
А то что фото повторяются — это скорее всего заслуга vk, что он возвращает каждый раз немного другой порядок. Скорее всего стоит 1 раз получить и записать в кеш, при загрузке страницы проверять кеш — если нет, получать снова, иначе брать из кеша.
В системных настройках пропишите collections.renderer_image_path = resourceimages/
Ну или другую настройку создайте в namespace collections и кастомный рендерер еще сделайте, чтобы стандартный остался

В рендерер как вы видите попадает record — эта вся строка из грида, в том числе и id (если вы конечно в настройках коллекции не удалили колонку id)

params.src = MODx.config['collections.renderer_image_path'] + record.id + '/' + data.sourceImg.src;
З.Ы. Не проверял.