public function titleFields()
 {
     $collection = new SearchableReadonlyCollection();
     $collection->addAll($this->titleFields);
     return $collection;
 }
 /**
  * Adds a display field
  * to the collection $titleFields
  *
  * @param string or array $field the field name
  * @param string $label the field label
  */
 public function addTitleField($field, $label)
 {
     if (gettype($field) == 'array') {
         if (count($field) == 0) {
             throw new InvalidArgumentException('Invalid field');
         }
         $criteriaCollection = new SearchableReadonlyCollection();
         $searchCriteriaProperty = new ToOneRelationPropertyFilter();
         $searchCriteriaProperty->setCriteriaAttribute($field[0]);
         $titleField = new AsyncSearchCriteriaTitleField($field[0], $label);
         for ($i = 1; $i < count($field); $i++) {
             if ($i == count($field) - 1) {
                 $searchCriteria = new SearchCriteria();
                 $searchCriteria->setCriteriaAttribute($field[$i]);
                 $criteriaCollection->add($searchCriteria);
             } else {
                 $searchCriteriaPropertyAux = new ToOneRelationPropertyFilter();
                 $searchCriteriaPropertyAux->setCriteriaAttribute($field[$i]);
                 $criteriaCollection->add($searchCriteriaPropertyAux);
             }
         }
         $i = 1;
         foreach ($criteriaCollection as $criteria) {
             if ($i < $criteriaCollection->count()) {
                 $collectionAux = $criteriaCollection->sliceFrom($i);
                 $criteria->setSearchCriteria($collectionAux->first());
                 $i++;
             }
         }
         $searchCriteriaProperty->setSearchCriteria($criteriaCollection->first());
         $criteriaCollection->reverse();
         $searchCriteria = $criteriaCollection->first();
     } else {
         $searchCriteria = new SearchCriteria();
         $searchCriteria->setCriteriaAttribute($field);
         $titleField = new AsyncSearchCriteriaTitleField($field, $label);
     }
     $filterType = new OrStringFilterType();
     $dataType = new SearchDataTypeString();
     $filterType->setSearchDataType($dataType);
     $searchCriteria->setSearchFilterType($filterType);
     if (gettype($field) == 'array') {
         $titleField->setSearchCriteria($searchCriteriaProperty);
     } else {
         $titleField->setSearchCriteria($searchCriteria);
     }
     $this->titleFields[] = $titleField;
 }