synonymsFindProcessCondition() method, so you * won't have to worry much about it. Important note: if you plan on * re-using the same $condition object for multiple invocations of this * method you must pass in here a clone of your condition object, since the * internal implementation of this method will change the condition (will * swap the aforementioned placeholders with actual column names) * * @return Traversable * Traversable result set of found synonyms and entity IDs to which those * belong. Each element in the result set should be an object and will have * the following structure: * - synonym: (string) Synonym that was found and which satisfies the * provided condition * - entity_id: (int) ID of the entity to which the found synonym belongs */ public function synonymsFind(QueryConditionInterface $condition); /** * Collect info on features pipe during invocation of hook_features_export(). * * If your synonyms provider depends on some other features components, this * method should return them. * * @return array * Array of features pipe as per hook_features_export() specification */ public function featuresExportPipe(); } /** * Exception thrown by implementations of SynonymsBehavior interface. */ class SynonymsBehaviorException extends Exception {} /** * Starting point for implementing SynonymsBehavior interface. */ abstract class AbstractSynonymsBehavior implements SynonymsBehavior { /** * Constant which denotes placeholder of a synonym column. * * @var string */ const COLUMN_SYNONYM_PLACEHOLDER = '***COLUMN***'; /** * Constant which denotes placeholder of an entity ID column. * * @var string */ const COLUMN_ENTITY_ID_PLACEHOLDER = '***ENTITY_ID***'; /** * Behavior implementation on which this class was initialized. * * @var array */ protected $behavior_implementation; public function __construct($behavior_implementation) { $this->behavior_implementation = $behavior_implementation; } public function featuresExportPipe() { return array(); } /** * Process condition in 'synonymsFind' method. * * Process condition in 'synonymsFind' method replacing all references of * synonym and entity ID columns with the real names of those columns. * * @param QueryConditionInterface $condition * Condition that should be processed * @param string $column_synonym * Real name of the synonym column * @param string $column_entity_id * Real name of the entity ID column */ protected function synonymsFindProcessCondition(QueryConditionInterface $condition, $column_synonym, $column_entity_id) { $condition_array = &$condition->conditions(); foreach ($condition_array as &$v) { if (is_array($v) && isset($v['field'])) { if ($v['field'] instanceof QueryConditionInterface) { // Recursively process this condition too. $this->synonymsFindProcessCondition($v['field'], $column_synonym, $column_entity_id); } else { $replace = array( self::COLUMN_SYNONYM_PLACEHOLDER => $column_synonym, self::COLUMN_ENTITY_ID_PLACEHOLDER => $column_entity_id, ); $v['field'] = str_replace(array_keys($replace), array_values($replace), $v['field']); } } } } } /** * Interface of the autocomplete synonyms behavior. */ interface AutocompleteSynonymsBehavior extends SynonymsBehavior { } /** * Interface of the synonyms friendly select behavior. */ interface SelectSynonymsBehavior extends SynonymsBehavior { }