【问题标题】:Sonata Admin: Add new field to Post EntitySonata Admin:向帖子实体添加新字段
【发布时间】:2016-02-03 10:52:25
【问题描述】:

我计划在我的一个项目中使用 Sonata Admin,所以现在我正在测试它的功能。我想向 Sonata 的 Post 实体 (SonataNewsBundle) 添加一个新字段。

例如,我想为标记为突发新闻的新闻添加一个新复选框(称为“突发新闻”)。

Sonata Admin 是一款很棒的软件,但 它确实缺乏文档。我查看了官方网站上的文档,但我不知道我应该怎么做才能完成这项任务。

向 Sonata Admin Post 实体添加新的布尔字段(中断)的步骤是什么? 如何我可以这样做?

提前致谢。


P.S.:我附上了一个标准的 Sonata Admin 屏幕截图,其中包含现有的“启用”字段。我想要一个标记为突发新闻的类似字段。我不需要使用标签(或任何其他分类系统)或基于类别的分类 - 只需一个复选框,将 Post 实体标记或取消标记为中断。

【问题讨论】:

    标签: php symfony sonata-admin symfony-sonata sonata


    【解决方案1】:

    “--- >你必须将你的布尔字段添加到你的实体我应该在哪里添加这个字段” 例如:

    // 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;
    }
    

    在您的管理类中:

    <?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')
       ;
    }
    }
    

    【讨论】:

      【解决方案2】:

      您必须将布尔字段添加到您的实体

          /**
           * @ORM\Column(type="bool")
           */
          protected $is_visible;
      

      并将该字段添加到您的管理表单映射器并设置适当的字段类型, 例如:

      $formMapper
                  ->add('is_visible', 'bool', array(
                      'label' => 'Title'
                  ))
      

      如果没有指定类型,SonataAdminBundle 会尝试猜测它。 Documentation

      另外,您可以从现有实体生成 Admin 类:

      php app/console sonata:admin:generate YourNS/FooBundle/Entity/Bar
      

      sonata:admin:generate 命令根据给定的模型类生成一个新的 Admin 类,将其注册为服务并可能创建一个新的控制器。作为参数,您需要指定完全限定的模型类。所有传递的参数和选项都用作交互模式下的默认值。您可以使用 --no-interaction 选项禁用交互模式。

      选项是:

      bundle:bundle 名称(默认值由给定模型决定 类,例如“你的NSFooBundle”)

      admin:管理类基名(默认情况下,这会将“Admin”添加到模型类名称中,例如“BarAdmin”)

      controller:控制器类基名(默认情况下,这会将“AdminController”添加到模型类名称中,例如“BarAdminController”)

      ma​​nager:模型管理器类型(默认这是第一个注册的模型管理器类型,例如“orm”)

      services:服务 YAML 文件(默认值为“services.yml”或“admin.yml”,如果已存在)

      id:管理服务 ID(默认值是捆绑包名称和管理类基名的组合,如“your_ns_foo.admin.bar”)

      【讨论】:

      • 这可能是一个愚蠢的问题,但是,我可以在编辑现有实体 src/Application/Sonata/NewsBundle/Entity/Post.php 时使用这种方法,然后按照您在答案中提供的步骤操作,生成Admin类等等?非常感谢。
      • Admin 类表示您的模型到每个管理操作的映射。在其中,您可以决定在列表中显示哪些字段,将哪些字段用作过滤器,或者在创建或编辑表单中显示哪些字段。
      • 很抱歉一直在问愚蠢的问题,但我想我完全错了... --- > 您必须将布尔字段添加到您的实体 我应该在哪里添加此字段? 假设我全新安装了Sonata Admin's sandbox。 Web 应用程序使用默认设置运行良好。 --- > 并将该字段添加到您的管理表单映射器并设置适当的字段类型在哪里我应该这样做?
      猜你喜欢
      • 2021-02-18
      • 2020-07-01
      • 1970-01-01
      • 2015-11-20
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      相关资源
      最近更新 更多