Craft Commerce — Atualizar o status do pedido no frontend?

Aug 31 2020

Na sequência desta pergunta Comércio: como atualizar o status de um pedido por meio do frontend

Gostaríamos de tornar mais fácil para os motoristas de entrega atualizar o status de um pedido de comércio de artesanato a partir de uma página de front-end. Fazer isso via CP no celular é um pouco complicado, pois envolve várias etapas.

Criamos um grupo de usuários de correios de chamadas.

{% extends '_layouts/_logistics' %}

{% block logistics %}
    {% if currentUser and currentUser.isInGroup('courier') %}
        {% include 'logistics/_orders' %}
    {% else %}
        {% redirect 'account' %}
    {% endif %}
{% endblock %}

Na inclusão de _orders, gostaríamos de mostrar uma lista de pedidos, cada um com um botão 'Marcar como entregue', que pode ser clicado à medida que os pedidos são atendidos.

<dl>
    {% if order.shippingAddress %}
        {% include 'shop/_includes/addresses/address' with { address: order.shippingAddress } %}
    {% endif %}
    <dt>{{ order.reference }}</dt>
</dl>
<form method="POST">
    <input type="hidden" name="action" value="">
    {{ redirectInput('logistics') }}
    {{ csrfInput() }}
    <input type="hidden" name="orderStatusId" value="4">
    <input class="button button--primary" type="submit" value='Mark as Delivered'>
</form>

Eu estou querendo saber se isso pode ser feito, sem a necessidade de construir um plugin ou módulo? Caso contrário, existe um plano para incluir a capacidade de fazer isso em uma versão futura do Craft Commerce.

Muito Obrigado,

André

Respostas

1 JamesSmith Sep 01 2020 at 22:18

Isso parece um pouco sujo, mas você pode fazer isso diretamente em um modelo Twig como este:

{% set order = craft.orders.id(123).one() %}
{% do order.setAttributes({orderStatusId: 4}, false) %}
{% do craft.app.getElements().saveElement(order) %}

-- naturalmente você precisaria de uma maneira de buscar qual ordem você deseja atualizar, mas você pode facilmente pegar isso dos seus dados POST ou da URL ou localStorage ou qualquer outra coisa.