Modificando opções personalizadas de um item ao adicioná-lo ao carrinho?

8

Estou ouvindo o evento sales_quote_save_before para perceber quando um item é adicionado ao carrinho. Uma vez acionado, eu percorro as opções de itens como este:

$quote = $observer->getEvent()->getQuote();

foreach ($quote->getAllItems() as $item) {
    $options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());

    foreach($options['options'] as $option) {

         if($option['label'] == 'myOptionA') {
              // Here I want to change the selected value for the option  
         }
     }
}

Como você vê, assim que uma determinada opção (myOptionA no exemplo) for atingida, desejo alterar a opção selecionada. Então, digamos que myOptionA é uma lista suspensa e tem 4 valores possíveis. Caso o valor 1 seja selecionado, desejo definir o valor 4 para esse item. Portanto, quando o carrinho terminar de carregar, ele deverá ter o valor 4 para myOptionA. Não apenas o nome, mas também o preço. Como eu pude fazer isso?

user1638055
fonte
CMIIW, esse loop fornece os valores disponíveis, não o selecionado. Para obter a opção personalizada real que foi definida, analise $ array_sku = explode ('-', $ item-> getSku ()); Obviamente, o primeiro é o SKU do produto real $ sku = reset ($ array_sku); Ainda não tem uma solução para obter os dados.
Nicolallias
O ponto principal que estou vendo é poder definir o preço do valor da opção. Estive analisando isso nos últimos dias e não estou vendo uma maneira óbvia de definir o preço do valor. Parece que o item de cotação precisa ter as opções removidas e reconstruídas a partir da solicitação.
achou

Respostas:

8

Você pode escrever um observador para o evento catalog_product_type_prepare_full_options, que é o último evento no processo adicionar ao carrinho antes que o produto seja realmente adicionado ao carrinho e depois que as opções personalizadas sejam preparadas.

No observador, você tem os seguintes parâmetros disponíveis:

  • transport: objeto de transporte para todas as opções personalizadas, para que você possa alterá-las no observador. transport->optionsé uma matriz sob a forma option_id => option_value. Atenção, o transporte em si é um stdClassobjeto, não uma instância de Varien_Object, como você poderia esperar. Portanto, não há métodos getter e setter para transport->options.
  • product: o produto que será convertido em um item de cotação posteriormente.
  • buy_request: O objeto buyRequest, você pode lê-lo aqui e ainda modificá-lo também. É um Varien_Objectque contém, entre outros:

    • product: o ID do produto
    • options: Matriz de opções personalizadas no formulário:

      option_id => value

Fonte e mais informações: info_buyReferência de solicitação

Portanto, seu observador pode ficar assim:

$transport = $observer->getTransport();
if (isset($transport->options[OPTION_A_ID]) && $transport->options[OPTION_A_ID] == 1) {
    $transport->options[OPTION_A_ID] = 4;
}

$buyRequest= $observer->getBuyRequest();
$buyRequestOptions = $buyRequest->getOptions();
if (isset($buyRequestOptions[OPTION_A_ID]) && $buyRequestOptions[OPTION_A_ID] == 1) {
    $buyRequestOptions[OPTION_A_ID] = 4;
}
$buyRequest->setOptions($buyRequestOptions);

A primeira parte (alteração $transport) é relevante para realmente alterar o valor da opção OPTION_A_ID. A segunda parte (alteração $buyRequest) é opcional, ela excluirá todos os vestígios do valor que o cliente selecionou e, se ele reordenar o pedido, o novo valor será selecionado imediatamente porque a solicitação de compra é "executada" com os parâmetros alterados. Você tem que decidir, se é isso que você quer.

Fabian Schmengler
fonte
O mesmo evento pode ser usado para o magento 2 para fins semelhantes.
Bartosz Kubicki
ele não está funcionando em magento2
Magento2 Devloper
0

Se você configurou seu atributo através do código, ou seja, usando um script de instalação - você encontrará seu atributo como uma coluna sob o sales_flat_quote_item.

Se estiver lá, tendo acesso à variável $ item, você poderá usar métodos mágicos pertencentes ao seu atributo:

// column name my_option
$item->setMyOption("value"); // to set the value
$item->getMyOption(); // to get the value

Se for esse o caso, você poderá simplificar o código da seguinte maneira:

$quote = $observer->getEvent()->getQuote();
foreach ($quote->getAllItems() as $item) {
    $item->setMyOptionA("New Value");
    $item->save();
}

Como mencionado, esta solução se refere apenas aos atributos do item de cotação configurados programaticamente.

Dan Hanly
fonte