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

Вызов шаблонного тега при использовании AJAX

  • 25 ноября 2016 г.
  • Добрый день!
    Создал новый файл с функцией, в котором содержится шаблонный тег вызова похожих товаров.
    При обращение к файлу через шаблон все выводится, но если я обращаюсь к файлу с файла JS посредством AJAX, то ничего не выводится.
    И заметил сл. при обращении к файлу через JS, в нем функции перестают работать, конкретно у меня не выводился результат запроса в базу, пришлось писать запрос без помощи внутренних функций диафана с новым подключением в базу и все заработало.

    Надеюсь суть вопроса ясна.
    Спасибо.
    • 26 ноября 2016 г.
    • Степан (idxdoc), не совсем понял Ваш вопрос, но попытаюсь ответить.
      Цитата
      Создал новый файл с функцией, в котором содержится шаблонный тег вызова похожих товаров.
      Это здорово.
      Цитата
      При обращение к файлу через шаблон все выводится
      Это подтверждает, что все здорово.
      Цитата
      но если я обращаюсь к файлу с файла JS посредством AJAX, то ничего не выводится
      Это не здорово, попробуем разобраться, как говориться, в слепую.
      Цитата
      И заметил сл. при обращении к файлу через JS, в нем функции перестают работать
      Это говорит только об одном - в скрипте ОШИБКА. Особенность javascript в том, что если возникает ошибка, подключенный скрипт становиться не рабочим. Решение: открываем консоль браузера и смотрим, где ошибка. Далее исправляем ее.
      Цитата
      конкретно у меня не выводился результат запроса в базу
      Ну так и понятно, скрипт стопорнулся и до записи в базу данных не дошло.
      Цитата
      пришлось писать запрос без помощи внутренних функций диафана с новым подключением в базу и все заработало
      Здесь на форуме часто употребляют слово "грабли". Я пытался выяснить, что эти люди подразумевают. С их слов, этим словом можно назвать практически любую доработку алгоритма. Так вот, лично я считаю, что именно Ваше решение можно назвать "граблями". Поясню. Если Вы пишите код на основе чего-либо, то Ваш код должен максимально соответствовать этой основе. Ну да ладно, как говорит электрик: "Если что-то работает, то не надо в это что-то лезть". Так что если считаете, что задача решена - значит все здорово.
      Успехов.
      • 26 ноября 2016 г. , редакция: 26 ноября 2016 г.
      • Ну Вы жгете конечно))))

        Цитата
        И заметил сл. при обращении к файлу через JS, в нем функции перестают работать
        Это говорит только об одном - в скрипте ОШИБКА. Особенность javascript в том, что если возникает ошибка, подключенный скрипт становиться не рабочим. Решение: открываем консоль браузера и смотрим, где ошибка. Далее исправляем ее.


        Перестают работать внутренние функции диафана, поэтому и пришлось делать через грабли))

        Цитата
        пришлось писать запрос без помощи внутренних функций диафана с новым подключением в базу и все заработало
        Здесь на форуме часто употребляют слово "грабли". Я пытался выяснить, что эти люди подразумевают. С их слов, этим словом можно назвать практически любую доработку алгоритма. Так вот, лично я считаю, что именно Ваше решение можно назвать "граблями". Поясню. Если Вы пишите код на основе чего-либо, то Ваш код должен максимально соответствовать этой основе. Ну да ладно, как говорит электрик: "Если что-то работает, то не надо в это что-то лезть". Так что если считаете, что задача решена - значит все здорово.
        Успехов.


        Это я привел другой пример, там задача решена, но в новой задаче я не могу просто взять и составить новый запрос, ибо если запрос в той задаче на вывод имени и фотографии, то тут этим не закончится, и это уже будут не грабли, а грабли в кубе.


        Поясню еще раз.

        Допустим возьмем шаблонный тег <insert name="show_block" module="shop"> и вызовем его в файле темы.
        В итоге у нас выведутся товары.

        А теперь возьмем этот шаблонный тег и вставим его в файл, который будет вызываться JS (AJAX), ничего не выведится.
        Но если написать в этом файле "echo 'Тест';" то код сработает и выведится "Тест"
        • 26 ноября 2016 г.
        • Цитата
          Ну Вы жгете конечно))))
          Самое удивительное то, что я разбираюсь в том, что говорю.

          Цитата
          Допустим возьмем шаблонный тег <insert name="show_block" module="shop"> и вызовем его в файле темы.
          В итоге у нас выведутся товары.

          А теперь возьмем этот шаблонный тег и вставим его в файл, который будет вызываться JS (AJAX), ничего не выведится.
          Но если написать в этом файле "echo 'Тест';" то код сработает и выведится "Тест"

          А вот, Вы, Степан (idxdoc), скорее нет, чем да. С чего вы взяли, что просто вставив тег
          Код
          <insert name="show_block" module="shop">
          в какой-то файл, с которым будет работать AJAX, то он сработает? ))) Чтобы он сработал, надо еще кое-что сделать. Уверен, Вы догадаетесь, что необходимо сделать, чтобы служебный тег заработал.

          Успехов.
          • 26 ноября 2016 г.
          • Цитата
            надо еще кое-что сделать


            Вот за этим я сюда и обратился, подскажите мне пожалуйста, что нужно сделать чтобы служебный тег работал при вызове файла через AJAX?
            • 26 ноября 2016 г.
            • Цитата
              что нужно сделать чтобы служебный тег работал при вызове файла через AJAX?

              Да ответ на поверхности: нужно сделать ровно то, что заставляет его работать в cms. Сегодня у меня просто нет ни времени, ни желания вкладывать бесплатно код - решение. Тем более, что Вы и сами способны разобраться.
              • 27 ноября 2016 г.
              • Цитата
                бесплатно код

                Можно и не бесплатно, без проблем
            • 27 ноября 2016 г. , редакция: 27 ноября 2016 г.
            • Степан, вы шаблонный тег через htmleditor() вызываете?
              • 27 ноября 2016 г. , редакция: 27 ноября 2016 г.
              • По всякому пробовал
                Код
                echo $this->diafan->_tpl->htmleditor('<insert name="show_block_rel" module="shop" count="4" images="1" shop_id="347">');


                Код
                echo $this->diafan->_tpl->htmleditor('<insert name="show_block_rel" module="shop" count="4" images="1" shop_id="'.$id.'">');


                и оба варианта без diafan->_tpl-> также попробовал

                Атрибута shop_id не должно быть, но в моем случае я его реализовал.
            • 27 ноября 2016 г.
            • вызывать нужно не файл, а метод класса (action).
              в документации, насколько помню есть информация как работать с ajax.
              • 27 ноября 2016 г. , редакция: 27 ноября 2016 г.
              • Спасибо, попробую тогда разобраться)
                О результатах отпишу, или выложу сюда мануал.

                ______________________________________________

                Попробовал, в итоге ничего.
                Консоль пишет что diafan_ajax.init не существует, оно и логично вроде, я же не создал эту функцию, создал ее только в shop.action, все сделал по примеру.

                Кто знает как вызвать шаблонный тег посредством AJAX, отзовитесь, готов заплатить!!!
              • 27 ноября 2016 г.
              • 1. пишете новый метод в shop.action, например get_data, внутри получаете нужные данные. тут как раз используйте либо htmleditor, либо напрямую код, вызываемый шаблонным тегом
                2. в js вызываете, как-то так
                Код

                $.ajax({
                url: '/',
                type: 'POST',
                dataType: 'json',
                module: 'shop',
                action: 'get_data',
                success: function (response) {
                // тут ваши данные
                }
                }
                );
              • 27 ноября 2016 г. , редакция: 27 ноября 2016 г.
              • 1 проблема в том что к файлу shop.action.php нельзя обратится в принципе пока есть данный код:
                Код
                if (! defined('DIAFAN'))
                {
                $path = __FILE__; $i = 0;
                while(! file_exists($path.'/includes/404.php'))
                {
                if($i == 10) exit; $i++;
                $path = dirname($path);
                }
                include $path.'/includes/404.php';
                }


                Но это даже не есть проблема, т.к. его можно удалить, и доступ тут же будет.
                Но удалив этот код я попробовал сделать, как Вы сказали, но ничего не вышло.
                Подумал что я тупо не правильно пишу код, и решил вывести вначале файла просто echo 'test'; и открыв данный файл в браузере я конечно же увидел test, т.е. доступ к файлу у меня есть.
                После вместо эхо тест вставил шаблонный тег в 2-х вариациях и он не сработал.
                Затем я решил прочитать про action в jquery AJAX, но ничего не нашел, либо его там не может быть, либо я невнимательный, уж простите

                Короче результат не о чем.
              • 28 ноября 2016 г. , редакция: 28 ноября 2016 г.
              • Цитата
                вызывать нужно не файл, а метод класса (action).

                забудьте про файл shop.action после того ,как написали в него нужный вам код.
                дальше роль играет уже сам диафан, именно его вы и просите обработать файл отправляя аякс в корень с параметрами module и action
                ---
                и не надо удалять код в начале)
              • 28 ноября 2016 г.
              • Скажите пожалуйста, в url что нужно написать? если мы в action пишем shop
            • 28 ноября 2016 г. , редакция: 28 ноября 2016 г.
            • Цитата
              Затем я решил прочитать про action в jquery AJAX, но ничего не нашел, либо его там не может быть
              Верно. В том виде, в котором ACTION в diafan.cms, такого там нет.
              Цитата
              Короче результат не о чем.
              Нее, не задавайтесь. Вы почти решили свою задачу. Только не воспринимайте за издевку (если так выглядит, то заранее извиняюсь), просто иначе все будет слишком просто.

              Цитата
              либо я невнимательный
              Попробую помочь: Вы смотрите на куски кода, а надо видеть архитектуру кода в целом, тогда все получится.
              • 28 ноября 2016 г.
              • Да уже начинаю ее видеть, толку от этого 0
  • 28 ноября 2016 г. , редакция: 28 ноября 2016 г.
  • Вообщем смотри есть модуль (например shop) есть контроллер (shop.php инициализация данных и принятие решений о том что требуется в данный момент) есть модель (я бы лучше называл это модулятор shop.model.php подготовка данных) отображение (вьюха shop.view.id.php рендер) это первый фундаментальный этап получения странички в котором надеюсь у вас нет пробелов понимании того как оно работает.
    Ок. идём дальше на кой то хрен нам (вам понадобился AJAX) далее работает совершенно другая схема.
    если у модуля имеется скрипт (смотрим в папку js) и он соответствует отображению (shop.id.js) он будет автоматически подключен (ну можно конечно и подключить любой другой скрипт в ручном режиме, ну как бы сейчас не об этом). Да к стати пример получился не очень удачный в этом js нет вызова AJAX, но можно добавить (то что накрапал Степан). Что произойдёт? Сформируется запрос который заставит Диафан отработать файл (shop.action.php) и если отталкиваться от примера Степана ( action: 'get_data' ) необходимо присутствие в нём метода get_data (public function buy(){}) и вот в нутри этого метода ты уже можешь делать все свои грязные дела, можешь даже HTML кусок того что должно быть выведено на странице написать. Подробности уже есть в доках

    ПыСы: Сумбурно представляю о чём была речь выше какие-то файлы что то переписывалось. Надеюсь что то что было описано как-то поможет взглянуть на предмет обсуждения более правильно. Да кстати это всё работает точно также и для админской части только нужно смотреть относительно папки admin
    • 28 ноября 2016 г. , редакция: 28 ноября 2016 г.
    • Денис, большое спасибо за вышеизложенное, но к большому сожелению в доках о AJAX написано меньше всего и толком без примеров, тут кусочек там кусочек, я уже раз 10 перечитал, но так и не смог вникнуть.

      Код
      необходимо присутствие в нём метода get_data (public function buy(){})

      Я это понимаю и уже сделал, но он у меня даже тупо эхо тест не выводит, и ошибки в консоли не выводит, т.е. js работает исправно.
      Скажите пожалуйста в url мне что нужно запихнуть? Файл shop.action.php или что-то другое? т.к. мы ведь в action: '...' указываем файл и так.
      Но если я ничего не указываю в url, то соответственно ничего не происходит.

      Я получается не могу связать ajax с методом описанным в shop.action.php, если Вы мне четкий пример хотябы укажите что написать в url,action и можно ли в diafan.ajax передать дату? я буду Вам признателен)

      Цитата
      идём дальше на кой то хрен нам (вам понадобился AJAX)

      По нажатию на кнопку купить, у меня открывается немаленькое окошко, в котором либо акции выводятся, либо похожие товары если они есть, сразу выводить ко всем товарам их похожие товары не целесообразно.

      Напишу сюда то что уже сделано:
      В файл shop.action.php в конце класса добавил:
      Код
      /**
      * Подгрузка похожих товаров
      *
      * @return void
      */

      public function shop_load_rel()
      {
      echo 'test';
      // Также пробовал писать $this->result["load"] = 'test';
      }


      В файл js писал различные вариации AJAX, но все безуспешно.
      В shop_load_rel() писал не только как указал, еще много различных вариаций пробовал, просто уже не помню.
      • 28 ноября 2016 г.
      • так echo и не даст ровным счётом ничего.
        В документации ж написано написано данные отправляются обратно через конструкцию $this->result
        и далее : бла бла бла $this->result["redirect"] ... $this->result["errors"] ... $this->result["data"]
        например
        $this->result["data"] = array(
        ".element" => "и вот тут твой кусок можно с HTML <strong>тегами</strong>");
        Далее смотри уже в браузере пришло или нет. Если не пришло. Значит где-то косяк на сервере. Если пришло но не попало туда куда планировалось (а в данном случае <div class="element"></div>), то зачит что-то не так в клиентской части и необходимо смотреть в JS скрипт.
      • 28 ноября 2016 г.
      • Код

        public function shop_load_rel() {
        echo 'test'; // это не работает
        // Также пробовал писать $this->result["load"] = 'test'; да но если хотите меньше ковыряться в JS то используйте тот набор который уже есть
        $this->result["data"] = array('ожидаемая переменная'=> 'test');
        }

        а чтобы это отработало в клиентской части надо инициировать запрос
        Код

        $.ajax({
        url:window.location.href,
        type:'POST',
        dataType:'json',
        data:{
        action:'shop_load_rel',
        module: 'shop',
        value1: 1,
        value2: 2
        },
        success:(function (response) {
        if (response.data) {
        // извращаемся с получеными данными как душе угодно
        } else {
        // или получаем ошибки и думаем почему так
        $(".error_"+name, '.js_registration_form, .registration_form').text('').hide();
        }
        })
        });
        • 28 ноября 2016 г. , редакция: 28 ноября 2016 г.
        • Код

          $('.wrap_filter_zagolovok').click(function(){
          $.ajax({
          url: window.location.href,
          type: 'POST',
          dataType: 'json',
          data:{
          action: 'shop_load_rel',
          module: 'shop'
          },
          success: function(response){
          console.log(response.data); // или так
          $('.wrap_filter_zagolovok').append(response.data); //или так
          }
          });
          });


          Код
          public function shop_load_rel()
          {
          $this->result["data"] = array(
          '.wrap_filter_zagolovok' => '<strong>тест</strong>'
          );
          }



          Простите за нудство, но всеже что не так?

          Ошибок никаких нет, и делал как у Вас с примером чтобы ошибку вывел, не выводит, он вообще ничего не выводит и при этом файл рабочий остается.
          • 28 ноября 2016 г.
          • Показывайте сайт уже что ли)
            • 29 ноября 2016 г. , редакция: 29 ноября 2016 г.
            • Ссылка на категорию, где более менее что-то заполнено
              http://www.stomatologicheskij-magazin.ru/shop/upakovochnye-mashiny/
              Сайт не адаптирован еще, поэтому минимальное разрешение 1300 желательно
          • 29 ноября 2016 г.
          • так точка то зачем тут?
            '.wrap_filter_zagolovok' => '<strong>тест</strong>'
            в итоге wrap_filter_zagolovok это будет элемент массива.
            оформляй правилльно, 'wrap_filter_zagolovok' => '<strong>тест</strong>'
            • 29 ноября 2016 г. , редакция: 29 ноября 2016 г.
            • Цитата
              ".element" => "и вот тут твой кусок можно с HTML <strong>тегами</strong>");


              Потому что у Вас тут точка :)
              И не только у Вас, аналогично в других AJAX вызовов тоже точки либо решетка в зависимости что надо класс или id

              Убрал точку, ровным счетом ничего.
          • 29 ноября 2016 г.
          • И ещё мне не очень нравится вот это

            Код
            success: function(response){
            console.log(response.data); // или так
            $('.wrap_filter_zagolovok').append(response.data); //или так
            }

            посмотри как оно сделано в других модулях.
            • 29 ноября 2016 г.
            • Обращаюсь ко всем кто пытался мне помочь:
              Если знаете как это все точно должно выглядеть, можете мне уделить 5 минут по скайпу чтобы все разжевать? я заплачу Вам! Тут не нужно писать хреново тучу кода, это не целый модуль и т.д. задействовано всего 2 файла и то в каждом по 2 строчки от силы. Уже 3 дня дрочим эту тему. Не понимаю я как это должно быть, и в документации не написано четко ни одного примера.

              Или же если Вы не знаете хватит морочить голову.

              Вы все по разному пишите ;D, кто нибудь делал эту хрень или нет?

              Простите за грубость, если это так могло выглядеть.
              • 29 ноября 2016 г.
              • Нажмите добавить в корзину, появится окошко, в котором справа будут акции, в них также есть кнопка купить, вот на ней и вызывается, это временно, для теста.
              • 29 ноября 2016 г.
              • Код
                var id=$(this).parents('.shop-item').find('input[name="good_id"]').val();

                $.ajax({
                url:'http://www.stomatologicheskij-magazin.ru/custom/custom08_10_2016_14_24/themes/functions/show_cart_block_shop.php',
                data:{shop_id:id},
                success:function(result){
                $('#wrap_cart_shop_list_infoThis').fadeOut(150,function(){$(this).html(result);});
                $('#wrap_cart_shop_list_infoThis').fadeIn(150);
                $('.cart_shop_list_title').fadeOut(150);
                $('.cart_shop_list_title').fadeIn(150);
                }
                });


                вот этот код?
              • 30 ноября 2016 г.
              • Конечно делал и не раз. И всё работает как в админской части так и в пользовательской.
              • 30 ноября 2016 г.
              • Ну в таком случае прошу вашей помощи, 5 минут уделить по скайпу сможете?
            • 29 ноября 2016 г.
            • Нет, код сейчас закоментирован.
              Этот код для обновления товара
              • 29 ноября 2016 г. , редакция: 29 ноября 2016 г.
              • Степан, создайте уже простой пример на демо-сборке CMS, сгенерируйте из него тему и выложите сюда архивом. Это одна из причин, по которой появились темы - показать наработку, применить, изменить, вернуть. Сразу будет понятно - какие файлы вы меняете, где и что.

                Можно будет скачать, воткнуть в демо у себя, подправить код, чтобы работало и скинуть вам архив обратно рабочий. А так (как по мне) и дальше будете буквами обмениваться.
  • 30 ноября 2016 г.
  • Я сделал
    Правда почти)))

    Я вывел то что мне нужно, единственное в формате json, мне нужно в формате html, но если я пишу dataType: 'html', то ничего не выводится..
    Парни давайте добьем уже эту тему:)
    • 01 декабря 2016 г.
    • Я использую вот такую конструкцию. Для того чтобы полученая строка превратиласть в HTML.
      Код
      function htmlDecode(input){
      var e = document.createElement('div');
      e.innerHTML = input;
      return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
      }

      и использую там к чему клеится
      Код
      $("выбранный элемент").empty().append(htmlDecode(val));
      • 01 декабря 2016 г.
      • Есть проще, с помощью prepare().

        А так большое спасибо!
  • 01 декабря 2016 г. , редакция: 01 декабря 2016 г.
  • Ребята!
    Я сделал!))))
    Ключевой момент мне служба поддержки подсказала, но не важно)))

    Короче, кому нужно будет тоже самое, обращайтесь, я выложу мануал, просто сейчас нет времени!)
    • 24 мая 2018 г.
    • Очень интересно если предложение в силе :)
      • 24 мая 2018 г.
      • Полтора года прошло))) Я и не помню уже что тут делал, я так понимаю тема про ajax, ничего сложного в этом нет, но мануал мало чем поможет на самом деле, все индивидуально, скопировав тупо код - это не решение собственной задачи, в любом случае нужны будут правки.
  • 01 декабря 2016 г.
  • Красавчик, ведь всё не так сложно - правда? Держи (это 5 :-) если что)
    • 01 декабря 2016 г.
    • Спасибо :)
      Да вообще ерунда)))
      И тебе пятюлю

Новости

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

Форум