Jump to content

Class 'ModuleFrontController' not found seulement avec Ajax


Recommended Posts

bonjour

je veux afficher une liste d'elements en fonction d'une autre list,

j'ai utiliser ajax mais au lieu d'afficher les elements

j'ai cette erreur

Fatal error:  Class 'ModuleFrontController' not found in D:\xampp\htdocs\prestashop\modules\vitrine\controllers\front\display.php on line 4

 

le message ne s'affiche que lorsque une requette http est declenché

 

 

class VitrineDisplayModuleFrontController extends ModuleFrontController

{

public function initContent()

{

parent::initContent();

//$product = new ProductCore();

$products_partials = Product::getProducts(1, 0, 0, 'id_product', 'DESC' );

$products = Product::getProductsProperties(1, $products_partials);

foreach ($products as $key => $product) {

$cover = Product::getCover($product['id_product']);

$products[$key]["id_image"] = $cover["id_image"];

 

}

$adhesif = AdhesifModel::findAll();

//$Images = ImageModel::findAll();

$subcategory = SubCategoryModel::findAll();

$this->context->smarty->assign('subcategories',$subcategory);

$this->context->smarty->assign('img','http://localhost/prestashop/img/vitrine/');

$this->context->smarty->assign('products',$products);

$this->context->smarty->assign('adhesifs',$adhesif);

$this->context->smarty->assign('products',$products);

if(Tools::getValue('subcategory')){

$subcategoryImages = SubCategoryImagesModel::find(Tools::getValue('subcategory'));

$this->context->smarty->assign('subcategoryImages',$subcategoryImages);

}

$this->setTemplate('vitrine.tpl');

}

}

 

 

 

merci

Link to comment
Share on other sites

Bonjour,

 

Votre contrôleur me semble bien formé. (Par contre, si possible, pensez à utiliser la balise code pour mentionner du code afin que ce soit plus lisible ;-)) et il n'y a donc pas à chercher dans celui-ci, je pense.

 

C'est plutôt dans votre appel AJAX, qu'il va falloir voir. Il semble que vous appelez le fichier php directement ; ce qui l'empêche de faire ses inclusions de fichiers de base.

Link to comment
Share on other sites

bonjour,

pour l'appel Ajax j'utilisé 2 scripts différents et toujours le même résultat

le script se trouve dans un fichier tpl

function getXhr(){
                                var xhr = null; 
				if(window.XMLHttpRequest) // Firefox et autres
				   xhr = new XMLHttpRequest(); 
				else if(window.ActiveXObject){ // Internet Explorer 
				   try {
			                xhr = new ActiveXObject("Msxml2.XMLHTTP");
			            } catch (e) {
			                xhr = new ActiveXObject("Microsoft.XMLHTTP");																																		1
			            }
				}
				else { // XMLHttpRequest non supporté par le navigateur 
				   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
				   xhr = false; 
				} 
                                return xhr;
			}
 
			/**
			* Méthode qui sera appelée sur le click du bouton
			*/
			function go(){
				var xhr = getXhr();
				
				sel = document.getElementById('subcategory');
				subcategory = sel.options[sel.selectedIndex].value;
				xhr.open("GET","http://localhost/prestashop/modules/vitrine/controllers/front/display.php?subcategory="+subcategory,true);
				xhr.send("null");
                           }

et voici le 2 script

 var sel = document.getElementById('subcategory');
                var im = document.getElementById('image');
                id = sel.options[sel.selectedIndex].value;
                $.ajax({
                type: 'POST',
                url: 'http://localhost/prestashop/modules/vitrine/controllers/front/Display.php',
                dataType: 'json',
                data: {
                    controller : 'VitrineDisplayModuleFrontController',
                    action : 'ajaxProcessGetId',
                    ajax : true,
                    id_sub : id
                },
                success: function(jsonData)
                {
                         //alert(jsonData);
                          $.each(jsonData, function(index, value)
                           {
                        $im.append('<option value="'+ index +'">'+ value +'</option>');
                            });
                }
                });

j'ai ajouté une fonction pour ce 2 script

	public function ajaxProcessGetId()
  {
      $id = Tools::getValue('id_sub');
      $subcategoryImages = SubCategoryImagesModel::find($id);
      echo json_encode($subcategoryImages);
      if($subcategoryImages)
         die(Tools::jsonEncode(array(
             'id' => htmlspecialchars($subcategoryImages['id']))
         ));
  }

 merci d'avoir pris le temps de repondre

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

Voilà donc le problème, vous faites un appel direct à votre fichier PHP.

 

Si vous utilisez un TPL (je passe le fonctionnement de votre module et de votre script, ce n'est pas le sujet et c'est votre méthode, par contre), vous pouvez modifier l'URL par ceci, par exemple: 

{$link->getModuleLink('nomdumodule', 'nomducontrolleur')|escape:'html':'UTF-8'}

Sinon, vous devez définir votre URL dans le contrôleur et, en JS, faire ainsi par exemple:

 $.ajax({
        url : ajax_link,
        data : {
          ajax:true,
          fc: 'module',
          controller: 'ajax',
          module: 'nomdumodule',
          processUnTruc: 1
        }
      });

 

Pour la manière et la méthode, elle est libre. Disons juste que l'appel direct au fichier PHP du module ne peut pas se faire, quoiqu'il arrive.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...