créer Dynamiquement ajouter au bloc de panier pour chaque option configurable finale, Aide pour cette $

magento.stackexchange https://magento.stackexchange.com/questions/3060

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.

entrer image description ici

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; ?>
Était-ce utile?

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é

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