自定义表单域渲染

Posted

技术标签:

【中文标题】自定义表单域渲染【英文标题】:Customize form field rendering 【发布时间】:2012-12-21 01:49:23 【问题描述】:

我想从sonata admin bundle 自定义编辑页面中表单字段的呈现,以包含一个使用字段文本内容的小程序。

我知道我必须在 admin 类中编辑configureFormFields 函数,但我需要知道 3 件事:

提供字段表单模板的语法是什么 模板文件放在哪里(哪个目录) 模板的外观。

【问题讨论】:

【参考方案1】:

找到解决办法

我所做的是:

    创建了一个字段类型,我们在 myCompany\myBundle\Form\Type\myfieldType.php 中将其称为 myfieldType

    namespace myCompany\myBundle\Form\Type;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
    
    class myfieldType extends AbstractType
    
    
        public function getParent()
        
            return 'text';
        
    
        public function getName()
        
            return 'myfield';
        
    
    

    在 app/config/services.yml 中注册了 Type

    myCompany.myBundle.form.type.myfield:
        class: myCompany\myBundle\Form\Type\myfieldType
        tags:
            -  name: form.type, alias: myfield 
    

    在我的 myentityAdmin 类中,

     protected function configureFormFields(FormMapper $formMapper)
     
         $formMapper
         ->add('myfieldname', 'myfield')
         ...
     
    

    public function getFormTheme() 
        return array('myCompanymyBundle:Admin:myfield_edit.html.twig');
    
    

    和模板:

    # src/mycompany/myBundle/Resources/views/Form/myfield_edit.html.twig #
    % block myfield_widget %
        % spaceless %
             block('textarea_widget') 
        % endspaceless %
    % endblock %
    

现在我可以通过 twig 变量“value”访问表单字段值!

如此简单......当你得到它时。

【讨论】:

在 Sonata 3.1 上不起作用:“属性“myfieldname”和方法之一“getMyfieldname()”、“myfieldname()”、“isMyfieldname()”、“hasMyfieldname() ", "__get()" 存在并在类中具有公共访问权限..." anwser的日期是2013年,所以版本类似于SonataAdminBundle 2.xx ... 是的,我只是在陈述这个事实。对于使用 Sonata 3+ 和 SF 2.8+ 的,它已经改变:你必须删除 getName() 方法;您可以忽略服务声明中的alias;您在 $formMapper->add() 方法(第二个参数)中直接使用类名(而不是别名)【参考方案2】:

除非块名称前缀与表单类型的名称匹配,否则 user1254498 的解决方案将不起作用。至少在最新版本的奏鸣曲管理包(2.2.12)中。在这种情况下:

# src/mycompany/myBundle/Resources/views/Form/myfield_edit.html.twig #
% block myfield_widget %
    % spaceless %
         block('textarea_widget') 
    % endspaceless %
% endblock %

并且,关于getFormTheme(),你也应该返回父主题,否则你可能会破坏整个风格......

public function getFormTheme()

    return array_merge(
            parent::getFormTheme(), array(
          'mycompanyBundle:Form:myfield_edit.html.twig')
    );        

另外,您可以使用变量sonata_admin.admim 访问twig 模板中的管理服务。

【讨论】:

【参考方案3】:

在您的 services.yml 文件中,您为编辑操作定义模板:

app.admin.product:
    class: AppBundle\Admin\ProductAdmin
    arguments: [~, AppBundle\Entity\Product, AppBundle:Admin\Product]
    tags:
        - name: sonata.admin, manager_type: orm, group: Products, label: Products
    calls:
        - [ setTemplate, [edit, AppBundle:Product:edit.html.twig]]

然后,您可以在该模板中覆盖表单中字段的模板:

% extends 'SonataAdminBundle:CRUD:base_edit.html.twig' %

% form_theme form.selectall 'AppBundle:Form:selectall.html.twig' %
% form_theme form.Country 'AppBundle:Form:country.html.twig' %

那么我的模板是这样的:

% block form_row %
<div class="form-group">
 form_label(form) 
% set c = 0 %
% for i in form %
    % set c = c+1 %
    % if (c == 1) %
        <div style="float: left; width: 20%;">
    % endif%
     form_row(i) 
    % if ((c == 60) or (form|length == loop.index)) %
        </div>
        % set c = 0 %
    % endif%
% endfor %
</div>
% endblock form_row %

在这种情况下,我的国家/地区复选框出现在 60 个元素的列中,而不是在包含整个元素列表的一列中。

希望这对其他人有帮助。

【讨论】:

以上是关于自定义表单域渲染的主要内容,如果未能解决你的问题,请参考以下文章

创建自定义导航栏渲染器以在 xamarin 表单 IOS 项目中添加自定义后退按钮图标

从 Xamarin 表单元素共享代码访问自定义渲染器实例

php 使用“自定义帖子类型”填充表单域

如何在 Magnolia 中创建自定义表单处理器?

xamarin 表单地图上的自定义引脚

以自定义表单呈现模板中的各个字段