Фотографии Вконтакте в MODx Revo

Сниппет, который позволяет вывести фотографии из альбома любой группы или же человека. Сниппет использует pdoTools.
Использование параметров и документация:
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. Аналогов не увидел, может есть и более лаконичные решения, но меня устроило такое.
Виктор
31 марта 2016, 07:54
modx.pro
27
5 387
+15

Комментарии: 27

Александр Москвин
31 марта 2016, 12:24
0
Интересно)
    Григорий Коленько
    31 марта 2016, 18:10
    0
    Стоит результаты полученные от вконтакте кешировать на пару часов:
    $currJson = $modx->cacheManager->set( 'vkontaktephotos', $json, 3600 );
      Виктор
      31 марта 2016, 18:59
      0
      Спасибо, поправил!
        Григорий Коленько
        31 марта 2016, 23:37
        0
        Вообще cache manager->get возвращает false, если ничего не закешировано, либо время жизни кончилось. Т. Е. Твоё условие срабатывает всегда же :)
        github.com/modxcms/revolution/blob/d63cc1735422a9c5c51b18a9f21d26bd1f6c390b/core/xpdo/cache/xpdocachemanager.class.php#L728
        Вообще не думаю что стоит неопределительный настройки хэндлера. Если у кого то нет apc? Работать же не будет. Пс 3600 не равно двум часам. Моя ошибка.
          Григорий Коленько
          31 марта 2016, 23:55
          0
          Вообще скорость работы замерь. Я подозреваю, что ты просто не замечаешь, что с запросом ко вконтакте у тебя время работы этого небольшого сниппета под секунду — полторы может быть. Плюс, если вконтакте тебе ничего не отдаст, то на месте вывода будет пустое место.
            Виктор
            01 апреля 2016, 04:33
            0
            Будет пусто, да. Следовательно настройки указаны не верно. Если выполнить все условия — то фотографии отобразятся. По поводу времени на загрузку страниц — целью не было загружать файлы к себе в ресурсы.
            Цель — гарантированный показ фотографий из альбомов. Я думаю сервера Вконтакте чаще всего работают быстрее, чем некоторые хостинги. Время загрузки 20 фото — добавляет 0,4 секунды. Если бы можно было кэшировать и изображения, было бы замечательно :-)
        Артём
        19 апреля 2016, 20:17
        0
        Кто может подсказать, как расширить возможности сниппета для импорта фотографий из закрытых групп?
          Виктор
          20 апреля 2016, 07:49
          0
          Боюсь, что никак. Уровень доступа должен быть +4 (Доступ к фотографиям).
          TITAN-UZ
          30 апреля 2016, 02:20
          0
          Как лечит эту проблему?
          PHP warning: Invalid argument supplied for foreach()
          <b>foreach ($response as $res) {</b>
            Воеводский Михаил
            30 апреля 2016, 02:37
            0
            $response не является массивом. В контексте плагина, похоже, фотографии не получены.
              Сергей
              24 июня 2016, 00:41
              0
              Та же самая проблема.
              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},......................
              sensoria
              11 января 2017, 14:56
              0
              В условиях написано vk.com/dev/photos.get, что идентификатор сообщества в параметре owner_id необходимо указывать со знаком "-".
              &oid=`-20629724` меняем на gid. убираем "-" и вуаля.
              Со временам появляется вышеупомянутая ошибка (PHP warning: Invalid argument supplied for foreach()) при кешировании, чистим (core/cache).
              Ну и для закрытых групп, облом.
                koozoo
                16 октября 2017, 02:47
                0
                Спасибо за сниппет! Огромный респект.

                Столкнулся с проблемой. Упорно игноррит лимит, всегда выводит 15 штук. Пытаюсь разобраться почему, но не понимаю пока что.
                  Николай Каленников
                  16 октября 2017, 04:18
                  0
                  Попробуйте изменить в сниппете название передаваемого параметра с &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;
                    koozoo
                    16 октября 2017, 20:02
                    0
                    Спасибо, но что-то внезапно всё стало unknown вместо URL фоток, даже со старым кодом, в итоге на выходе ничего. Зато count сработал :)
                    Дмитрий
                    16 января 2018, 19:04
                    0
                    Ребята, что этот снипет безбожно тупит? Перестал выводить фотки по коду, который тут представлен.
                      Андрей
                      16 января 2018, 19:48
                      0
                      Ребята, что этот снипет безбожно тупит?
                      А почему нет то, хочет — тупит, не хочет — не тупит :)

                      По сабжу, надо смотреть лог ошибок, проверить api, может вконтакт что то изменил. Исходя из анализа уже доработать то что необходимо.
                        Дмитрий
                        17 января 2018, 10:18
                        0
                        Почистил кеш на сайте. Он помер.
                          Андрей
                          17 января 2018, 13:00
                          0
                          Что означает — скрипт не может заново получить данные. Смотрим логи, правим ошибки :)
                            Дмитрий
                            21 января 2018, 20:02
                            0
                            Где его логи посмотреть?
                              Андрей
                              21 января 2018, 20:11
                              0
                              Верхнее меню в админке — Управление -> Отчёты -> Журнал ошибок, путь — /core/cache/logs/error.log. Ну и серверные логи посмотреть заодно.
                                Дмитрий
                                21 января 2018, 20:21
                                0
                                Не нашёл связанного
                                  Дмитрий
                                  21 января 2018, 20:23
                                  0
                                  А вот выскочила это:
                                  [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.
                      Дмитрий
                      26 января 2018, 14:47
                      0
                      Сделал таким образом.
                      <?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 группы не нужно писать с минусом.
                        Оксана
                        07 февраля 2018, 21:45
                        0
                        это вариант на заработал, немного исправила, вроде все норм:
                        <?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 без "-"
                        Оксана
                        07 февраля 2018, 21:47
                        0
                        По аналогии пытаюсь вывести список сообщений из темы, но что-то не срабатывает, может сможете помочь:
                        <?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;
                          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                          27