MadConfirm
Confirmação com botões custom — builder PHP sobre MadDialog (JS puro, sem libs externas).
Mad\Ui\MadConfirm é o builder fluente por trás de
MadMessage::confirm() —
monta um diálogo modal (tipo warning, via MadDialog) com um ou
mais botões, cada um disparando um método PHP do componente alvo via
MadWire.call() quando clicado. Não é instanciado diretamente — sempre via
MadMessage::confirm(...).
O JS global madConfirm(mensagem, opções) (e o atributo
data-mad-confirm usado por mad:click/mad-act
via confirm="...") é um diálogo client-side simples
(Promise<boolean>, sim/não) que decide se uma ação local prossegue —
não chama o servidor e não tem botões customizados. O
Mad\Ui\MadConfirm desta página é uma classe PHP que
roda dentro de uma action e decide, no servidor, quais métodos cada botão dispara.
São dois mecanismos diferentes com nomes parecidos.
Uso básico — confirmar/cancelar
use Mad\Ui\MadMessage;
use Mad\Http\MadResponse;
public function onExcluir(int $id): MadResponse
{
return MadMessage::confirm('Excluir', 'Confirmar exclusão do registro #' . $id . '?', $this)
->onConfirm('deletar', [$id]) // botão primário — chama $this->deletar($id)
->onCancel() // botão secundário — só fecha o diálogo
->build();
}
public function deletar(int $id): MadResponse
{
Produto::destroy($id);
return MadToast::success('Excluído!')->removeRow($id, static::class);
}
API
| Método | Retorno | Descrição |
|---|---|---|
button($label, $action, $params = [], $variant = 'secondary', $madId = '') | static | Adiciona um botão genérico que chama $action do componente alvo. |
onConfirm($action, $params = [], $label = 'Confirmar', $variant = 'primary', $madId = '') | static | Atalho para o botão de confirmação principal (destaque, lado direito). |
onCancel($label = 'Cancelar') | static | Botão que só fecha o diálogo — não chama nenhum método PHP. |
build() | MadResponse | Finaliza o builder — obrigatório chamar por último. |
$variant aceita as mesmas variantes de botão do resto do framework:
primary, secondary, destructive, ghost,
outline. Sem nenhum botão adicionado, build() cai no fallback de
um único botão "OK" que só fecha o diálogo.
O ícone do diálogo vem do 4º argumento de MadMessage::confirm($title, $content, $component, $icon)
— nome de ícone Lucide, default alert-triangle. O type do dialog é
sempre warning em MadConfirm (não é configurável).
Múltiplos botões
Quando a confirmação tem mais de duas saídas possíveis, encadeie vários button():
use Mad\Ui\MadMessage;
use Mad\Http\MadResponse;
public function onPublicar(int $id): MadResponse
{
return MadMessage::confirm('Publicar', 'Escolha como deseja prosseguir:', $this)
->button('Publicar agora', 'publicar', [$id], 'primary')
->button('Salvar rascunho', 'salvarRascunho', [$id]) // variant default: secondary
->onCancel('Fechar')
->build();
}
Direcionando para outro componente
Por padrão os botões chamam métodos do componente passado como terceiro argumento de
MadMessage::confirm() (normalmente $this). Cada
button()/onConfirm() aceita um $madId próprio para
sobrescrever esse alvo por botão — ou você pode passar uma string de mad-id direto no
confirm():
// O 3º parâmetro de MadMessage::confirm() aceita string (mad-id explícito) —
// útil quando o botão precisa chamar um método de OUTRO componente da tela,
// não do componente que disparou o diálogo.
return MadMessage::confirm('Aprovar pedido', 'Confirmar aprovação?', 'pedido-detalhe-123')
->onConfirm('aprovar', [$pedidoId])
->build();
O que build() gera
build() serializa título/ícone/mensagem com json_encode (seguro
contra HTML/aspas) e monta os callbacks dos botões como expressões JS
MadWire.call(madId, action, params) — o resultado é um
MadResponse com um único op script chamando
MadDialog.show(...):
// build() monta e devolve um MadResponse com um único op script:
MadDialog.show({
"type": "warning",
"title": "Excluir",
"message": "Confirmar exclusão do registro #42?",
"icon": "alert-triangle",
"buttons": [
{ "label": "Confirmar", "type": "primary", "callback": () => MadWire.call("cmp-a1b2", "deletar", [42]) },
{ "label": "Cancelar", "type": "secondary", "callback": null }
]
});