ModelAdmin可搜索字段的自定义

时间:2016-05-20 20:20:00

标签: php silverstripe

我使用Silverstripes'在产品和类别之间建立了多对多的关系。 ORM。一切正常,除非我尝试为产品添加类别时,类别的选项由用户ID而不是类别名称显示。我试图将ID映射到名称但不起作用。以下是我试过的,我错过了什么?

class Product extends DataObject {

  private static $db = array(
    'ProductName' => 'Varchar(32)',
    );

  private static $many_many = array (
    'Category' => 'Category'
  );
}


class Category extends DataObject {

  private static $db = array(
    'Category' => 'Varchar(32)',
    );

  public function searchableFields() {
    return array (
      'Category' => array (
        'filter' => 'ExactMatchFilter',
        'title' => 'Category',
        'field' => 'TextField'->setSource(
                        $this::get()->map('ID','Category')
                    )
      )   
    );
  }

  private static $belongs_many_many = array (
    'Product' => 'Product'
  );
}

1 个答案:

答案 0 :(得分:4)

当Silverstripe需要显示DataObject的速记时,它将调用该DataObject上的getTitle()方法。

getTitle()将首先检查DataObject是否有Title字段,如果有,则返回该值。

如果您的DataObject没有Title字段,它会尝试搜索Name字段。

如果它也找不到Name字段,它将默认返回DataObject的ID,这可能就是你发生的事情。

如何修复您的具体示例

您有两种方法可以修复您的具体示例:

  1. 将DataObjects数据库字段重命名为NameTitle
  2. 覆盖2 DataObjects上的getTitle()方法
  3. 解决方案#1

    class Product extends DataObject {
    
      private static $db = array(
        'Name' => 'Varchar(32)',
        );
    
      private static $many_many = array (
        'Category' => 'Category'
      );
    }
    
    
    class Category extends DataObject {
    
      private static $db = array(
        'Name' => 'Varchar(32)',
        );
    
      public function searchableFields() {
        return array (
          'Category' => array (
            'filter' => 'ExactMatchFilter',
            'title' => 'Category',
            'field' => 'TextField'->setSource(
                            $this::get()->map('ID','Category')
                        )
          )   
        );
      }
    
      private static $belongs_many_many = array (
        'Product' => 'Product'
      );
    }
    

    解决方案#2

    class Product extends DataObject {
    
      private static $db = array(
        'ProductName' => 'Varchar(32)',
        );
    
      private static $many_many = array (
        'Category' => 'Category'   );
    
      public function getTitle() {
        return $this->ProductName;   
      }
    }
    
    
    class Category extends DataObject {
    
      private static $db = array(
        'Category' => 'Varchar(32)',
        );
    
      public function searchableFields() {
        return array (
          'Category' => array (
            'filter' => 'ExactMatchFilter',
            'title' => 'Category',
            'field' => 'TextField'->setSource(
                            $this::get()->map('ID','Category')
                        )
          )   
        );   }
    
      private static $belongs_many_many = array (
        'Product' => 'Product'   );
    
      public function getTitle() {
        return $this->Category;
      }
    
    }
    

    哪种解决方案最好?

    在您的具体情况下,我会使用解决方案#1,因为您的数据库字段是功能名称/标题字段。

    如果我的DataObject的标题需要使用很多字段,我会使用解决方案#2。让我们假设你有一个Person DataObject,它有一个名字和一个姓氏:

    public function getTitle() {
      return $this->FirstName . ' ' . $this->LastName;
    }