제품 저장시 사용자 정의 옵션 작성


18

제품을 만들 때마다 제품에 대한 사용자 지정 옵션을 자동으로 만드는 중입니다. 지금까지 내가 얻은 것은 catalog_product_save_before이벤트에서 발생 하고 다음 코드를 실행 하는 관찰자입니다 .

    //check that we haven't made the option already
    $options = $product->getProductOptions();
    foreach ($options as $option) {
        if ($option['title'] == 'Auto Date & Time' && $option['type'] == 'date_time' && !$option['is_delete']) {
            //we've already added the option
            return;
        }
    }
    $options[] = array(
        'title' => $product->getDateLabel(),
        'type' => 'date_time',
        'is_require' => 1,
        'sort_order' => 0,
        'is_delete' => '',
        'previous_type' => '',
        'previous_group' => '',
        'price' => '0.00',
        'price_type' => 'fixed',
        'sku' => ''
    );
    $product->setProductOptions($options);
    $product->setCanSaveCustomOptions(true);
    //this line doesnt make sense here, but it works ... kinda
    $product->save();

$product->save()in을 그대로두면 이벤트가 두 번째로 발생하는지 확인한 후에도 foreach 루프에서 return 문이 호출되지만 2 개의 사용자 정의 옵션이 생성됩니다.

내가 꺼내면 사용자 정의 옵션이 작성되지 않습니다.

누군가 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까?
Magento 1.7과 협력하고 있습니다


안녕하세요, catalog_product_save_before 이벤트를 사용하고 있으므로 이벤트가 완료된 후 제품 woudl이 저장되므로-> save를 호출 할 필요가 없습니다. 관찰자에서 해당 저장 통화를 제거하면 어떻게됩니까?
ProxiBlue

save () 호출을 제거하면 사용자 정의 옵션이 생성되지 않습니다.
Jason Neumann

답변:


12

정확한 문제를 찾을 때까지 여기에 해결책이 있습니다. 대신 catalog_product_save_before이벤트를 사용하십시오 catalog_product_prepare_save. 이것의 단점은 prepare_save관리자 인터페이스 또는 API에서 제품을 저장할 때만 이벤트가 전달 된다는 것 입니다. 따라서 사용자 정의 코드에서 저장하는 경우 수동으로 트리거하지 않으면 트리거되지 않습니다.

문제가 Mage_Catalog_Model_Product::_beforeSave()메소드 와 관련이 있다는 직감이 있습니다. 거기에는 사용자 정의 옵션의 처리가 있습니다.
그러나이 catalog_product_save_before처리가 발생한 후에 전달되므로 사용자 지정 옵션이 처리되는 동안 Mage_Catalog_Model_Product::_beforeSave()이벤트가 아직 실행되지 않아 추가되지 않기 때문에 실제로는 비어 있습니다. 메소드 상단에서 언급 한 메소드
에서 행을 이동하면 parent::_beforeSave();옵션이 추가됩니다 (여전히 두 번이지만 추가됩니다). 문제가 발견되면 더 많이 게시하겠습니다.

[편집]
찾았습니다. 나는 위의 줄에서 어떻게 든 옳았습니다.
내가 말했듯이 문제는 catalog_product_save_before사용자 정의 옵션이 처리 된 후에 전달 된다는 것 입니다. 그러나 이것이 작동하지 않는 이유입니다.
사용자 정의 옵션은 Mage_Catalog_Model_Product::_afterSave()다음 코드 로 저장됩니다 .

$this->getOptionInstance()->setProduct($this)
            ->saveOptions();

그러나 귀하의 경우 옵션 배열이 비어있을 때 $this->getOptionInstance()옵션이 채워집니다 _beforeSave. 따라서 ... 저장할 것이 없습니다.
여전히 catalog_product_save_before여기 를 사용하려면 작동해야 할 코드가 있습니다.

//check that we haven't made the option already
$options = $product->getOptions();
if ($options){
    foreach ($options as $option) {
        if ($option['title'] == 'Auto Date & Time' && $option['type'] == 'date_time' && !$option['is_delete']) {
            //we've already added the option
            return;
        }
    }
}
$option = array(
    'title' => 'Auto Date & Time',
    'type' => 'date_time',
    'is_require' => 1,
    'sort_order' => 0,
    'is_delete' => '',
    'previous_type' => '',
    'previous_group' => '',
    'price' => '0.00',
    'price_type' => 'fixed',
    'sku' => ''
);
//don't use it like this because it has no effect
//$product->setProductOptions($options);
$product->setCanSaveCustomOptions(true);
//use it this way. Populate `$product->getOptionInstance()` directly
$product->getOptionInstance()->addOption($option);
//don't forget to state that the product has custom options
$product->setHasOptions(true);

안녕하세요 @Marius catalog_product_prepare_save대신 대신 사용할 catalog_product_save_before수 있으며 변경이 필요한 경우 옵션을 어떻게 업데이트 할 수 있습니까 ?
Zaheerabbas

0

방금 같은 문제가 있었는데 마리우스의 대답은 훌륭했습니다. 그래도 사용자 정의 옵션을 업데이트하는 방법을 알아내는 데 시간이 걸렸습니다. $ product-> getOptionInstance ()-> addOption () 옵션을 저장하기 위해 작동하고 "is_delete"를 1로 설정하면 저장 옵션이 제거된다는 것을 알고 다음 코드를 만들었습니다.

$oldOptions = $product->getOptionInstance()->getOptions();
foreach ($oldOptions as $key => $option){
    if($option['title'] == "Custom Option Title") {
        $oldOptions[$key]['is_delete'] = 1;                 
        $product->getOptionInstance()->addOption($oldOptions[$key]);
    }
}

삭제 후이 코드로 업데이트 된 사용자 정의 옵션을 추가 할 수 있습니다.

$newOption = array(
    'title' => "Custom Option Title",
    'type' => 'radio',
    'is_require' => 1,
    'sort_order' => 20,
    'values' => array(
        array(
            'title' => "Value 1 Title",
            'price' => 42.00,
            'price_type' => 'fixed',
            'sku' => "",
            'sort_order' => '1'
        ),
        array(
            'title' => "Value 2 Title",
            'price' => 50,
            'price_type' => 'percent',
            'sku' => "",
            'sort_order' => '2'
        )
    )
);
$product->getOptionInstance()->addOption($newOption);

0

제품을 저장하는 동안 magento에서 사용자 정의 옵션을 생성하는 것은 매우 쉬운 단계입니다.

   $product = Mage::getModel("catalog/product")->load($productid);

    $options[] = array(
            'title' => 'Pet',
            'type' => 'field',
            'is_require' => 0,
            'sort_order' => 0,
        );
    $options[] = array(
            'title' => 'Date',
            'type' => 'field',
            'is_require' => 1,
            'sort_order' => 2,
        );

    $product->setProductOptions(($options));
    $product->setCanSaveCustomOptions(true);
    $product->save();`

이미 사용자 정의 옵션이 작성된 경우 다음 코드를 사용하여 삭제할 수 있습니다

$product = Mage::getModel("catalog/product")->load($productid);

    $customOptions = $product->getOptions();

    foreach ($customOptions as $option) {
        $option->delete();
    }

    $product->setHasOptions(0);
    $product->save();

감사

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.