UMIhelp

Разработка сайта на UMI.CMS => Настройка системы и модулей => Тема начата: mimo от 26 Апреля 2014, 09:22:55

Название: Пагинация ?p=0
Отправлено: mimo от 26 Апреля 2014, 09:22:55
Здравствуйте уважаемые участники форума!
Вопрос следующий в каталоге стоит пагинация вида /?p=номер страницы
при переходе на первую страницу образуется урл с /?p=0, а это дубль страницы каталога.
Как сделать условие что если страница первая то выводилась страница каталога. Возможно у кого то была подобная проблема.
Пока сделал редирект, но не считаю это правильным.
Спасибо!
Название: Re:Пагинация ?p=0
Отправлено: e.ioffe от 26 Апреля 2014, 12:32:27
Странно. Пагинация генерируется стандартным макросом? Какая версия системы?
Название: Re:Пагинация ?p=0
Отправлено: mimo от 27 Апреля 2014, 21:14:28
вроде стандартным. версия 2.9.1
я так полагаю формируется из файла pagenum.php по пути
/classes/system/utils/pagenum
Название: Re:Пагинация ?p=0
Отправлено: ilyar от 28 Апреля 2014, 12:49:37
Макрос system numpages() (http://dev.docs.umi-cms.ru/spravochnik_makrosov_umicms/virtualnyj_modul_system/system_numpages/) реализован классом umiPagenum выдает вот такую структуру данных:

Код: XML [Выделить]

<udata module="system" method="numpages" generation-time="0.000595">
  <items>
    <item link="?p=0" is-active="1">1</item>
    <item link="?p=1" page-num="1">2</item>
    <item link="?p=2" page-num="2">3</item>
    <item link="?p=3" page-num="3">4</item>
  </items>
  <toend_link page-num="3">?p=3</toend_link>
  <tonext_link page-num="1">?p=1</tonext_link>
</udata>


Поэтому все верно для первой страницы будет дубль ?p=0 от него можно избавиться на уровне шаблонизатора, не знаю как это сделать в TPL,  но в XSLT просто:

Код: XSL [Выделить]

  <xsl:template match="udata[@method='numpages']/items/item">
    <li>
      <xsl:apply-templates select="@is-active"/>
      <a href="{@link}">
        <xsl:value-of select="."/>
      </a>
    </li>
  </xsl:template>

  <xsl:template match="udata[@method='numpages']/items/item[position()=1]">
    <li>
      <xsl:apply-templates select="@is-active"/>
      <a href=".">
        <xsl:value-of select="."/>
      </a>
    </li>
  </xsl:template>


Еще вариант кастомизировать макрос system numpages().
Название: Re:Пагинация ?p=0
Отправлено: e.ioffe от 28 Апреля 2014, 13:19:21
Да, совсем забыл - писал костыль для этих целей.

В custom.php:

public function numpages($total = 0, $per_page = 0, $template = "default", $varName = "p", $max_pages = false) {
    $system = system_buildin_load('system');

    $return = $system->numpages($total, $per_page, $template, $varName, $max_pages);

    if(!is_array($return))
        return $return;

    if($return['void:pages'][0]['attribute:page-num'] === 0) {
        $link = str_replace('p=0', '', $return['void:pages'][0]['attribute:link']);

        if($link === '?' || $link === '')
            $link = '/';

        $return['void:pages'][0]['attribute:link'] = $link;
        $return['items']['nodes:item'][0]['attribute:link'] = $link;
    }

    if(isset($return['toprev_link']) && $return['toprev_link']['attribute:page-num'] === 0) {
        $link = str_replace('p=0', '', $return['toprev_link']['node:value']);

        if($link === '?' || $link === '')
            $link = '/';

        $return['toprev_link']['node:value'] = $link;
    }

    if(isset($return['tobegin_link']) && $return['tobegin_link']['attribute:page-num'] === 0) {
        $link = str_replace('p=0', '', $return['tobegin_link']['node:value']);

        if($link === '?' || $link === '')
            $link = '/';

        $return['tobegin_link']['node:value'] = $link;
    }

    return $return;
}
Название: Re:Пагинация ?p=0
Отправлено: ilyar от 28 Апреля 2014, 14:27:25
Да, совсем забыл - писал костыль для этих целей.

Собираю подобные фиксы в проекте UMI.CMS / patchs (http://team.emom.ru/umicms/patchs/blob/master/README.md), предлагаю присоединится и опубликовать этот кастом в раздел Snippets (http://team.emom.ru/umicms/patchs/snippets), что скажешь?
Название: Re:Пагинация ?p=0
Отправлено: e.ioffe от 28 Апреля 2014, 14:33:26
Собираю подобные фиксы в проекте UMI.CMS / patchs (http://team.emom.ru/umicms/patchs/blob/master/README.md), предлагаю присоединится и опубликовать этот кастом в раздел Snippets (http://team.emom.ru/umicms/patchs/snippets), что скажешь?

Это скорее не патч, а custom, так как полностью зависит от того, что будет отдавать system numpages.

Лучше было бы иметь выход напрямую на разработчиков UMI (не продираясь через Службу заботы), чтобы сообщать о проблемах.
Название: Re:Пагинация ?p=0
Отправлено: ilyar от 28 Апреля 2014, 15:13:49
Это скорее не патч, а custom, так как полностью зависит от того, что будет отдавать system numpages.

Лучше было бы иметь выход напрямую на разработчиков UMI (не продираясь через Службу заботы), чтобы сообщать о проблемах.

В проекте, есть патчи, для системных файлов и есть сниппеты просто для различных решений, все просто без выдумок, для того что бы сконцентрировать решения для повседневных задач разработки на Юми.
Название: Re:Пагинация ?p=0
Отправлено: mimo от 28 Апреля 2014, 16:11:36
Да, совсем забыл - писал костыль для этих целей.

В custom.php:
Спасибо за помощь!

я так понял этот код нужно закинуть в файлик custom.php?
что то у меня не отрабатывает... Что могу делать не так?
Название: Re:Пагинация ?p=0
Отправлено: e.ioffe от 28 Апреля 2014, 16:14:02
Да, совсем забыл - писал костыль для этих целей.

В custom.php:
Спасибо за помощь!

я так понял этот код нужно закинуть в файлик custom.php?
что то у меня не отрабатывает... Что могу делать не так?

В custom. Вместо вызова system/numpages нужно писать custom/numpages
Название: Re:Пагинация ?p=0
Отправлено: e.ioffe от 29 Апреля 2014, 13:23:23
Писал код по памяти, забыл про существенную деталь (параметр $first_page_link в конце). Правильный код и немного рефакторинга:
public function numpages($total = 0, $per_page = 0, $template = "default", $varName = "p", $max_pages = false, $first_page_link = false) {
if(!$first_page_link)
$first_page_link = umiHierarchy::getInstance()->getPathById(cmsController::getInstance()->getCurrentElementId());

$system = system_buildin_load('system');

$return = $system->numpages($total, $per_page, $template, $varName, $max_pages);

if(is_array($return)) {
if($return['void:pages'][0]['attribute:page-num'] === 0) {
$link = $this->prepareNumpagesLink($return['void:pages'][0]['attribute:link'], $first_page_link);

$return['void:pages'][0]['attribute:link'] = $link;
$return['items']['nodes:item'][0]['attribute:link'] = $link;
}

if(isset($return['toprev_link']) && $return['toprev_link']['attribute:page-num'] === 0) {
$link = $this->prepareNumpagesLink($return['toprev_link']['node:value'], $first_page_link);

$return['toprev_link']['node:value'] = $link;
}

if(isset($return['tobegin_link']) && $return['tobegin_link']['attribute:page-num'] === 0) {
$link = $this->prepareNumpagesLink($return['tobegin_link']['node:value'], $first_page_link);

$return['tobegin_link']['node:value'] = $link;
}
} elseif(trim($return) !== '') {
$return = $this->prepareNumpagesLink($return, $first_page_link);
}

return $return;
}

public function prepareNumpagesLink($string, $first_page_link) {
$string = str_replace('?p=0&', '?', $string);
$string = str_replace('?p=0', $first_page_link, $string);
$string = str_replace('p=0', '', $string);

return $string;
}
Название: Re:Пагинация ?p=0
Отправлено: e.ioffe от 10 Мая 2014, 17:02:42
https://www.fl.ru/tu/10609/seo-optimizatsiya-sayta-na-umicms-paginatsiya.html - для тех, у кого не получается решить проблему самостоятельно.