模态对话框

建议编辑

模拟一个模态对话框,该对话框响应用户操作在主页面内容上方出现。

工作描述

模态窗口出现在页面顶部,使页面变暗。这有助于将用户的注意力集中在特定操作上,而不会失去整体上下文。需要注意的是,模态窗口不应用于大型表单。

此图片展示了一个示意性的模态窗口。

使用时机

模态窗口最适合用于仅在某些情况下需要的次要内容。这些内容可能包括设置、新建文档、填写小型表单。例如,点击链接可能会打开一个模态窗口以输入地址。

使用方法

可以通过调用静态方法使用简短语法来实现模态窗口,这样就无需创建单独的类。以下示例演示如何创建模态窗口:

use Orchid\Support\Facades\Layout;
use Orchid\Screen\Actions\ModalToggle;
use Orchid\Support\Facades\Toast;

/**
 * 按钮命令。
 *
 * @return \Orchid\Screen\Action[]
 */
public function commandBar(): array
{
    return [
        ModalToggle::make('启动演示模态')
            ->modal('exampleModal')
            ->method('action')
            ->icon('full-screen'),
    ];
}

/**
 * 视图。
 *
 * @return string[]|\Orchid\Screen\Layout[]
 */
public function layout(): array
{
    return [
        Layout::modal('exampleModal', [
            Layout::rows([]),
        ]),
    ];
}

/**
 * 提交模态窗口表单时将发生的操作
 */
public function action(): void
{
    Toast::info('你好,世界!这是一个提示消息。');
}

需要注意的是,在添加模态窗口时,应将其添加到 layout() 方法返回的数组的顶层。它不应添加到其他布局(如 Tabs)内部。

标题

要设置模态窗口的标题,可以使用 title 方法:

Layout::modal('exampleModals', [
    Layout::rows([]),
])
    ->title('窗口标题');

窗口大小

根据窗口的内容,可能需要调整其大小。这可以通过指定 size 方法来完成:

use Orchid\Screen\Layouts\Modal;

Layout::modal('exampleModals', [
    Layout::rows([]),
])
    ->size(Modal::SIZE_LG);

按钮名称

模态窗口有两个操作:

  • 颜色按钮 – 默认操作,保存已完成的工作或确认之前调用的命令。
  • 取消按钮 – 关闭窗口而不保存输入的数据。

您可以为它们设置自己的名称:

Layout::modal('exampleModals', [
    Layout::rows([]),
])
    ->applyButton('发送')
    ->closeButton('关闭');

禁用按钮

要禁用每个按钮有其自己的方法:

Layout::modal('exampleModals', [
    Layout::rows([]),
])
    ->withoutApplyButton()
    ->withoutCloseButton();

位置

模态窗口不仅可以显示在屏幕中央,还可以显示在右侧:

use Orchid\Screen\Layouts\Modal;

Layout::modal('exampleModals', [
    Layout::rows([]),
])
    ->type(Modal::TYPE_RIGHT);

打开

有时您可能需要在页面显示后立即打开模态窗口。为此,您可以使用 ->open 方法:

use Orchid\Screen\Layouts\Modal;

Layout::modal('exampleModals', [
    Layout::rows([]),
])
    ->open();

延迟数据加载

在处理数据集时,无需为每个值创建模态窗口。相反,您可以使用延迟加载。这将在打开窗口时替换 query 屏幕数据并显示新内容。

为了声明模态窗口为异步,您必须调用 deferred 方法,并在参数中传递应替代 query 的方法名称:

Layout::modal('deferredModal', Layout::rows([
    Input::make('welcome')
]))->deferred('loadDataOnOpen'),

以下是延迟加载方法的示例:

/**
 * 此方法用于获取数据,并在模态打开时更新模态内容,而无需完全重新加载页面。
 */
public function loadDataOnOpen(string $welcome): array
{
    return [
        'welcome' => $welcome,
    ];
}

在触发模态窗口时,您可以直接传递值:

use Orchid\Screen\Actions\ModalToggle;

ModalToggle::make('打开模态')
    ->method('methodForSubmitModal')
    ->modalTitle('可自定义标题')
    ->modal('deferredModal', [
        'welcome' => '你好,世界!',
    ]),

禁用响应处理

默认情况下,窗口操作的结果将显示给用户,但如果您需要执行复杂处理或下载文件,这种方法可能不适用。要禁用响应处理,您需要添加对 rawClick 方法的调用:

Layout::modal('exampleModals', [
    Layout::rows([]),
])
    ->rawClick();

我们的朋友