Фотографии Вконтакте в 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;
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.