frosty22/grido-ext

Grido 扩展,基于注解的实体自动化工厂。

dev-master 2013-09-09 11:01 UTC

This package is not auto-updated.

Last update: 2020-01-05 15:57:00 UTC


README

Grido 数据网格的工厂,根据实体自身的注解创建用于特定查询的生成数据网格。基于超级数据网格 Grido: http://o5.github.io/grido-sandbox/

从 API 角度来看,这里最重要的是 GridoFactory 对象,它是该组件的基石,它创建 Grido 组件的实例,该实例之后可以被渲染。这个工厂接受 GridoExt\Mapper,它接受 QueryBuilder。

我是一个懒惰的人,所以我坚持“代码越少越好”的原则,因此大多数情况下不需要任何默认注解(例如 Format,Type 等),它们仅用于覆盖默认行为。

映射

库中包含一些表示特定实体注解的对象

这个工厂的基础是 EntityMetaReader 和 Ale,参见 composer 依赖

  • 格式 - 允许定义用于绘制属性值的自定义格式
  • 类型 - 允许定义值的 数据类型 - 对于集合很有用
  • 选择 - 用于创建映射到值的数组

示例

实体示例

use EntityMetaReader\Mapping as EMR;
use Doctrine\ORM\Mapping as ORM;
use GridoExt\Mapping as GRID;


class Product extends Ale\Entities\BaseEntity {

	/**
	 * @EMR\Name("Název produktu")
	 * @GRID\Format(empty="nevyplněno")
	 * @ORM\Column(type="string")
	 * @var string
	 */
	protected $name;


	/**
	 * @EMR\Name("Expirace produktu")
	 * @EMR\Access(read="admin")
	 * @GRID\Format("j.n.Y H:i")
	 * @ORM\Column(type="datetime")
	 * @var DateTime
	 */
	protected $expire;


	/**
     * @EMR\Name("Jméno uživatele")
     * @GRID\Type(type="select", mappedBy="name")
     * @ORM\ManyToOne(targetEntity="User")
     * @var User
     */
    protected $user;


    /**
     * @EMR\Name("Stav produktu")
     * @GRID\Select(mapping={1 = 'Schválen', 2 = 'Zamítnut', 3 = 'Čeká'})
     * @ORM\Column(type="smallint")
     * @var int
     */
    protected $state;

}

使用工厂简单创建数据网格,例如

class FooPresenter extends Presenter {


	/**
	 * @var \GridoExt\GridoFactory
	 */
	protected $gridoFactory;


	protected function createComponentProductGrid($name)
	{
		// Vytvoření query pomocí QueryBuilderu
		$qb = $this->entityManager->createQueryBuilder()
			->select("product", "order", "category")  // Slouží zároveň i jako definice, entit které se mají zobrazit v gridu
			->from("Product", "product")
			->leftJoin("product.order", "order")
			->leftJoin("product.category", "category")
			->orderBy("product.created", "DESC"); // Defaultní řazení výsledků, datagridu může přepsat

		$map = new \GridoExt\Mapper($qb); // Vytvoření mapperu pro továrničku

		// Některé sloupce můžeme chtít v konkrétním gridu skýt - Skrytí sloupců "sale", "price"
		$map->hide('Entity\Product', array('sale', 'price'));

		// Můžeme chtít přidat odkaz na hodnotu ve sloupci - přidá odkaz na sloupec "name" vedoucí na "detail" s parametrem ID
		$map->link('Entity\Product', 'name', function($product){ return $this->link("detail", $product->id); });

		// Případně můžeme vnutit i zde vlastní render (pokud nechceme globálně přes anotace entity)
		$map->addCustomRender('Entity\Product', 'price', function($product){ return $product->price . ",-"; });

		$grido = $this->gridoFactory->create($map); // Vytvoření instance Grido pomocí továrničky

		$grido->addActionHref("foo", "Foo"); // Vytvoření odkazu na actionFoo a předání parametru product
		$grido->addActionDetail(); // Zkratka pro vytvoření odkazu na actionDetail (příslušná barva, ikona tlačítka)
		$grido->addActionEdit();   // Zkratka pro vytvoření odkazu na actionEdit (příslušná barva, ikona tlačítka)
		$grido->addActionRemove(); // Zkratka pro vytvoření odkazu na handleRemove (příslušná barva, ikona tlačítka, JS potvrzení)

		return $grido;
	}


	public function actionFoo(Product $product)
	{
	   ...
	}


	public function actionDetail(Product $product)
	{
	   ...
	}


	public function actionEdit(Product $product)
	{
	   ...
	}


	public function handleRemove(Product $product)
	{
	   ...
	}


}