| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | <?php/** * @file * Documentation for Synonyms module. *//** * Collect info about available synonyms behavior implementations. * * If your module ships a synonyms behavior implementation you probably want to * implement this hook. However, exercise caution, if your synonyms behavior * implementation is a field-based one, you might be better off implementing * hook_synonyms_field_behavior_implementation_info(). * * @param string $entity_type *   Entity type whose synonyms behavior implementations are requested * @param string $bundle *   Bundle name whose synonyms behavior implementations are requested * @param string $behavior *   Behavior name whose implementations are requested * * @return array *   Array of information about synonyms behavior implementations your module *   exposes. Each sub array will represent a single synonyms behavior *   implementation and should have the following structure: *   - provider: (string) machine name of your synonyms behavior implementation. *     Prefix it with your module name to make sure no name collision happens. *     Also, provider must be unique within the namespace of behavior, entity *     type and bundle. Basically, this is what distinguishes one behavior *     implementation from another *   - label: (string) Human friendly translated name of your synonyms behavior *     implementation *   - class: (string) Name of PHP class that implements synonyms behavior *     interface, which is stated in synonyms behavior definition. This class *     will do all the synonyms work. This hook serves pure declarative function *     to map entity types, bundles with their synonym behavior implementations *     whereas real "synonyms-related" work is implemented in your class */function hook_synonyms_behavior_implementation_info($entity_type, $bundle, $behavior) {  $providers = array();  switch ($entity_type) {    case 'entity_type_i_want':      switch ($bundle) {        case 'bundle_i_want':          switch ($behavior) {            case 'behavior_i_want':              $providers[] = array(                'provider' => 'my_module_synonyms_behavior_implementation_machine_name',                'label' => t('This is human friendly name of my synonyms behavior implementation. Put something meaningful here'),                'class' => 'MySynonymsSynonymsBehavior',              );              break;          }          break;      }      break;  }  return $providers;}/** * Example of synonyms behavior implementation class. * * You are encouraged to extend AbstractSynonymsBehavior class as that one * contains a few heuristic that make your implementation easier. */class MySynonymsSynonymsBehavior extends AbstractSynonymsBehavior implements AutocompleteSynonymsBehavior {  /**   * Extract synonyms from an entity within a specific behavior implementation.   *   * @param object $entity   *   Entity from which to extract synonyms   *   * @return array   *   Array of synonyms extracted from $entity   */  public function extractSynonyms($entity) {    $synonyms = array();    // Do something with $entity in order to extract synonyms from it. Add all    // those synonyms into your $synonyms array.    return $synonyms;  }  /**   * Add an entity as a synonym into another entity.   *   * Basically this method should be called when you want to add some entity   * as a synonym to another entity (for example when you merge one entity   * into another and besides merging want to add synonym of the merged entity   * into the trunk entity). You should update $trunk_entity in such a way that   * it holds $synonym_entity as a synonym (it all depends on how data is stored   * in your behavior implementation, but probably you will store entity label   * or its ID as you cannot literaly store an entity inside of another entity).   * If entity of type $synonym_entity_type cannot be converted into a format   * expected by your behavior implementation, just do nothing.   *   * @param object $trunk_entity   *   Entity into which another one should be added as synonym   * @param object $synonym_entity   *   Fully loaded entity object which has to be added as synonym   * @param string $synonym_entity_type   *   Entity type of $synonym_entity   */  public function mergeEntityAsSynonym($trunk_entity, $synonym_entity, $synonym_entity_type) {    // If you can add $synonym_entity into $trunk_entity, then do so.    // For example:    $trunk_entity->synonym_storage[] = $synonym_entity;  }  /**   * Look up entities by their synonyms within a behavior implementation.   *   * You are provided with a SQL condition that you should apply to the storage   * of synonyms within the provided behavior implementation. And then return   * result: what entities match by the provided condition through what   * synonyms.   *   * @param QueryConditionInterface $condition   *   Condition that defines what to search for. Apart from normal SQL   *   conditions as known in Drupal, it may contain the following placeholders:   *   - AbstractSynonymsBehavior::COLUMN_SYNONYM_PLACEHOLDER: to denote   *     synonyms column which you should replace with the actual column name   *     where the synonyms data for your provider is stored in plain text.   *   - AbstractSynonymsBehavior::COLUMN_ENTITY_ID_PLACEHOLDER: to denote   *     column that holds entity ID. You are supposed to replace this placeholder   *     with actual column name that holds entity ID in your case.   *   For ease of work with these placeholders, you may extend the   *   AbstractSynonymsBehavior class and then just invoke the   *   AbstractSynonymsBehavior->synonymsFindProcessCondition() method, so you   *   won't have to worry much about it   *   * @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) {    // Here, as an example, we'll query an imaginary table where your module    // supposedly keeps synonyms. We'll also use helpful    // AbstractSynonymsBehavior::synonymsFindProcessCondition() to normalize    // $condition argument.    $query = db_select('my_synonyms_storage_table', 'table');    $query->addField('table', 'entity_id', 'entity_id');    $query->addField('table', 'synonym', 'synonym');    $this->synonymsFindProcessCondition($condition, 'table.synonym', 'table.entity_id');    $query->condition($condition);    return $query->execute();  }  /**   * 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() {    $pipe = parent::featuresExportPipe();    // Here you can add any additional features components your provider    // depends on.    return $pipe;  }}
 |