Фотографии Вконтакте в MODx Revo
        Сниппет, который позволяет вывести фотографии из альбома любой группы или же человека. Сниппет использует pdoTools. 
Использование параметров и документация:
Код сниппета:
В чанке tpl_vkPhoto, можно использовать все переменные, которые генерирует API Вконтакте. к примеру,
[[+src_big]], [[+text]] и другие.
P.S. Аналогов не увидел, может есть и более лаконичные решения, но меня устроило такое.
     
    
    
                                                                                
            https://vk.com/pages?oid=-1&p=photos.getСниппет: getVKphotoКод сниппета:
$oid = $modx->getOption('oid',$scriptProperties,'0');//группа или учетка
$aid = $modx->getOption('aid',$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
$photo_sizes = $modx->getOption('photo_sizes',$scriptProperties,'0');//1 - позволяет получать все размеры фотографий.
$limit=$modx->getOption('limit',$scriptProperties,'10'); //количество загружаемых фото
$class = $modx->getOption('class',$scriptProperties,'');
$tpl = $modx->getOption('tpl',$scriptProperties,'@INLINE <li>[[+src_big]]</li>');
$cacheOptions = array(
    xPDO::OPT_CACHE_KEY => 'myCache',
    xPDO::OPT_CACHE_HANDLER => 'cache.xPDOAPCCache'
);
$json=$modx->cacheManager->get('getvkphoto'.$aid, $cacheOptions);
if (!isset($json))
{
$url = 'https://api.vk.com/method/photos.get?oid='.$oid.'&aid='.$aid.'&rev='.$rev.'&extended='.$extended.'&feed_type='.$feed_type.'&limit='.$limit.'&photo_sizes='.$photo_sizes;
$json = file_get_contents($url);
$modx->cacheManager->set('getvkphoto'.$aid, $json, 3600, $cacheOptions);
}
$data = json_decode($json, true);
$response = $data['response'];
$output = '';
$pdo = $modx->getService('pdoTools');
foreach ($response as $res) {
    $res['class'] = $class;
    $output .= $pdo->getChunk($tpl, $res);
}
return $output;Вызов сниппета:[[getVKphoto? 
&oid=`-20629724` 
&aid=`173443310` 
&rev=`1` 
&extended=`0` 
&feed_type=`photo` 
&photo_sizes=`0`
&limit=`15`
&tpl=`tpl_vkPhoto`
]]в tpl можно использовать @CODE, @INLINE (спасибо pdoTools)В чанке tpl_vkPhoto, можно использовать все переменные, которые генерирует API Вконтакте. к примеру,
[[+src_big]], [[+text]] и другие.
P.S. Аналогов не увидел, может есть и более лаконичные решения, но меня устроило такое.
Комментарии: 27
                Интересно)            
                    
                Стоит результаты полученные от вконтакте кешировать на пару часов:
                    $currJson = $modx->cacheManager->set( 'vkontaktephotos', $json, 3600 );            
                Спасибо, поправил!            
                    
                Вообще cache manager->get возвращает false, если ничего не закешировано, либо время жизни кончилось. Т. Е. Твоё условие срабатывает всегда же :)
github.com/modxcms/revolution/blob/d63cc1735422a9c5c51b18a9f21d26bd1f6c390b/core/xpdo/cache/xpdocachemanager.class.php#L728
Вообще не думаю что стоит неопределительный настройки хэндлера. Если у кого то нет apc? Работать же не будет. Пс 3600 не равно двум часам. Моя ошибка.
                    github.com/modxcms/revolution/blob/d63cc1735422a9c5c51b18a9f21d26bd1f6c390b/core/xpdo/cache/xpdocachemanager.class.php#L728
Вообще не думаю что стоит неопределительный настройки хэндлера. Если у кого то нет apc? Работать же не будет. Пс 3600 не равно двум часам. Моя ошибка.
                Вообще скорость работы замерь. Я подозреваю, что ты просто не замечаешь, что с запросом ко вконтакте у тебя время работы этого небольшого сниппета под секунду — полторы может быть. Плюс, если вконтакте тебе ничего не отдаст, то на месте вывода будет пустое место.            
                    
                Будет пусто, да. Следовательно настройки указаны не верно. Если выполнить все условия — то фотографии отобразятся. По поводу времени на загрузку страниц — целью не было загружать файлы к себе в ресурсы. 
Цель — гарантированный показ фотографий из альбомов. Я думаю сервера Вконтакте чаще всего работают быстрее, чем некоторые хостинги. Время загрузки 20 фото — добавляет 0,4 секунды. Если бы можно было кэшировать и изображения, было бы замечательно :-)
                    Цель — гарантированный показ фотографий из альбомов. Я думаю сервера Вконтакте чаще всего работают быстрее, чем некоторые хостинги. Время загрузки 20 фото — добавляет 0,4 секунды. Если бы можно было кэшировать и изображения, было бы замечательно :-)
                Кто может подсказать, как расширить возможности сниппета для импорта фотографий из закрытых групп?            
                    
                Боюсь, что никак. Уровень доступа должен быть +4 (Доступ к фотографиям).            
                    
                Как лечит эту проблему?
                    PHP warning: Invalid argument supplied for foreach()
<b>foreach ($response as $res) {</b>            
                $response не является массивом. В контексте плагина, похоже, фотографии не получены.            
                    
                Та же самая проблема.
api.vk.com/method/photos.get?oid=9776487&aid=229820379
Пишет: Доступ запрещен
api.vk.com/method/photos.get?gid=9776487&aid=229820379
То всё работает.
                    PHP warning: Invalid argument supplied for foreach()И да решил проверить ссылку:api.vk.com/method/photos.get?oid=9776487&aid=229820379
Пишет: Доступ запрещен
{"error":{"error_code":200,"error_msg":"Access denied","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"photos.get"},{"key":"oid","value":"9776487"},{"key":"aid","value":"229820379"}]}}Но если так:api.vk.com/method/photos.get?gid=9776487&aid=229820379
То всё работает.
{"response":[{"pid":408318922,"aid":229820379,"owner_id":-9776487,"user_id":35703515,"src":"http:\/\/cs633517.vk.me\/v633517515\/2249d\/eFYrHtgoiBk.jpg","src_big":"http:\/\/cs633517.vk.me\/v633517515\/2249e\/vDbqyvWGNAk.jpg","src_small":"http:\/\/cs633517.vk.me\/v633517515\/2249c\/BzpmqHqmNNk.jpg","src_xbig":"http:\/\/cs633517.vk.me\/v633517515\/2249f\/4JZdQLNi_E4.jpg","src_xxbig":"http:\/\/cs633517.vk.me\/v633517515\/224a0\/p8_quHFZbJs.jpg","width":1280,"height":616,"text":"","created":1459717471},......................            
                В условиях написано vk.com/dev/photos.get, что идентификатор сообщества в параметре owner_id необходимо указывать со знаком "-".
&oid=`-20629724` меняем на gid. убираем "-" и вуаля.
Со временам появляется вышеупомянутая ошибка (PHP warning: Invalid argument supplied for foreach()) при кешировании, чистим (core/cache).
Ну и для закрытых групп, облом.
                    &oid=`-20629724` меняем на gid. убираем "-" и вуаля.
Со временам появляется вышеупомянутая ошибка (PHP warning: Invalid argument supplied for foreach()) при кешировании, чистим (core/cache).
Ну и для закрытых групп, облом.
                Спасибо за сниппет! Огромный респект.
Столкнулся с проблемой. Упорно игноррит лимит, всегда выводит 15 штук. Пытаюсь разобраться почему, но не понимаю пока что.
                    Столкнулся с проблемой. Упорно игноррит лимит, всегда выводит 15 штук. Пытаюсь разобраться почему, но не понимаю пока что.
                Попробуйте изменить в сниппете название передаваемого параметра с &limit на &count
                    $url = 'https://api.vk.com/method/photos.get?oid='.$oid.'&aid='.$aid.'&rev='.$rev.'&extended='.$extended.'&feed_type='.$feed_type.'&count='.$limit.'&photo_sizes='.$photo_sizes;            
                Спасибо, но что-то внезапно всё стало unknown вместо URL фоток, даже со старым кодом, в итоге на выходе ничего. Зато count сработал :)            
                    
                Ребята, что этот снипет безбожно тупит? Перестал выводить фотки по коду, который тут представлен.            
                    Ребята, что этот снипет безбожно тупит?А почему нет то, хочет — тупит, не хочет — не тупит :)
По сабжу, надо смотреть лог ошибок, проверить api, может вконтакт что то изменил. Исходя из анализа уже доработать то что необходимо.
                Почистил кеш на сайте. Он помер.            
                    
                Что означает — скрипт не может заново получить данные. Смотрим логи, правим ошибки :)            
                    
                Где его логи посмотреть?            
                    
                Верхнее меню в админке — Управление -> Отчёты -> Журнал ошибок, путь — /core/cache/logs/error.log. Ну и серверные логи посмотреть заодно.            
                    
                Не нашёл связанного            
                    
                А вот выскочила это:
[2018-01-21 20:22:37] (ERROR @ /home/o/oooakg/kulibin.club/public_html/core/xpdo/cache/xpdoapccache.class.php: 36) xPDOAPCCache[myCache]: Error creating APC cache provider; xPDOAPCCache requires the APC extension for PHP, version 2.0.0 or later.
            
                    [2018-01-21 20:22:37] (ERROR @ /home/o/oooakg/kulibin.club/public_html/core/xpdo/cache/xpdoapccache.class.php: 36) xPDOAPCCache[myCache]: Error creating APC cache provider; xPDOAPCCache requires the APC extension for PHP, version 2.0.0 or later.
                Так отрабатывает
prntscr.com/i3jopj
                    prntscr.com/i3jopj
                Сделал таким образом.
Чтобы все отображались $limit я так понял должен быть -1. Если 0, то ничего не будет.
А как ваше кеширование работает я не понял. Подставил код, ничего не отображается. Кеш чистил, ничего. Если можете, то доделайте и поясните.
uid группы не нужно писать с минусом.
                    <?php
    //VK API - photos.get
    $uid = $modx->getOption('uid',$scriptProperties, '0'); // Группа
    $gid = $modx->getOption('gid',$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
    $limit = $modx->getOption('limit',$scriptProperties, '-1'); // Количество загружаемых фото
    $class = $modx->getOption('class',$scriptProperties, '');
    $tpl = $modx->getOption('tpl', $scriptProperties, '@INLINE <li>[[+src_big]]</li>');
    
    $query = file_get_contents('https://api.vk.com/method/photos.get?owner_id=-'.$uid.'&album_id='.$gid.'&rev='.$rev.'&extended='.$extended.'&feed_type='.$feed_type.'&limit='.$limit.'&photo_sizes=0');
    $result = json_decode($query, true);
    
    $response = $result['response'];
    $output = '';
    $pdo = $modx->getService('pdoTools');
    
    foreach ($response as $res) {    
        $res['class'] = $class;
        $output .= $pdo->getChunk($tpl, $res);
    }
    return $output;Если писать $photo_sizes = 1, тогда ничего не отображает. Если 0, тогда доступны src_xxbig в том числе. Не понял почему.Чтобы все отображались $limit я так понял должен быть -1. Если 0, то ничего не будет.
А как ваше кеширование работает я не понял. Подставил код, ничего не отображается. Кеш чистил, ничего. Если можете, то доделайте и поясните.
uid группы не нужно писать с минусом.
                это вариант на заработал, немного исправила, вроде все норм:
                    <?php
//VK API - photos.get
    $uid = $modx->getOption('uid',$scriptProperties, '0'); // Группа
    $gid = $modx->getOption('gid',$scriptProperties, '0'); // Альбом
    $rev = $modx->getOption('rev',$scriptProperties, '1'); // 1 новые сверху
    $extended = $modx->getOption('extended',$scriptProperties, '1'); // Расширенные поля
    $feed_type = $modx->getOption('feed_type',$scriptProperties, 'photo'); // photo, photo_tag
    $limit = $modx->getOption('count',$scriptProperties, '10'); // Количество загружаемых фото
    $class = $modx->getOption('class',$scriptProperties, '');
    $tpl = $modx->getOption('tpl', $scriptProperties, '@INLINE [[+src_big]]');
    
    $query = file_get_contents('https://api.vk.com/method/photos.get?owner_id=-'.$uid.'&album_id='.$gid.'&rev='.$rev.'&extended='.$extended.'&feed_type='.$feed_type.'&count='.$limit.'&photo_sizes=0');
    $result = json_decode($query, true);
    
    $response = $result['response'];
    $output = '';
    $pdo = $modx->getService('pdoTools');
    
    foreach ($response as $res) {    
        $res['class'] = $class;
        $output .= $pdo->getChunk($tpl, $res);
    }
    return $output;&uid без "-"            
                По аналогии пытаюсь вывести список сообщений из темы, но что-то не срабатывает, может сможете помочь:
                    <?php
//VK API - board.getComments
    $group_id = $modx->getOption('group_id',$scriptProperties, '0'); // идентификатор сообщества
    $topic_id = $modx->getOption('topic_id',$scriptProperties, '0'); // идентификатор обсуждения
    $count = $modx->getOption('count',$scriptProperties, '20'); // количество сообщений, которое необходимо получить (но не более 100). По умолчанию — 20. 
    $extended = $modx->getOption('extended',$scriptProperties, '1'); // Если указать в качестве этого параметра 1, то будет возвращена информация о пользователях, являющихся авторами сообщений. По умолчанию 0. 
    $class = $modx->getOption('class',$scriptProperties,'');
    $tpl = $modx->getOption('tpl', $scriptProperties, '@INLINE [[+text]]');
    
    $query = file_get_contents('https://api.vk.com/method/board.getComments?group_id='.$group_id.'&topic_id='.$topic_id.'&count='.$count.'&extended='.$extended.'&sort=desc');
    $result = json_decode($query, true);
    $response = $result['response'];
    $output = '';
    $pdo = $modx->getService('pdoTools');
    
    foreach ($response as $res) {    
        $res['class'] = $class;
        $output .= $pdo->getChunk($tpl, $res);
    }
    return $output;            
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.