créer Dynamiquement ajouter au bloc de panier pour chaque option configurable finale, Aide pour cette $
-
16-10-2019 - |
Question
Je travaille sur un projet où sur la page du produit au lieu des options configurables normales, il y a des options configurables, puis la base de données est interrogée pour savoir si les vendeurs particuliers portent le produit. Il affiche ensuite la liste des fournisseurs via javascript, comme indiqué ci-dessous.
Je veux l'ajouter au bloc de panier pour apparaître à côté de chaque fournisseur. Parce que tout cela est créé dynamiquement, je devais passer l'ID de fournisseur à un script « ajouter au panier » que j'ai créé. Je pris l'application d'origine / design / frontend / base / default / template / catalogue / produit / view / addtocart.phtml et fait mon propre comme on le voit ci-dessous. Le fichier php suivant est appelé via ajax. Le addtocart.phtml original avait un tas de cette variable $. Je dois simuler ce $ (quel que soit le modèle, aide sa référence à) de telle sorte que le fonctionnement de ce bloc. Je suis sans beaucoup de succès. Quelqu'un peut-il voir ce que je fais mal ou ce que je pourrais faire différemment? Merci beaucoup!
<?php require_once('/var/www/Staging/public_html/app/Mage.php'); ?>
<?php umask(0); Mage::app();?>
<?php $value = $_POST['value'];?>
<?php $block = Mage::getModel('catalog/product');?>
<?php $_product = Mage::registry('current_product'); ?>
<?php //if($_product->isSaleable()): ?>
<div class="add-to-cart">
<?php //if(!$_product->isGrouped()): ?>
<label for="qty"><?php echo $block->__('Qty:') ?></label>
<input type="text" name="qty" id="qty" maxlength="12" value="<?php echo $block->getProductDefaultQty() * 1 ?>" title="<?php echo $block->__('Qty') ?>" class="input-text qty" />
<?php //endif; ?>
<button type="button" title="<?php echo $buttonTitle ?>" class="button btn-cart" id='$value'><span><span><?php echo $buttonTitle ?></span></span></button>
<?php echo $block->getChildHtml('', true, true) ?>
</div>
<?php //endif; ?>
La solution
Soit s aller à la racine de ce que vous demandez:
Je dois simuler $ ce (quel que soit le modèle, aide sa référence à) afin que ce bloc fonctionne. Je suis sans beaucoup de succès.
La vue addtocart.phtml est appelé par cette déclaration xml dans app / design / frontend / base / default / layout / catalog.xml:
<block type="catalog/product_view" name="product.info.addtocart" as="addtocart" template="catalog/product/view/addtocart.phtml"/>
Cela signifie que le $this
vous faites référence est le modèle catalog/product_view
. En supposant aucun réécritures, qui devrait se traduire par le fichier de classe Mage_Catalog_Block_Product_View
, dans app / code / core / Mage / Catalogue / Bloc / Produit / view.php.
Donc, avec tout cela mis à part, vous voulez $this
à se comporter comme si elle est appelée à partir du bloc. En supposant que vous utilisez encore votre script autonome appelé via AJAX, vous devez remplacer $this
avec $block
- chargement qui comme une nouvelle instance du modèle de bloc référencé ci-dessus. Cela peut conduire à des effets indésirables - par exemple -. $block->getProduct()
ne fonctionnera pas
Edité autonome addtocart.phtml:
En fonction de votre édition, je l'ai mis à jour cette réponse:
<?php
require_once('/var/www/Staging/public_html/app/Mage.php');
umask(0);
Mage::app();
//ensure that the value is legitimate
if($_POST && is_numeric($_POST['value'])){
$value = $_POST['value'];
}
//pass this in your ajax call for the add button
if($_POST && is_numeric($_POST['product_id'])){
$product_id = $_POST['product_id'];
}
$helper = Mage::helper('core'); //for translation
$block = new Mage_Catalog_Block_Product_View(); // not best practice, but neither are standalones
$product = Mage::getModel('catalog/product')->load($product_id); // no need to use the _ here, it's not protected/private; additonally Mage::registry won't work because you're technically not on a product detail page
$buttonTitle = ''; //you are using this, but it isn't set
?>
<div class="add-to-cart">
<label for="qty"><?php echo $helper->__('Qty:') ?></label>
<input type="text" name="qty" id="qty" maxlength="12" value="<?php echo $block->getProductDefaultQty($product) * 1 ?>" title="<?php echo $helper->__('Qty') ?>" class="input-text qty" />
<button onclick="window.location = '<?php echo Mage::helper('checkout/cart')->getAddUrl($product);?>'" type="button" title="<?php echo $buttonTitle ?>" class="button btn-cart" id='$value'><span><?php echo $buttonTitle ?></span></button>
</div>
D'autres pensées:
Vous utilisez $_GET['value']
- ne pas accepter l'entrée non filtrée des utilisateurs. Vous placez ce directement dans le bouton Ajouter au panier. Tout le monde pourrait munge cela scripts Injecter et d'autres mauvaises choses sur une page via l'URL. Ceci est appelé XSS - lire la suite ici: http://phpmaster.com / php-security-cross-site-scripting-attaques XSS /
Si $_GET['value']
est votre fournisseur, pensez à utiliser vendor
-. Il est sémantique
Comment je mettre en œuvre ceci:
Alors, votre approche est pas mauvais , en soi; ça va marcher. Mais voici ce que je ferais:
- Créer un plugin fournisseur
- Créer une action de contrôleur personnalisé qui prend un argument de
vendor
, en utilisant$this->getRequest()->getParams()
- qui filtre en mode natif pour des trucs infâmes - définir le type de sortie du régulateur de texte / html, fixé à un thème vierge qui n'a pas de script inclut ou des éléments de mise en page (blocs de structure, etc.)
Ou, au lieu de rouler vos propres, utilisez le plugin du marché Unirgy qui fait ce que vous essayez de le faire - et le fait très bien!
http://www.unirgy.com//products/ umarketplace / magento-multi-fournisseurs-marché