Задать вопрос
  • Как изменить псевдоним (user) в YouTube и Google+?

    Fortoo
    @Fortoo
    Top-Web OpenCart
    Псевдоним на YouTube - что это и как выбрать?
    Теперь вот так:
    https://www.youtube.com/watch?v=g5Txek3c7oA

    Сервис для выбора Псевдонима на YouTube: https://www.youtube.com/handle
    Ответ написан
    Комментировать
  • Области видимости переменных из разных case внутри одного switch (PHP)?

    Fortoo
    @Fortoo
    Top-Web OpenCart
    Чтобы лучше понять "почему не видны переменные", нужно представить как думает машина и что switch

    switch ($status) {
            case 1:
                 //...
                break;
            case 2:
                 //...
                break;
            case 3: 
                //...
                break;
        }


    это подобие замены (когда используется break;) классического ветвления с использованием IF

    if ($status == 1) {
        //...
    } elseif ($status == 2) {
        //...
    } elseif ($status == 3) {
        //...
    } else { //это  замена default (не обязателен) из конструкций switch
        //...
    }


    Соответственно, если не выполнено (или выполнено) какое-то условие, то его не может увидеть другое условие, потому-что эти условия как-бы разорваны между собой.
    Ответ написан
    Комментировать
  • Как сделать плавную прокрутку страницы до якоря?

    Fortoo
    @Fortoo
    Top-Web OpenCart
    Можно вообще не использовать ID
    Вот мой пример https://qna.habr.com/q/556291#answer_item_2349276

    А это пример с ID
    $(document).ready(function() {
      //$("body").on('click', '[href*="#"]', function(e){ такой вариант НАДЁЖНЕЕ, когда динамически изменяется DOM
      $('a[href^="#"]').on('click', function(e) {
        // отменяем стандартное действие ссылки
        e.preventDefault();
    
        var sc = $(this).attr("href");
        var dn = $(sc).offset().top;
           // sc - в переменную заносим информацию о том, к какому блоку надо перейти
           // dn - определяем положение блока на странице
    
       $('html, body').animate({scrollTop: dn}, 1000);  
          // 1000 скорость перехода в миллисекундах
      });
    });


    Бывает, что при переходе по ссылке, загружается дополнительный контент,
    тогда нужно дождаться загрузки и только потом перейти по ссылке- например перешли по ссылке а потом загружаются отзывы:
    $("#review").load('index.php?route=blog/article/review&article_id={{ article_id }}', function(response, status, xhr) {
            if (status == "error") {
        	   var msg = " Извините, но произошла ошибка: ";
        	   $("#error").html(msg + xhr.status + " " + xhr.statusText);
            } else {
        	    var sc = window.location.hash;//ссылка с id (#answer_item_2349276)которую мы поймали на другой странице, например  (qna.habr.com/q/556291#answer_item_2349276)
                var dn = $(sc).offset().top;//определяем положение блока на странице 
                $('html, body').animate({scrollTop: dn}, 1000); 
            }
    	});
    Ответ написан
    Комментировать
  • Как скопировать введенное значение из одного input в другой input?

    Fortoo
    @Fortoo
    Top-Web OpenCart
    <script>
       $("input").on('input', function () {
         var value = $(this).val();
         $("#second_input").val(value);
       });
    </script>


    Так надёжнее, ловит событие и когда не касаешься клавиатуры, а к примеру копируешь в поле с помощью мыши.
    Ответ написан
    Комментировать
  • Как инициализировать слайдер после AJAX загрузки?

    Fortoo
    @Fortoo
    Top-Web OpenCart
    Я так понял что
    observer: true,
    observeParents: true,
    observeSlideChildren: true,
    следят за изменением именно дерева самого слайдера, а у меня например после ajax слайдер почти не меняется (только адрес на картинки в слайдере).
    Хотя...не знаю почему все эти observe плохо следят)

    Поэтому я использовал пример из документации Swiper и
    observerUpdate - Событие будет запущено, если наблюдатель включен и обнаружит мутации DOM.
    И я запускаю повторную инициализацию.
    Не знаю на сколько это верно, я ещё тестирую у себя этот код.
    // К примеру это моя инициализация слайдера в другом файле
    const swiper = new Swiper('.swiper', {
      observer: true, //обязательно
      observeParents: true, //обязательно
      observeSlideChildren: true, //обязательно
      // ...
    });
    
    // И здесь же запускаю слушатель событий повторно инициализирую
    swiper.on('observerUpdate', function () {
      console.log('DOM изменился ');
    
      const swiper = new Swiper('.swiper', {
        // ...
      });
    });


    ......К сожалению, такой код конечно сильно нагружает запросами
    Ответ написан
    Комментировать
  • Как узнать вошел ли пользователь в opencart?

    Fortoo
    @Fortoo
    Top-Web OpenCart
    Кстати, метод isLogged() в ОС3 в system\library\cart\customer.php,
    поэтому имеем доступ к нему из любого контроллера через $this->customer->isLogged()
    Ответ написан
    Комментировать
  • Как определить, содержит ли url определенное слово?

    Fortoo
    @Fortoo
    Top-Web OpenCart
    Для примера возмём адрес https://learn.javascript.ru/json
    В данном случае location.href вернёт строку.
    console.log(window.location.href.indexOf('json'));
    // получим цифру 28


    Метод indexOf() ищет в массиве или строке совпадение и возвращает цифру ( начиная с нуля, количество символов до искомого значения), т.е. вернётся индекс первого найденного элемента или -1, если ничего не нашлось.
    Искомый "json" начинается с 29 буквы, но учитывая что отчёт начинается с 0, поэтому 28 буква.

    'Hello, world!'.indexOf('world'); // 7
    'Hello, world!'.indexOf('o');     // 4, в конце hello
    'Hello, world!'.indexOf('o', 5);  // 8, вторая буква в world
    !!'Hello, world!'.indexOf('z');   // true, отрицательное число приводится к true
    !!'Hello, world!'.indexOf('H');   // false, 0 трактуется как false

    Это древний метод indexOf(), для таких задач лучше использовать метод includes() .

    Раньше методом indexOf() часто проверяли, есть ли элемент в массиве. Эта задача проще, индекс здесь не нужен, но других методов для этого не было.

    Поэтому в старых скриптах можно увидеть такой код:
    const guestList = ['Петя', 'Настя', 'Артур', 'Лена', 'Настя', 'Эммануил']
    const guest = // получаем откуда-нибудь имя гостя
    
    if (guestList.indexOf(guest) >= 0) {
      // пускаем на вечеринку
    } else {
      // отправляем домой
    }


    Из-за того, что indexOf() возвращает индекс, в условии обязательно нужна проверка (>= 0 или !== -1).
    Если так не сделать, то появится неприятный баг: мы будем пускать на вечеринку всех, кроме первого гостя в списке.

    Дело в том, что JavaScript интерпретирует ненулевые числа как истину (true) и будет запускать первую ветку if.
    А на первом госте indexOf() вернёт 0, что считается ложным (false), и наш скрипт не пустит человека на вечеринку.

    Метод lastIndexOf() начинает поиск с конца.
    Метод test() тоже хорош, просто проверит, подходит ли искомая строка под регулярное выражение.

    Отличие метода includes()(добавлен в ECMAScript в 2016г) от метода indexOf() заключается в том, что он возвращает логическое значение (true, или false), а не числовое значение (индекс элемента, или -1, если элемент не найден).
    Кроме того, очень незначительным отличием includes() является то, что он правильно обрабатывает NaN в отличие от indexOf/lastIndexOf.

    Я предпочитаю так:
    if (window.location.href.includes('json')) {
        // содержит
    } else {
        // не содержит
    }
    Ответ написан
    Комментировать
  • Не заходит в админку OpenCart?

    Fortoo
    @Fortoo
    Top-Web OpenCart
    Причины действительно могут быть разными, к примеру...

    https://opencartforum.com/topic/93218-ne-zahodit-v...
    Ответ написан
    Комментировать
  • OpenСart исчезает корзина сразу после добавления, почему?

    Fortoo
    @Fortoo Автор вопроса
    Top-Web OpenCart
    нашёл на просторах такое решение:

    Итак, проблема в вашем сеансе в system/library/cart/cart.php
    После входа в систему инициируется класс клиента и запускается метод __construct.
    на line 22 файла system/library/cart/cart.php вы можете увидеть , как это работает:

    // this code queries the current cart of your session id. so before you were logged int, your cart was saved to the database under a session id.
    $cart_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cart WHERE api_id = '0' AND customer_id = '0' AND session_id = '" . $this->db->escape($this->session->getId()) . "'");
    
    //after it finds your card products, it adds them to your CUSTOMER id.
    foreach ($cart_query->rows as $cart) {
        $this->db->query("DELETE FROM " . DB_PREFIX . "cart WHERE cart_id = '" . (int)$cart['cart_id'] . "'");
    
        // The advantage of using $this->add is that it will check if the products already exist and increaser the quantity if necessary.
        $this->add($cart['product_id'], $cart['quantity'], json_decode($cart['option']), $cart['recurring_id']);
    }

    Таким образом, причина, по которой ваша корзина не заполняется после входа в систему, заключается в том, что в этом сеансе. Возможно, некоторая часть вашего кода удаляет $ this-> session-> getId (), поэтому скрипт не может найти продукты в корзине.

    Чтобы отладить это, просто print_r, session_id и такие результаты
    //print out the session id.
    print_r($this->session->getId());
    $cart_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cart WHERE api_id = '0' AND customer_id = '0' AND session_id = '" . $this->db->escape($this->session->getId()) . "'");
    
    //print out the result of the query
    print_r($cart_query->rows);
    foreach ($cart_query->rows as $cart) {
        $this->db->query("DELETE FROM " . DB_PREFIX . "cart WHERE cart_id = '" . (int)$cart['cart_id'] . "'");
    
        // The advantage of using $this->add is that it will check if the products already exist and increaser the quantity if necessary.
        $this->add($cart['product_id'], $cart['quantity'], json_decode($cart['option']), $cart['recurring_id']);
    }


    чтобы увидеть, что там. если он пуст, вам нужно будет копнуть глубже, чтобы увидеть, кто его удаляет.

    если он заполнен, посетите таблицу phpmyadmin oc_cart, чтобы найти записи session_id=$this->session->getId() и попытаться выяснить, почему он не возвращает товары из корзины.

    надеюсь это поможет.

    ОДНАКО.... теперь я скажу(автор вопроса).
    Хорошая идея поискать проблему в сессиях, поэтому я поделюсь своим опытом.
    Действительно при потере сессии исчезает корзина, в моём случае проблемы была в том, что сайт на хостинге был настроен по протоколуhttps://www.site.com, а сами страницы могли открываться по www.site.com. Поэтому при отправке товара в корзину, менялся протокол и то что попадало в миникорзину, в итоге исчезало из основной корзины.
    В итоге в конфиге прописал все подключения через https://www и настроил редирект с www.site.com, на https://www.site.com в .htaccess и всё заработало!
    Ответ написан
    Комментировать
  • Как отправлять альбом вместе с подписью в Telegram?

    Fortoo
    @Fortoo
    Top-Web OpenCart
    А для PHP такое возможно?
    Ответ написан
    Комментировать
  • Слайдер- Как сделать возможность в активном слайде видеть ссылку с данными на следующий и предыдущий слайд?

    Fortoo
    @Fortoo Автор вопроса
    Top-Web OpenCart
    Спасибо всем за предложенные варианты!
    Я в начале подумал что без js не обойтись(потому-что многие слайдеры при "зацикливании вкруговую" создают cloned слайды), но поразмыслив, решил попробовать сделать такой слайдер использую только PHP.
    Поэтому iBird Rose в этом смысле был ближе к моему варианту, в котором я прошёлся по массиву и вытащил из каждого next слайда нужные данные по ключам и потом используя функцию array_keys() последний ключ в массиве заменил первым, поэтому и "зацикливании вкруговую" тоже работает)
    Ответ написан
    Комментировать