web-dev-qa-db-fra.com

Obtenez tous les produits simples à partir d'un produit configurable dans la vue du produit Magento

Comment puis-je obtenir tous les produits simples associés à un produit configurable? J'ai trouvé comment faire le contraire (obtenir un produit configurable à partir d'un simple produit) mais ce n'est pas ce dont j'ai besoin.

Je veux montrer combien d'unités j'ai en stock pour le produit sélectionné (attribut configurable). Mon idée initiale est d'imprimer toutes les quantités de stock et de contrôler l'affichage avec jQuery. Une idée?

26
Denis Spalenza

utilisez le script suivant dans

app/design/frontend/default/[your theme]/template/catalog/product/view/type/options/configurable.phtml

A l'intérieur du script:

spConfig.getIdOfSelectedProduct = function () {
    var existingProducts = new Object();
    for (var i = this.settings.length - 1; i >= 0; i--) {
        var selected = this.settings[i].options[this.settings[i].selectedIndex];
        if (selected.config) {
            for (var iproducts = 0; iproducts < selected.config.products.length; iproducts++) {
                var usedAsKey = selected.config.products[iproducts] + "";
                if (existingProducts[usedAsKey] == undefined) {
                    existingProducts[usedAsKey] = 1;
                } else {
                    existingProducts[usedAsKey] = existingProducts[usedAsKey] + 1;
                }
            }
        }
    }
    for (var keyValue in existingProducts) {
        for (var keyValueInner in existingProducts) {
            if (Number(existingProducts[keyValueInner]) < Number(existingProducts[keyValue])) {
                delete existingProducts[keyValueInner];
            }
        }
    }
    var sizeOfExistingProducts = 0;
    var currentSimpleProductId = "";
    for (var keyValue in existingProducts) {
        currentSimpleProductId = keyValue;
        sizeOfExistingProducts = sizeOfExistingProducts + 1
    }
    if (sizeOfExistingProducts == 1) {
        alert("Selected product is: " + currentSimpleProductId)
    }
}

Maintenant, ajoutez l'événement onchange à votre liste déroulante sur la même page:

onchange = "spConfig.getIdOfSelectedProduct()"

Description complète

14
Hardik

Utilisez ce code ci-dessous

Code pour obtenir les informations complètes sur le produit (où 3 est l'ID de produit configurable)

$product = Mage::getModel('catalog/product')->load(3); 
$childProducts = Mage::getModel('catalog/product_type_configurable')
                    ->getUsedProducts(null,$product);

foreach($childProducts as $child) {
    print_r($child->getName());  // You can use any of the magic get functions on this object to get the value
}

Un autre code pour obtenir les identifiants des produits pour enfants

$childProducts = Mage::getModel('catalog/product_type_configurable')
                    ->getChildrenIds(3);

J'espère que cela t'aides!!

57
Great Indian Brain

Un produit configurable peut être associé à plusieurs autres produits.

Voici le code pour récupérer tous les produits enfants associés à un produit configurable.

Voilà le code :)

/**
 * Load product by product id
 */
$product = Mage::getModel('catalog/product')->load(YOUR_PRODUCT_ID);

/**
 * Get child products id and such (only ids)
 */
$childIds = Mage::getModel('catalog/product_type_configurable')->getChildrenIds($product->getId());

/**
 * Get children products (all associated children products data)
 */
$childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProducts(null,$product);

Source: http://blog.chapagain.com.np/magento-how-to-get-all-associated-children-product-of-a-configurable-product/

18
Abid Hussain

J? ai compris. Merci pour les réponses.

<?php if($_product->getTypeId() == "configurable"): ?>
    <?php $_configurable = $_product->getTypeInstance()->getUsedProductIds(); ?>
    <?php foreach ($_configurable as $_config): ?>
        <?php $_simpleproduct = Mage::getModel('catalog/product')->load($_config); ?>
        <?php //Magic php with a $_simpleproduct. ?>
    <?php endforeach; ?>
<?php endif; ?>
5
Denis Spalenza

Pour tous ceux qui souhaitent le faire et afficher les résultats, je partagerai ce que j'ai fait pour le terminer

Ajoutez au segment script de: app/design/frontend/default/[your_theme] /template/catalog/product/view/type/options/configurable.phtml

id = {};
<?php 
foreach ($_product->getTypeInstance(true)->getUsedProducts ( null, $_product) as $simple) {
    $stock = Mage::getModel('cataloginventory/stock_item')->loadByProduct($simple)->getQty();
    echo "  id[" . $simple->getId() . "] = $stock;\n\r";
}
?>

    spConfig.getIdOfSelectedProduct = function () {
        var existingProducts = new Object();
        for (var i = this.settings.length - 1; i >= 0; i--) {
            var selected = this.settings[i].options[this.settings[i].selectedIndex];
            if (selected.config) {
                for (var iproducts = 0; iproducts < selected.config.products.length; iproducts++) {
                    var usedAsKey = selected.config.products[iproducts] + "";
                    if (existingProducts[usedAsKey] == undefined) {
                        existingProducts[usedAsKey] = 1;
                    } else {
                        existingProducts[usedAsKey] = existingProducts[usedAsKey] + 1;
                    }
                }
            }
        }
        for (var keyValue in existingProducts) {
            for (var keyValueInner in existingProducts) {
                if (Number(existingProducts[keyValueInner]) < Number(existingProducts[keyValue])) {
                    delete existingProducts[keyValueInner];
                }
            }
        }
        var sizeOfExistingProducts = 0;
        var currentSimpleProductId = "";
        for (var keyValue in existingProducts) {
            currentSimpleProductId = keyValue;
            sizeOfExistingProducts = sizeOfExistingProducts + 1
        }
        if (sizeOfExistingProducts == 1) {
           var qtyLeft = id[currentSimpleProductId];
           if(qtyLeft >= 1) {
               jQuery('.availability-only').html('Only ' + qtyLeft + ' available.');
               jQuery('p.out-of-stock').removeClass('out-of-stock').addClass('in-stock');
               jQuery('p.in-stock > span').html('In stock');
           } else {
               jQuery('.availability-only').html('Sorry, there are none available in this size.');
               jQuery('p.in-stock').removeClass('in-stock').addClass('out-of-stock');
               jQuery('p.out-of-stock > span').html('Out of stock');
           }
        }
    }

dans le select de la même page, ajoutez:

 onchange = "spConfig.getIdOfSelectedProduct()"

N'hésitez pas à modifier ce que la déclaration imprime, mais cela devrait vous y amener. Il représente également 0 stock disponible, le changeant en Out of stock en css et texte

2
Kender