Ссылка на предыдущий и следующий товар в интернет-магазине

#
Ссылка на предыдущий и следующий товар в интернет-магазине
Для пятой версии была реализация подобного функционала. Как добиться подобного для шестерки?
#
Re: Ссылка на предыдущий и следующий товар в интернет-магазине
Может кому пригодится.
Добавить в ТДС перед показом:
// Если мы находимся на странице товара
if ($Shop_Controller_Show->item) {
   $oShop_Item = Core_Entity::factory('Shop_Item', $Shop_Controller_Show->item);

   // Текущий элемент
   $cur_elem = $Shop_Controller_Show->item;
   // Текущая группа
   $cur_group = $oShop_Item->shop_group_id;

   // SELECT * FROM shop_items WHERE shop_items.id < $cur_elem ORDER BY shop_items.id DESC LIMIT 1
   $oCore_QueryBuilder_Select = Core_QueryBuilder::select()
      ->select('shop_items.path')
      ->from('shop_items')
      ->open()
         ->where('shop_items.id', '<', $cur_elem)
         ->setAnd()
         ->where('shop_items.shop_group_id', '=', $cur_group)
         ->setAnd()
         ->where('shop_items.deleted', '=', '0')
      ->close()
      ->clearOrderBy()
      ->orderBy('id', 'DESC')
      ->limit(1);

   $prev = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
   $prev = $prev['path'];

   // SELECT * FROM shop_items WHERE shop_items.id > $cur_elem ORDER BY shop_items.id LIMIT 1
   $oCore_QueryBuilder_Select = Core_QueryBuilder::select()
      ->select('shop_items.path')
      ->from('shop_items')
      ->open()
         ->where('shop_items.id', '>', $cur_elem)
         ->setAnd()
         ->where('shop_items.shop_group_id', '=', $cur_group)
         ->setAnd()
         ->where('shop_items.deleted', '=', '0')
      ->close()
      ->clearOrderBy()
      ->orderBy('id')
      ->limit(1);

   $next = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
   $next = $next ['path'];

   $Shop_Controller_Show
      ->addEntity(Core::factory('Core_Xml_Entity')
         ->name('neighboring_items')
            ->addEntity(Core::factory('Core_Xml_Entity')->name('prev_item')->value($prev))
            ->addEntity(Core::factory('Core_Xml_Entity')->name('next_item')->value($next))
      );
}


В XML появится узел:
   <neighboring_items>
      <prev_item>046</prev_item>
      
      <next_item></next_item>
   </neighboring_items>


Сам XSL-шаблон:
      <div class="navigator">
         <xsl:choose>
            <xsl:when test="$prev_item != ''">
               <a href="{$link_path}{$prev_item}/">← Предыдущий товар</a>
            </xsl:when>
            <xsl:otherwise>
               <span class="previous">← Предыдущий товар</span>
            </xsl:otherwise>
         </xsl:choose>
         <xsl:choose>
            <xsl:when test="$next_item != ''">
               <a href="{$link_path}{$next_item}/">Следующий товар →</a>
            </xsl:when>
            <xsl:otherwise>
               <span class="next">Следующий товар →</span>
            </xsl:otherwise>
         </xsl:choose>
      </div>


Замечания, корректировки и предложения приветствуются.
Единственное, что я не понимаю - почему между узлами в XML пропуск строки?
#
Re: Ссылка на предыдущий и следующий товар в интернет-магазине
Делаю для инфосистем но выдает ошибки.
Не подскажите что не так.

// Если мы находимся на странице товара
if ($Informationsystem_Controller_Show->item) {
    $oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', $Informationsystem_Controller_Show->item);

    // Текущий элемент
    $cur_elem = $Informationsystem_Controller_Show->item;
    // Текущая группа
    $cur_group = $oInformationsystem_Item->informationsystem_group_id;

    // SELECT * FROM informationsystem_Items WHERE informationsystem_Items.id < $cur_elem ORDER BY informationsystem_Items.id DESC LIMIT 1
    $oCore_QueryBuilder_Select = Core_QueryBuilder::select()
       ->select('informationsystem_Items.path')
       ->from('informationsystem_Items')
       ->open()
          ->where('informationsystem_Items.id', '<', $cur_elem)
          ->setAnd()
          ->where('informationsystem_Items.informationsystem_group_id', '=', $cur_group)
          ->setAnd()
          ->where('informationsystem_Items.deleted', '=', '0')
       ->close()
       ->clearOrderBy()
       ->orderBy('id', 'DESC')
       ->limit(1);

    $prev = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
    $prev = $prev['path'];

    // SELECT * FROM informationsystem_Items WHERE informationsystem_Items.id > $cur_elem ORDER BY informationsystem_Items.id LIMIT 1
    $oCore_QueryBuilder_Select = Core_QueryBuilder::select()
       ->select('informationsystem_Items.path')
       ->from('informationsystem_Items')
       ->open()
          ->where('informationsystem_Items.id', '>', $cur_elem)
          ->setAnd()
          ->where('informationsystem_Items.informationsystem_group_id', '=', $cur_group)
          ->setAnd()
          ->where('informationsystem_Items.deleted', '=', '0')
       ->close()
       ->clearOrderBy()
       ->orderBy('id')
       ->limit(1);

    $next = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
    $next = $next ['path'];

    $Informationsystem_Controller_Show
       ->addEntity(Core::factory('Core_Xml_Entity')
          ->name('neighboring_items')
             ->addEntity(Core::factory('Core_Xml_Entity')->name('prev_item')->value($prev))
             ->addEntity(Core::factory('Core_Xml_Entity')->name('next_item')->value($next))
       );
}
Модератор
#
Re: Ссылка на предыдущий и следующий товар в интернет-магазине
astroom-design,
тексты ошибок?
#
Re: Re: Ссылка на предыдущий и следующий товар в интернет-магазине
Предупреждение: XSLTProcessor::transformToDoc() [<a href='xsltprocessor.transformtodoc'>xsltprocessor.transformtodoc</a>]: runtime error: file /var/www/2wind/data/www/a2com.host2wind.ru/ line 80 element choose в файле /var/www/2wind/data/www/a2com.host2wind.ru/modules/xsl/processor/xslt.php (строка 53)Предупреждение: XSLTProcessor::transformToDoc() [<a href='xsltprocessor.transformtodoc'>xsltprocessor.transformtodoc</a>]: Variable 'prev_item' has not been declared. в файле /var/www/2wind/data/www/a2com.host2wind.ru/modules/xsl/processor/xslt.php (строка 53)


Exception: Query error 1146: Table 'a2com.informationsystem_Items' doesn't exist. Query: SELECT `informationsystem_Items`.`path` FROM `informationsystem_Items` WHERE ( `informationsystem_Items`.`id` < '313' AND `informationsystem_Items`.`informationsystem_group_id` = '22' AND `informationsystem_Items`.`deleted` = '0' ) ORDER BY `id` DESC LIMIT 1
35 modules/core/exception.php
641 modules/core/database/mysql.php
60 modules/core/querybuilder/statement.php
188 hostcmsfiles/lib/lib_1/lib_1.php
271 modules/lib/model.php
100 modules/core/page.php
161 templates/template21/template.htm
86 modules/template/model.php
100 modules/core/page.php
375 modules/core/command/controller/default.php
190 modules/core/router/route.php
205 index.php
Модератор
#
Re: Ссылка на предыдущий и следующий товар в интернет-магазине
1. У Вас не объявлены переменные prev_item, next_item.
2. Вы неверно заменили, регистр имеет значение, таблица называется informationsystem_items, а не informationsystem_Items
#
Re: Re: Ссылка на предыдущий и следующий товар в интернет-магазине
1. Где нужно объявить переменные?
2. Заменил регистр и выдал одну ошибку Parse error: syntax error, unexpected '<' in /var/www/2wind/data/www/a2com.host2wind.ru/hostcmsfiles/lib/lib_1/lib_1.php on line 164
страница с ошибкой http://a2com.host2wind.ru/services/usn/22/313/
Модератор
#
Re: Ссылка на предыдущий и следующий товар в интернет-магазине
1. в XSL-шаблоне объявить, они получаются из XML.
2. Откройте строку 164 и посмотрите в чем там ошибка, я ваш код даже не вижу, как по такой ошибке можно что-либо советовать?!
#
Re: Ссылка на предыдущий и следующий товар в интернет-магазине
Вот что получилось
В коде страницы ТДС
<?php

$Informationsystem_Controller_Show = Core_Page::instance()->object;

$xslName = $Informationsystem_Controller_Show->item
   ? Core_Array::get(Core_Page::instance()->libParams, 'informationsystemItemXsl')
   : Core_Array::get(Core_Page::instance()->libParams, 'informationsystemXsl');

$Informationsystem_Controller_Show->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('ОтображатьСсылкуНаАрхив')->value(0)
)->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('ОтображатьСсылкиНаСледующиеСтраницы')->value(1)
)->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('ТекущаяГруппа')->value($Informationsystem_Controller_Show->group)
)->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('show_comments')->value(
         intval(Core_Array::get(Core_Page::instance()->libParams, 'showComments', 1))
      )
)->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('show_add_comments')->value(
         intval(Core_Array::get(Core_Page::instance()->libParams, 'showAddComment', 2))
      )
);

$Informationsystem_Controller_Show
   ->tags(TRUE)
   ->comments(TRUE);

if ($Informationsystem_Controller_Show->item == 0)
{
   $Informationsystem_Controller_Show->itemsForbiddenTags(array('text'));
}
else
{
   if (Core_Array::getPost('add_comment') && Core_Array::get(Core_Page::instance()->libParams, 'showAddComment') != 0)
   {
      $Informationsystem_Controller_Show->cache(FALSE);

      $oLastComment = Core_Entity::factory('Comment')->getLastCommentByIp(
         Core_Array::get($_SERVER, 'REMOTE_ADDR')
      );

      $oXmlCommentTag = Core::factory('Core_Xml_Entity')
         ->name('document');

      $siteuser_id = 0;
      if (Core::moduleIsActive('siteuser'))
      {
         $oSiteuser = Core_Entity::factory('Siteuser')->getCurrent();

         if ($oSiteuser)
         {
            $siteuser_id = $oSiteuser->id;
         }
      }

      $oComment = Core_Entity::factory('Comment');

      $allowable_tags = '<b><strong><i><em><br><p><u><strike><ul><ol><li>';
      $oComment->parent_id = intval(Core_Array::getPost('parent_id', 0));
      $oComment->active = Core_Array::get(Core_Page::instance()->libParams, 'addedCommentActive', 1) == 1 ? 1 : 0;
      $oComment->author = Core_Str::stripTags(Core_Array::getPost('author'));
      $oComment->email = Core_Str::stripTags(Core_Array::getPost('email'));
      $oComment->phone = Core_Str::stripTags(Core_Array::getPost('phone'));
      $oComment->grade = intval(Core_Array::getPost('grade', 0));
      $oComment->subject = Core_Str::stripTags(Core_Array::getPost('subject'));
      $oComment->text = nl2br(Core_Str::stripTags(Core_Array::getPost('text'), $allowable_tags));
      $oComment->siteuser_id = $siteuser_id;

      $oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', $Informationsystem_Controller_Show->item);

      $oXmlCommentTag
         ->addEntity($oComment)
         ->addEntity($oInformationsystem_Item);

      if (is_null($oLastComment) || time() > Core_Date::sql2timestamp($oLastComment->datetime) + ADD_COMMENT_DELAY)
      {
         $oInformationsystem = $Informationsystem_Controller_Show->getEntity();

         if ($oInformationsystem->use_captcha == 0 || $siteuser_id > 0 || Core_Captcha::valid(Core_Array::getPost('captcha_id'), Core_Array::getPost('captcha')))
         {
            $oComment->save();

            $oInformationsystem_Item->add($oComment);

            $oXmlCommentTag->addEntity($oInformationsystem);

            // Отправка письма администратору
            $sText = Xsl_Processor::instance()
               ->xml($oXmlCommentTag->getXml())
               ->xsl(Core_Entity::factory('Xsl')->getByName(Core_Array::get(Core_Page::instance()->libParams, 'addCommentAdminMailXsl')))
               ->process();

            $oCore_Mail_Driver = Core_Mail::instance()
               ->to(EMAIL_TO)
               ->from(Core_Valid::email($oComment->email)
                  ? $oComment->email
                  : EMAIL_TO
               )
               ->subject(Core::_('Informationsystem.comment_mail_subject'))
               ->message(trim($sText))
               ->contentType(Core_Array::get(Core_Page::instance()->libParams, 'commentMailNoticeType', 0) == 0
                  ? 'text/plain'
                  : 'text/html'
               )
               ->send();
         }
         else
         {
            $oXmlCommentTag->addEntity(Core::factory('Core_Xml_Entity')
               ->name('error_captcha')->value(1)
            );

            $oComment->text = Core_Str::br2nl($oComment->text);
            $Informationsystem_Controller_Show->addEntity($oComment);
         }
      }
      else
      {
         $oXmlCommentTag->addEntity(Core::factory('Core_Xml_Entity')
            ->name('error_time')->value(1)
         );

         $oComment->text = Core_Str::br2nl($oComment->text);
         $Informationsystem_Controller_Show->addEntity($oComment);
      }

      // Результат добавления комментария
      $xsl_result = Xsl_Processor::instance()
         ->xml($oXmlCommentTag->getXml())
         ->xsl(Core_Entity::factory('Xsl')->getByName(
            Core_Array::get(Core_Page::instance()->libParams, 'addCommentNoticeXsl'))
         )
         ->process();

      $Informationsystem_Controller_Show->addEntity(
         Core::factory('Core_Xml_Entity')
            ->name('message')->value($xsl_result)
      );
   }
}




// В корне выводим из всех групп
if ($Informationsystem_Controller_Show->group == 0)
{
   $Informationsystem_Controller_Show->group(FALSE);
}

$Informationsystem_Controller_Show
   ->xsl(
      Core_Entity::factory('Xsl')->getByName($xslName)
   )
   ->itemsProperties(TRUE)
   ->show();

<?php

$Informationsystem_Controller_Show = Core_Page::instance()->object;

$xslName = $Informationsystem_Controller_Show->item
   ? Core_Array::get(Core_Page::instance()->libParams, 'informationsystemItemXsl')
   : Core_Array::get(Core_Page::instance()->libParams, 'informationsystemXsl');

$Informationsystem_Controller_Show->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('ОтображатьСсылкуНаАрхив')->value(0)
)->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('ОтображатьСсылкиНаСледующиеСтраницы')->value(1)
)->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('ТекущаяГруппа')->value($Informationsystem_Controller_Show->group)
)->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('show_comments')->value(
         intval(Core_Array::get(Core_Page::instance()->libParams, 'showComments', 1))
      )
)->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('show_add_comments')->value(
         intval(Core_Array::get(Core_Page::instance()->libParams, 'showAddComment', 2))
      )
);

$Informationsystem_Controller_Show
   ->tags(TRUE)
   ->comments(TRUE);

if ($Informationsystem_Controller_Show->item == 0)
{
   $Informationsystem_Controller_Show->itemsForbiddenTags(array('text'));
}
else
{
   if (Core_Array::getPost('add_comment') && Core_Array::get(Core_Page::instance()->libParams, 'showAddComment') != 0)
   {
      $Informationsystem_Controller_Show->cache(FALSE);

      $oLastComment = Core_Entity::factory('Comment')->getLastCommentByIp(
         Core_Array::get($_SERVER, 'REMOTE_ADDR')
      );

      $oXmlCommentTag = Core::factory('Core_Xml_Entity')
         ->name('document');

      $siteuser_id = 0;
      if (Core::moduleIsActive('siteuser'))
      {
         $oSiteuser = Core_Entity::factory('Siteuser')->getCurrent();

         if ($oSiteuser)
         {
            $siteuser_id = $oSiteuser->id;
         }
      }

      $oComment = Core_Entity::factory('Comment');

      $allowable_tags = '<b><strong><i><em><br><p><u><strike><ul><ol><li>';
      $oComment->parent_id = intval(Core_Array::getPost('parent_id', 0));
      $oComment->active = Core_Array::get(Core_Page::instance()->libParams, 'addedCommentActive', 1) == 1 ? 1 : 0;
      $oComment->author = Core_Str::stripTags(Core_Array::getPost('author'));
      $oComment->email = Core_Str::stripTags(Core_Array::getPost('email'));
      $oComment->phone = Core_Str::stripTags(Core_Array::getPost('phone'));
      $oComment->grade = intval(Core_Array::getPost('grade', 0));
      $oComment->subject = Core_Str::stripTags(Core_Array::getPost('subject'));
      $oComment->text = nl2br(Core_Str::stripTags(Core_Array::getPost('text'), $allowable_tags));
      $oComment->siteuser_id = $siteuser_id;

      $oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', $Informationsystem_Controller_Show->item);

      $oXmlCommentTag
         ->addEntity($oComment)
         ->addEntity($oInformationsystem_Item);

      if (is_null($oLastComment) || time() > Core_Date::sql2timestamp($oLastComment->datetime) + ADD_COMMENT_DELAY)
      {
         $oInformationsystem = $Informationsystem_Controller_Show->getEntity();

         if ($oInformationsystem->use_captcha == 0 || $siteuser_id > 0 || Core_Captcha::valid(Core_Array::getPost('captcha_id'), Core_Array::getPost('captcha')))
         {
            $oComment->save();

            $oInformationsystem_Item->add($oComment);

            $oXmlCommentTag->addEntity($oInformationsystem);

            // Отправка письма администратору
            $sText = Xsl_Processor::instance()
               ->xml($oXmlCommentTag->getXml())
               ->xsl(Core_Entity::factory('Xsl')->getByName(Core_Array::get(Core_Page::instance()->libParams, 'addCommentAdminMailXsl')))
               ->process();

            $oCore_Mail_Driver = Core_Mail::instance()
               ->to(EMAIL_TO)
               ->from(Core_Valid::email($oComment->email)
                  ? $oComment->email
                  : EMAIL_TO
               )
               ->subject(Core::_('Informationsystem.comment_mail_subject'))
               ->message(trim($sText))
               ->contentType(Core_Array::get(Core_Page::instance()->libParams, 'commentMailNoticeType', 0) == 0
                  ? 'text/plain'
                  : 'text/html'
               )
               ->send();
         }
         else
         {
            $oXmlCommentTag->addEntity(Core::factory('Core_Xml_Entity')
               ->name('error_captcha')->value(1)
            );

            $oComment->text = Core_Str::br2nl($oComment->text);
            $Informationsystem_Controller_Show->addEntity($oComment);
         }
      }
      else
      {
         $oXmlCommentTag->addEntity(Core::factory('Core_Xml_Entity')
            ->name('error_time')->value(1)
         );

         $oComment->text = Core_Str::br2nl($oComment->text);
         $Informationsystem_Controller_Show->addEntity($oComment);
      }

      // Результат добавления комментария
      $xsl_result = Xsl_Processor::instance()
         ->xml($oXmlCommentTag->getXml())
         ->xsl(Core_Entity::factory('Xsl')->getByName(
            Core_Array::get(Core_Page::instance()->libParams, 'addCommentNoticeXsl'))
         )
         ->process();

      $Informationsystem_Controller_Show->addEntity(
         Core::factory('Core_Xml_Entity')
            ->name('message')->value($xsl_result)
      );
   }
}




// В корне выводим из всех групп
if ($Informationsystem_Controller_Show->group == 0)
{
   $Informationsystem_Controller_Show->group(FALSE);
}

$Informationsystem_Controller_Show
   ->xsl(
      Core_Entity::factory('Xsl')->getByName($xslName)
   )
   ->itemsProperties(TRUE)
   ->show();


// Если мы находимся на странице товара
if ($Informationsystem_Controller_Show->item) {
     $oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', $Informationsystem_Controller_Show->item);

     // Текущий элемент
     $cur_elem = $Informationsystem_Controller_Show->item;
     // Текущая группа
     $cur_group = $oInformationsystem_Item->informationsystem_group_id;

     // SELECT * FROM informationsystem_items WHERE informationsystem_items.id < $cur_elem ORDER BY informationsystem_items.id DESC LIMIT 1
     $oCore_QueryBuilder_Select = Core_QueryBuilder::select()
        ->select('informationsystem_items.path')
        ->from('informationsystem_items')
        ->open()
           ->where('informationsystem_items.id', '<', $cur_elem)
           ->setAnd()
           ->where('informationsystem_items.informationsystem_group_id', '=', $cur_group)
           ->setAnd()
           ->where('informationsystem_items.deleted', '=', '0')
        ->close()
        ->clearOrderBy()
        ->orderBy('id', 'DESC')
        ->limit(1);

     $prev = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
     $prev = $prev['path'];

     // SELECT * FROM informationsystem_items WHERE informationsystem_items.id > $cur_elem ORDER BY informationsystem_items.id LIMIT 1
     $oCore_QueryBuilder_Select = Core_QueryBuilder::select()
        ->select('informationsystem_items.path')
        ->from('informationsystem_items')
        ->open()
           ->where('informationsystem_items.id', '>', $cur_elem)
           ->setAnd()
           ->where('informationsystem_items.informationsystem_group_id', '=', $cur_group)
           ->setAnd()
           ->where('informationsystem_items.deleted', '=', '0')
        ->close()
        ->clearOrderBy()
        ->orderBy('id')
        ->limit(1);

     $next = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
     $next = $next ['path'];

     $Informationsystem_Controller_Show
        ->addEntity(Core::factory('Core_Xml_Entity')
           ->name('neighboring_items')
              ->addEntity(Core::factory('Core_Xml_Entity')->name('prev_item')->value($prev))
              ->addEntity(Core::factory('Core_Xml_Entity')->name('next_item')->value($next))
        );
}

И шаблон XSL
        <div class="navigator">
          <xsl:choose>
             <xsl:when test="$prev_item != ''">
                <a href="{$link_path}{$prev_item}/">← Предыдущий товар</a>
             </xsl:when>
             <xsl:otherwise>
                <span class="previous">← Предыдущий товар</span>
             </xsl:otherwise>
          </xsl:choose>
          <xsl:choose>
             <xsl:when test="$next_item != ''">
                <a href="{$link_path}{$next_item}/">Следующий товар →</a>
             </xsl:when>
             <xsl:otherwise>
                <span class="next">Следующий товар →</span>
             </xsl:otherwise>
          </xsl:choose>
       </div>
#
Re: Ссылка на предыдущий и следующий товар в интернет-магазине
Ошибка теперь указывает на строку 79 в XSL в блоке на тег <xsl:choose> выделил жирным
<div class="navigator">
           <xsl:choose>
              <xsl:when test="$prev_item != ''">
                 <a href="{$link_path}{$prev_item}/">← Предыдущий товар</a>
              </xsl:when>
              <xsl:otherwise>
                 <span class="previous">← Предыдущий товар</span>
              </xsl:otherwise>
           </xsl:choose>
           <xsl:choose>
              <xsl:when test="$next_item != ''">
                 <a href="{$link_path}{$next_item}/">Следующий товар →</a>
              </xsl:when>
              <xsl:otherwise>
                 <span class="next">Следующий товар →</span>
              </xsl:otherwise>
           </xsl:choose>
        </div>
Авторизация