ibrows / sonata-admin-annotation-bundle
通过注解管理Sonata表单、数据、列表和ShowMapper
2.4.2
2016-10-05 07:24 UTC
Requires
- php: >=5.3.0
- ibrows/annotation-reader: ~1.0
- sonata-project/admin-bundle: ~2.3|~3.0
- symfony/framework-bundle: >=2.0|~3.0
README
通过注解管理Sonata表单、数据、列表和ShowMapper
如何安装
将Bundle添加到composer.json文件中
// composer.json { "require": { "ibrows/sonata-admin-annotation-bundle": "*" } }
使用composer.phar从控制台安装Bundle
$ php composer.phar update ibrows/sonata-admin-annotation-bundle
在AppKernel.php中启用Bundle - 不要忘记在SonataAdminBundle之前将AppKernel提供给Bundle并注册Bundle 之前
<?php // app/AppKernel.php public function registerBundles() { $bundles = array( // ... new Ibrows\Bundle\SonataAdminAnnotationBundle\IbrowsSonataAdminAnnotationBundle($this), ); }
配置(仅在需要使用@AutoService时)
ibrows_sonata_admin_annotation: autoservice: service_id_prefix: companyname.admin default_entity: admin: CompanyName\ProjectNameBundle\Admin\DefaultAdmin controller: CompanyNameProjectNameBundle:Admin/DefaultAdmin entities: - {directory: %kernel.root_dir%/../src/CompanyName/ProjectNameBundle/Entity, prefix: CompanyName\ProjectNameBundle\Entity}
注解
- Ibrows\Bundle\SonataAdminAnnotationBundle\Annotation\Order用于类上的全局排序,例如"显示所有属性"。
- Ibrows\Bundle\SonataAdminAnnotationBundle\Annotation用于特定配置和排除,如果使用排序。
如果属性上存在FormMapperExclude注解,则假定类上有Order/FormMapperAll(其他注解也类似 - List/Form/Datagrid)。
查看注解以了解它们接受的选项。
示例
<?php namespace YourApp\Entity; use Ibrows\Bundle\SonataAdminAnnotationBundle\Annotation as Sonata; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity * @Sonata\Order\ListMapperAll * @Sonata\Order\ShowMapperAll * @Sonata\Order\FormMapperAll * * @Sonata\Order\ShowAndFormreorder(with="General", keys={"name"}) * @Sonata\Order\ShowAndFormreorder(keys={"taxRate"}) * * @Sonata\AutoService() */ class Country { /** * @var integer $id * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") * @Sonata\ListMapper(identifier=true) * @Sonata\Order\FormMapperExclude * @Sonata\ShowMapper(with="General") */ protected $id; /** * @var string $name * @ORM\Column(type="string") * @Sonata\ShowMapper(with="General") */ protected $name; /** * @var float * @ORM\Column(type="float", name="shipping_free_limit") */ protected $shippingFreeLimit; /** * @var float * @ORM\Column(type="float", name="shipping_fixed_rate") */ protected $shippingFixedRate; /** * @var float * @ORM\Column(type="float", name="tax_rate") */ protected $taxRate; /** * @ORM\ManyToMany(targetEntity="Article", inversedBy="countries") * @ORM\JoinTable(name="article_country") * @Sonata\Order\ListMapperExclude * @Sonata\FormMapper(options={"required"=false}) **/ protected $articles; }
<?php namespace YourApp\Entity; use Ibrows\Bundle\SonataAdminAnnotationBundle\Annotation as Sonata; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Show\ShowMapper; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Datagrid\ListMapper; use Application\Sonata\MediaBundle\Entity\Gallery; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity * @Sonata\Order\ShowAndFormreorder(keys={"name"}) */ class Article { /** * @var string $number * @ORM\Column(name="number", type="string", unique=true) */ protected $number; /** * @var string $name * @ORM\Column(type="string") * @Sonata\DatagridMapper */ protected $name; /** * @var string $description * @ORM\Column(type="text") * @Sonata\Order\ListMapperExclude */ protected $description; /** * @var string $matchCode * @ORM\Column(name="match_code", type="string") * @Sonata\Order\ListMapperExclude */ protected $matchCode; /** * @var string $articleGroup * @ORM\Column(name="article_group", type="string") * @Sonata\Order\ListMapperExclude * @Sonata\Order\ShowMapperExclude */ protected $articleGroup; /** * @var ArrayCollection * @ORM\OneToMany(targetEntity="ArticlePrice", mappedBy="articleEntity") * @Sonata\Order\ListMapperExclude */ protected $prices; /** * @ORM\ManyToMany(targetEntity="Country", mappedBy="articles") **/ protected $countries; /** * @var Gallery $pictures * @ORM\ManyToOne( * targetEntity="Application\Sonata\MediaBundle\Entity\Gallery", * cascade={"persist"} * ) * @Sonata\FormMapper( * type="sonata_type_model_list", * options={"required"=false}, * fieldDescriptionOptions={ * "link_parameters"={ * "context":"article", * "provider":"sonata.media.provider.image" * } * } * ) */ protected $pictures; /** * @param \Sonata\AdminBundle\Form\FormMapper $formMapper * @Sonata\FormCallback */ public static function configureFormFields(FormMapper $formMapper) { $formMapper->add('countries'); } }
在Admin中使用(可能在AbstractAdmin.php中)
使用AbstractSonataAdminAnnotationAdmin
<?php namespace YourApp\Admin; use Ibrows\Bundle\SonataAdminAnnotationBundle\Admin\AbstractSonataAdminAnnotationAdmin; abstract class AbstractAdmin extends AbstractSonataAdminAnnotationAdmin { }
使用特性(PHP >=5.4)
<?php namespace YourApp\Admin; use Ibrows\Bundle\SonataAdminAnnotationBundle\Admin\SonataAdminAnnotationAllTrait; use Sonata\AdminBundle\Admin\Admin; abstract class AbstractAdmin extends Admin { use SonataAdminAnnotationAllTrait; }
自定义实现
<?php namespace YourApp\Admin; use Ibrows\Bundle\SonataAdminAnnotationBundle\Reader\SonataAdminAnnotationReaderInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Sonata\AdminBundle\Admin\Admin; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Show\ShowMapper; abstract class AbstractAdmin extends Admin { /** * @param ListMapper $listMapper */ protected function configureListFields(ListMapper $listMapper) { $this->getSonataAnnotationReader()->configureListFields($this->getClass(), $listMapper); } /** * @param FormMapper $formMapper */ protected function configureFormFields(FormMapper $formMapper) { $this->getSonataAnnotationReader()->configureFormFields($this->getClass(), $formMapper); } /** * @param ShowMapper $showMapper */ protected function configureShowFields(ShowMapper $showMapper) { $this->getSonataAnnotationReader()->configureShowFields($this->getClass(), $showMapper); } /** * @param DatagridMapper $datagridMapper */ protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $this->getSonataAnnotationReader()->configureDatagridFilters($this->getClass(), $datagridMapper); } /** * @return ContainerInterface */ protected function getContainer() { return $this->getConfigurationPool()->getContainer(); } /** * @return SonataAdminAnnotationReaderInterface */ protected function getSonataAnnotationReader() { return $this->getContainer()->get('ibrows_sonataannotation.reader'); } }
已知问题
版本2.2.*
- 当使用@AutoService注解时,每次更改此注解都必须清除缓存(删除/添加/编辑)。原因是appDevDebugContainer被完全缓存,编译器无法注册新更改。
版本1.1.*
- 使用oneToMany/manyToOne关系会导致"entity not managed" doctrine错误。原因是FormMapper-Annotation默认将by_reference设置为false,使用@FormMapper(options={"by_reference"=true})将修复此问题。
新功能
版本2.4
- 在FormMapper和ShowMapper注解中添加了新的"tab"和"tabOptions"用于分组 -> @FormMapper(tab="Main")
版本2.2
- 允许通过@AutoService注解使用注解注册SonataAdminServices - 请参阅已知问题以了解缓存问题
版本1.2
- 允许使用@Order/FormReorder, @Order/ShowReorder, @Order/ListReorder或@Order/ShowAndFormReorder注解对FormMapper/ShowMapper和ListMapper进行重新排序
版本1.1
- 在FormMapper和ShowMapper注解中添加了新的"with"和"withOptions"用于分组 -> @FormMapper(with="Main")
- 允许在实体中使用@FormCallback注解配置静态回调方法(请参阅@FormCallback示例)