unclecheese/betterbuttons

为GridField详细表单添加新的表单操作和按钮,以增强可用性。

安装量: 507,658

依赖项: 24

建议者: 5

安全性: 0

星星: 80

关注者: 15

分支: 87

开放性问题: 64

类型:silverstripe-module

1.3.15 2018-04-17 18:54 UTC

README

silverstripe/silverstripe-admin#436

但我现在就想用!

如果你想在合并之前使用SS4,可以使用这个分支

Build Status

Screenshot

修改GridFields的详细表单,使用更友好的操作,包括

  • 保存并添加另一个:创建一个记录,然后直接添加另一个,无需点击后退按钮,然后再添加。
  • 保存并关闭:保存记录并返回列表视图
  • 用户友好的删除:从建设性操作板中提取出来并移开,因此不太可能意外点击。包括操作内联确认而不是浏览器警告框。
  • Screenshot
  • 取消:与后退按钮相同,但位置更方便
  • 前一条/下一条记录:在不返回列表视图的情况下导航到列表中的前一条或下一条记录
  • 前端链接:如果你的DataObject有一个Link()方法,可以一键获取草稿站点和已发布站点的链接,以在单次点击中查看记录的上下文
  • Screenshot
  • 版本控制:保存、保存并发布、回滚、取消发布
  • Screenshot
  • 可配置UI:将按钮添加到顶部(工具)或底部(操作)。
  • 消除歧义的选项卡:在模型管理中,顶部的选项卡在模型之间切换。在详细视图中,它们在字段组之间切换,这可能会创建一个令人困惑的用户体验。Better Buttons将字段分组为它们在CMSMain中的样子,在主编辑区域中使用选项卡组。
  • Screenshot
  • 添加您自己的自定义操作!

在详细视图中创建自定义操作

Screenshot

要求

SilverStripe 4.0或更高版本

安装

composer require unclecheese/betterbuttons 2.x-dev

自定义按钮集合

哪些按钮应该出现在哪里会有所不同,因为用户的偏好不同。BetterButtons为GridField详细表单中的“创建”和“编辑”视图提供了一组默认按钮集合,但这些可以在config.yml文件中轻松覆盖。

默认配置

BetterButtonsUtils:
  edit:
    BetterButtonPrevNextAction: true
    BetterButton_New: true
  versioned_edit:
    BetterButtonPrevNextAction: true
    BetterButton_New: true

BetterButtonsActions:
  create:
    BetterButton_Save: true
    BetterButton_SaveAndClose: true

  edit:
    BetterButton_Save: true
    BetterButton_SaveAndClose: true
    BetterButton_Delete: true
    BetterButtonFrontendLinksAction: true

  versioned_create:
    BetterButton_SaveDraft: true
    BetterButton_Publish: true
  versioned_edit:
    BetterButton_SaveDraft: true
    BetterButton_Publish: true
    Group_Versioning: true
    BetterButton_Delete: true
    BetterButtonFrontendLinksAction: true

BetterButtonsGroups:
  SaveAnd:
    label: Save and...
    buttons:
      BetterButton_SaveAndAdd: true
      BetterButton_SaveAndClose: true
      BetterButton_SaveAndNext: true
      BetterButton_SaveAndPrev: true
  Versioning:
    label: Versioning...
    buttons:
      BetterButton_Rollback: true
      BetterButton_Unpublish: true

在YAML定义中,每个按钮类型都分配了一个符号。它可以放置在任何地方,任何次数。此外,它可以放置在命名组中,前提是该组已在BetterButtonsGroups节点中定义。按钮组是一个带有标签的单个按钮,点击时会显示一系列选项。

由于Config层的数组合并具有特殊性,按钮必须定义为开或关(true或false)。要删除默认配置中的按钮,必须在项目配置中显式将其设置为false。以下是一个示例自定义配置。

BetterButtonsActions:
  edit:
    BetterButton_Save: false
    Group_SaveAnd: false
    Group_MyGroup: true
BetterButtonsGroups:
  MyGroup:
    label: This is a group
    buttons:
      BetterButton_Save: true
      BetterButton_SaveAndNext: true

创建组时,请确保不要重复任何组外部的按钮,因为具有相同名称的表单字段不能在表单中出现两次。

创建自定义操作

以下示例中,我们将创建一个GridField详细表单中的自定义操作,用于将DataObject更新为“批准”或“拒绝”。

我们可以在两个地方添加操作

  • 操作在表单底部(例如保存、取消)
  • 工具在表单右上角(例如新建记录、上一条/下一条)

首先,我们将根据按钮需要在UI中显示的位置,重载模型的getBetterButtonsActionsgetBetterButtonsUtils方法。

    public function getBetterButtonsActions() {
        $fields = parent::getBetterButtonsActions();
        if($this->IsApproved) {
            $fields->push(BetterButtonCustomAction::create('deny', 'Deny'));
        }
        else {
            $fields->push(BetterButtonCustomAction::create('approve', 'Approve'));
        }
        return $fields;
    }

BetterButtonCustomAction对象接收调用模型上方法的参数("拒绝"或"批准"),以及按钮的标签。

现在让我们向DataObject添加方法。

    public function approve() {
        $this->IsApproved = true;
        $this->write();
    }

    public function deny() {
        $this->IsApproved = false;
        $this->write();
    }

最后,出于安全考虑,我们需要将这些方法列入白名单,允许GridField表单调用。这与控制器中的$allowed_actions非常类似。

    private static $better_buttons_actions = array (
        'approve',
        'deny'
    );

现在UI中有了新的按钮!

Screenshot

个性化用户体验

确保在点击"批准"或"拒绝"后,表单刷新。

  $fields->push(
    BetterButtonCustomAction::create('deny', 'Deny')
      ->setRedirectType(BetterButtonCustomAction::REFRESH)
  );

重定向类型可以使用常量

BetterButtonCustomAction::REFRESH
BetterButtonCustomAction::GOBACK

刷新表单,或分别返回到列表视图。

此外,我们可以在我们的方法中返回一个消息,以添加成功消息,该消息将在操作完成后渲染。

    public function deny() {
        $this->IsApproved = false;
        $this->write();

        return 'Denied for publication';
    }

定义任意链接

有时,你可能根本不想向控制器发送请求。为此,有一个更简单的BetterButtonLink类。

    $fields->push(
        new BetterButtonLink(
          'View on Meetup.com',
           $this->MeetUpLink
        )
    );

Screenshot

创建嵌套表单

你可能有一个需要提示用户输入的操作,例如在订单记录上"发送此客户消息"。对于这类复杂操作,你可以使用BetterButtonNestedForm

	public function getBetterButtonsActions() {
		$f = parent::getBetterButtonsActions();
		$f->push(BetterButtonNestedForm::create('sendmessage','Send this customer a message', FieldList::create(
			TextareaField::create('Content')
		)));

		return $f;
	}

在这种情况下,你的动作处理程序接收$data$form,就像控制器一样。

    public function sendmessage ($data, $form) {
    	$message = Message::create(array (
    		'OrderID' => $this->ID,
    		'Content' => $data['Content']
    	));

    	$message->write();
    	$form->sessionMessage('Message sent','good');
    }

禁用Better按钮

有时,你可能需要在某些类上禁用Better按钮。你可以通过YML配置将静态better_buttons_enabled更改为false来实现。

MyBetterButtonLessClass
  better_buttons_enabled: false