rezaramezanpour / laravel-toc
为帖子、新闻、文章或其他文本生成目录表的 Laravel 包
dev-main
2021-10-13 06:42 UTC
Requires
- php: ^7.0
- illuminate/support: 8.*.*
Requires (Dev)
- phpunit/phpunit: ^6.4
This package is auto-updated.
Last update: 2021-10-13 06:43:13 UTC
README
**本包最初是从 https://packagist.org.cn/packages/nikolay-oskin/contents 分支出来的**。
本包根据输入文本中的 h2-h6 HTML 标签,为您的帖子、新闻、文章等提供可点击的目录表。
使用方法
假设您有一些帖子(来自 WYSIWYG 编辑器或类似的东西)存储在数据库中,看起来像这样
<h2>First h2 header</h2>
<p>Some text</p>
<h3>First h3 header</h3>
<p>Some text</p>
<h3>2nd h3 header</h3>
<p>Some text</p>
<h4>First h4 header</h4>
<p>Some text</p>
<h4>2nd h4</h4>
<p>Some text</p>
<h2>Latest header</h2>
您有一个 PostController,其中包含 show() 方法,该方法将 Post 模型对象数据发送到您的视图。
public function show ($id) { $post = Post::find($id); $header = $post->title; $body = $post->body; return view('post', compact('header', 'body'); }
您的 'post.blade.php' 视图看起来非常简单,如下所示
<div> <h1>{{$header}}</h1> {!! $body !!} </div>
这就是您如何在控制器中使用此包来生成“目录表”的方法
public function show ($id, Contents $contents) { $post = Post::find($id); $header = $post->title; $body = $contents->fromText($post->body)->getHandledText(); $contents = $contents->getContents(); return view('post', compact('header', 'body', 'contents'); }
现在您已传递了“contents”数组,其中存储了您的标题标签。此外,如您所见,您还传递了“handledText”,其中包含标题 HTML 标签中的 id 属性。
您的视图
<div> <h1>{{$header}}</h1> @if(!empty($contents)) @include('nikolay-oskin.contents.table', $contents) @endif {!! $post !!} </div>
table.blade.php 是包含 ul-li 标签的视图,您可以在其中添加 CSS 样式或进行其他自定义。
结果
选项
默认情况下,为 h2-h6 标签创建内容。您可以为包含在“目录表”中的标题标签设置。
示例
public function show ($id, Contents $contents) { $post = Post::find($id); $contents->fromText($post->body)->setTags(['h2', 'h3']); $body = $contents->getHandledText(); $contents = $contents->getContents(); return view('post', compact('body', 'contents'); // Only h2 and h3 headers will be added to table of contents }
您还可以设置文本的最小长度数字,如果文本长度低于此数字,则 $contents 数组将为空,并且 $contents->getHandledText() 返回原始文本。
示例
public function show ($id, Contents $contents) { $post = Post::find($id); $contents->fromText($post->body)->setTags(['h2', 'h3'])->setMinLength(5000); $body = $contents->getHandledText(); $contents = $contents->getContents(); return view('post', compact('body', 'contents'); // Table of contents will not be shown for texts length less than 5000 chars. }
安装
适用于 Laravel 5.5+
composer require rezaramezanpour/laravel-toc
将视图复制到您的 resource/views 目录
php artisan vendor:publish --provider="RezaRamezanpour\LaravelToc\ContentsServiceProvider"
许可证
MIT