Magento - 사용자 입력에 따른 제품 항목 속성 견적/주문
요약
일반적인 제품 속성처럼 제품에 저장되지 않거나 제품 편집 페이지에 표시되지 않는 제품 속성을 만들고 싶습니다.대신 주문/견적 항목에 저장하여 주문, 송장 등에 표시하기를 원합니다.또한 카트에 제품을 추가하기 전에 프런트 엔드에서 고객이 구성할 수 있어야 합니다.
세부 사항
- 사용자 지정 옵션과 마찬가지로 양식 요소를 프런트엔드 제품 페이지에 추가해야 합니다.
- 사용자 지정 옵션과 달리 실제 제품 특성이 아닙니다.관리 제품 페이지나 특성 세트에는 표시되지 않아야 합니다.
- 고객은 유효한 값을 제공해야 합니다.서버 측 검증을 할 수 있어야 합니다.
- HTML을 생성하는 .phtml 템플릿을 원합니다.현재 앱/디자인/프론트엔드/베이스/기본/카탈로그/제품/보기/유형/기본값을 재정의할 수 있습니다.만족스러운 (설계) 결과를 가진 ptml.하지만 저는 그 가치를 어떻게 포착하고, 검증하고, 결국 저장할 수 있는지 모릅니다.
- 이 양식 요소의 값은 견적/주문 제품 항목과 함께 저장해야 합니다.
- 이 값은 모든 송장, 주문, 판매 이메일에 표시되어야 합니다.
- 템플릿을 사용하여 출력을 제어하거나 값을 표시하는 데 사용되는 문자열을 반환할 수 있습니다.
나의 질문들
- 어떻게 검증하고 최종적으로 에서 값을 저장합니까?
<input>
제품이 카트에 추가될 때 견적 항목에 대한 프런트 엔드 제품 페이지에서, 그리고 나중에 주문 항목에 대한 체크아웃 프로세스에서? - 주문, 송장, 판매 이메일 등의 페이지에 이 값을 표시하려면 어떻게 해야 합니까?
- 내 값이 특정 값으로 설정된 항목이 있는 주문을 가져오려면 주문 컬렉션을 어떻게 필터링합니까?
업데이트 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에 사용자 지정 필드를 추가했으며 개념은 정상이지만 해당 기사에는 좋지 않은 몇 가지 사례가 있습니다.내가 다르게 할 수 있는 것들:
- 설정 스크립트를 사용하여 직접 수행하는 대신 데이터베이스에 필드를 추가합니다.
- $_REQUEST에 직접 액세스하는 대신 Magento의 Request 개체를 사용합니다.
- Magent를 core로 수정하는 대신 확장 및 다시 쓰기를 사용합니다.
- 코어를 수정하는 대신 확장에서 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
'programing' 카테고리의 다른 글
WebKit/Blink에서 MacOS 트랙패드 사용자의 스크롤 막대 숨기기 방지 (0) | 2023.09.04 |
---|---|
Chrome Developer 도구를 통해 Ajax 통화의 HTML 응답 보기? (0) | 2023.09.04 |
스핀 잠금 구현이 올바르고 최적입니까? (0) | 2023.09.04 |
mysql의 모든 테이블에서 모든 행을 비우는 방법(sql) (0) | 2023.09.04 |
divid에 자녀가 있는지 여부를 쿼리합니다. (0) | 2023.09.04 |