Frage

Ich arbeite an einem Projekt, bei dem auf der Produktseite anstelle der normalen konfigurierbaren Optionen einige konfigurierbare Optionen vorhanden sind, und dann wird die Datenbank befragt, ob bestimmte Anbieter das Produkt tragen. Anschließend wird die Liste der Anbieter über JavaScript wie unten gezeigt angezeigt.

enter image description here

Ich möchte, dass das Hinzufügen zum Warenkorbblock neben jedem Anbieter auftaucht. Da dies alles dynamisch erstellt wird, musste ich die Anbieter -ID an ein Skript "Hinzufügen zum Karren" übergeben, das ich erstellt habe. Ich habe die ursprüngliche App/Design/Frontend/Base/Standard/Vorlage/Katalog/Produkt/View/addtocart.phtml genommen und meine eigene gemacht, wie unten angezeigt. Die folgende PHP -Datei wird über AJAX aufgerufen. Der ursprüngliche addtocart.phtml hatte eine Reihe von $ dieser Variablen. Ich muss $ this simulieren (egal welches Modell, auf das er sich bezieht), damit dieser Block funktioniert. Ich bin ohne viel Erfolg. Kann jemand sehen, was ich falsch mache oder was ich anders machen könnte? Vielen Dank!

    <?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; ?>
War es hilfreich?

Lösung

Kommen wir zur Wurzel, was Sie fragen:

Ich muss $ this simulieren (egal welches Modell, auf das er sich bezieht), damit dieser Block funktioniert. Ich bin ohne viel Erfolg.

Die addtocart.phtml -Ansicht wird über diese XML -Deklaration in App/Design/Frontend/Base/Default/Layout/Catalog.xml aufgerufen:

<block type="catalog/product_view" name="product.info.addtocart" as="addtocart" template="catalog/product/view/addtocart.phtml"/>

Das bedeutet, dass das $this Sie beziehen sich auf das Modell catalog/product_view. Unter der Annahme, dass keine Umschreibungen, sollte dies in die Klassendatei übersetzt werden Mage_Catalog_Block_Product_View, gefunden in app/code/core/mage/catalog/block/product/view.php.

Also, mit all dem beiseite, wollen Sie also $this sich so zu verhalten, als würde es aus dem Block genannt. Angenommen, Sie verwenden immer noch Ihr eigenständiges Skript, das über Ajax bezeichnet wird, sollten Sie ersetzen $this mit $block - Laden Sie dies als neue Instanz des oben genannten Blockmodells. Dies kann zu unerwünschten Effekten führen - zum Beispiel - - $block->getProduct() Wird nicht funktionieren.

Bearbeitet eigenständige addtocart.phtml:

Basierend auf Ihrer Bearbeitung habe ich diese Antwort aktualisiert:

<?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>

Einige andere Gedanken:

Sie verwenden $_GET['value'] - Akzeptieren Sie nicht den Benutzern versuchte Eingaben. Sie platzieren dies direkt in die Schaltfläche "Hinzufügen zum Warenkorb". Jeder konnte dies machten, um Skripte und andere schlechte Dinge über die URL auf eine Seite zu injizieren. Dies heißt XSS - Lesen Sie hier mehr: http://phpmaster.com/php-security-cross-site-scripting-attacks-xss/

Wenn $_GET['value'] Ist Ihr Anbieter in Betracht, die Verwendung zu verwenden vendor - Es ist semantisch.

Wie ich das umsetzen würde:

Ihr Ansatz ist also nicht falsch, per se; Es wird funktionieren. Aber so würde ich es tun:

  • Erstellen Sie ein Hersteller -Plugin
  • Erstellen Sie eine benutzerdefinierte Controller -Aktion, die ein Argument von vendor, verwenden $this->getRequest()->getParams() - Welche filtert nativ für schändliche Sachen
  • Setzen Sie den Ausgangstyp des Controllers auf Text/HTML, auf ein leeres Thema eingestellt, das kein Skript enthält, oder Layoutelemente (Strukturblöcke usw.).

Oder verwenden Sie das Unirgy Marketplace -Plugin, das das tut, was Sie versuchen - und macht es sehr gut!

http://www.unirgy.com//products/umarketplace/magento-multi-vendor-marketplace

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top