programing

Magento - 사용자 입력에 따른 제품 항목 속성 견적/주문

codeshow 2023. 9. 4. 20:49
반응형

Magento - 사용자 입력에 따른 제품 항목 속성 견적/주문

요약

일반적인 제품 속성처럼 제품에 저장되지 않거나 제품 편집 페이지에 표시되지 않는 제품 속성을 만들고 싶습니다.대신 주문/견적 항목에 저장하여 주문, 송장 등에 표시하기를 원합니다.또한 카트에 제품을 추가하기 전에 프런트 엔드에서 고객이 구성할 수 있어야 합니다.

세부 사항

  • 사용자 지정 옵션과 마찬가지로 양식 요소를 프런트엔드 제품 페이지에 추가해야 합니다.
    • 사용자 지정 옵션과 달리 실제 제품 특성이 아닙니다.관리 제품 페이지나 특성 세트에는 표시되지 않아야 합니다.
    • 고객은 유효한 값을 제공해야 합니다.서버 측 검증을 할 수 있어야 합니다.
    • HTML을 생성하는 .phtml 템플릿을 원합니다.현재 앱/디자인/프론트엔드/베이스/기본/카탈로그/제품/보기/유형/기본값을 재정의할 수 있습니다.만족스러운 (설계) 결과를 가진 ptml.하지만 저는 그 가치를 어떻게 포착하고, 검증하고, 결국 저장할 수 있는지 모릅니다.
  • 이 양식 요소의 값은 견적/주문 제품 항목과 함께 저장해야 합니다.
    • 이 값은 모든 송장, 주문, 판매 이메일에 표시되어야 합니다.
    • 템플릿을 사용하여 출력을 제어하거나 값을 표시하는 데 사용되는 문자열을 반환할 수 있습니다.

나의 질문들

  1. 어떻게 검증하고 최종적으로 에서 값을 저장합니까?<input>제품이 카트에 추가될 때 견적 항목에 대한 프런트 엔드 제품 페이지에서, 그리고 나중에 주문 항목에 대한 체크아웃 프로세스에서?
  2. 주문, 송장, 판매 이메일 등의 페이지에 이 값을 표시하려면 어떻게 해야 합니까?
  3. 내 값이 특정 값으로 설정된 항목이 있는 주문을 가져오려면 주문 컬렉션을 어떻게 필터링합니까?

업데이트 1

는 이 할 수 catalog/product 아마 모그델아고도마리그()▁(▁modelsales/quote_item와 같은 sales_quote_item_qty_set_after

$infoBuyRequest = $product->getCustomOption('info_buyRequest');
$buyRequest = new Varien_Object(unserialize($infoBuyRequest->getValue()));
$myData = $buyRequest->getMyData();

제공한 사용자 를 저의 이러방식고데제고를이검다에서 검색할 수 .<input>제품 페이지에 있습니다.

는 이것이 스럽습니다.info_buyRequest견적 및 주문 항목과 함께 저장됩니다.만약 그렇다면, 이것은 나의 문제 1과 2를 부분적으로 해결했습니다.그러나 아직도 이 코드를 실행하기에 적합한 위치를 잘 모르고 백엔드 주문/견적/보고서 페이지에 표시하는 방법을 잘 모르겠습니다.또한 데이터베이스에 직렬화된 값으로 저장되어 있기 때문에 제 맞춤형 데이터를 기반으로 견적/주문 품목 컬렉션을 얻는 것이 가장 어려울 것이라고 생각합니다.

Magento는 제품 속성이나 제품 사용자 지정 옵션이 아닌 옵션을 추가할 수 있는 기능을 제공합니다.제품에 설정되어 있으며 옵션 코드로 품목을 견적합니다.additional_options.

두 가지 단계를 수행해야 하며, 각 단계는 이벤트 관찰자를 통해 처리할 수 있습니다.추가 옵션을 다시 정렬하려면 세 번째 이벤트도 관찰해야 합니다.

견적 항목에 옵션 추가

첫 번째 단계는 이벤트 관찰자를 추가하여 로드된 제품이 카트에 추가되기 전에 추가 옵션을 설정하는 것입니다.한 가지 옵션은 다음을 사용하는 것은catalog_product_load_after 건의사의

<catalog_product_load_after>
    <observers>
        <extra_options>
            <type>model</type>
            <class>extra_options/observer</class>
            <method>catalogProductLoadAfter</method>
        </extra_options>
    </observers>
</catalog_product_load_after>

이벤트 관찰자에서 추가 검사를 추가할 수 있습니다. 요청한 페이지는 카트에 추가 작업입니다.이 관찰자 방법의 요점은 특별한 옵션의 선택을 추가하는 것입니다.additional_options옵션을 선택할 수 있습니다.

public function catalogProductLoadAfter(Varien_Event_Observer $observer)
{
    // set the additional options on the product
    $action = Mage::app()->getFrontController()->getAction();
    if ($action->getFullActionName() == 'checkout_cart_add')
    {
        // assuming you are posting your custom form values in an array called extra_options...
        if ($options = $action->getRequest()->getParam('extra_options'))
        {
            $product = $observer->getProduct();

            // add to the additional options array
            $additionalOptions = array();
            if ($additionalOption = $product->getCustomOption('additional_options'))
            {
                $additionalOptions = (array) unserialize($additionalOption->getValue());
            }
            foreach ($options as $key => $value)
            {
                $additionalOptions[] = array(
                    'label' => $key,
                    'value' => $value,
                );
            }
            // add the additional options array with the option code additional_options
            $observer->getProduct()
                ->addCustomOption('additional_options', serialize($additionalOptions));
        }
    }
}

추가 옵션이 제품에서 견적 항목으로 자동 이동됩니다.이 관찰자를 배치하면 카트와 체크아웃 검토에 옵션이 표시됩니다.

주문 품목에 옵션 추가

이를 유지하려면 관찰자가 한 명 더 필요합니다(마젠토 1.5 이후에만).

<sales_convert_quote_item_to_order_item>
    <observers>
        <extra_options>
            <type>model</type>
            <class>extra_options/observer</class>
            <method>salesConvertQuoteItemToOrderItem</method>
        </extra_options>
    </observers>
</sales_convert_quote_item_to_order_item>

여기서는 옵션을 견적 항목에서 주문 항목으로 이동합니다.

public function salesConvertQuoteItemToOrderItem(Varien_Event_Observer $observer)
{
    $quoteItem = $observer->getItem();
    if ($additionalOptions = $quoteItem->getOptionByCode('additional_options')) {
        $orderItem = $observer->getOrderItem();
        $options = $orderItem->getProductOptions();
        $options['additional_options'] = unserialize($additionalOptions->getValue());
        $orderItem->setProductOptions($options);
    }
}

이 시점부터 추가 옵션은 프런트 엔드 및 주문 이메일뿐만 아니라 관리 인터페이스 주문 보기, 송장, 발송물, 신용 메모 및 PDF에 표시됩니다.

재주문에 대한 지원

재주문 중에 옵션을 새 주문으로 옮기려면 복사에 주의해야 합니다.한가가능지은다같습다니음과성▁▁using다ibility를 사용하는 한 가지 가능성이 .checkout_cart_product_add_after 건의사의

<checkout_cart_product_add_after>
    <observers>
        <extra_options>
            <type>singleton</type>
            <class>extra_options/observer</class>
            <method>checkoutCartProductAddAfter</method>
        </extra_options>
    </observers>
</checkout_cart_product_add_after>

코드 중복을 방지하기 위해 추가 옵션의 구문 분석 및 추가 옵션 배열 구축은 별도의 함수로 이동해야 하지만, 이 예에서는 각 메서드에 필요한 논리를 명확하게 유지합니다.

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{
    $action = Mage::app()->getFrontController()->getAction();
    if ($action->getFullActionName() == 'sales_order_reorder')
    {
        $item = $observer->getQuoteItem();
        $buyInfo = $item->getBuyRequest();
        if ($options = $buyInfo->getExtraOptions())
        {
            $additionalOptions = array();
            if ($additionalOption = $item->getOptionByCode('additional_options'))
            {
                $additionalOptions = (array) unserialize($additionalOption->getValue());
            }
            foreach ($options as $key => $value)
            {
                $additionalOptions[] = array(
                    'label' => $key,
                    'value' => $value,
                );
            }
            $item->addOption(array(
                'code' => 'additional_options',
                'value' => serialize($additionalOptions)
            ));
        }
    }
}

번역:

이러한 옵션 레이블 또는 값을 변환할 수 있는 메커니즘이 없습니다.그런 점에서 유용할 수 있는 몇 가지 아이디어가 있습니다.

옵션 이트벤다 quote_item_load_load_서가추션을 합니다.$option['print_value'] = $helper->__($option['value']);.한다면print_value설정되어 있으면 Magento가 디스플레이 렌더링에 사용합니다.
주문 품목에서도 동일한 작업을 수행할 수 있습니다.

그런 것은 없습니다.print_label그러나 사용자 정의 인덱스를 설정할 수 있습니다(label_source예를 들어, 소스로 사용하여 즉시 라벨을 설정합니다.$option['label'] = $helper->__($option['label_source']);.

외에는해야 할 (grep for 템수는데할다것야니입의해지그정하상을로이플으릿grep(▁beyond▁for다(grep for)).getItemOptions() 클래스 )를 합니다.additional_options).

견적 항목에 사용자 정의 필드를 추가할 수 있습니다.시작하기 위해 Magento의 Order Line Items에 사용자 정의 필드를 추가하는 방법.최근에 이러한 지침을 사용하여 Magento Quote Item에 사용자 지정 필드를 추가했으며 개념은 정상이지만 해당 기사에는 좋지 않은 몇 가지 사례가 있습니다.내가 다르게 할 수 있는 것들:

  1. 설정 스크립트를 사용하여 직접 수행하는 대신 데이터베이스에 필드를 추가합니다.
  2. $_REQUEST에 직접 액세스하는 대신 Magento의 Request 개체를 사용합니다.
  3. Magent를 core로 수정하는 대신 확장 및 다시 쓰기를 사용합니다.
  4. 코어를 수정하는 대신 확장에서 config.xml을 변경합니다.

일반적으로 Magento core는 수정하지 않는 것이 좋습니다. 모듈을 통해 사용자 지정을 적용하면 향후 업그레이드가 더 쉬워지고 가능해질 수 있습니다.moduleCreator가 필요한 보일러 플레이트를 생성하는 데 도움이 되기 전에 자신의 확장자를 만들지 않은 경우.

Magento 1.8의 My Solution

항목 따옴표로 옵션 설정

$quoteItem = $cart->getQuote()->getItemById($itemId);
$quoteItem->addOption(array('label' => 'buymode', 'code' => 'buymode', 'value' => $data['buymode']));
$quoteItem->save();

QuoteItem에서 액세스 옵션

$quoteItem->getOptionByCode('buymode')->getValue();

OrderItem으로 전송 옵션

sales_convert_quote_item_to_order_item

public function onConvertQuoteItemToOrderItem($observer) {
    $orderItem = $observer->getOrderItem();
    $quoteItem = $observer->getItem();
    $options = $orderItem->getProductOptions();
    $options['buymode'] = $quoteItem->getOptionByCode('buymode')->getValue();
    $orderItem->setProductOptions($options);
}

OrderItem의 액세스 옵션

$orderItem->getProductOptionByCode('buymode')

언급URL : https://stackoverflow.com/questions/9412074/magento-quote-order-product-item-attribute-based-on-user-input

반응형