carrooi/labels

Nette 的标签模块

1.0.0 2015-02-12 07:53 UTC

This package is auto-updated.

Last update: 2024-09-06 03:28:44 UTC


README

Build Status Donate

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
    • 初始版本