eolica / laravel-content-tools
用于直接在页面上编辑网页前端翻译的Laravel包
Requires
- php: ^8.0
- brick/varexporter: ^0.3.7
- illuminate/contracts: ^8.0 || ^9.0 || ^10.0
- illuminate/filesystem: ^8.0 || ^9.0 || ^10.0
- illuminate/http: ^8.0 || ^9.0 || ^10.0
- illuminate/support: ^8.0 || ^9.0 || ^10.0
- illuminate/view: ^8.0 || ^9.0 || ^10.0
Requires (Dev)
- orchestra/testbench: ^6.0 || ^7.0 || ^8.0
- phpunit/phpunit: ^9.0 || ^10.0
README
这是一个用于直接在页面上编辑网页前端翻译的Laravel包。它使用ContentTools,这是一个JavaScript库,提供WYSIWYG编辑器,可以添加到任何页面,以便我们可以在行内编辑HTML内容。
安装
您可以通过Composer安装此包
composer require eolica/laravel-content-tools
安装后,如果您没有使用自动包发现,则需要将Eolica\LaravelContentTools\ContentToolsServiceProvider
服务提供者注册到您的config/app.php
文件中。
'providers' => [ ... /* * Package Service Providers... */ Eolica\LaravelContentTools\ContentToolsServiceProvider::class, ... ],
或者,您也可以在App\Providers\AppServiceProvider
中注册它
namespace App\Providers; use Eolica\LaravelContentTools\ContentToolsServiceProvider; final class AppServiceProvider extends ServiceProvider { public function register(): void { $this->app->register(ContentToolsServiceProvider::class); } ... }
公共资产
由于此包使用公共资产,您必须使用以下Artisan命令来发布它们
php artisan vendor:publish --tag=content-tools:assets --force
为了保持资产更新并避免未来更新中出现的问题,我们建议将命令添加到composer.json文件中的post-autoload-dump
脚本中
"scripts": { "post-autoload-dump": [ "@php artisan vendor:publish --tag=content-tools:assets --force --ansi" ] }
包将自动将发布的资产注入到styles
和scripts
堆栈中,因此您必须将它们添加到您的布局中
<html> <head> ... @stack('styles') </head> <body> ... @stack('scripts') </body> </html>
配置
您可以使用以下命令发布content-tools
配置文件
php artisan vendor:publish --tag=content-tools:config
这将在您的应用中创建一个config/content-tools.php
文件,您可以根据需要修改它来设置配置。
这是具有默认值的配置文件
<?php return [ 'routes' => [ 'prefix' => 'content-tools', 'middleware' => ['web'], ], 'editor' => [ 'default_tools' => [ [ 'bold', 'italic', 'link', 'align-left', 'align-center', 'align-right', ], [ 'heading', 'subheading', 'paragraph', 'unordered-list', 'ordered-list', 'table', 'indent', 'unindent', 'line-break', ], [ 'preformatted', ], [ 'undo', 'redo', 'remove', ], ], 'default_video_width' => 400, 'default_video_height' => 300, 'highlight_hold_duration' => 2000, 'min_crop' => 10, 'restricted_attributes' => [ '*' => [], 'img' => ['height', 'width', 'src', 'data-ce-max-width', 'data-ce-min-width'], 'iframe' => ['height', 'width'], ], ], ];
路由
routes
选项是您可以指定应用于包路由的前缀的地方,如果与其他应用程序中的路由发生冲突,也可以指定这些路由的中间件列表,默认情况下,应用web
组中间件。
编辑器
editor
选项是您可以指定ContentTools设置的地方。
使用方法
您需要做的只是将content-tools-translation
组件添加到您的Blade视图中。
<x-content-tools-translation key="web.pages.home.content" />
key
属性映射到在您的翻译文件中定义的短键。
您可以将任何额外属性传递给组件,例如,我们可以添加class
属性来样式化内容
<x-content-tools-translation key="web.pages.home.content" class="content" />
固定布局
假设我们有一个包含h1
html标签标题的网站主页,我们希望这个标题是可翻译的,但我们不希望用户破坏h1
标签,从而对SEO产生负面影响。
这就是固定布局允许我们做的事情。只需添加一个带有您希望固定的html标签的值的fixture
属性即可
<x-content-tools-translation key="web.pages.home.title" fixture="h1" />
我们建议始终使用固定布局以防止用户破坏页面布局,并在必要时仅使用非固定翻译。
权限
默认情况下,此包使用 Eolica\LaravelContentTools\PermissionHandler\TruePermissionHandler
,允许任何进入您网站的人编辑您的翻译。这在本地开发中非常有用,但在生产环境中,您可能需要某种身份验证检查。
此包附带 Eolica\LaravelContentTools\PermissionHandler\AuthGuardCheckPermissionHandler
,用于检查特定身份验证守护程序的用户是否已通过身份验证。
考虑到这一点,我们可以在应用程序不在本地环境中运行时,将此实现绑定到我们的 App\Providers\AppServiceProvider
。
namespace App\Providers; use Eolica\LaravelContentTools\PermissionHandler\AuthGuardCheckPermissionHandler; use Eolica\LaravelContentTools\PermissionHandler\PermissionHandler; final class AppServiceProvider extends ServiceProvider { public function register(): void { if (!$this->app->isLocal()) { $this->app->bind(PermissionHandler::class, function ($app): PermissionHandler { return new AuthGuardCheckPermissionHandler( $app->make('auth')->guard('backend') ); }); } } ... }
现在,在生产环境中,只有通过 backend
守护程序身份验证的用户才能编辑翻译。在本地开发中,它将回退到 Eolica\LaravelContentTools\PermissionHandler\TruePermissionHandler
实现以便我们可以轻松测试,无需进行身份验证。
创建自己的权限处理器
如果 Eolica\LaravelContentTools\PermissionHandler\AuthGuardCheckPermissionHandler
不足以满足您的需求,您可以创建自己的权限处理器实现。
权限处理器可以是实现 Eolica\LaravelContentTools\PermissionHandler\PermissionHandler
接口的任何类。
namespace Eolica\LaravelContentTools\PermissionHandler; interface PermissionHandler { public function check(): bool; }
要注册自己的权限处理器,您可以在 App\Providers\AppServiceProvider
中覆盖我们默认的实现。
namespace App\Providers; use App\ContentTools\PermissionHandler\YourOwnPermissionHandler; use Eolica\LaravelContentTools\PermissionHandler\PermissionHandler; final class AppServiceProvider extends ServiceProvider { public function register(): void { $this->app->bind(PermissionHandler::class, function ($app): PermissionHandler { return new YourOwnPermissionHandler(); }); } ... }
由于我们的包使用 bindIf
方法注册绑定(如果尚未注册),因此您的自定义权限处理器将优于我们的默认实现。
组合多个权限处理器
也许 Eolica\LaravelContentTools\PermissionHandler\AuthGuardCheckPermissionHandler
对您来说很好,但您还想执行其他类型的检查,因此您为特定情况创建了自定义权限处理器,并且不想复制和粘贴内置权限处理器代码。
对于这些场景,此包附带 Eolica\LaravelContentTools\PermissionHandler\CompositePermissionHandler
,它接受一系列 PermissionHandler
。
与以往一样,您可以在 App\Providers\AppServiceProvider
中绑定此实现。
namespace App\Providers; use App\ContentTools\PermissionHandler\YourOwnPermissionHandler; use Eolica\LaravelContentTools\PermissionHandler\AuthGuardCheckPermissionHandler; use Eolica\LaravelContentTools\PermissionHandler\CompositePermissionHandler; use Eolica\LaravelContentTools\PermissionHandler\PermissionHandler; final class AppServiceProvider extends ServiceProvider { public function register(): void { $this->app->bind(PermissionHandler::class, function ($app): PermissionHandler { return new CompositePermissionHandler( new AuthGuardCheckPermissionHandler($app->make('auth')), new YourOwnPermissionHandler(), ); }); } ... }
使用此方法,您可以为每个检查创建小的处理器,而不是创建执行所有不同检查的大权限处理器,从而使代码更灵活、可重用。
创建自己的翻译存储库
此包附带 Eolica\LaravelContentTools\Repository\FileTranslationRepository
,它从 storage/app/resources/lang
文件夹中的 php 文件持久化和加载翻译。如果您想将翻译持久化到其他源(数据库、csv、yaml 等),您可以创建自己的翻译存储库。
翻译存储库可以是实现 Eolica\LaravelContentTools\Repository\TranslationRepository
接口的任何类。
namespace Eolica\LaravelContentTools\Repository; interface TranslationRepository { public function save(string $locale, string $group, string $key, string $value): void; public function load(string $locale, string $group): array; }
要注册自己的翻译存储库,您可以在 App\Providers\AppServiceProvider
中覆盖我们默认的实现。
namespace App\Providers; use App\ContentTools\Repository\YourOwnTranslationRepository; use Eolica\LaravelContentTools\Repository\TranslationRepository; final class AppServiceProvider extends ServiceProvider { public function register(): void { $this->app->bind(TranslationRepository::class, function ($app): TranslationRepository { return new YourOwnTranslationRepository(); }); } ... }
由于我们的包使用 bindIf
方法注册绑定(如果尚未注册),因此您的自定义存储库将优于我们的默认实现。
当前缺少的功能
- 对具有 参数 的翻译支持,我们还需要为此提供良好的解决方案,任何帮助都将受到欢迎。
- 对更复杂翻译的支持图像上传
变更日志
请参阅 CHANGELOG 了解最近更改的更多信息。
安全性
如果您在此包中发现安全漏洞,请通过发送电子邮件到 info@eolicadigital.com 而不是使用问题跟踪器。
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。