Jump to content
rewuxiin

получение 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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

 

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

 

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

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

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

Share this post


Link to post
Share on other sites

Попробуй вот так результат возвращать:

header('Content-type: application/json');
echo json_encode($result[0]);

Share this post


Link to post
Share on other sites

Где $result[0] для примера, вообщем там массив должен быть.

Share this post


Link to post
Share on other sites

 

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

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

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

 

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

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

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

заработало!

 

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

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

 

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

 

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

 

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

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

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

 

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

Share this post


Link to post
Share on other sites

print_r каждого шага в обработке ajax запроса в php файле поможет Вам решить проблему..

Share this post


Link to post
Share on other sites

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

Edited by Kerm

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

Как ajax вообще связан со smarty? каким образом?

Share this post


Link to post
Share on other sites

Как ajax вообще связан со smarty? каким образом?

 

Это, как я понимаю, риторический вопрос?! :)

Share this post


Link to post
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), подсказал куда копать!

Share this post


Link to post
Share on other sites

×

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More