2012-10-21 3 views
3

구성 가능한 제품과 관련된 간단한 제품의 재고 상태 목록을 표시하려고합니다. 이것은 'Size'관련 속성이 표시되지 않을 때 배열의 첫 번째 인스턴스를 제외하고는 정상적으로 작동합니다.구성 가능한 하위 제품의 특성 및 인벤토리

<?php $_helper = $this->helper('catalog/output'); ?> 
<?php $_product = $this->getProduct(); ?> 
<?php $instock = "Next Day"; ?> 
<?php $outofstock = "4 to 7 Days"; ?> 
<?php $conf = Mage::getModel('catalog/product_type_configurable')->setProduct($_product); ?> 
<?php $col = $conf->getUsedProductCollection()->addAttributeToSelect('Size')->addFilterByRequiredOptions(); ?> 
<ul> 
<?php foreach($col as $simple_product){ 
    $qty = intval(Mage::getModel('cataloginventory/stock_item')->loadByProduct($simple_product)->getQty()); 
    $size = Mage::getModel('catalog/product')->load($simple_product->getId())->getAttributeText('Size'); 
?> 
    <li> 
     <?php 
     if ($qty >= 1) 
     {echo $qty, " ",$size," ",$instock;} 
     else 
     {echo $qty, " ",$size," ",$outofstock;} ?> 
    </li> 
<?php } ?> 
</ul> 

결과 세트는 다음과 같이보고한다 : 첫 번째 속성이 표시하려면 내가 잘못 있는데 방법에

99 Next Day 
99 9 Next Day 
99 8.5 Next Day 
99 8 Next Day 
99 7.5 Next Day 
0 7 4 to 7 Days 
99 12 Next Day 
99 11.5 Next Day 
99 11 Next Day 
99 10.5 Next Day 
99 10 Next Day 

모든 포인터?

답변

2

문제를 해결하는 것은 원인을 이해하는 것보다 훨씬 쉽습니다! 그러나 저를 올바른 순서로 그것을 해결하자 모든

  1. 첫째, 모두 addAttributeToSelectgetAttributeText 사실 (나는 당신이 생각하는 크기하지 크기 등) attribute_code하지 attribute_value 작동합니다.

  2. Magento가 안에 처음으로 $product->getData('Size')을 입력하면 null을 반환합니다. 당신이 크기getAttributeText에 기능을 전달하는 경우

  3. 크기 코드는 특정 속성 인스턴스에 대한 크기로 대체됩니다. 어떻게 된거 야? 아주 간단한 :

    SELECT `eav_attribute`.* FROM `eav_attribute` WHERE (`eav_attribute`.`attribute_code`='Size') AND (entity_type_id = :entity_type_id); 
    

    그리고 당신은 대소 문자를 구분하지 (* _ci)와 같은 테이블 부씩이있는 경우, 그것은 것입니다 : 메소드 체인의 가장 깊은 층, 마 젠토는 DB 옆 요청을 실제 값인 attribute_code이 "크기"이더라도 값을 가져 오십시오. 콜레이트에 대한 자세한 내용은 official articleSO에서 확인할 수 있습니다.

  4. 따라서 첫 번째 getAttributeText('Size') 이후의 함수는 모두 $product->getData('Size')이 올바른 값을 반환합니다.

이제 스크립트로 돌아갑니다. 이외에도 크기 크기에서 문제는 당신이 몇 가지 더 작은 문제가 있지만 더 일반적으로 젠토와 PHP를 이해하는 것이 그들과 거래를하는 것이 좋을 것 : 모든

  1. 첫째, 그것은 정말 나쁜 루프 내부에서 load 기능을 사용하도록 연습하십시오. 특히 제품 객체가있는 경우 특히 두 번 반복하십시오. 구성 가능한 제품에 많은 simples가 있으면 불필요한 메모리와 시간이 낭비됩니다. 필요한 모든 데이터를 collection에 추가 한 다음로드 된 제품을 루프에서 사용하는 것이 좋습니다. 이미 크기을 (를) 사용하여 컬렉션에 addAttributeToSelect 기능을 추가했습니다.그래서 문제를 접근하는 올바른 방법은 것 : 내가 원하는

    $col = $conf->getUsedProductCollection() 
        ->addAttributeToSelect('size') 
        ->joinField(
        'qty', 
        'cataloginventory/stock_item', 
        'qty', 
        'product_id=entity_id', 
        '{{table}}.stock_id=1', 
        'left' 
    )->addFilterByRequiredOptions(); 
    foreach($col as $simple_product){ 
        $qty = (int)$simple_product->getQty(); 
        $size = $simple_product->getAttributeText('size'); 
        // do your logic 
    } 
    
  2. 그리고 두 번째 문제는 당신이 .phtml 템플릿 파일에있어 이후,이 젠토 템플릿 표준을 준수 할 수에서 필요한 것, 언급 - 사용 당신 루프와 경우에 가까운 태그 :

    <?php foreach($col as $simple_product):?> 
        <li> 
        <?php if ($qty >= 1):?> 
          <!-- some html --> 
        <?php else:?> 
          <!-- some html --> 
        <?php endif:?> 
        </li> 
    <?php endforeach;?> 
    
+0

질문에 답변하고 설명하는 시간을내어 주셔서 감사합니다. 매우 감사드립니다. –

+0

루프가 템플릿 파일에서이 구문을 사용해야한다는 점에 대해 언급 해 주셔서 감사합니다. 다른 개발자가이 작업을 수행하지 않은 채로 너무 많은 템플릿 파일을 열어 코드를 완전히 untabbed/unformatted로 남겨 두었습니다. 그것을 보면 아기를 밟을 수 있습니다. – pspahn

0

Size 속성이 첫 번째 제품에 설정되어 있습니까? shirt_size을 내 속성으로 사용하여 코드를 테스트했으며 결과가 예상대로 반환됩니다.

+0

안녕하세요. 코드를 확인해 주셔서 감사합니다. 예, '크기'속성은 필수 항목이며 설정 가능한 유일한 속성입니다. Annoyingly 'Size'드롭 다운에는 누락 된 속성이 있습니다.이 경우 크기 9.5입니다. 그래서 실제로 어떤 일이 벌어지고 있는지를 알 수 없습니다. –

+0

제품이 가져 오기를 기반으로하거나 대량 작업을 사용하여 업데이트 된 경우 제품 관리에서 해당 제품을 열고 다시 저장하십시오. 값은 때때로 붙지 않는 경향이 있습니다. – pspahn

1

이 버전에서 작동합니다. 1.7.0.2 AttributeText를 입력하지 않아도 자동으로 수집됩니다.

<?php if($_product->getTypeId() == "configurable"): 
    $ids = $_product->getTypeInstance()->getUsedProductIds(); ?> 
    <?php $instock = "Next Day"; ?> 
    <?php $outofstock = "4 to 7 Days"; ?> 
    <ul> 
    <?php foreach ($ids as $id) : 
    $simpleproduct = Mage::getModel('catalog/product')->load($id); 
    $name = $simpleproduct->getName(); 
    $qty = (int)Mage::getModel('cataloginventory/stock_item')->loadByProduct($simpleproduct)->getQty();?> 
    <li><?php echo $simpleproduct->getName()." - ".(int)Mage::getModel('cataloginventory/stock_item') 
    ->loadByProduct($simpleproduct)->getQty();?> 
    </li> 
    <li><?php 
    if ($qty >= 1) 
      {echo $qty, " ",$name," ",$instock;} 
      else 
      {echo $qty, " ",$name," ",$outofstock;} 
      ?> 
    </li> 
    <?php endforeach; ?> 
    </ul> 
    <?php endif; ?> 
관련 문제