shel/neos-terminal

Neos CMS UI 终端,用于运行 Eel 表达式和其他命令

资助包维护!
Patreon
sebobo

安装次数: 25,554

依赖项: 0

建议者: 0

安全性: 0

星标: 13

关注者: 3

分支: 5

开放问题: 4

类型:neos-plugin

1.2.1 2024-09-17 08:20 UTC

README

Tests

此包为 Neos CMS UI 提供了一个终端仿真插件。提供了一些命令以在 Neos CMS 项目的开发与调试过程中节省时间。

所有命令及其输出也自动在浏览器开发控制台中以 NeosTerminal 的形式可用,便于处理 JSON 结果和持久历史。

它使用了 Linus Willner 的优秀 终端组件

快速概述

  • 通过 Neos UI 或浏览器控制台运行命令
    • 评估当前选中页面和内容上的 Eel 表达式
    • 通过节点属性搜索节点
    • 刷新缓存
    • 修复节点
  • 命令名称自动完成
  • 通过 t+t 快捷键打开终端
  • 限制命令到后端角色
  • 创建您自己的命令并在自己的包中提供它们
  • 完全支持 Shel.Neos.CommandBar

外观

观看 视频

Terminal example in the Neos CMS backend

安装

在您的 Neos 项目中运行以下命令

composer require shel/neos-terminal

支持的 Neos 版本

由于需要 React 功能,终端 UI 集成仅适用于提供 React >= 16.8 的较新 Neos 版本。但即使 React 版本太旧,命令仍然注册并通过 NeosTerminal 全局窗口对象可用。

使用方法

有三种方式可以访问终端功能

  1. 点击 Neos 后端顶部菜单栏中的终端图标以打开终端。
  2. 使用 t t 快捷键打开终端(通过 Settings.yaml 中的 Neos 快捷键 API 配置)。
  3. 通过全局 NeosTerminal 对象从浏览器开发控制台访问终端命令。

现在您可以运行提供的任何命令,或您自己的命令。

包含的命令

可用的默认命令

  • eel - Eel 表达式解析器
  • flushCache - 刷新一个或所有 Neos/Flow 缓存
  • help - 显示命令列表及其参数
  • clear - 清除终端
  • search - 通过属性搜索节点
  • nodeRepair - 修复节点

您可以添加 自定义命令

Eel 评估器

eel 命令允许您运行任何 Eel 表达式。

您可以运行简单的表达式

eel 5+2

读取特定设置

eel Configuration.setting('Neos.Flow.core.context')

获取所有 Eel 辅助函数的列表

eel Configuration.setting('Neos.Fusion.defaultContext')

或更复杂的表达式。以下调用将返回主页所有子页面的标签

eel Array.map(q(site).children().get(), page => page.label)

默认情况下,当前 sitedocumentNode 和当前选中的 node 在您的表达式上下文中可用。

注意: 命令将对结果执行一些转换

  • 如果结果是节点或节点列表,则每个节点将替换为其 properties 列表。
  • 属性是对象的,则替换为其类名。

这将在未来的版本中得到优化,并应该提高输出的可读性。

刷新缓存

flushCache 命令允许您刷新所有缓存或单个缓存。

例如,以下调用将刷新融合渲染缓存

flushCache Neos_Fusion_Content

如果省略缓存标识符,则刷新所有缓存。

请仅在绝对必要时使用此命令。缓存问题可以在实现中进行修复。

修复节点

nodeRepair 命令允许您通过节点类型修复节点。它使用与 ./flow node:repair CLI 命令相同的插件和方法。

例如,以下调用将移除 Neos 示例文本节点中的未定义属性

nodeRepair removeUndefinedProperties Neos.NodeTypes:Text

您也可以通过添加 -d 选项进行干运行,看看该方法会做什么

nodeRepair --dryRun removeUndefinedProperties Neos.NodeTypes:Text

要按工作空间过滤,可以添加工作空间名称

nodeRepair --workspace user-admin removeUndefinedProperties Neos.NodeTypes:Text

警告:一些修复方法在通过 CLI 运行时会要求您进行确认。目前它们将在不要求确认的情况下执行。

配置

在生产环境中启用插件

默认情况下,该插件仅在 开发 环境中加载。如果您想将其激活在 生产 中,您必须覆盖您的 Settings.yaml 中的设置

Neos:
  Neos:
    Ui:
      frontendConfiguration:
        'Shel.Neos.Terminal:Terminal':
          enabled: true

安全性

在 Neos 后端执行命令会打开一个可能的安全风险。

因此,如果您在生产环境中使用此插件,请确保只有有限数量的用户可以访问它。

当创建自己的命令时,请记住确保数据库或其他系统不会发生任何不良情况。

示例:如果您有自己的 Eel 辅助程序,可以发送 API 请求到另一个具有完全写访问权限的系统,如果足够权限的后端用户被黑客攻击,这可能会被滥用。

主题

请查看此包中的 Settings.yaml 和其 frontendConfiguration。它允许您使用自己的主题覆盖主题。

命令策略

默认情况下,任何 管理员 都可以完全访问所有现有和添加的命令。

此外,存在一个名为 Shel.Neos.Terminal:TerminalUser 的角色,默认情况下只能运行 eel 命令。您可以向此角色添加更多权限,以允许更多命令,并将其分配给用户或作为其他角色的 parentRole。请参阅此包中的 Policy.yaml 中的示例。

添加自己的命令

添加自己的命令只需要几个步骤(具体取决于您计划做什么)。

创建一个名为 MyCommand 的新类,并实现此包中的 TerminalCommandControllerPluginInterface 或从 AbstractTerminalCommand 继承。一旦实现了所有必需的方法,您就可以开始了!

例如,您可以使用以下类创建一个显示每日笑话的命令。只需根据您的包密钥调整命名空间即可。

<?php
declare(strict_types=1);

namespace Vendor\Package\Command;

use Neos\Flow\Http\Client\Browser;
use Neos\Flow\Http\Client\CurlEngine;
use Shel\Neos\Terminal\Domain\CommandContext;
use Shel\Neos\Terminal\Domain\CommandInvocationResult;
use Shel\Neos\Terminal\Command\TerminalCommandInterface;

class JokeCommand implements TerminalCommandInterface
{           

    public static function getCommandName(): string
    {
        return 'jod';
    }

    public static function getCommandDescription(): string
    {
        return 'Joke of the day';
    }

    public static function getCommandUsage(): string
    {
        return 'jod [<string>]';
    }

    public function invokeCommand(string $argument, CommandContext $commandContext): CommandInvocationResult
    {
        $browser = new Browser();
        $browser->setRequestEngine(new CurlEngine());
        $jokeResponse = json_decode($browser->request('https://api.jokes.one/jod')->getBody()->getContents());
        $joke = $jokeResponse->contents->jokes[0]->joke;

        $result = $joke->title . ': ' . $joke->text;

        return new CommandInvocationResult(true, $result);
    }
}

您创建了哪些有用的命令?请发送包含 PHP 类或链接到您存储库的 gist 链接,我们可以将其添加到文档中。

向 Neos UI 提供反馈

Neos UI 支持 ServerFeedbacks。这些通常用于在操作节点和文档后触发节点和文档的重新加载或更改节点状态。

您可以将这些反馈添加到 CommandInvocationResult

触发节点更新执行后 Neos UI 客户端框架重新加载的调用方法示例如下

  public function invokeCommand(string $argument, CommandContext $commandContext): CommandInvocationResult
    {
        $newNodeTitle = $argument;
        $commandContext->getFocusedNode()->setProperty('title', $newNodeTitle);    
        $result = 'I updated the node title';
        $feedback = [
            new \Neos\Neos\Ui\Domain\Model\Feedback\Operations\ReloadDocument()        
        ];

        return new CommandInvocationResult(true, $result, $feedback);
    }

如果您有具有自己注册反馈的 Neos UI 插件,您也可以触发它们。

在其他包中提供命令

如果你的包提供了一个命令,你应当在定义命令时检查终端是否已安装在你的代码中。

为了实现这一点,你需要将命令类包装在条件中,并使用完全限定名来引用终端包中的类和接口。

if (interface_exists('Shel\Neos\Terminal\Command\TerminalCommandInterface', false)) {
    class JokeCommand implements \Shel\Neos\Terminal\Command\TerminalCommandInterface
    {
        public static function getCommandName(): string { ... }
        public static function getCommandDescription(): string { ... }
        public static function getCommandUsage(): string { ... }

        public function invokeCommand(string $argument, \Shel\Neos\Terminal\Domain\CommandContext $commandContext): \Shel\Neos\Terminal\Domain\CommandInvocationResult {
            ...

            return new \Shel\Neos\Terminal\Domain\CommandInvocationResult(true, $result);
        }
    }
} else {
    class JodCommand {}
}

支持此插件/如何去除赞助徽章

创建和维护此类插件需要花费大量时间。因此,我决定添加一个微小的烦人徽章来推广对我的工作的财务支持。

有几种方法可以去除终端中的小赞助徽章。

  1. 与我联系进行100€(不含税)/注册密钥的直接赞助。
  2. 通过Github成为赞助者,每月20$+级别。
  3. 成为patreon每月20$+级别。

作为回报,你会感觉好很多,你将获得一个可以放入设置的注册密钥,这将禁用提到的徽章。

这将帮助我进一步开发这个和其他插件。当然,我也会尽我最大的努力快速响应用户的问题和疑问。

还有第四种方法:fork这个仓库并修补验证检查(或者你可能找到的任何其他方法)。当然你可以这么做。但你会得到不好的 karma,而且你不会帮助这个插件的未来。

如果这个徽章没有让你烦恼,那也行。保留它,享受插件吧 :)

贡献

非常欢迎贡献。

对于代码贡献,请创建一个fork,并为当前维护的最低分支(目前是master)创建一个PR。

  • 请确保不要将任何生成文件包含在你的更改中的/Resources/Public/中。
  • 请在你的提交中提供关于你更改的详细说明,并确保提交信息格式良好。

运行测试

确保你在composer.json中包含了所需的behat依赖项,并运行以下命令

FLOW_CONTEXT=Testing bin/phpunit -c Build/BuildEssentials/PhpUnit/FunctionalTests.xml Packages/Plugins/Shel.Neos.Terminal/Tests/Functional

许可证

许可证