構成可能な製品に関連付けられているすべての単純な製品を取得するにはどうすればよいですか?逆の方法(単純な製品から構成可能な製品を取得する方法)を見つけましたが、それは私が必要としていることではありません。
選択した製品(構成可能な属性)の在庫数を表示したいと思います。私の最初のアイデアは、すべての量の在庫を印刷し、jQueryを使用して表示を制御することです。何か案が?
以下のコードを使用してください
完全な製品情報を取得するためのコード(3は構成可能な製品ID)
$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
}
子供向け製品IDを取得するための別のコード
$childProducts = Mage::getModel('catalog/product_type_configurable')
->getChildrenIds(3);
お役に立てれば!!
構成可能な製品には、他の複数の製品を関連付けることができます。
これは、構成可能な製品に関連付けられているすべての子製品をフェッチするためのコードです。
ここにコードがあります:)
/**
* 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);
で次のスクリプトを使用します
app/design/frontend/default/[your theme]/template/catalog/product/view/type/options/configurable.phtml
スクリプト内:
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)
}
}
次に、同じページのドロップダウンにイベントを追加onchange
します。
onchange = "spConfig.getIdOfSelectedProduct()"
わかった。返信ありがとうございます。
<?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; ?>
これを実行し、結果を表示したい人のために、私がそれを終えるためにしたことを共有します
script
次のセグメントに追加します: 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');
}
}
}
同じページのselect
に次を追加します。
onchange = "spConfig.getIdOfSelectedProduct()"
ステートメントの印刷内容を自由に編集してください。ただし、これで問題は解決します。また、手持ちの在庫が0であるためOut of stock
、cssとテキストで変更します。
以下の最も単純なコードをブロックで記述し、それをテンプレートファイルで呼び出すだけで、製品に関連する製品を取得できます。
$productId = (int)$this->getRequest()->getParam('id');
$objectManager = \Magento\Framework\App\objectManager::getInstance();
$product = $objectManager->create("\Magento\Catalog\Model\Product")->load($productId);
$collection = $product->getTypeInstance()->getAssociatedProducts($product);
$this->setCollection($collection);
ここで、テンプレートに次のコードを記述して名前を出力します。
$collection = $block->getCollection();
foreach ($collection as $key => $value)
{
echo $value->getName();
echo "<br>";
}