Ação Personalizada
Uma ação ajuda a executar uma solicitação em uma entrada CRUD. Por padrão, o NexoPOS vem com ações “editar” e “excluir” que operam diretamente na linha selecionada. Isto mostrará como criar uma ação personalizada em uma entrada CRUD.
Registrar Filtro Personalizado
<?php
namespace Modules\YourModule\Providers;
use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;
class ServiceProvider
{
public function register()
{
Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
}
}
Vamos explicar o que está acontecendo acima. Em primeiro lugar, vamos registrar nosso filtro com o provedor de serviços do nosso módulo. Importamos 3 classes (Hook, CrudEntry e OrderCrud).
Neste exemplo, estamos tentando adicionar uma nova ação a uma entrada CRUD na tabela de pedidos. Em seguida, adicionamos um filtro usando o método “addFilter”, que irá colocar o callback no método “setActions” da classe OrderCrud.
Assim, toda vez que o método "setActions" é chamado, a callback "customAction" é acionada com, como parâmetro único, uma instância de "CrudEntry".
Adicionar ação à instância do CrudEntry
Agora, vamos nos concentrar no método de callback, pois é nele que vamos inserir nossa ação. Observe que podemos inserir mais de uma ação de uma só vez. Aqui está como definir uma ação:
<?php
namespace Modules\YourModule\Providers;
use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;
class ServiceProvider
{
public function regiser()
{
Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
}
public function customAction( CrudEntry $crudEntry )
{
$crudEntry->action(
label: 'Email to Customer',
identifier: 'email',
type: 'GET',
url: url( '/api/your/slug/' . $crudEntry->id )
);
return $entry;
}
}
Observe que aqui, nossa ação terá como identificador “email” e como rótulo “Email para o Cliente” (visível para o usuário). Quando for clicada, uma requisição GET (assíncrona) será executada para a URL fornecida no parâmetro “url”.
Se você quiser que o usuário confirme a ação, você pode adicionar uma nova entrada a esse array chamada "confirm", assim:
<?php
namespace Modules\YourModule\Providers;
use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;
class ServiceProvider
{
public function regiser()
{
Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
}
public function customAction( CrudEntry $crudEntry )
{
$crudEntry->action(
label: 'Email to Customer',
type: 'GET',
url: url( '/api/your/slug/' . $crudEntry->id ),
confirm: [
'message' => 'Would you like to send this as an email?'
]
);
return $entry;
}
}
Para solicitações assíncronas, apenas "GET" e "DELETE" são suportados. Se você quiser que o usuário seja direcionado para uma página diferente após clicar na ação, use o tipo "GOTO" em vez de "GET", assim:
<?php
namespace Modules\YourModule\Providers;
use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;
class ServiceProvider
{
public function regiser()
{
Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
}
public function customAction( CrudEntry $crudEntry )
{
$crudEntry->action(
lable: 'Email to customer',
type: 'GOTO',
url: url( '/api/your/slug/' . $crudEntry->id ),
confirm: [
'message' => 'Would you like to send this as an email?'
]
);
return $entry;
}
}
Ao clicar em uma ação, o usuário será redirecionado para a página na chave "url".
Executando solicitações assíncronas
Por padrão, as requisições GET e DELETE executarão uma requisição assíncrona. No entanto, um dos requisitos é adicionar uma mensagem de confirmação. Isso deve impedir que o usuário final acione uma ação acidentalmente.
<?php
namespace Modules\YourModule\Providers;
use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;
class ServiceProvider
{
public function regiser()
{
Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
}
public function customAction( CrudEntry $crudEntry )
{
$crudEntry->action(
label: 'Refresh Product',
type: 'GET',
url: url( '/api/your/slug/' . $crudEntry->id ),
confirm: [
'message' => 'Would you like to refresh the products ?'
]
);
return $entry;
}
}