Нужна пагинация кастомного сниппета
Ребята, нужна пагинация сниппета, чтобы с pdoPage работало. Помогите.
<?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>');
$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'];
$output = '';
$pdo = $modx->getService('pdoTools');
foreach ($response as $res) {
$res['class'] = $class;
$output .= $pdo->getChunk($tpl, $res);
}
return $output;
Комментарии: 31
Перед foreach
$modx->setPlaceholder($totalVar,count($response));
$response = array_slice($response,$offset, ($limit+$offset), true);
Если нужен idx в чанках:foreach ($response as $key=>$res) {
$res['class'] = $class;
$res['idx'] = $key+1;
$output .= $pdo->getChunk($tpl, $res);
}
Спасибо за участие решения проблемы.
[[!pdoPage?
Страницы некоторые отображают те же фотки.
Можете посмотреть сами.
[[!pdoPage?
&element=`GetVkAlbumPhoto`
&owner_id=`[[*album_group_id]]`
&album_id=`[[*album_id]]`
&rev=`1`
&tpl=`VkPicTpl`
&limit=`5`
&pageLimit=`10`
&pageNavVar=`album_photo_page.nav`
&tplPage=`@INLINE <li class="waves-effect"><a href="[[+href]]">[[+pageNo]]</a></li>`
&tplPageWrapper=`@INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div>`
&tplPageActive=`@INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li>`
&tplPagePrev=`@INLINE <li class="waves-effect control"><a href="[[+href]]"><i class="material-icons">chevron_left</i></a></li>`
&tplPageNext=`@INLINE <li class="waves-effect control"><a href="[[+href]]"><i class="material-icons">chevron_right</i></a></li>`
&tplPageFirstEmpty=`@INLINE <li class="waves-effect control"><a href="[[+href]]">Первая</a></li>`
&tplPageLastEmpty=`@INLINE <li class="waves-effect control"><a href="[[+href]]">Последняя</a></li>`
&tplPagePrevEmpty=`@INLINE <div style="display: inline; padding-left: 15px"></div>`
&tplPageNextEmpty=`@INLINE <div style="display: inline; padding-left: 15px"></div>`
]]
Вызвал. Страниц очень много. На деле 66 фото.Страницы некоторые отображают те же фотки.
Можете посмотреть сами.
Версия pdoTools? Может были какие-то изменения в этих переменных (limit, page, offset)
И код сниппета полный еще раз (с изменениями)
И код сниппета полный еще раз (с изменениями)
А еще что возвращает vk скиньте (json)
Ошибочку в коде у себя нашел,
$response = array_slice($response,$offset, $limit, true);
А то что фото повторяются — это скорее всего заслуга vk, что он возвращает каждый раз немного другой порядок. Скорее всего стоит 1 раз получить и записать в кеш, при загрузке страницы проверять кеш — если нет, получать снова, иначе брать из кеша.
ОООО!!! Теперь огонь!
Большое спасибо за решение проблемы! Я просто сам практически ничего не понимаю в этом. Стихия другая, но делать нужно. Я вот код автора переделал, т.к. почти не работал. А за пагинацию спасибо.
Большое спасибо за решение проблемы! Я просто сам практически ничего не понимаю в этом. Стихия другая, но делать нужно. Я вот код автора переделал, т.к. почти не работал. А за пагинацию спасибо.
Хотя теперь не должны повторяться, это было из-за ошибки в коде.
Но лучше все-таки писать в кеш, чтобы не запрашивать каждый раз все фото. Кеш сбрасывать плагином на очистку кеша сайта, или передавая определенный параметр на страницу (refresh=1), ну или кеш, например, на сутки делать.
Но лучше все-таки писать в кеш, чтобы не запрашивать каждый раз все фото. Кеш сбрасывать плагином на очистку кеша сайта, или передавая определенный параметр на страницу (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']
}
Упал код. Страница не загрузилась.
<?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>');
$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']
}
$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;
Некоторые правки
<?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/
HTTP ERROR 500
$response = $result['response'];
$photos= $modx->cacheManager->set('vk_photos',$response, 86400, [xPDO::OPT_CACHE_KEY => 'vk_photos']);
Видимо криво скопировал, не хватало закрывающей скобки и точки с запятой.
Спасибо. Только можно ответ? Если я щас сброшу кеш через админку, то он почиститься? И перекешируется через день?
Через админку он не почистится. Через сутки при запросе он сгенерируется снова.
А если есть необходимость, а через админку нельзя?
То нужно лезть в core/cache/vk_photos/ и чистить?
То нужно лезть в core/cache/vk_photos/ и чистить?
Можно так, можно в скрипт добавить проверку — передавать в адресной строке параметр, если он передан принудительно обновлять кеш.
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
Слушайте, а я ведь щас понял, что кеш таким образом не верный для меня. У меня ресурс несколько документов с разными альбомами. А получилось, что везде один. Закешировал один.
$response= $modx->cacheManager->get('vk_photos_'.$modx->resource->id, [xPDO::OPT_CACHE_KEY => 'vk_photos']);
$photos= $modx->cacheManager->set('vk_photos_'.$modx->resource->id, $response, 86400, [xPDO::OPT_CACHE_KEY => 'vk_photos']);
Замените эти строчки
Отлично. Спасибо.
Я ещё делал сниппет для получения обложки альбома.
$owner_id = $modx->getOption('owner_id', $scriptProperties, '0'); // Группа
$album_id = $modx->getOption('album_id', $scriptProperties, '0'); // Альбом
$class = $modx->getOption('class', $scriptProperties, '');
$query = file_get_contents('https://api.vk.com/method/photos.getAlbums?owner_id=-'.$owner_id.'&album_ids='.$album_id.'&need_covers=1&photo_sizes=1');
$result = json_decode($query, true);
$response = $result['response'];
$pdo = $modx->getService('pdoTools');
foreach($response[0]['sizes'] as $pic){
if($pic['width'] == 604)
$preview = $pic['src'];
}
return $preview;
Проверьте, правильно ли я делаю кеширование, спасибо:$owner_id = $modx->getOption('owner_id', $scriptProperties, '0'); // Группа
$album_id = $modx->getOption('album_id', $scriptProperties, '0'); // Альбом
$class = $modx->getOption('class', $scriptProperties, '');
$response = $modx->cacheManager->get('vk_album_prev_'.$modx->resource->id, [xPDO::OPT_CACHE_KEY => 'vk_album_prev']);
if(empty($response)) {
/* Получаем превью альбома с ВК */
$query = file_get_contents('https://api.vk.com/method/photos.getAlbums?owner_id=-'.$owner_id.'&album_ids='.$album_id.'&need_covers=1&photo_sizes=1');
$result = json_decode($query, true); // Декодируем полученный json массив
$response = $result['response'];
$alb_preview= $modx->cacheManager->set('vk_photos_'.$modx->resource->id, $response, 3600, [xPDO::OPT_CACHE_KEY => 'vk_album_prev']);
}
$pdo = $modx->getService('pdoTools');
$modx->setPlaceholder($totalVar, count($response));
$response = array_slice($response, $offset, $limit, true);
foreach($response[0]['sizes'] as $pic){
if($pic['width'] == 604)
$preview = $pic['src'];
}
return $preview;
Тут ошибка
$alb_preview= $modx->cacheManager->set('vk_photos_'.$modx->resource->id, $response, 3600, [xPDO::OPT_CACHE_KEY => 'vk_album_prev']);
Вы пишите кеш и получаете его из разных файлов$response = $modx->cacheManager->get('vk_album_prev_'.$modx->resource->id, [xPDO::OPT_CACHE_KEY => 'vk_album_prev']);
Нужно привести к одному виду.
Да не заметил…
Кстати, можно вместо '' писать null? $output = null;
$output = '';
<?php
//VK API
$owner_id = $modx->getOption('owner_id', $scriptProperties, '0'); // Группа
$album_id = $modx->getOption('album_id', $scriptProperties, '0'); // Альбом
$class = $modx->getOption('class', $scriptProperties, '');
$response = $modx->cacheManager->get('vk_album_prev_'.$modx->resource->id, [xPDO::OPT_CACHE_KEY => 'vk_album_prev']);
if(empty($response)) {
/* Получаем превью альбома с ВК */
$query = file_get_contents('https://api.vk.com/method/photos.getAlbums?owner_id=-'.$owner_id.'&album_ids='.$album_id.'&need_covers=1&photo_sizes=1');
$result = json_decode($query, true); // Декодируем полученный json массив
$response = $result['response'];
$alb_preview= $modx->cacheManager->set('vk_album_prev_'.$modx->resource->id, $response, 3600, [xPDO::OPT_CACHE_KEY => 'vk_album_prev']);
}
$pdo = $modx->getService('pdoTools');
$modx->setPlaceholder($totalVar, count($response));
$response = array_slice($response, $offset, $limit, true);
foreach($response[0]['sizes'] as $pic){
if($pic['width'] == 604)
$preview = $pic['src'];
}
return $preview;
Что-то я не верно сделал. Терь у разных альбомов одна превью.Кстати, можно вместо '' писать null? $output = null;
$output = '';
У меня получается так, что превьюшка для всех альбомов одинаковая… А исправить не понимаю как…
Это зависит от того, где сниппет вызывается, скорее всего просто $modx->resource->id одинаков. Замените на $album_id
А ну да, я же вызываю альбомы все и там прошу картинки.
Ну я поменял, но всё-равно одна превьюшка на всё.
Ну я поменял, но всё-равно одна превьюшка на всё.
<?php
//VK API
$owner_id = $modx->getOption('owner_id', $scriptProperties, '0'); // Группа
$album_id = $modx->getOption('album_id', $scriptProperties, '0'); // Альбом
$response = $modx->cacheManager->get('vk_photos_preview_'.$modx->resource->$album_id, [xPDO::OPT_CACHE_KEY => 'vk_photos_preview']);
if(empty($response) || $request['refresh'] == 1) {
// Получаем превью альбома с ВК
$query = file_get_contents('https://api.vk.com/method/photos.getAlbums?owner_id=-'.$owner_id.'&album_ids='.$album_id.'&need_covers=1&photo_sizes=1');
$result = json_decode($query, true); // Декодируем полученный json массив
$response = $result['response'];
$alb_preview= $modx->cacheManager->set('vk_photos_preview_'.$modx->resource->$album_id, $response, 3600, [xPDO::OPT_CACHE_KEY => 'vk_photos_preview']);
}
foreach($response[0]['sizes'] as $pic){
if($pic['width'] == 604)
$preview = $pic['src'];
}
return $preview;
$modx->resource->$album_id
на $modx->resource->id.$album_id
Работает, спасибо!
Окажите пожалуйста консультацию modx.pro/help/14706/
Если я правильно понял, сделал так
drive.google.com/open?id=1N8OiAMYFpUFjJXHP64w5vi3NYMm3SaJI
$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 массив
var_dump($result);
Результатdrive.google.com/open?id=1N8OiAMYFpUFjJXHP64w5vi3NYMm3SaJI
<?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>');
$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'];
$output = '';
$pdo = $modx->getService('pdoTools');
$modx->setPlaceholder($totalVar, count($response));
$response = array_slice($response, $offset, ($limit + $offset), true);
foreach ($response as $res) {
$res['class'] = $class;
$output .= $pdo->getChunk($tpl, $res);
}
return $output;
Версия pdo последняя 2.10.4-pl.
Ребята, привет. Заметил, что полетел сниппет и тот, который берёт обложку альбома. Код на последний момент был такой. Сниппет ругался на
Notice
: Undefined index: response in
/home/o/oooakg/kulibin.club/public_html/core/cache/includes/elements/modsnippet/86.include.cache.php
on line
22
Notice
: Undefined variable: output in
/home/o/oooakg/kulibin.club/public_html/core/cache/includes/elements/modsnippet/86.include.cache.php
on line
35
А это $result = json_decode($query, true); // Декодируем полученный json массив и return $output; строка
Потом посмотрел через echo, что в $query и $result. В Пусто $result, а в $query ошибка запроса. Array выводит. В чём проблема? VK что-то типо изменила?
{«error»:{«error_code»:5,«error_msg»:«User authorization failed: no access_token passed.»,«request_params»:[{«key»:«oauth»,«value»:«1»},{«key»:«method»,«value»:«photos.get»},{«key»:«owner_id»,«value»:"-114376384"},{«key»:«album_id»,«value»:«250351367»},{«key»:«rev»,«value»:«1»},{«key»:«extended»,«value»:«0»},{«key»:«feed_type»,«value»:«photo»},{«key»:«count»,«value»:""},{«key»:«v»,«value»:«5.73»}]}}
Notice
: Undefined index: response in
/home/o/oooakg/kulibin.club/public_html/core/cache/includes/elements/modsnippet/86.include.cache.php
on line
22
Notice
: Undefined variable: output in
/home/o/oooakg/kulibin.club/public_html/core/cache/includes/elements/modsnippet/86.include.cache.php
on line
35
А это $result = json_decode($query, true); // Декодируем полученный json массив и return $output; строка
Потом посмотрел через echo, что в $query и $result. В Пусто $result, а в $query ошибка запроса. Array выводит. В чём проблема? VK что-то типо изменила?
{«error»:{«error_code»:5,«error_msg»:«User authorization failed: no access_token passed.»,«request_params»:[{«key»:«oauth»,«value»:«1»},{«key»:«method»,«value»:«photos.get»},{«key»:«owner_id»,«value»:"-114376384"},{«key»:«album_id»,«value»:«250351367»},{«key»:«rev»,«value»:«1»},{«key»:«extended»,«value»:«0»},{«key»:«feed_type»,«value»:«photo»},{«key»:«count»,«value»:""},{«key»:«v»,«value»:«5.73»}]}}
<?php
// VK API
//ini_set('error_reporting', E_ALL);
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
$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_'.$modx->resource->id, [xPDO::OPT_CACHE_KEY => 'vk_photos']);
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.'&v=5.73');
$result = json_decode($query, true); // Декодируем полученный json массив
$response = $result['response']['items'];
$photos= $modx->cacheManager->set('vk_photos_'.$modx->resource->id, $response, 86400, [xPDO::OPT_CACHE_KEY => 'vk_photos']);
}
$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;
Я тут прочитал, что с 14 мая правила в API поменяли и токен нужно вводить.
Теперь $query такого вида
$query = file_get_contents('https://api.vk.com/method/photos.get?&access_token='.$access_token.'&owner_id=-'.$owner_id.'&album_id='.$album_id.'&rev='.$rev.'&extended='.$extended.'&feed_type='.$feed_type.'&count='.$count.'&v=5.73');
и вначале переменная
// vk.com/apps?act=manage МОИ приложения — Настройки — Сервисный ключ доступа
$access_token = 'тут токе';
Теперь $query такого вида
$query = file_get_contents('https://api.vk.com/method/photos.get?&access_token='.$access_token.'&owner_id=-'.$owner_id.'&album_id='.$album_id.'&rev='.$rev.'&extended='.$extended.'&feed_type='.$feed_type.'&count='.$count.'&v=5.73');
и вначале переменная
// vk.com/apps?act=manage МОИ приложения — Настройки — Сервисный ключ доступа
$access_token = 'тут токе';
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.