// $Id: API.txt,v 1.4 2008/02/29 22:11:51 cwgordon7 Exp $

There are three major hooks to implement, hook_flexifilters, hook_flexifilter_conditions, and hook_flexifilter_components. Hook_flexifilters is for defining default flexifilters; hook_flexifilter_conditions is for describing your module's conditions to flexifilter; hook_flexifilter_components is for describing your module's components to flexifilter.




For hook_flexifilters, an array should be returned, each value of the array corresponding to an exported flexifilter (as an array itself).

function hook_flexifilter() {
  return array(
    array(
      // Exported flexifilter here.
    ),
    array(
      // Another exported flexifilter here.
    ),
  );
}




A description of hook_flexifilter_components:

/**
 * Implementation of hook_flexifilter_components()
 *
 * @return An array of components to be used by the Flexifilter module. The keys of this array
 * are unique identifiers for the component (called the component class), and the values of the
 * array are again arrays, with the following keys:
 * - label : A human readable name for the component
 * - description (optional) : A human readable description of what the component does (defaults to none)
 * - is_container (optional) : TRUE if any of the #contains_ fields are TRUE (set automatically)
 * - contains_condition (optional) : TRUE if the component has a condition associated with it (defaults to FALSE)
 * - contains_components (optional) : TRUE if the component has children components (defaults to FALSE)
 * - callback : A callback function which implements the component
 * - callback_arguments (optional) : An array of arguments to pass to the callback function (defaults to none)
 * - group (optional) : A human readable name of the group that the component belongs to (defaults to "Other")
 * - step : The step in which this is to be performed. Can be 'both', 'either', 'process', or 'prepare'.
 *     - If 'either' is specified, it will default to process, and the user will not be given the option to change it
 *       unless they have "show advanced options" checked.
 */

Hook_flexifilter_conditions works in a similar way with only one modification:

 - It has no 'step' attribute.




Two examples of a function specified in the 'callback' key follows:

function flexifilter_component_foo($op, $settings, $text) {
  switch ($op) {
    case 'settings':
      // Here we're passing back a settings form.
      $form = array();
      return $form;

    case 'prepare':
    case 'process':
      // This filter does the same thing for both prepare and process, as its 'step' is set to 'either'.
      // This step will append that message to the text being filtered.
      $text .= ' - This message brought to you by flexifilter.';
      return $text;

    default:
      return $text;
  }
}

function flexifilter_condition_foo($op, $settings, $text) {
  switch ($op) {
    case 'settings':
      // Here we're passing back a settings form.
      $form = array();
      return $form;

    case 'prepare':
    case 'process':
      // We return TRUE if 1 + 1 = 2.
      if ((1 + 1) == 2) {
        return TRUE;
      }
      // If we get here, 1 + 1 is not equal to two.
      return FALSE;
  }
}



Some useful API functions follow:

flexifilter_invoke_condition($condition, $op, $text); - This will invoke the condition specified in 'condition' with $op and $text. It will return either TRUE or FALSE, depending on what the condition returned.

flexifilter_invoke_component($component, $op, $settings = array(), $text = ''); - This will invoke the component specified in 'component' with $op, $settings, and $text. 

flexifilter_components_involve_step($components, $step); - This will return TRUE if any of the components in the components array will run in the current step 'process' or 'prepare'.

flexifilter_save_filter($filter); - This will save the filter specified in $filter. It can be used for both INSERTs and UPDATEs.