Sonata Admin:向 Post 实体添加新字段
Sonata Admin: Add new field to Post Entity
我计划在我的一个项目中使用 Sonata Admin,所以现在我正在测试它的功能。我想向 Sonata 的 Post 实体 (SonataNewsBundle) 添加一个新字段。
例如,我想为标记为突发新闻的新闻添加一个新复选框(称为 "breaking")。
Sonata Admin 是一款很棒的软件,但它确实缺少文档。我查看了官方网站上的文档,但我不知道我应该怎么做才能完成这项任务。
将新布尔字段(中断)添加到 Sonata Admin Post 实体的步骤是什么? 我该怎么做?
提前致谢。
P.S.: 我附上了标准的 Sonata Admin 屏幕截图,其中包含 现有的 "enabled" 字段 。我想要一个 similar 字段用于标记为 breaking 的新闻。我不需要使用标签(或任何其他分类系统)或基于类别的分类 - 只需一个复选框即可将 Post 实体标记或取消标记为中断。
您必须将布尔字段添加到实体中
/**
* @ORM\Column(type="bool")
*/
protected $is_visible;
并将该字段添加到您的管理表单映射器并设置适当的字段类型,
例如:
$formMapper
->add('is_visible', 'bool', array(
'label' => 'Title'
))
如果未指定类型,SonataAdminBundle 会尝试猜测。
Documentation
此外,您可以从现有实体生成管理员 class:
php app/console sonata:admin:generate YourNS/FooBundle/Entity/Bar
sonata:admin:generate命令根据给定模型[=57=生成一个新的Adminclass ],将其注册为服务并可能创建一个新的控制器。作为参数,您需要指定完全限定的模型 class。所有传递的参数和选项都用作交互模式中的默认值。您可以使用 --no-interaction 选项禁用交互模式。
选项是:
bundle:bundle名称(默认值由给定的模型决定
class,例如“你的 NSFooBundle”)
admin:管理员 class 基本名称(默认情况下,这会将“Admin”添加到模型 class 名称中,例如“BarAdmin”)
controller:控制器 class 基本名称(默认情况下,这会将“AdminController”添加到模型 class 名称中,例如“BarAdminController”)
manager:模型管理器类型(默认情况下这是第一个注册的模型管理器类型,例如“orm”)
services:服务YAML文件(默认值为“services.yml”或“admin.yml”,如果已经存在)
id:admin 服务 ID(默认值是 bundle name 和 admin class basename 的组合,如“your_ns_foo.admin.bar”)
"--- > 你必须将你的布尔字段添加到你的实体中,我应该在哪里添加这个字段"
例如:
// src/AppBundle/Entity/Product.php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="product")
*/
class Product
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=100)
*/
protected $name;
/**
* @ORM\Column(type="decimal", scale=2)
*/
protected $price;
/**
* @ORM\Column(type="text")
*/
protected $description;
/**
* @ORM\Column(type="bool")
*/
protected $isVisible;
}
在您的管理员中 class:
<?php
// src/AppBundle/Admin/ProductAdmin.php
namespace AppBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
class ProductAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', 'text', array(
'label' => 'Product Name'
))
->add('price', 'decimal', array(
'label' => 'Product Price'
))
// if no type is specified, SonataAdminBundle tries to guess it
->add('description')
->add('isVisible', 'bool', array(
'label' => 'Is Product visible'
))
// ...
;
}
// Fields to be shown on filter forms
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('name')
->add('price')
;
}
// Fields to be shown on lists
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('name')
->add('price')
;
}
// Fields to be shown on show action
protected function configureShowFields(ShowMapper $showMapper)
{
$showMapper
->add('name')
->add('price')
->add('isVisible')
;
}
}
我计划在我的一个项目中使用 Sonata Admin,所以现在我正在测试它的功能。我想向 Sonata 的 Post 实体 (SonataNewsBundle) 添加一个新字段。
例如,我想为标记为突发新闻的新闻添加一个新复选框(称为 "breaking")。
Sonata Admin 是一款很棒的软件,但它确实缺少文档。我查看了官方网站上的文档,但我不知道我应该怎么做才能完成这项任务。
将新布尔字段(中断)添加到 Sonata Admin Post 实体的步骤是什么? 我该怎么做?
提前致谢。
P.S.: 我附上了标准的 Sonata Admin 屏幕截图,其中包含 现有的 "enabled" 字段 。我想要一个 similar 字段用于标记为 breaking 的新闻。我不需要使用标签(或任何其他分类系统)或基于类别的分类 - 只需一个复选框即可将 Post 实体标记或取消标记为中断。
您必须将布尔字段添加到实体中
/**
* @ORM\Column(type="bool")
*/
protected $is_visible;
并将该字段添加到您的管理表单映射器并设置适当的字段类型, 例如:
$formMapper
->add('is_visible', 'bool', array(
'label' => 'Title'
))
如果未指定类型,SonataAdminBundle 会尝试猜测。 Documentation
此外,您可以从现有实体生成管理员 class:
php app/console sonata:admin:generate YourNS/FooBundle/Entity/Bar
sonata:admin:generate命令根据给定模型[=57=生成一个新的Adminclass ],将其注册为服务并可能创建一个新的控制器。作为参数,您需要指定完全限定的模型 class。所有传递的参数和选项都用作交互模式中的默认值。您可以使用 --no-interaction 选项禁用交互模式。
选项是:
bundle:bundle名称(默认值由给定的模型决定 class,例如“你的 NSFooBundle”)
admin:管理员 class 基本名称(默认情况下,这会将“Admin”添加到模型 class 名称中,例如“BarAdmin”)
controller:控制器 class 基本名称(默认情况下,这会将“AdminController”添加到模型 class 名称中,例如“BarAdminController”)
manager:模型管理器类型(默认情况下这是第一个注册的模型管理器类型,例如“orm”)
services:服务YAML文件(默认值为“services.yml”或“admin.yml”,如果已经存在)
id:admin 服务 ID(默认值是 bundle name 和 admin class basename 的组合,如“your_ns_foo.admin.bar”)
"--- > 你必须将你的布尔字段添加到你的实体中,我应该在哪里添加这个字段" 例如:
// src/AppBundle/Entity/Product.php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="product")
*/
class Product
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=100)
*/
protected $name;
/**
* @ORM\Column(type="decimal", scale=2)
*/
protected $price;
/**
* @ORM\Column(type="text")
*/
protected $description;
/**
* @ORM\Column(type="bool")
*/
protected $isVisible;
}
在您的管理员中 class:
<?php
// src/AppBundle/Admin/ProductAdmin.php
namespace AppBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
class ProductAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', 'text', array(
'label' => 'Product Name'
))
->add('price', 'decimal', array(
'label' => 'Product Price'
))
// if no type is specified, SonataAdminBundle tries to guess it
->add('description')
->add('isVisible', 'bool', array(
'label' => 'Is Product visible'
))
// ...
;
}
// Fields to be shown on filter forms
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('name')
->add('price')
;
}
// Fields to be shown on lists
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('name')
->add('price')
;
}
// Fields to be shown on show action
protected function configureShowFields(ShowMapper $showMapper)
{
$showMapper
->add('name')
->add('price')
->add('isVisible')
;
}
}