`
superjavason
  • 浏览: 109703 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

自定义Symfony filter(过滤器)

 
阅读更多
更多内容在http://www.onepie.org

symfony自动生成的Filter有一些局限性,比如不能过滤关联表的特定字段,过滤的表单只有input和select两种,

下面介绍处理上面两个问题的解决方案。

1. 关联表字段查询

假设我们有Order和User两张表,Order中有user_id和User关联,Syfmony默认可以通过user_id来过滤,现在想通过User的name字段模糊查询获得用户的所有订单。

sfFormFilterDoctrine中有方法doBuildQuery,
 if ($this->getTable()->hasField($field))
      {
        $method = sprintf('add%sColumnQuery', self::camelize($this->getFieldName($field)));
      }
      else if (!method_exists($this, $method = sprintf('add%sColumnQuery', self::camelize($field))) && null !== $type)
      {
        throw new LogicException(sprintf('You must define a "%s" method to be able to filter with the "%s" field.', $method, $field));
      }


从上面的代码可以看出只要增加一个add%FiledName%ColumnQuery方法即可以自定义每个字段的查询,所以只要添加如下代码
public function addUsernameColumnQuery(Doctrine_Query $query, $field, $value)
  {
    $query->leftJoin('r.User u');
    if(!empty($value)){
      $query->andWhere('u.name like ?', "%$value%");
    }     
  }

2. 自定义Filter表单字段类型

假设我们有一张商品表Product, 其中有一个字段status,我们需要使用checkbox选择多个状态来过滤商品
首先在ProductFormFilter的configure函数中添加
  
  $this->widgetSchema['status'] = new sfWidgetFormChoice(array(
      'choices' => self::$STATUS_TEXT,
      'multiple' => true,
      'expanded' => true,
    ));

    $this->validatorSchema['status'] = new sfValidatorChoice(array(
      'required' => false,
      'multiple' => true,
      'choices' => array_keys(self::$STATUS_TEXT),
    ));

这和定义Form的widget一样,但是如果这样的还不行, 因为涉及到多选,但默认status是input的类型,所以我们需要让symfony知道我们现在传过来的参数可能是数组,在filter中重载getFields方法,把status字段设为ForeignKey类型
 public function getFields()
  {
    $fields = parent::getFields();
    $fields["status"] = "ForeignKey";
    return $fields;
  }
分享到:
评论

相关推荐

    symfony控制器层

    过滤器的灵活性很高,可以轻松地添加自定义逻辑。在 Symfony 中,过滤器可以分为两类: - **前置过滤器**:在动作执行前运行。 - **后置过滤器**:在动作执行后运行。 这些过滤器可以用来处理诸如权限验证、日志...

    118、API资源过滤器1

    这些过滤器可以通过注解的方式添加到实体类中,从而实现自定义的过滤行为。 #### 三、使用Search Filter进行模糊查询 ##### 3.1 Search Filter简介 Search Filter是最常用的一种过滤器,它可以实现对实体属性的...

    logical-filter-bundle:Symfony和API平台的过滤器和逻辑

    本文将深入探讨“logical-filter-bundle”这一主题,它涉及到Symfony和API平台中的过滤器和逻辑,帮助开发者更好地理解如何利用这些工具进行数据筛选和处理。 首先,让我们了解什么是过滤器。在软件开发中,过滤器...

    symfony twig详情

    - **filter**:对变量应用过滤器进行转换。 - **embed**:嵌入另一个模板中的部分。 - **extends**:继承自另一个模板。 - **for**:循环遍历数组或迭代器。 - **if**:条件语句。 - **include**:包含另一个模板...

    PetkoparaCrudGeneratorBundle:Symfony3 CRUD生成器包,具有分页,过滤器,批量操作和Twitter引导程序3.3.6功能

    原则关联映射支持表单和过滤器中的多对一,一对一和多对多(如果关系是拥有方) 排序 每页项目 多行批量操作(删除) 从索引中删除 在生成的视图中设置基本模板。 可以为所有生成的文件设置保存路径(默认情况下...

    TableBundle:Symfony Bundle,易于分页和过滤

    预加载默认过滤器并重置本地存储过滤器 智能过滤多个单词(Filter :: TYPE_LIKE_WORDS_AND) (测试版)支持api调用以通过网络服务加载资源 计划功能: 更多翻译 添加高级模板 新的列显示类型(现在:仅原始文本值...

    Laravel开发-twigbridge

    例如,创建一个自定义过滤器: ```php use Spatie\TwigBridge\TwigExtensions; use Illuminate\Support\Facades\App; App::make(TwigExtensions::class)->addFilter('my_filter', function ($value) { // 过滤器...

    基于PHP面向对象的自定义MVC框架高级项目开发12天视频

    - 输入验证:使用filter_var等函数过滤非法字符。 - SQL注入防护:使用预处理语句或ORM操作数据库。 - 密码加密:使用bcrypt等算法存储密码。 #### 六、总结 本系列视频教程详细介绍了如何使用PHP语言构建一个...

    PHP实例开发源码-PHP 验证通 示例.zip

    4. **过滤器**:`filter_var`函数是PHP提供的一个强大过滤器,可以用于验证和清理用户输入,例如验证URL、IP地址、邮箱等。 5. **自定义函数**:对于特定需求,开发者可以编写自定义函数进行验证,例如,验证密码...

    Twig扩展名:Twig扩展名

    创建自定义过滤器涉及实现`Twig_Filter`接口或使用`twig_filter`函数注册。 2. **函数(Functions)**:函数在模板中作为独立的表达式出现,返回值可以在模板中使用。例如,`asset()` 是一个内置函数,用于获取应用...

    twig标记说明

    `filter_name`可以是各种内置或自定义的过滤器,如`e`用于转义HTML实体。 **set标签**用于创建变量: ```twig {% set myVariable = 'Hello World' %} ``` **extends和block标签**用于模板继承和重写,使得代码复用...

    PHP实例开发源码—php齐博企业网站V1.0系统 公司模板.zip

    在齐博企业网站中,可能使用自定义的路由规则或框架如Laravel、Symfony的内置路由功能。 7. **表单处理**:PHP能够接收和验证HTTP请求中的表单数据,用于用户注册、登录或其他交互。开发者会利用`$_POST`超级全局...

    php学习资料

    - 函数:自定义函数,内置函数如echo、print、isset、unset等。 2. **PHP进阶** - 引用与值传递:理解引用传递和值传递的区别,如何使用引用进行复杂数据交换。 - 类与对象:面向对象编程基础,类的定义、属性、...

    基于PHP的康盛品牌空间网上展示系统UTF-8源码.zip

    5. **安全性**:PHP提供了许多安全功能,如过滤输入数据(filter_var)、防止SQL注入(预处理语句)、XSS防护(htmlspecialchars)等,以确保网站的安全运行。 6. **会话管理**:PHP内置的session功能可以用来跟踪...

    PHP实例开发源码-590文学网.zip

    7. **错误处理和日志记录**:良好的错误处理是任何项目的关键,源码中可能包含自定义错误处理函数和日志记录机制,如使用`error_reporting`和`error_log`。 8. **性能优化**:可能运用缓存技术(如Memcached或Redis...

    PHP面试题(笔试题)

    13. **框架与库的使用**:了解Laravel、Symfony、Yii等流行PHP框架的工作原理,以及Composer包管理器的使用。 14. **PHP扩展开发**:虽然不是每个开发者都需要,但了解如何编写和编译PHP扩展可以显示更深层次的技术...

    2017最新最全PHP面试题笔试题

    4. PHP安全:学习防止SQL注入、XSS攻击、CSRF攻击等常见的Web安全问题,了解如何使用htmlspecialchars()、filter_var()等函数进行数据过滤和验证。 四、其他相关知识点 1. PHP与HTML的结合:理解如何在PHP文件中...

    PHP实例开发源码—自媒体个人博客源码 php版.zip

    13. **安全防护**:防止SQL注入、XSS攻击等网络安全威胁是博客系统设计的重要部分,需要使用预处理语句、过滤用户输入等方式确保安全性。 14. **版本控制**:开发过程中,版本控制工具如Git是必不可少的,它可以...

    PHP教程 PPT版

    通过`$_POST`或`$_GET`接收表单数据,`filter_var()`函数进行数据过滤和验证,防止SQL注入和跨站脚本攻击。 **面向对象编程** PHP5引入了完整的面向对象编程支持,包括类、对象、继承、封装、多态等概念。`class`...

    php基础知识代码下载

    8. **表单处理**:在Web开发中,PHP经常用来处理HTML表单提交的数据,使用 `filter_var()` 进行数据验证和过滤,`htmlspecialchars()` 防止XSS攻击。 9. **数据库交互**:PHP与MySQL数据库的连接和查询是常见的应用...

Global site tag (gtag.js) - Google Analytics