Вход • Регистрация

Последние просмотренные товары

  • 03 июня 2013 г.
  • Подскажите, схему как организовать хранениение списка последних просмотренных товаров, ну и потом вывода его в блоке, ну это наверное уже не сложно.

    А вообще, было бы полезно и познавательно в документации в разделе практических примеров привести скелет примера, как сделать сохранение последних XX , просмотренных пользователем товаров, с возможностью настройки этого количества XX через личный кабинет, а также
    выводом блока "последние просмотренные товары "
  • 04 июня 2013 г.
  • Все ж просто))
    Делаем таблицу, при вызове функции _id пишем в нее нужные данные.
    затем создаем шаблонный тег, где эти данные выводим.

    В документации собственно все это есть, надо только немножко подумать.
  • 04 июня 2013 г. , редакция: 04 июня 2013 г.
  • Да не, можно без таблицы, можно сессией обойтись, думаю.
    Давайте учиться думать алгоритм.

    Первый шаг: когда пользователь открывает товар, он ему должен запомниться.
    Т.е. идем в /modules/shop/shop.model.php, находим там
    Код
    public function id() //генерирует данные для отображения карточки товара


    id товара у нас это $this->diafan->show

    Второй шаг: где-нибудь в этой функции собачим код:
    Код
    if ( ! isset($_SESSION['shop_history']))
    {
    $_SESSION['shop_history'] = array();
    }

    if ( ! in_array($this->diafan->show, $_SESSION['shop_history']))
    {
    $_SESSION['shop_history'][] = $this->diafan->show;
    }


    Третий шаг: останется только создать шаблонный тег, типа insert name=show_lastview_goods
    где сделать проверку
    Код
    if ( ! empty($_SESSION['shop_history']))
    { ... }

    затем перебор массива $_SESSION['shop_history']
    и в цикле запросики в БД, выдергивая по готовым id наши товары.

    Четвертый шаг: вывод товаров в нужном оформлении.
    • 05 июня 2013 г.
    • Виталий! Если бы был приз за самого полезного участника форума - Вы были бы на первом месте!
      Спасибо! Вы изложили как раз все так как мне надо, кратко и не влезая в детали, которые уже можно посмотреть из документации. Постараюсь в ближайшие дни реализовать.
      • 06 июня 2013 г.
      • Хех. Конечно. Виталий разработчик. Эту кухню всяко лучше знает чем мы. Он знает что будет в следующей версии. Раньше ещё очень здорово Марина помогала, теперь вот Виталик остался.
    • 03 декабря 2013 г.
    • Цитата
      и в цикле запросики в БД
      . Никогда так не делайте :)

      SELECT id,name FROM table WHERE id IN ( ". implode(',',$array_ids) ." ) - вот оптимальное решение :)
    • 28 мая 2015 г.
    • Цитата
      id товара у нас это $this->diafan->show

      Я так понял уже не работает
      Теперь он сидит в $this->result['id']
      Но и это уже походу не надо. Был случайно обнаружен вот такой штук
      Код
      $_SESSION['shop_view']

      И в нем уже сидели id посещенных страниц...
  • 06 июня 2013 г.
  • Сегодня все сделал. Все получилось. Единтсенная доработочка, вместо кода
    Код

    if ( ! isset($_SESSION['shop_history']))
    {
    $_SESSION['shop_history'] = array();
    }

    if ( ! in_array($this->diafan->show, $_SESSION['shop_history']))
    {
    $_SESSION['shop_history'][] = $this->diafan->show;
    }


    сделал вот так:
    Код

    $cur_id=$this->diafan->show;
    if ( ! isset($_SESSION['shop_history']))
    {
    $_SESSION['shop_history'] = array(); // первый раз формируем сам массив
    }
    array_unshift($_SESSION['shop_history'], $cur_id); // вставляем элемент В НАЧАЛО массива
    $_SESSION['shop_history']=array_unique($_SESSION['shop_history']); // Удаляем возможные дубликаты

    В этом варианте блок выданет сначала самые последние товары, и нет повторов.
    Виталию, еще раз спасибо!
  • 18 ноября 2013 г.
  • добрый день!
    Как я понимаю - на ВТОРОМ шаге мы записываем в массив просмотренные товары в текущей сессии

    Не понятен Третий шаг:
    Цитата
    Третий шаг: останется только создать шаблонный тег, типа insert name=show_lastview_goods
    где сделать проверку


    В includes/function.php пишу:
    Код
    public function show_lastview_goods ()
    {
    if ( ! empty($_SESSION['shop_history']))
    {
    for($i = 0; $i < count($_SESSION);$i++):
    echo $_SESSION[$i];
    endfor;


    Затем вывожу в нужном месте:
    Код
    <insert name="show_lastview_goods" module="shop" count="4">


    Подскажите, пожалуйста где ошибка?
    • 18 ноября 2013 г.
    • Цитата
      Подскажите, пожалуйста где ошибка?

      Вот тут
      Код
      <insert name="show_lastview_goods" module="shop" count="4">

      В модуле shop этой функции нет Вы же её в includes/function.php поместили.
      count="4" не критическая ошибка, но этот параметр нигде не фигурирует и никак не обрабатывается в Вашей функции. Поэтому не нужен.
      Просто
      Код
      <insert name="show_lastview_goods">
      • 18 ноября 2013 г.
      • Виталий, спасибо! Я новичок. Извините, если задаю глупые вопросы.
        Но все равно почему-то ничего не выводит визуально.
        Может шаблонный тег нужно выводить в каком то другом месте? я его пишу в site.php
      • 18 ноября 2013 г.
      • Виталий, module="shop" count="4" - придумал я, Анастасия изначально делала как Вы рекомендовали.
        Но чего-то не хватает, на паблик ничего не выходит... Уж и кеш сайта обратно включили, хотя на период работ обычно отключаем.
        Ни в какую... Сначала вылезал "Array" на паблике, а теперь и этого нет.
        • 19 ноября 2013 г.
        • Ну так надо было посмотреть, что за array вылезал. Может внутри было то что вам нужно.
          да и
          Код
          echo $_SESSION[$i];

          действительно выведет array
          для вывода массивов и прочих сложных конструкций лучше использовать
          Код
          print_r($_SESSION[$i]);
          • 19 ноября 2013 г.
          • Спасибо! Но снова ничего не работает.
            Использую всего три файла site, function и shop.model . Может быть нужно еще где то прописывать? Почему-то мне кажется, что я пропускаю какой-то немаловажный шаг. И проблема либо в записи id товаров в массив, либо в выводе.
            И еще вопрос - пошагово можно как-нибудь посмотреть работу кода? (Чтобы увидеть заполняется ли массив)

            • 20 ноября 2013 г. , редакция: 20 ноября 2013 г.
            • Можно конечно и потрейсить для этого нужны инструменты.
              Например: NetBeanse + XDebug
              или можно посмотреть что в конкретной точке можем поиметь всё тем же print_r($this->diafan), print_r($_SESSION)
              технология добавления тегов в документации описана хорошо.
              Если хотите в модуле, как в примере то надо кастомизирвать файлы: shop.php, shop.model.php и шаблон shop.view.[x].php
              тогда тег будет выглядеть как у Валерия Викторовича.
              Если действия которые будут производится общего характера то достаточно внести правки в function.php тогда тег будет выглядеть как у Виталия.
      • 21 ноября 2013 г.
      • Виталий, не работает эта конструкция. Что мы с Анастасией упускаем, почему не работает?
        • 21 ноября 2013 г.
        • Провёл небольшие исследования на момент погружения в условие

          Код
          if ( ! empty($_SESSION['shop_history']))


          лично у меня массив $_SESSION пуст возможно у вас тоже пуст.
          поэтому ничего и не выводит попробуйте написать print_r($_SESSION) перед условием

          Код
          print_r($_SESSION);
          if ( ! empty($_SESSION['shop_history'])){
          ...
          }
          • 21 ноября 2013 г.
          • Денис, и так что-то не прокатывает... зараза такая, в чем же проблема...
            • 21 ноября 2013 г.
            • Это была проверка на присутствие каких либо данных.
              Тогда встаёт вопрос, тег <insert name="show_lastview_goods"> стоит точно там где вы его пытаетесть смотреть или может быть вы смотрите другую страницу где этого тега нет?
              Потому что print_r($_SESSION); полюбому должен вывести хотябы Array(), а если не пуст, то в скобках данные сессий.
              По какойто причине не метод show_lastview_goods не отрабатывает (должен находится в includes/functuins.php).

              Всё же просто.
  • 21 ноября 2013 г.
  • Виталий, Денис! Спасибо вам огромное! Не знаю, чтобы я без вас делала!

    Теперь появилась следующая проблема - как вывести карточки этих товаров?
    • 22 ноября 2013 г.
    • Зависит от того, насколько полная информация нужна в "списке последних просмотренных". Обычно достаточно реально небольшой список, название товаров ссылками на карточки. Для этого id товаров из массива перебираются и формируются ссылки, что-то вроде
      Код
      echo '<a href="/' . $this->diafan->_route->link(DB::title("shop", $_SESSION['shop_history'][$i], "site_id"), "shop", DB::title("shop", $_SESSION['shop_history'][$i], "cat_id"), $_SESSION['shop_history'][$i]) . ">' . DB::title("shop", $_SESSION['shop_history'][$i], "name") . '</a>';

      (не проверял, но работать должно именно так)

      По сути, надо вывести
      Код
      echo '<a href="/' . URL . ">' . имя товара . '</a>';

      Вместо имени товара пишем
      Код
      DB::title("shop", $_SESSION['shop_history'][$i], "name")
      - это просто запрос в БД, чтобы узнать имя товара по его ID
      А вместо URL нам нужен ЧПУ до товара. Это метод link.
      Куда мы суем ID товара из сессии, а site_id и cat_id выдергиваем через DB::title из той же таблицы shop.
      ________________________

      Если нам надо выводить прям карточки товара, то надо заморачиваться с отбором товаров из БД, отбором всех их доп.характеристик, их цен, их изображений, затем формировать верстку всего этого. Это решаемо, но это подольше. Тогда лучше функцию действительно перенести в модельку shop, и там склонировать, например, show_block и использовать вьюху.
      • 27 ноября 2013 г.
      • Виталий, добрый день! Спасибо! с помощью вашего кода ссылки на просмотренные товары формируются.
        Но нам как раз нужно выводить карточки товаров...
        Функцию перенесла в модель shop/shop.php - именно тут и формирую ссылки просмотренных товаров
        Создала файл в shop/view/shop.view.show_lastview_goods.php по шаблону shop.view.show_block.php
        В нужном месте - шаблонная функция стала такого вида
        Код
        <insert name="show_lastview_goods" module="shop" template="show_lastview_goods">
        . Все верно? (В таком виде на паблик не выводится ничего)

        Кроме того, Мне не понятно, как передавать ссылки или id товаров в шаблон shop/view/shop.view.show_lastview_goods.php
        • 28 ноября 2013 г.
        • Наверно template="lastview_goods"? или вообще без template="" ?
          • 28 ноября 2013 г. , редакция: 28 ноября 2013 г.
          • Да согласна, сделала не верно.
            Клонировала shop.view.show_block.php и сделала shop.view.show_block_lastview_goods.php
            Исправила в шаблонном теге
            Код
            <insert name="show_lastview_goods" module="shop" template="lastview_goods">


            но основная проблема то даже не в этом.. а в том как передать и какие параметры во вьюху и реализовать вывод карточек.
            • 28 ноября 2013 г. , редакция: 28 ноября 2013 г.
            • попыталась отдельно вывести на экран
              Код
              $i1=DB::title("shop", $_SESSION['shop_history'][$i], "site_id");
              $i2=DB::title("shop", $_SESSION['shop_history'][$i], "cat_id");
              $i3=DB::title("shop", $_SESSION['shop_history'][$i], "name");
              $row["link"] = $this->diafan->_route->link(DB::title("shop", $_SESSION['shop_history'][$i], "site_id"), "shop", DB::title("shop", $_SESSION['shop_history'][$i], "cat_id"), $_SESSION['shop_history'][$i]);


              Выводит $i1 = 11,$i2 =7,$i3= ПУСТО, $row["link"]=ссылка
              Имя товара не выводит(
              Если я правильно понимаю, именно эти параметры нужно передавать?
              • 05 декабря 2013 г.
              • Для того чтобы из модела передать данные во вьюху формируется массив. В конце метода можно посмотреть какой именно массив передаётся, а если метод свой то на ваше усмотрение конечно.
                Обычно както так выглядит.
                Код
                return $this->result

                Нарастите его необходимыми данными и всё. Естественно чтобы в него что-то положить нужно это что-то откудо то взять. Чаще всего из базы данных.

                Если честно уже трудно что-то конкретное советовать, из за того что уже целостность исходных данных непонятна.
        • 05 декабря 2013 г.
        • Лучше данные формировать всётаки в моделе, а в конструктуре рулить процессами.
  • 02 декабря 2013 г.
  • Сейчас глянул в Битрикс, оказывается в редакции малый бизнес он есть как самый обычный компонет "Просмотренные товары":
    Код
    <?$APPLICATION->IncludeComponent(
    "bitrix:sale.viewed.product"

    Зараза такая...

    А у нас даже подсказать не могут как его создать, раз нет в стандартной поставке..
    • 04 декабря 2013 г. , редакция: 04 декабря 2013 г.
    • ну...так в диафане тоже есть, называется отложенные.
      Нужно вставить добавление, в id прописать вызов.
      В итоге получится полноценный компонент "просмотренные товары", и для авторизованных поль-ей всегда его последние просмотренные показываются.

      Единственное что я дописывал это ограничение на кол-во добавленных отложенных товаров, но там пару строчек кода.

      отдельно нету конечно, но части есть, и не надо обладать особенными знаниями, хватит знаний начального курса универа, если вы не прогуливали конечно, и не были двоешником.
      • 04 декабря 2013 г.
      • Нет, не прогуливал, в нашем военном училище прогулы карались гауптвахтой. Или исключением из рядов КПСС.
  • 07 июня 2021 г.
  • А почему происходит сброс просмотренных товаров когда человек выходит из личного кабинет?
    Где это можно подкрутить?
    • 07 июня 2021 г.
    • Дим, я ведь тебе ответил в другой теме
      • 07 июня 2021 г.
      • Цитата
        Хранить нужно просмотренные не в сессии потому что, а в куке просто. То есть переписать нужно функционал просмотренных товаров, а точнее немного исправить.

        историю на куки поменять?
        • 07 июня 2021 г.
        • сессию на куки
          • 08 июня 2021 г.
          • а есть где можно подглядеть как это сделать?
            • 09 июня 2021 г.
            • вот тут https://www.php.net/ :-D
              • 10 июня 2021 г.
              • PHP (рекурсивный акроним словосочетания PHP: Hypertext Preprocessor) - это распространенный язык программирования общего назначения с открытым исходным кодом.

                Куки (cookies) — текстовые файлы небольшого размера, записываемые сервером в браузер пользователя

                А теперь вопрос :-D
                Если вопрос про куки, то зачем человеку давать сайт про php?
              • 11 июня 2021 г.
              • Могу предположить, что надо поменять $_COOKIE на $_SESSION

                А Андрей правильно ссылку дал.

                Вы же в коде php будете менять куки на сессию и там разные методы записи.

                Допустим для куки - setcookie(),
                а для сессии у вас должны быть вызвана функция session_start();

              • 11 июня 2021 г. , редакция: 11 июня 2021 г.
              • Цитата
                Если вопрос про куки, то зачем человеку давать сайт про php?


                На какой сайт, по вашему мнению, должна быть ссылка? На этот?
              • 11 июня 2021 г.
              • Алевтина просто толсто троллит )))

                P.S. cookies это вообще печеньки

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум