Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We're retiring the forums!

The SilverStripe forums have passed their heyday. They'll stick around, but will be read only. We'd encourage you to get involved in the community via the following channels instead:

General Questions /

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

SS3 - how to set searchable fields for a dataobject


Go to End


13 Posts   8892 Views

Avatar
BenWu

Community Member, 97 Posts

25 July 2012 at 11:07pm

Hello,

I got a simple class

class Contact extends DataObject {
  static $db= array('Firstname'=>'varchar', 'Surname'=>'varchar'); 

 static $has_one = array(
                "Company" => "Company",
        );

        static $many_many = array(
                "Leads" => "Lead",
        );

}

Then in the Leads Admin page, when i try to link it to a contact, i got this error:

Error at framework/forms/gridfield/GridFieldAddExistingAutocompleter.php line 171: Uncaught LogicException: GridFieldAddExistingAutocompleter: No searchable fields could be found for class "Contact"

If I replace 'Firstname' with Name, I don't have problem at all. So by default, GridFieldAddExistingAutocompleter tries to use the 'Name' field to search for auto-completion, if there is no Name fields, it will fail.

I tried to put

static $searchable_fields = array('Firstname', 'Surname'); 

but it doesn't help.

Avatar
priithansen

Community Member, 25 Posts

26 July 2012 at 2:59pm

Edited: 26/07/2012 3:21pm

It appears to me that the gridfield only looks for Title or Name field by default.

So adding something like this to GridField code should solve half the battle.

		$config = GridFieldConfig_RelationEditor::create();
		$config->getComponentByType('GridFieldAddExistingAutocompleter')->setSearchFields(array('Firstname', 'Surname'))->setResultsFormat('$Firstname - $Surname');
		$gridField = new GridField("Contact", "Contact", $this-> Contact(), $config);
    	$fields->addFieldToTab("Root.Main", $gridField);

Avatar
BenWu

Community Member, 97 Posts

26 July 2012 at 8:34pm

many thanks.

I found something simliar but not sure where to put them. I am using the ModelAdmin to manage Contact.

class ContactAdmin extends ModelAdmin {
        static $menu_title = "Contacts";
        static $url_segment = "contacts";

        static $managed_models = array(
                "Contact",
        );
} 

The search result of ModelAdmin is displayed in a Gridfield. Is it possible to get that Gridfield and tell it what the searchable fields are?

Avatar
priithansen

Community Member, 25 Posts

27 July 2012 at 12:25am

If I understand You correctly this should help.

Add to Contact Dataobject

static $searchable_fields = array(
		'CompanyID' => array('title' => 'Company'),
		'LeadsID' => array('title' => 'Leads')
);

Avatar
BenWu

Community Member, 97 Posts

27 July 2012 at 1:02am

Edited: 27/07/2012 1:03am

Thanks.

The error shows up when I edit a Lead in the LeadAdmin and tried to link a Lead to an existing contact.

<?php

class LeadAdmin extends ModelAdmin {
	static $menu_title = "Leads";
	static $url_segment = "leads";

	static $managed_models = array(
		"Lead",
	);
}


class Lead extends DataObject {
	static $db = array(
		"Name" => "Varchar(255)",
		'Content'=>'HTMLText',
		"Status" => "Enum('Open,Won,Lost,Cancelled','Open')",
	);

	static $has_one = array(
		"Company" => "Company",
	'Creator'=>'Member',
	);


	static $belongs_many_many = array(
		"Contacts" => "Contact",
	);
}

Therefore, the 'Firstname' and 'Surname' of the Contact object needs to be searchable.

Currently, I have to add a field called Name and in the Contact class, I did this to sync Name to firstname and surname

	public function onAfterWrite(){ 
	  parent::onAfterWrite(); 
	  $this->Name = $this->getName();
	  $this->Name = str_replace("'", '"', $this->Name);
	  DB::query('UPDATE "'. $this->baseTable(). '" set name =\''. $this->Name . '\' where ID = '. $this->ID  );
	}

 public function getName() {
                return ($this->Surname) ? trim($this->FirstName . ' ' . $this->Surname) : $this->FirstName;
        }

but it is not an idea solution as I have duplicated content in the database :-(

regards,
Ben

Avatar
priithansen

Community Member, 25 Posts

27 July 2012 at 1:19am

Couldn't you overwrite the default gridfield for lead in the Lead DataObject with

 public function getCMSFields() {
		$fields = parent::getCMSFields();

		//Gridfield with the same name as default.

		return $fields;
	}

Maybe You can send me the files so I can see first hand what the problem is exactly?

Avatar
BenWu

Community Member, 97 Posts

27 July 2012 at 1:24am

Avatar
priithansen

Community Member, 25 Posts

27 July 2012 at 1:36am

This seems to work for me

<?php
class Lead extends DataObject {
	static $db = array(
		"Name" => "Varchar",
		"Status" => "Enum('Open,Won,Lost,Cancelled','Open')",
	);

	static $has_one = array(
		"Company" => "Company",
	);

	static $belongs_many_many = array(
		"Contacts" => "Contact",
	);
	public function getCMSFields() { 
   		$fields = parent::getCMSFields();

    	$config = GridFieldConfig_RelationEditor::create(); 
    	$config->getComponentByType('GridFieldAddExistingAutocompleter')->setSearchFields(array('FirstName', 'Surname'))->setResultsFormat('$FirstName - $Surname'); 
    	$gridField = new GridField("Contacts", "Contacts", $this-> Contacts(), $config); 
    	$fields->addFieldToTab("Root.Contacts", $gridField);

    	return $fields; 
	}
}

Go to Top