Question

J'ai passé les derniers jours à essayer de comprendre comment transmettre des variables de mon contrôleur à mon modèle.J'essaie de créer un filtre de produit très simple qui prend des entrées de forme et crée une collection de produits basée sur celles-ci.J'ai le formulaire construit et j'utilise AJAX :

jQuery.ajax(
    {
        url: formURL,
        type: "POST",
        data: {
            location : location,
            width : width
        },
        success: function() {
            alert('form good');
        },
        error: function() {
            alert('form issue');
        } 
    });

poster sur mon contrôleur :

    class Custom_GateSelector_IndexController extends Mage_Core_Controller_Front_Action
{
    public function indexAction() 
    {
        $gate_location = $this->getRequest()->getPost('location');
        $gate_width    = $this->getRequest()->getPost('width');
    }
}

Ensuite, j'ai besoin que les deux variables soient disponibles dans mon modèle :

    class Custom_GateSelector_Model_Products extends Mage_Catalog_Model_Product
{
  public function getItemsCollection()
  {
      $topStairs = 'yes';
      $gateWidth = 29.00;
      $rootcatID = Mage::app()->getStore()->getRootCategoryId();

      $collection = $this->getCollection()
          ->addAttributeToSelect('*')
          ->addAttributeToFilter('gate_max_width', array('gt' => $gateWidth))
          ->addAttributeToFilter('category_id', array('in' => $rootcatID))
          ->addAttributeToFilter('type_id', array('eq' => 'simple'))                                         
          ->addAttributeToSort('price', 'DESC')                                                               
          ->addAttributeToFilter('status', array('eq' => Mage_Catalog_Model_Product_Status::STATUS_ENABLED)); 

      return $collection;
  }
} 

J'ai essayé le Mage::register('gate-location', $gate_location); méthode mais je ne peux pas y accéder dans la classe Model pour une raison quelconque.

Était-ce utile?

La solution 3

Ainsi, après une longue semaine passée à m'arracher les cheveux, j'ai réalisé que la meilleure façon de transmettre des informations d'un contrôleur à un modèle était de ne pas le faire.Merci à Ben @ Sonassi d'avoir répondu à une question sans rapport qui m'a fait réaliser que je pouvais utiliser

Mage::app()->getRequest()->getParam('location');

pour obtenir la variable post dans l'action du modèle pour accéder à ce dont j'avais besoin.

Autres conseils

Donc, vous voulez essentiellement passer une variable d’une classe à une autre ?

Si c'est ce que vous souhaitez réaliser, pourquoi ne pas les transmettre comme paramètres de méthode ? getItemsCollection iirc n'est défini dans aucune classe parent - vous êtes donc libre de modifier sa signature :

public function getItemsCollection($gateLocation, $gateWidth)
{
    // …
}

Si vous souhaitez éviter cela pour une raison quelconque, vous pouvez toujours modifier la collection par la suite :

$collection = $gsProduct->getItemsCollection();
$collection->addAttributeToFilter('gate_max_width', array('gt' => $gateWidth))

Si vous voulez le modèle

Custom_GateSelector_Model_Products sur ce indexAction() alors il obtiendrait ces paramètres sur le modèle.

Alors, appelez les fonctions ci-dessous sur getItemsCollection

$gate_location = Mage::app()->getRequest()->getPost('location');
$gate_width    = Mage::app()->getRequest()->getPost('width');

Conformément au système magento, vous ne pouvez pas obtenir le contrôleur actuel et vous ne pouvez pas accéder à une autre page.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top