Jump to content

получение json в ajax из контроллера


Recommended Posts

надеюсь знатоки натолкнут на понимание вопроса.

 

я лишь немного пишу на php, с ajax и json знаком, однако так и не понял как работать с ними в prestashop

документацию читал, возможно не наткнулся на то что нужно.
так же, как пример, рассматривал модуль ajaxcart.

 

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

получаю данные, отправляю в smarty

    public function hookDisplayHome($params) {
        $vendors = array();


        $sql = 'SELECT * FROM `podbor_shini_i_diski`';


        $results = Db::getInstance()->ExecuteS($sql); 
       
            foreach ($results as $row) {
            $vendors[] = $row['vendor'];
        }  
        $this->context->smarty->assign(array(
            'vendors' => array_unique($vendors),
        ));
 return $this->display(__FILE__, 'selectioncar.tpl');

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

вот как здесь http://basecontent.info/stats/podbor_shini_diski/new/podbor.php

в контроллере создаю функцию 

 

которая допустим вернет мне модель
 

public function displayAjax($post){
        $models = array();
        if (!empty($post['vendor']) != 0) {
            foreach ($results as $row) {
                if ($row['vendor'] == $post['vendor']) {
                    $models[] = $row['car'];
                }
            }                        
        }
        
        return $models;        


    }

создаю файл selectioncar-ajax.php

 

include_once(dirname(__FILE__).'/selectioncar.php');
$context = Context::getContext();
$selectionCar = new selectioncar();
$models = $selectionCar->displayAjax($_POST);


 die(Tools::jsonEncode(array('models'=>$models)));

ну и jquery

 

function retMod() {
    data = $('#carTyre').serialize();
    
    $.ajax({        
        type: 'POST',
        headers: {"cache-control": "no-cache"},
        url: baseDir + 'modules/selectioncar/selectioncar-ajax.php',
        async: true,
        cache: false,
        data: data,
        success:function(res){
            alert(res);
        }
    });
}

однако алерт получаю пустой.

 

как же получить данные?

Edited by rewuxiin (see edit history)
Link to comment
Share on other sites

Попробуйте в $.ajax data добавить параметр ajax=true. Насколько я помню, именно так контроллер понимает, что это был ajax-запрос.

спасибо, действительно это я упустил, однако всеравно вернувшийся алерт - пуст((

Link to comment
Share on other sites

Может потому что dataType: "json" забыл указать?

var number = $number;
var product_id = $product_id;
$.ajax({
						type: "POST",
						url: "/ajax-info.php",
						dataType: "json",
						data: {
							'number': number,
							'product_id': product_id
						},
						cache: false,

						success: function(data) {}
Edited by Kerm (see edit history)
Link to comment
Share on other sites

 

Может потому что dataType: "json" забыл указать?

 

возможно. добавил, теперь возвращается null. 

массив, на всякий случай, в  selectioncar-ajax.php , для проверки, заполнял

  die(Tools::jsonEncode(array('models'=>'test')));
Link to comment
Share on other sites

 

возможно. добавил, теперь возвращается null. 

массив, на всякий случай, в  selectioncar-ajax.php , для проверки, заполнял

  die(Tools::jsonEncode(array('models'=>'test')));

 

А в отладке если пройти?

Это уже вообще на какие сказки похоже.

Вы вообще попадаете в selectioncar-ajax.php?

И еще, Вы уверены, что Вам вообще контроллер нужен?

Link to comment
Share on other sites

А в отладке если пройти?

Это уже вообще на какие сказки похоже.

Вы вообще попадаете в selectioncar-ajax.php?

И еще, Вы уверены, что Вам вообще контроллер нужен?

в отладке ошибок нет.

при открытии по прямому пути файла /modules/selectioncar/selectioncar-ajax.php - пусто

 

попробовал отключить файл 

include_once(dirname(__FILE__).'/selectioncar.php');

заработало!

 

но что это значит? дальнейшую логику писать в /selectioncar-ajax.php ?

и почему считаете что контроллер мне не нужен?

 

прошу прощения если что-то очевидное упускаю, привык делать все в MVC, а там получил в модель, обработал в контроллере, отдал во вью

 

Link to comment
Share on other sites

Ну если привыкли к правильному (а MVC - это несомненно правильное), то тогда

 

1. в папке модуля заводите папку /controllers/front

2. создаете там контроллер (ИмяКонтроллера.php)

 

class ИмяКонтроллераModuleFrontController extends ModuleFrontController {

 

    public function postProcess()
    {

        die(Tools::jsonEncode(array( 'models'=>'test',)));

    }
 

}

 

3. в java пишете

...

url: {$link->getModuleLink('ИмяМодуля', 'ИмяФайлаКонтроллера', ['параметр1' => 'параметр1значение'])|addslashes}

...

 

 

Это будет схематично как-то так, как Prestashop'овцы прописали. :-)

  • Like 1
Link to comment
Share on other sites

что-то у меня вашим Js непонятно

как его использовать-то? я подобную запись нашел только в формах prestashop

url: {$link->getModuleLink('ИмяМодуля', 'ИмяФайлаКонтроллера', ['параметр1' => 'параметр1значение'])|addslashes}
Link to comment
Share on other sites

 

что-то у меня вашим Js непонятно

как его использовать-то? я подобную запись нашел только в формах prestashop

url: {$link->getModuleLink('ИмяМодуля', 'ИмяФайлаКонтроллера', ['параметр1' => 'параметр1значение'])|addslashes}

 

Этот url: - это параметр из $.ajax. Использовать через .tpl - либо полностью скрипт там писать, либо скрипт подключать отдельно (с переменной), а переменную определять в .tpl.

Link to comment
Share on other sites

Причем здесь вообще смарти...открываешь php файл и распечатываешь вывод шагов в обработке ajax запроса в файл через "file_put_contents" и ищешь ошибку...

Edited by Kerm (see edit history)
Link to comment
Share on other sites

я имел ввиду работу ajax в смарти.

 

а вы видимо мне советуете как правильно поступить в самом первом случае который я пытался сделать?

Link to comment
Share on other sites

а дело было так.
при подключении в

selectioncar-ajax.php

контроллера

selectioncar.php

происходила проверка

if (!defined('_PS_VERSION_'))    exit;

и происходил тот самый exit

 

а нужно-то было в selectioncar-ajax.php добавить

require_once(dirname(__FILE__).'/../../config/config.inc.php');require_once(dirname(__FILE__).'/../../init.php');

спасибо максиму (absent), подсказал куда копать!

Link to comment
Share on other sites

×
×
  • Create New...