Перейти к содержанию

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

Всем привет! Разрабатываю свой первый модуль для 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 код, а не ожидаемая пара "ключ-значение"). 

 

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

 

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

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


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

если 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

$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

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


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

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

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


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

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

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

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


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

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

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

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


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

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

 

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

Войти

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

Войти

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

    • От chirs
      1 500.00 руб
      Скачать/Купить дополнение


      Мульти-Опции NEW
      Модуль Мульти-Опции расширяет возможности стандартных опций:
      Зависимость опции от другой опции или нескольких опций - изначально опция скрыта и отображается после выбора значения в родительской опции Зависимость опции от значения или нескольких значений другой опции - изначально опция скрыта и отображается после выбора конкретного значения или значений родительской опции Возможность указания количества покупаемых опций Возможность отображения значений опций в виде кнопки-картинки Указание значения по-умолчанию для опции Скидки на опции, в т.ч. в зависимости от количества Возможность указать конкретную стоимость опции (знак "=") Возможность настроить порядок вывода опций на странице товара Живая цена - динамическое отображение изменений цены в зависимости от выбранных опций Картинки для опций без ограничений  
      Демонстрация:
      Страница товара
      Админка (логин: demo, пароль: demo)
       
      Обратите внимание:
      Если у вас установлена тема (шаблон), сильно отличающаяся от стандартной, очень вероятно, что потребуются доработки модуля, поскольку невозможно предусмотреть все вариации тем сторонних разработчиков. Кроме того, у вас могут уже быть установлены другие модули других разработчиков, которые могут вызвать конфликты совместимости.
      Поэтому:
      По стоимости модуля вы так же покупаете мою полную техподдержку. Всё, что необходимо - это в случае необходимости доработок написать мне и я обязательно помогу в течение 1-2 дней с донастройкой, а так же могу немного навести "красоту" под вашу тему opencart-а.
      Добавил chirs Добавлено 11.01.2019 Категория Опции Системные требования Сайт разработчика http://opencart2x.codernotes.ru Старая цена Метод активации Без активации Ioncube Loader Нет OpenCart 2.3
      2.2
      2.1 ocStore 2.3
      2.2
      2.1 OpenCart.Pro, ocShop Opencart.pro 2.3
      Opencart.pro 2.1 Обращение к серверу разработчика  
    • От DSV
      2 500.00 руб
      Скачать/Купить дополнение


      Grand - адаптивный универсальный шаблон
      Grand – многоцелевой, настраиваемый, легкий в использовании и полностью адаптивный шаблон для работы современного интернет магазина. 
      Подходит для любого типа магазина: одежда, обувь, электроника, спорт, ювелирные изделия и многое другое ...
       
      Демонстрация
      Магазин: http://grand.kreativ.pro/
      Админка: http://grand.kreativ.pro/admin/ , доступ: demo / demo
       
      Совместимость
      Работает с Opencart v3.0, Русская сборка OpenCart v3.0
       
      Настройки:
      "Быстрый Старт" (Quick Start).
      Настройка основных цветов в админке
      Добавление CSS в админке
      Добавление JavaScript в админке
      Модуль "Настройка шаблона"
      Модуль "Баннеры"
      Модуль "Новости" (с добавлением сопутствущих товаров)
      Модуль "Категории на главной", с возможностью выбора категорий, выводятся блоками по одной категории
      Модуль "Заказ в 1 клик" (с учетом в админке)
      Модуль "Вывод текста во всплывающем окне"
      Модуль "Дополнительные вкладки в карточке товара"
      Модуль "Нашли дешевле?"
      Модуль "Заказ обратного звонка" (с учетом в админке)
      Модуль "Подписка на новости"
      Модуль "Просмотренные товары"
      Модуль "Рекомендуемые" (добавляете свои товары и меняете заглавие на свое)
      Модуль "Слайдшоу" (с возможностью добавления своего текста и некоторыми настройками)
      Модуль "Сообщить когда появится"
      Модуль "Текстовые баннеры"
      Модуль "Быстрый просмотр товара"
      Вывод Артикула (SKU) в карточке товара
      Добавление карты на странице "Контакты"
      Пользовательские меню в шапке сайта
      Контактная информация в шапке сайта
      Контактная информация в подвале сайта
      Трехуровневое основное и боковое меню
      Основное меню (свои ссылки, бренды, информация, контакты)
      Стикер товара – Акция
      Иконки социальных сетей в шапке сайта
      Иконки социальных сетей в подвале
      Иконки платежных систем в подвале сайта
      Свои иконки социальных сетей в карточке товара и в новостях
      Zoom эффект изображения в карточке товара
      Возможность отключения кнопки "Купить" и "Заказ в один клик" если товара нет в наличии
      Свои ссылки в подвале сайта
      Слайдер дополнительных изображений в карточке товара
      Всплывающее окно при нажатии кнопки купить
      Авторизация во всплывающем окне
      В настройках шаблона можно добавить логотип в подвале сайта
      Хлебные крошки - убраны ссылки страницы на саму себя
      Вкл/Выкл краткого описания товаров
      Вкл/Выкл прокрутки в модулях (рекомендуемые, акции, бестселлер, новинки, блог)
      Вкл/Выкл картинки категорий в списке товаров
      Вкл/Выкл кнопки в "Закладки", в "Сравнение"
      Вкл/Выкл ссылок в подвале сайта
      Вкл/Выкл микроразметки карточки товара
      Вкл/Выкл поворота картинки при наведении курсора
      Вкл/Выкл Условия соглашения (Контакты, Быстрый заказ, Заказ звонка)
       
      Лицензия:
      Шаблон можно использовать только на одном основном домене (тестовые без ограничений).
       
      Техническая поддержка
      Через личные сообщения на данном форуме.
      Поддержка производится только пользователям, числящимся в списке покупателей шаблона.
      Добавил DSV Добавлено 09.12.2018 Категория Платные шаблоны Системные требования Сайт разработчика dsv@kreativ.pro Старая цена Метод активации Без активации Ioncube Loader Нет OpenCart 3.0 ocStore Несовместим OpenCart.Pro, ocShop  
    • От yurggen80
      У меня одного такая проблема: когда на сайте регистрируется Продавец, то админу на почту приходит уведомление и регистрации нового ... ПОКУПАТЕЛЯ!?
      Потом, нужно активировать этого Покупателя, а потом, его же - как Продавца.
      Короче, геморр какой-то. Программист говорит, что так задано.
      Версия ocStore 2.1.0.2.1
    • От Alex010790
      Требуется специалист в Opencart для сотрудничества на постоянной основе, доработки готового сайта. На данный момент актуальная задача исправить ошибки  от Я Маркет по  Yml 
    • От chirs
      Модуль Мульти-Опции расширяет возможности стандартных опций:
      Зависимость опции от другой опции или нескольких опций - изначально опция скрыта и отображается после выбора значения в родительской опции Зависимость опции от значения или нескольких значений другой опции - изначально опция скрыта и отображается после выбора конкретного значения или значений родительской опции Возможность указания количества покупаемых опций Возможность отображения значений опций в виде кнопки-картинки Указание значения по-умолчанию для опции Скидки на опции, в т.ч. в зависимости от количества Возможность указать конкретную стоимость опции (знак "=") Возможность настроить порядок вывода опций на странице товара Живая цена - динамическое отображение изменений цены в зависимости от выбранных опций Картинки для опций без ограничений  
      Демонстрация:
      Страница товара
      Админка (логин: demo, пароль: demo)
       
      Обратите внимание:
      Если у вас установлена тема (шаблон), сильно отличающаяся от стандартной, очень вероятно, что потребуются доработки модуля, поскольку невозможно предусмотреть все вариации тем сторонних разработчиков. Кроме того, у вас могут уже быть установлены другие модули других разработчиков, которые могут вызвать конфликты совместимости.
      Поэтому:
      По стоимости модуля вы так же покупаете мою полную техподдержку. Всё, что необходимо - это в случае необходимости доработок написать мне и я обязательно помогу в течение 1-2 дней с донастройкой, а так же могу немного навести "красоту" под вашу тему opencart-а.
  • Последние посетители   0 пользователей онлайн

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

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.