carrooi / labels
Nette 的标签模块
Requires
- kdyby/doctrine: ~2.2
- kdyby/events: ~2.3
- nette/application: ~2.2
- nette/di: ~2.2
- nette/utils: ~2.2
Requires (Dev)
- nette/bootstrap: ~2.2
- nette/mail: ~2.2
- nette/safe-stream: ~2.2
- nette/tester: ~1.3.0
This package is auto-updated.
Last update: 2024-09-06 03:28:44 UTC
README
Nette 框架的标签模块。
现在,任何 doctrine 实体都可以转换为 "可标签化" 实体(想象一下您的 Gmail 邮件带有标签)。
安装
$ composer require carrooi/labels
$ composer update
配置
extensions: labels: Carrooi\Labels\DI\LabelsExtension labels: ownerClass: App\Model\Entities\User labelItemClass: App\Model\Entities\LabelItem entities: App\Model\Entities\Mail: mail App\Model\Entities\Article: article
- ownerClass:很可能是您的
User
实体 - labelItemClass:实体,其中包含您的标签与可标签化实体之间的关联
- entities:包含名称的标签化实体列表,该名称是您的
LabelItem
实体中的列
拥有者实体
拥有者实体必须实现 Carrooi\Labels\Model\Entities\ILabelOwner
接口,该接口只有一个方法
getId()
:返回标识符
namespace App\Model\Entities; use Carrooi\Labels\Model\Entities\ILabelOwner; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @author David Kudera */ class User implements ILabelOwner { // ... /** * @return int */ public function getId() { return $this->id; } }
LabelItem 实体
必须实现 Carrooi\Labels\Model\Entities\ILabelItem
接口的实体,具有以下方法
getId()
:返回标识符getLabel()
:返回Carrooi\Labels\Model\Entities\Label
实体setLabel()
:设置Carrooi\Labels\Model\Entities\Label
实体
您可以使用预定义的 Carrooi\Labels\Model\Entities\TLabelItem
特性来实现最后两个方法,而不是自己实现。
namespace App\Model\Entities; use Carrooi\Labels\Model\Entities\ILabelItem; use Carrooi\Labels\Model\Entities\TLabelItem; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @author David Kudera */ class LabelItem implements ILabelItem { use TLabelItem; /** * @ORM\Id * @ORM\Column(type="integer") * @var int */ private $id; /** * @ORM\ManyToOne(targetEntity="\App\Model\Entities\Mail") * @var \App\Model\Entities\Mail */ private $mail; /** * @ORM\ManyToOne(targetEntity="\App\Model\Entities\Article") * @var \App\Model\Entities\Article */ private $article; /** * @return int */ public function getId() { return $this->id; } // ... other getters and setters for mail and article fields }
可标签化实体
最后,更新您的可标签化实体,例如我们的 Mail
实体。
每个可标签化实体都必须实现 Carrooi\Labels\Model\Entities\ILabelableEntity
接口,具有以下方法
getId()
:返回标识符getLabelItems()
:返回Carrooi\Labels\Model\Entities\ILabelItem
实体的数组addLabelItem()
:现在将Carrooi\Labels\Model\Entities\ILabelItem
实体添加到标签项集合removeLabelItem()
:从标签项集合中删除Carrooi\Labels\Model\Entities\ILabelItem
实体
您不需要自己实现这些方法(除了 getId()
以外),只需简单地使用 Carrooi\Labels\Model\Entities\TLabelable
特性。
namespace CarrooiTests\LabelsApp\Model\Entities; use Carrooi\Labels\Model\Entities\ILabelableEntity; use Carrooi\Labels\Model\Entities\TLabelable; use Kdyby\Doctrine\Entities\Attributes\Identifier; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @author David Kudera */ class Article implements ILabelableEntity { use TLabelable; // ... your own fields /** * @return int */ public function getId() { return $this->id; } // ... some other getters and setters }
用法
主要思想是您有更多的标签命名空间,您(或您的用户)可以在其中创建新的标签。当然,如果您想,您也可以只有一个主命名空间,其中包含该命名空间中的所有标签。例如,GitHub 就是在问题和拉取请求之间共享标签。
这些命名空间可能是在您的项目和数据库中“硬编码”的。
标签命名空间外观
您可以使用注册的服务 Carrooi\Labels\Model\Facades\LabelNamespacesFacade
来处理命名空间。
创建新命名空间:
$namespace = $namespaces->addNamespace('articles');
查找命名空间:
$namespace = $namespaces->findNamespace('articles');
获取所有命名空间:
foreach ($namespaces->getNamespaces() as $namespace) { // ... }
重命名命名空间:
$namespaces->renameNamespace($namespace, 'mails');
删除命名空间:
$namespaces->removeNamespace($namespace);
标签外观
现在您可以让您的用户创建自己的标签。为此,有 Carrooi\Labels\Model\Facades\LabelsFacade
服务。
创建标签:
$label = $labels->addLabel($namespace, $owner, 'Best articles', 'best');
最后一个参数是标签的 "系统名称",不是必需的。如果您有一些默认标签并想稍后与它们一起工作,这可能很有用。
获取所有标签:
foreach ($labels->getLabels($namespace, $owner) as $label) { // ... }
按系统名称查找标签:
$label = $labels->findLabel($namespace, $owner, 'best');
按 ID 查找标签:
$label = $labels->findLabelById($id);
重命名标签:
$labels->renameLabel($label, 'Super articles', 'super');
您可以将第二个和第三个参数替换为 null。
删除标签:
$labels->removeLabel($label);
标签项外观
最后一个外观类是 Carrooi\Labels\Model\Facades\LabelItemsFacade
,它再次在 DI 容器中注册为服务。
使用此服务,您可以在创建的标签中管理实际的标签化实体。
将可标签化项目添加到标签:
$labelItems->addItemToLabel($article, $label);
通过可标签化项目查找标签项实体:
$labelItem = $labelItems->findItem($article, $label);
可标签化项目是否在标签中?:
$labelItems->isItemInLabel($article, $label);
获取标签中的所有标签项:
foreach ($labelItems->getItems($label) as $labelItem) { // ... }
按类型获取标签化项目:
foreach ($labelItems->getItemsByType($label, Article::class) as $article) { // ... }
从标签中删除标签化项目:
$labelItems->removeItemFromLabel($label, $item);
变更日志
- 1.0.0
- 初始版本