UnclePasha

Отладка AJAX запроса

Рекомендуемые сообщения

UnclePasha    0

Всем привет! Разрабатываю свой первый модуль для Opencart 1.5.5.1.2 и возникла проблема с возвратом значений из контроллера в шаблон через AJAX. Изначально делал всё по руководствам в Интернете. 
 
Контроллер (прошу извинить, не понял, как форматировать код в спойлере): 

 


class ControllerModuleMyModule extends Controller {

private $error = array();

public function index() {
//Load the language file for this module
$this->load->language('module/my_module');

//Set the title from the language file $_['heading_title'] string
$this->document->setTitle($this->language->get('heading_title'));

//Load the settings model. You can also add any other models you want to load here.
$this->load->model('setting/setting');

//Save the settings if the user has submitted the admin form (ie if someone has pressed save).
if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
$this->model_setting_setting->editSetting('my_module', $this->request->post);

$this->session->data['success'] = $this->language->get('text_success');

$this->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'));
}

//This is how the language gets pulled through from the language file.
//
// If you want to use any extra language items - ie extra text on your admin page for any reason,
// then just add an extra line to the $text_strings array with the name you want to call the extra text,
// then add the same named item to the $_[] array in the language file.
//
// 'my_module_example' is added here as an example of how to add - see admin/language/english/module/my_module.php for the
// other required part.

$text_strings = array(
'heading_title',
'text_enabled',
'text_disabled',
'text_content_top',
'text_content_bottom',
'text_column_left',
'text_column_right',
'entry_layout',
'entry_limit',
'entry_image',
'entry_position',
'entry_status',
'entry_sort_order',
'button_save',
'button_cancel',
'button_add_module',
'button_remove',
'entry_cat_before',
'entry_part_name',
'entry_cat_after',
'entry_example' //this is an example extra field added
);

foreach ($text_strings as $text) {
$this->data[$text] = $this->language->get($text);
}
//END LANGUAGE

//The following code pulls in the required data from either config files or user
//submitted data (when the user presses save in admin). Add any extra config data
// you want to store.
//
// NOTE: These must have the same names as the form data in your my_module.tpl file
//
$config_data = array(
'my_module_example' //this becomes available in our view by the foreach loop just below.
);

foreach ($config_data as $conf) {
if (isset($this->request->post[$conf])) {
$this->data[$conf] = $this->request->post[$conf];
} else {
$this->data[$conf] = $this->config->get($conf);
}
}

//This creates an error message. The error['warning'] variable is set by the call to function validate() in this controller (below)
if (isset($this->error['warning'])) {
$this->data['error_warning'] = $this->error['warning'];
} else {
$this->data['error_warning'] = '';
}

//SET UP BREADCRUMB TRAIL. YOU WILL NOT NEED TO MODIFY THIS UNLESS YOU CHANGE YOUR MODULE NAME.
$this->data['breadcrumbs'] = array();

$this->data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/home', 'token=' . $this->session->data['token'], 'SSL'),
'separator' => false
);

$this->data['breadcrumbs'][] = array(
'text' => $this->language->get('text_module'),
'href' => $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL'),
'separator' => ' :: '
);

$this->data['breadcrumbs'][] = array(
'text' => $this->language->get('heading_title'),
'href' => $this->url->link('module/my_module', 'token=' . $this->session->data['token'], 'SSL'),
'separator' => ' :: '
);

$this->data['action'] = $this->url->link('module/my_module', 'token=' . $this->session->data['token'], 'SSL');

$this->data['cancel'] = $this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL');


//This code handles the situation where you have multiple instances of this module, for different layouts.
$this->data['modules'] = array();

if (isset($this->request->post['my_module_module'])) {
$this->data['modules'] = $this->request->post['my_module_module'];
} elseif ($this->config->get('my_module_module')) {
$this->data['modules'] = $this->config->get('my_module_module');
}

$this->load->model('design/layout');

$this->data['layouts'] = $this->model_design_layout->getLayouts();

//Choose which template file will be used to display this request.
$this->template = 'module/my_module.tpl';
$this->children = array(
'common/header',
'common/footer',
);

/*My test module*/
//Taking all parent categories
$this->load->model('catalog/category');
$this->data['module_category'] = $this->model_catalog_category->getAllCategories();  //выводит список категорий в <select> 

/*End of test module*/
//Send the output.
$this->response->setOutput($this->render());

}

/*Моя функция для обработки AJAX*/
public function aj(){
      $this->load->language('module/my_module');
      $category_id = $this->request->get['category_id'];

      if ($category_id > 0) {
            //loading the AJAX
            $this->template = 'module/my_module.tpl';
            $this->load->model('catalog/product');
            $product = $this->model_catalog_product->getProduct($category_id);
            $data['product'] = $product;
            $this->response->setOutput($this->render());
}


/*
* This function is called to ensure that the settings chosen by the admin user are allowed/valid.
* You can add checks in here of your own.
*
*/

private function validate() {
if (!$this->user->hasPermission('modify', 'module/my_module')) {
$this->error['warning'] = $this->language->get('error_permission');
}

if (!$this->error) {
return TRUE;
} else {
return FALSE;
}
}

}
?>


 

AJAX функция в шаблоне (срабатывает при выборе нужного значения в списке <select>):

 $('#category').on('change', function() {
        $.ajax({
          type: 'get',
          url: 'index.php?route=module/my_module/aj&token=<?php echo $token; ?>',
          data: 'category_id='+this.value,
          dataType: 'html',
          beforeSend: function(){
              console.log("Send");
          },
          success: function(htmlText){
              console.log(htmlText);
        },
        error: function(xhr, textStatus, error){
          console.log(xhr.responseText);
          console.log(textStatus);
          console.log(error);
      }
    }); 

Первая проблема в том, что контроллер не может поймать параметры get запроса и, как следствие, обработать его. Вторая проблема - даже если я пишу простую переменную в функции-обработчике, в ответе console.log(xhr.responseText) выводит весь HTML код шаблона.

 

Я пробовал делать всё через JSON (создавал простой массив в функции контроллера и ставил его на вывод через $this->response->setOutput(json_encode($json))), но из-за проблемы с выводом в AJAX была ошибка парсинга JSON (т.к. выводится весь HTML код, а не ожидаемая пара "ключ-значение"). 

 

Что я делаю не так? 

 

Заранее благодарен за помощь. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ArtemPitov    331

если json

$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode( ..тут возврат массива в json.. ));
 $('#category').on('change', function() {

    var id = 'category_id='+this.value;

    $.ajax({
        type: 'GET',
        url: 'index.php?route=module/my_module/aj',
        data: id,
        dataType: 'html',
        beforeSend: function(){
          console.log("Send");
        },
        success: function(htmlText){
          console.log(htmlText);
        },
        error: function(xhr, textStatus, error){
          console.log(xhr.responseText);
          console.log(textStatus);
          console.log(error);
      }
    });
public function aj(){
  
    $this->load->language('module/my_module');
    if isset($this->request->get['category_id']) {

      $product = $this->model_catalog_product->getProduct($category_id);

      $this->response->setOutput($product);

      if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/my_module.tpl'))  
          $this->template = $this->config->get('config_template') . '/template/module/my_module.tpl';
      else $this->template = 'default/template/module/my_module.tpl'; 
    } else  $this->response->setOutput('ERROR');

} 

Пробуйте так, писал на скорую руку мог и ошибиться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
UnclePasha    0

если json

$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode( ..тут возврат массива в json.. ));
 $('#category').on('change', function() {

    var id = 'category_id='+this.value;

    $.ajax({
        type: 'GET',
        url: 'index.php?route=module/my_module/aj',
        data: id,
        dataType: 'html',
        beforeSend: function(){
          console.log("Send");
        },
        success: function(htmlText){
          console.log(htmlText);
        },
        error: function(xhr, textStatus, error){
          console.log(xhr.responseText);
          console.log(textStatus);
          console.log(error);
      }
    });
public function aj(){
  
    $this->load->language('module/my_module');
    if isset($this->request->get['category_id']) {

      $product = $this->model_catalog_product->getProduct($category_id);

      $this->response->setOutput($product);

      if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/my_module.tpl'))  
          $this->template = $this->config->get('config_template') . '/template/module/my_module.tpl';
      else $this->template = 'default/template/module/my_module.tpl'; 
    } else  $this->response->setOutput('ERROR');

} 

Пробуйте так, писал на скорую руку мог и ошибиться

 

А где ставить заголовки и json output? В функции index или в функции для ajax? 

Пока создал функцию по образцу вашей, отредактировал ajax запрос, результат вывел в alert(htmlText), получилось то, что на скриншоте во вложении.  

post-711288-0-45204800-1464795167_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ArtemPitov    331

для начала поясните что он должен делать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
UnclePasha    0

для начала поясните что он должен делать

Он должен принимать через get запрос выбранную категорию (из списка <select> в шаблоне) в контроллер, затем переданная категория служит аргументом для функции getProductsByCategoryId, получаем массив товаров и парсим его обратно в .tpl файл. Это первое, что хочу сделать в модуле. Потом, на втором этапе, этот товар будет присвоен новой категории. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ArtemPitov    331

Он должен принимать через get запрос выбранную категорию (из списка <select> в шаблоне) в контроллер, затем переданная категория служит аргументом для функции getProductsByCategoryId, получаем массив товаров и парсим его обратно в .tpl файл. Это первое, что хочу сделать в модуле. Потом, на втором этапе, этот товар будет присвоен новой категории. 

так откройте любой стандартный модуль и не посмотрите как там сделано и не выдумывайте велосипед 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
UnclePasha    0

так откройте любой стандартный модуль и не посмотрите как там сделано и не выдумывайте велосипед 

 

А вы можете привести такой пример? Насколько я смотрел, функционал модулей в админпанели однообразен, там лишь форма с изменением положения модуля, кнопкой сохранения и удаления. А по ТЗ надо сделать функционал, который я описал выше, именно в админке. Это разве невозможно? Не сарказм, просто вопрос к профессионалу :)

Custom функций в стандартных модулях я также не увидел, только index() и validate(). Может, я действительно пошел не по тому пути? 

Изменено пользователем UnclePasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ArtemPitov    331

А вы можете привести такой пример? Насколько я смотрел, функционал модулей в админпанели однообразен, там лишь форма с изменением положения модуля, кнопкой сохранения и удаления. А по ТЗ надо сделать функционал, который я описал выше, именно в админке. Это разве невозможно? Не сарказм, просто вопрос к профессионалу :)

Custom функций в стандартных модулях я также не увидел, только index() и validate(). Может, я действительно пошел не по тому пути? 

Пишите в ЛС подробный функционал, я не совсем "вехал" что там должно быть  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От Jonsonnnn
      Всем привет! Интересует мнение профи opencart по поводу шаблона лайтшоп.
       
      Стоит ли его покупать ? Оправдана цена за такой шаблон? Какие могут с ним возникнуть подводные камни ? 
       
      Есть ли у кого-то готовый магазин который уже работает ? 
      Хотелось бы услышать мнение специалистов, а то не хотелось бы выкинуть деньги на ветер 
    • От nikeforce111
       Добрый день,
      Интересует такой вопрос, можно ли сделать или разработать калькулятор для отдельной категории на ocstore 1.5.5.1.2 либо может есть возможность приобрести какой то модуль? подскажите пожалуйста
      Категория называется дымоходы, в ней будет очень много труб и комплектующих. 
      На сегодняшний день там просто куча товара, который можно подобрать с помощью фильтра. Но это не весь товар будет еще добавляться около 1000 товаров, а то и более и будет бардак.
      Очень понравился калькулятор вот на это сайте, хотелось бы на подобии как вот тут www.ochag.by/catalog/dymo... только для отдельной категории ДЫМОХОДЫ 


    • От BobbyBob
      Добрый день!
      Необходимо починить фильтр, вынести характеристики в карточке товара, сделать Sitemap только с категориями и специальным фоном в отдельной странице, вынести доп. инфо в список товаров
      Шаблон Journal2
      Возможно еще потребуются некоторые работы
      Готов обсуждать объем работы и цену
      Пишите сюда или на почту Butch_yep@mail.ru
    • От katilina


      Просмотр файла July - адаптивный шаблон для ocStore/Opencart
      Адаптивный шаблон July.
      разработчики ShopUtils и Katilina
      Демо для версии ocstore - opencart 2.0.x - 2.1.x -2.2.x - 2.3
      Версия для 2.3.x - скачивайте архив july_ocstore_opencart_2.3_v2.16.07.14.zip

      april.mattimeo.ru
      mart.mattimeo.ru
      august.mattimeo.ru
      ДОКУМЕНТАЦИЯ april.mattimeo.ru/documentation
       
      Демо для версии ocstore 1.5.5.1.2

      july.mattimeo.ru
      may.mattimeo.ru
      june.mattimeo.ru
      Внимание! Версии шаблона под 1.5.х и под 2.х лицензируются отдельно даже для одного домена.
      Ключ на домен, у которого уже есть ключ для версии 15512, выдаётся за дополнительную плату 1500 руб.
      Поддержка движка другой версии в цену одного шаблона не входит
       

       
      Системные требования:
      - ocStore v1.5.4.x - 2.3.x / Opencart 1.5.4.x - 1.5.6.x, Opencart 2.0.x - 2.1.x - 2.2.x - 2.3.x
      Будьте внимательны при установке движка. Opencart.Pro с шаблоном не протестирован.
      - Ioncube Loader v4.5+ (для 2.x - 5.0+)
      - PHP v5.3+
      - vQmod v2.4.1 (только для 1.5.x)
      В версии шаблона для 2.0.x - 2.1.x - 2.2.x
      - Вы можете включить отображение опций в модулях и в выбранных категориях ( опции в блоке товара или в модальном окне на Ваш выбор)
      - Выбор количества товара в модулях и в категориях
      - Выбор сеток товара на странице категорий ( по 5, 4, 3 в ряд или 2 вида списка)
      - Новости с категориями
      - Дополнительные модули для новостей ( избранные, последние, тэги, разделы новостей)
      - Возможность прикреплять товары к новостям
       

       
      July тема - позитивный и чистый шаблон. Если Вы хотите иметь уникальный, привлекательный дизайн и пытаетесь сделать свой стиль среди многочисленных владельцев магазинов, July тема является прекрасной отправной точкой для Вас.
      Демо-данные высылаются по просьбе покупателя
      http://july.mattimeo.ru/docs/img/boots.png Шаблон использует технологию вёрстки bootstrap3
      http://july.mattimeo.ru/docs/img/user_part2.jpg
      Мы стараемся для Вас. Если Вам понравилась тема, не забудьте поставить 5 звёздочек
      В шаблоне есть также модуль новостей, подписка на новости магазина,
      возможность очистить кэш из админ панели управления сайтом.
      Вы можете загрузить настройки шаблона, сохранить настройки шаблона.
      Список модулей будет увеличиваться.
      Рекомендуем модули
      1. Живая цена - Динамическое обновление цены
      2. FilterPro Патч для модуля в архиве july_for_filterpro.zip
      3. SEO CMS TOP 2: Блог | Новости | Отзывы | Галерея | Формы
      4. Дополнительные вкладки на странице товара Патч для шаблона, купившим модуль
      Добавил katilina Добавлено 09.11.2015 Категория Платные шаблоны Системные требования ocStore v1.5.4.x - 2.x / Opencart 1.5.4.x - 1.5.6.x, Opencart 2.0.x - 2.1.x - 2.2.x - 2.3.xIoncube Loader v4.5+ (для 2.x - 5.0+)PHP v5.3+vQmod v2.4.1+ (только для 1.5.x) Сайт разработчика Старая цена Метод активации По запросу в ЛС Ioncube Loader Требуется OpenCart 2.3
      2.2
      2.1
      1.5.6.4
      1.5.6.3
      1.5.6.2
      1.5.6.1
      1.5.6
      1.5.4.1 ocStore 2.3
      2.2
      2.1
      1.5.5.1.2
      1.5.5.1.1
      1.5.5.1
      1.5.4.1.2
      1.5.4.1.1
      1.5.4.1 OpenCart.Pro, ocShop  
    • От katilina
      Адаптивный шаблон July.
      разработчики ShopUtils и Katilina
      Демо для версии ocstore - opencart 2.0.x - 2.1.x -2.2.x - 2.3
      Версия для 2.3.x - скачивайте архив july_ocstore_opencart_2.3_v2.16.07.14.zip

      april.mattimeo.ru
      mart.mattimeo.ru
      august.mattimeo.ru
      ДОКУМЕНТАЦИЯ april.mattimeo.ru/documentation
       
      Демо для версии ocstore 1.5.5.1.2

      july.mattimeo.ru
      may.mattimeo.ru
      june.mattimeo.ru
      Внимание! Версии шаблона под 1.5.х и под 2.х лицензируются отдельно даже для одного домена.
      Ключ на домен, у которого уже есть ключ для версии 15512, выдаётся за дополнительную плату 1500 руб.
      Поддержка движка другой версии в цену одного шаблона не входит
       

       
      Системные требования:
      - ocStore v1.5.4.x - 2.3.x / Opencart 1.5.4.x - 1.5.6.x, Opencart 2.0.x - 2.1.x - 2.2.x - 2.3.x
      Будьте внимательны при установке движка. Opencart.Pro с шаблоном не протестирован.
      - Ioncube Loader v4.5+ (для 2.x - 5.0+)
      - PHP v5.3+
      - vQmod v2.4.1 (только для 1.5.x)
      В версии шаблона для 2.0.x - 2.1.x - 2.2.x
      - Вы можете включить отображение опций в модулях и в выбранных категориях ( опции в блоке товара или в модальном окне на Ваш выбор)
      - Выбор количества товара в модулях и в категориях
      - Выбор сеток товара на странице категорий ( по 5, 4, 3 в ряд или 2 вида списка)
      - Новости с категориями
      - Дополнительные модули для новостей ( избранные, последние, тэги, разделы новостей)
      - Возможность прикреплять товары к новостям
       

       
      July тема - позитивный и чистый шаблон. Если Вы хотите иметь уникальный, привлекательный дизайн и пытаетесь сделать свой стиль среди многочисленных владельцев магазинов, July тема является прекрасной отправной точкой для Вас.
      Демо-данные высылаются по просьбе покупателя
      http://july.mattimeo.ru/docs/img/boots.png Шаблон использует технологию вёрстки bootstrap3
      http://july.mattimeo.ru/docs/img/user_part2.jpg
      Мы стараемся для Вас. Если Вам понравилась тема, не забудьте поставить 5 звёздочек
      В шаблоне есть также модуль новостей, подписка на новости магазина,
      возможность очистить кэш из админ панели управления сайтом.
      Вы можете загрузить настройки шаблона, сохранить настройки шаблона.
      Список модулей будет увеличиваться.
      Рекомендуем модули
      1. Живая цена - Динамическое обновление цены
      2. FilterPro Патч для модуля в архиве july_for_filterpro.zip
      3. SEO CMS TOP 2: Блог | Новости | Отзывы | Галерея | Формы
      4. Дополнительные вкладки на странице товара Патч для шаблона, купившим модуль
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу