Как доработать скрипт переключателя материалов. Подробно см. описании вопроса.

Голоса: +1
Добрый день!

Установил скрипт переключателя материалов. Он переключает ссылаясь на ID материала и не может "перепрыгнуть" через неактивный ID (удаленного материала). Можно ли сделать в этом коде так, чтобы, если отсутствует следующий номер ID, то перейти на следующий активный ID или как-то по другому, но, чтобы пролистывал через отсутствующий ID?

<a id="b" href="javascript://">Предыдущий материал</a><span id="i"> → </span> <a id="a" href="javascript://">Следующий материал</a></div> <script defer> $('#a').bind('click',function(){ var next="<?substr($ENTRY_URL$,0,strpos($ENTRY_URL$,$ID$))?><?$ID$+1?>" $.ajax({ type: 'GET', url: next, success: function(){location.href=next}, error: function(){$('#i').remove();$('#a').replaceWith(' <span style="background:#AADBAD;padding:3px;font:12px Arial;border: 1px solid #46A546;">Дальше материалов нет.</span>');} });}); $('#b').bind('click',function(){ var prev="<?substr($ENTRY_URL$,0,strpos($ENTRY_URL$,$ID$))?><?$ID$-1?>" $.ajax({ type: 'GET', url: prev, success: function(){location.href=prev}, error: function(){$('#i').remove();$('#b').replaceWith(' <span style="background:#AADBAD;padding:3px;font:12px Arial;border: 1px solid #46A546;">Дальше материалов нет.</span>');} });}); </script>

Спасибо!

С уважением, Иса Балаев.
| Автор: | Категория: JavaScript
Я еще раз подправил код, т.к. нашел там еще одну ошибку. Скопируйте его заново. Теперь точно все работает. На этот раз проверил.
Спасибо! Работает. И предыдущий код тоже работал.

Ответов: 1

Голоса: +1
 
Лучший ответ

Такие вещи надо делать на php. Особенно после релиза нового API сделать это просто. Но вы не первый кому нужен подобный функционал. Поэтому я набросал универсальный скрипт, который подойдет для любого модуля. 

Суть сводится к следующему. Все материалы беруться из sitemap.xml 

Отсюда небольшой минус данного метода - sitemap обновляется примерно раз в неделю, а это значит, что недавно добавленные материалы будут игнорироваться.

Это вставляете в нужный вам модуль, в нужное место шаблона "Страница материалов и комментариев к нему":

<a id="prevPost" class="nextPost" href="javascript://">Предыдущий материал</a>
<a id="nextPost" class="nextPost" href="javascript://">Следующий материал</a>

 Ну а сам скрипт в тот же шаблон перед </body>

<script>
$('.nextPost').on('click', function(e) {
  e.preventDefault();
  var nextId, idLeft, idRight, urlLeft, urlRight
  postId = $ID$,
  module = '$MODULE_ID$',
  nextPost = this.id;
  xml = [], allId = [];
  
  $.ajax ({
    type: "GET",
      url: '/sitemap.xml',
    dataType: "xml",
    success: function(data) {
      $(data).find("loc:contains('/" + module + "/')").each(function (i) {
        xml[i] = $(this).text();
        allId[i] = parseInt(xml[i].split('-').pop());
      });
	  
      for (var i = 0; i < allId.length; i++) {
        nextId = allId[i];
      
        if (nextId < postId && (typeof idLeft === 'undefined' || idLeft < nextId)) {
          idLeft = nextId;
          urlLeft = xml[i];
        } else if (nextId > postId && (typeof idRight === 'undefined' || idRight > nextId)) {
          idRight = nextId;
          urlRight = xml[i];
        };
	  
      };
	
      if (nextPost == 'prevPost' && ( typeof idLeft === 'undefined') ) {
        alert ("Предыдущих материалов нет");
        $('#prevPost').css('display','none');
      } else if (nextPost == 'nextPost' && ( typeof idRight === 'undefined') ) {
        alert ("Далее материалов нет");
        $('#nextPost').css('display','none');
      } else if (nextPost == 'nextPost') {
        location.href = urlRight;
      } else {
        location.href = urlLeft;
      };
	
    },
  
    error: function (XMLHttpRequest, textStatus, errorThrown) {
      alert ('Что-то пошло не так: ' + textStatus)
    }
	
  });
  
});
</script>

 

| Автор:
Редактирование | | Автор: Александр Леонов
Спасибо, Александр!
Этот sitemap обновляется автоматически, без моего участия?
А этот код я могу установить в прямо в шаблоне, без php?

Спасибо еще раз!
Установил я его... Но, при нажатии не "след. материал", в адресной строке в конце прописывается undefined и говорит, что такой страницы нет . Почему так происходит?
Да (на оба вопроса)
Александр, а почему в адресной строке в конце прописывается undefined (при нажатии на след.материал)?
Напишите подробней. В какой шаблон вставили, поменяли ли url на свой адрес. И напишите адрес своего сайта. Посмотрим
Скорее всего вы не правильно прописали url адрес. Я подредактировал код. Убрал оттуда переменную url. Чтобы не было путаницы. Скопируйте его и вставьте. И адрес сайта напишите чтоб не гадать на кофейной гуще.
Теперь работает! Огромное Вам спасибо! Как же Вас отблагодарить, Александр?
Скрипт работает, но все же есть пару косяков, проверяем карту все последние материалы уже там, по идее должно далее переключаться, но выбирает один материал как бы рандомно не пойму.  Вот вам пример материал - тык видим, что переключение идет не за порядком, а непонятным способом, вперед материалов нет, а назад, находит один и тот же.  Вроде вижу в чем причина, он назад мотает до последнего материала с ID, а далее идут материалы с уникальным урл от сео модуля и он их обходит стороной. Может есть идеи как и для уник урл сделать?
Скрипт полностью рабочий, но дело в том, что он работает только по ID материала со стандартными ссылками (без сео-модуля). Если ссылка не стандартная, то он ее просто пропускает. Сделать так чтобы он брал ссылки из sitemap по порядку не сложно. Но конкретно в вашем случае не знаю за что зацепиться. Вот, например, есть у вас такая ссылка в sitemap тык  Как узнать что она ведет конкретно на материал из блога, а не в новости, например? Тут можно сделать только с помощью API. Даже базовое подойдет. В нем есть возможность получить все материалы из категории.
...