Выборка "других" ресурсов с вычетом текущих (Ajax)

Задача: требуется вывести что-то типо «Другое в блоге».
На странице используется pdoPage с Ajax навигацией. Каким образом можно получать список id ресурсов, которые выведены на текущей странице?
Каким образом можно просто решить задачу?

Мысль есть повесить обработку на
$(document).on('pdopage_load', function(e, config, response) {
    console.log(e, config, response);
});
После загрузки получать ID из атрибутов блоков, и делать ajax запрос на обновление данные в блоке «Другое»

Но вопрос с первой загрузкой страницы остается актуальным(
Пробовал перед вызовом pdoPage использовать
{set $_articlesIds = []}
, а в чанках непосредственно вызывать
{set $_articlesIds[] = $id}
, но
{$_articlesIds|join:","}
все равно выдает пустоту(

{set $_articlesIds = []}
{set $articles = $_modx->runSnippet('!pdoPage', [
    'parents' => $_modx->resource.id,
    'showLog' => 0,
    'element' => 'pdoResources',
    'limit' => 4,
    'where' => ['published' => 1],
    'ajax' => 1,
    'includeContent' => 1,
    'includeTVs' => 'tags',
    'ajaxMode' => 'default',
    'sortby' => '{"createdon":"DESC"}',
    'tpl' => 'blog_article.item',
])}
lexikon
19 августа 2016, 12:00
modx.pro
2
1 660
0

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

lexikon
20 августа 2016, 12:41
0
Реализовать подгрузку ajax и обновление удалось. Остался вопрос как получить массив ID ресурсов которые отображаются на первой странице. Делать дополнительный запрос нет желания( Есть у кого какие мысли?

PS
Вот сниппет для подгрузки ресурсов.
<?php
if (empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}

if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    $modx->resource->set('cacheable', 0);
    $modx->resource->set('template', 0); 
    header('Content-Type: application/json');

    $response = array('status' => false);
    
    if (empty($_POST['action'])) {
        $response['message'] = 'Action requeired';
    } else {
        switch ($_POST['action']) {
        	case 'getAriclesWithout':
        	    $ids = $_POST['ids'];
        	    $resources = array();
        	    if(is_array($ids)){
        	        foreach($ids as $value) {
        	            $resources[] = '-'.(int)$value;
        	        }
        	    } else {
        	        $response['message'] = 'IDs not given';
        	        break;
        	    }

        		$result = $modx->runSnippet('pdoResources', array(
        		    'resources' => implode($resources,","),
        		    'tpl' => 'sidebar_articles.item',
        		    'limit' => 2,
        		    'where' => array('published' => 1, 'isfolder' => 0),
        		    'includeTVs' => 'image,image2',
        		    'sortby' => 'RAND()'
    		    ));
    		    if($result)
        		    $response = array('status' => true, 'output' => $result, 'resourcesValue' => implode($resources,","));
    		    else
    		        $response = array('status' => true, 'output' => '');
        		break;
        }
    }
    
    die(json_encode($response));

}
Вот клиентский код.
$(document).on('pdopage_load', function(e, config, response) {
			console.log(e, config, response);
			var wrapper = $('<div/>');
			var output = $(response.output);
			wrapper.append(output);
			var ids = [];
			if(output.length > 0) {
				wrapper.find('div.blog-feed__item').each(function() {
					ids.push($(this).data('id'))
				})
			}

			$.ajax({
				url: window.location.pathname,
				type: 'post',
				data: {action: 'getAriclesWithout', ids: ids},
				success: function(data) {
					console.log(data);
					if(data.status == true) {
						var others = $('#others');
						others.html('');
						others.append(data.output);
					}
				}
			});
		});
    lexikon
    20 августа 2016, 13:05
    0
    Василий, прошу помощи. В документации по Fenom явно указано:
    Если массив $arr еще не существует, он будет создан. Таким образом, это еще один способ определить массив. Однако такой способ применять не рекомендуется, так как если переменная $arr уже содержит некоторое значение (например, строку), то это значение останется на месте и [] может на самом деле означать доступ к символу в строке. Лучше инициализировать переменную путем явного присваивания значения.
    относительно данного кода:
    {set $arr.key = value}
    {set $arr[] = value} {* будет взят максимальный целочисленый ключ, увеличенный на 1 *}
    Я пытаюсь использовать такой же метод с pdoPage, внутри чанков использую код для отладки:
    {set $_articlesIds[] = $id}
        {$_articlesIds|length}
    и вижу что мой массив каждый раз создается новый(
    Кирилл Киселев
    20 августа 2016, 13:26
    0
    Что ты будешь делать, после того, как получишь список ID ресурсов?
      lexikon
      20 августа 2016, 13:30
      0
      я сделаю из них строку типо "-12,-10,-8" и подставлю в сниппет в параметр &resources, чтобы исключить их из выборки.
      Их нужно исключить из выборки в блоке «Другое в блоге»… то есть имеем страницу блога, открывается первая страница с 5 записями, на этой же странице имеется блок «Другое в блоге», туда должны вывестись именно другие записи из блога.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4