You are here

class ViewsRulesLoop in Views Rules 7

Loop plugin for using results from a view with Rules displays.

Hierarchy

Expanded class hierarchy of ViewsRulesLoop

1 string reference to 'ViewsRulesLoop'
views_rules_rules_plugin_info in ./views_rules.rules.inc
Implements hook_rules_plugin_info().

File

rules/views_rules.plugin.inc, line 10
Views Rules plugin implementations.

View source
class ViewsRulesLoop extends RulesActionContainer implements ViewsRulesIterable {
  protected $itemName = 'view loop';
  protected $view;

  /**
   * @var RulesState
   */
  protected $viewLoopState;
  public function __construct($viewName = NULL, $displayName = NULL, $settings = array()) {
    $this->info += array(
      'view_name' => $viewName,
      'display_name' => $displayName,
    );
    $this->settings = (array) $settings + $this->settings;
    $this
      ->setUp();
  }
  public function integrityCheck() {

    // Check view is configured.
    $view = $this
      ->getView();
    if (!$view) {
      throw new RulesIntegrityException(t('%plugin: View display is not configured.', array(
        '%plugin' => $this
          ->getPluginName(),
      )), $this);
    }

    // Check view display is an iterator.
    $display = $view->display_handler;
    if (!isset($display)) {
      throw new RulesIntegrityException(t('%plugin: Configured view display is missing.', array(
        '%plugin' => $this
          ->getPluginName(),
      )), $this);
    }
    if (!$display instanceof views_rules_iterator) {
      throw new RulesIntegrityException(t('%plugin: Configured view display is not a Rules iterator.', array(
        '%plugin' => $this
          ->getPluginName(),
      )), $this);
    }

    // Validate view display.
    if (!$view
      ->validate()) {
      throw new RulesIntegrityException(t('%plugin: Configured view does not validate.', array(
        '%plugin' => $this
          ->getPluginName(),
      )), $this);
    }
    parent::integrityCheck();

    // Check row variables.

    /** @var $display views_rules_iterator */
    foreach ($display
      ->get_rules_variable_info() as $name => $info) {
      if (isset($this->settings[$name . ':var'])) {
        $this
          ->checkVarName($this->settings[$name . ':var']);
      }
    }
  }
  public function evaluate(RulesState $state) {
    try {
      if ($iterator = $this
        ->getViewIterator()) {

        // Prepare view arguments.
        $arguments = array_intersect_key($this
          ->getExecutionArguments($state), $this
          ->pluginParameterInfo());
        $arguments = array_values(rules_unwrap_data($arguments));

        // Execute view.
        $this->viewLoopState = $state;
        try {
          $iterator
            ->execute_iterator($arguments, $this);
        } catch (views_rules_iterator_exception $e) {
          throw new RulesEvaluationException($e
            ->getMessage(), array(), $this);
        }
        unset($this->viewLoopState);
      }
      else {
        throw new RulesEvaluationException('Unable to evaluate invalid view iterator.', array(), $this);
      }
    } catch (RulesEvaluationException $e) {
      rules_log($e->msg, $e->args, $e->severity);
      rules_log('Unable to evaluate %name.', array(
        '%name' => $this
          ->getPluginName(),
      ), RulesLog::WARN, $this);
    }
    $this
      ->resetView();
  }
  public function evaluateRow(array $data) {

    // Clone state to evaluate children in a sandbox.
    $rowState = clone $this->viewLoopState;

    // Fill in state data.
    foreach ($this
      ->rowVariables() as $name => $info) {
      $rowState
        ->addVariable($name, $data[$info['source name']], $info);
    }
    parent::evaluate($rowState);

    // Update variables from parent scope.
    foreach ($this->viewLoopState->variables as $key => &$value) {
      if (array_key_exists($key, $rowState->variables)) {
        $value = $rowState->variables[$key];
      }
    }
  }
  public function pluginParameterInfo() {
    if ($iterator = $this
      ->getViewIterator()) {
      return $iterator
        ->get_rules_parameter_info();
    }
    return array();
  }
  protected function stateVariables($element = NULL) {
    $variables = parent::stateVariables($element);

    // Add row variables to state.
    $variables += $this
      ->rowVariables();
    return $variables;
  }
  public function rowVariables() {
    if ($iterator = $this
      ->getViewIterator()) {
      $variables = array();
      foreach ($iterator
        ->get_rules_variable_info() as $name => $info) {
        if (isset($this->settings[$name . ':var'])) {
          $variables[$this->settings[$name . ':var']] = array(
            'source name' => $name,
            'type' => $info['type'],
            'label' => $this->settings[$name . ':label'],
          );
        }
      }
      return $variables;
    }

    // Return no variable.
    return array();
  }

  /**
   * @param bool $reset
   *   Whether to reset the iterator by retrieving a new one.
   * @return view
   */
  public function getView($reset = FALSE) {
    if (!isset($this->view) || $reset) {
      $view = views_get_view($this->info['view_name'], $reset);
      if ($view && $view
        ->set_display($this->info['display_name'])) {
        $this->view = $view;
      }
    }
    return $this->view;
  }

  /**
   * @param bool $reset
   *   Whether to reset the iterator by retrieving a new one.
   * @return views_rules_iterator
   */
  public function getViewIterator($reset = FALSE) {
    if ($view = $this
      ->getView($reset)) {
      return $view->display_handler instanceof views_rules_iterator ? $view->display_handler : NULL;
    }
    return NULL;
  }
  public function label() {
    $view = $this
      ->getView();
    return t('Views loop: @view - @display', array(
      '@view' => ($viewLabel = $view
        ->get_human_name()) ? $viewLabel : $view->name,
      '@display' => $view->display_handler->display->display_title,
    ));
  }
  public function dependencies() {

    // TODO Remove once http://drupal.org/node/1682524 is fixed.
    $modules = array_flip(RulesPlugin::dependencies());
    $modules += array_flip(parent::dependencies());
    return array_keys($modules);
  }
  protected function exportChildren($key = NULL) {
    return parent::exportChildren('DO');
  }
  protected function exportFlat() {
    return FALSE;
  }
  protected function exportSettings() {
    $export = array();
    $export['VIEW'] = $this->info['view_name'];
    $export['DISPLAY'] = $this->info['display_name'];
    $export += parent::exportSettings();
    $export['ROW VARIABLES'] = array();
    foreach ($this
      ->rowVariables() as $name => $info) {
      $export['ROW VARIABLES'][$info['source name']][$name] = $info['label'];
    }
    return $export;
  }
  protected function importChildren($export, $key = NULL) {
    parent::importChildren($export, 'DO');
  }
  protected function importSettings($export) {

    // Import view.
    $this->info['view_name'] = $export['VIEW'];
    $this->info['display_name'] = $export['DISPLAY'];

    // Import row variables.
    foreach ($export['ROW VARIABLES'] as $name => $variable) {
      $this->settings[$name . ':var'] = key($variable);
      $this->settings[$name . ':label'] = current($variable);
    }
    parent::importSettings($export);
  }
  public function resetInternalCache() {
    parent::resetInternalCache();
    $this
      ->resetView();
  }
  public function resetView() {
    $this->view = NULL;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
RulesActionContainer::action public function Adds an action to the container.
RulesActionContainer::componentProvidesVariables public function Returns an array of provided variable names.
RulesActionContainer::exportToArray protected function Overrides RulesContainerPlugin::exportToArray 1
RulesActionContainer::import public function Applies the given export. Overrides RulesContainerPlugin::import 1
RulesActionContainer::pluginProvidesVariables public function Returns info about variables 'provided' by the plugin. Overrides RulesPlugin::pluginProvidesVariables
RulesActionContainer::providesVariables public function Returns info about all variables provided for later evaluated elements. Overrides RulesPlugin::providesVariables 1
RulesContainerPlugin::$children protected property
RulesContainerPlugin::access public function Whether the currently logged in user has access to all configured elements. Overrides RulesPlugin::access 1
RulesContainerPlugin::availableVariables public function Returns info about variables available to be used as arguments for this element. Overrides RulesPlugin::availableVariables
RulesContainerPlugin::componentVariables public function Returns the specified variables, in case the plugin is used as component.
RulesContainerPlugin::delete public function Overrides delete to keep the children alive, if possible. Overrides RulesPlugin::delete 1
RulesContainerPlugin::destroy public function Removes circular object references so PHP garbage collector can work. Overrides RulesPlugin::destroy 1
RulesContainerPlugin::executeByArgs public function Executes container with the given arguments. Overrides RulesPlugin::executeByArgs 1
RulesContainerPlugin::getIterator public function Allows access to the children through the iterator. 1
RulesContainerPlugin::optimize public function Overrides optimize(). Overrides RulesPlugin::optimize
RulesContainerPlugin::parameterInfo public function Returns info about parameters needed for executing the configured plugin. Overrides RulesPlugin::parameterInfo
RulesContainerPlugin::setUpVariables protected function Returns info about all variables that have to be setup in the state. Overrides RulesPlugin::setUpVariables
RulesContainerPlugin::sortChildren public function Sorts all child elements by their weight. 1
RulesContainerPlugin::variableInfoAssertions protected function Returns asserted additions to the available variable info. Overrides RulesPlugin::variableInfoAssertions 1
RulesContainerPlugin::__clone public function By default we do a deep clone. Overrides RulesPlugin::__clone 1
RulesContainerPlugin::__sleep public function Overrides RulesPlugin::__sleep 2
RulesExtendable::$itemInfo protected property
RulesExtendable::facesAs public function
RulesExtendable::forceSetUp public function Forces the object to be setUp, this executes setUp() if not done yet. 1
RulesExtendable::itemFacesAs public static function Returns whether the a RuleExtendable supports the given interface.
RulesExtendable::rebuildCache public function Allows items to add something to the rules cache. 1
RulesExtendable::setUp protected function 1
RulesExtendable::__call public function Magic method: Invoke the dynamically implemented methods.
RulesPlugin::$availableVariables protected property Static cache for availableVariables(). 1
RulesPlugin::$cache protected property Overrides RulesExtendable::$cache
RulesPlugin::$elementId protected property Identifies an element inside a configuration.
RulesPlugin::$hook protected property Overrides RulesExtendable::$hook
RulesPlugin::$id public property If this is a configuration saved to the db, the id of it.
RulesPlugin::$info protected property Info about this element. Usage depends on the plugin. 2
RulesPlugin::$name public property
RulesPlugin::$parent protected property The parent element, if any.
RulesPlugin::$settings public property An array of settings for this element.
RulesPlugin::$weight public property
RulesPlugin::applyDataSelector public function Applies the given data selector.
RulesPlugin::checkParameterSettings protected function Checks whether parameters are correctly configured.
RulesPlugin::checkVarName protected function
RulesPlugin::compare protected static function
RulesPlugin::depth public function Returns the depth of this element in the configuration.
RulesPlugin::elementId public function Returns the element id, which identifies the element inside the config.
RulesPlugin::elementMap public function Gets the element map helper object, which helps mapping elements to ids.
RulesPlugin::elements public function Iterate over all elements nested below the current element.
RulesPlugin::ensureNameExists protected function Ensure the configuration has a name. If not, generate one.
RulesPlugin::entityInfo public function
RulesPlugin::entityType public function
RulesPlugin::execute public function Execute the configuration.
RulesPlugin::export public function Exports a rule configuration.
RulesPlugin::exportParameterSetting protected function
RulesPlugin::form public function Seamlessly invokes the method implemented via faces.
RulesPlugin::form_submit public function
RulesPlugin::form_validate public function
RulesPlugin::getArgument protected function Returns the argument for the parameter $name described with $info.
RulesPlugin::getArgumentInfo public function Returns info about the configured argument.
RulesPlugin::getExecutionArguments protected function Gets the right arguments for executing the element.
RulesPlugin::getPluginName public function Gets the name of this plugin instance. 1
RulesPlugin::hasStatus public function Checks if the configuration has a certain exportable status.
RulesPlugin::identifier public function Returns the config name.
RulesPlugin::importParameterSetting protected function
RulesPlugin::info public function Returns the info of the plugin. 2
RulesPlugin::internalIdentifier public function
RulesPlugin::isRoot public function Returns whether the element is the root of the configuration.
RulesPlugin::parentElement public function Returns the element's parent.
RulesPlugin::plugin public function Returns the name of the element's plugin.
RulesPlugin::pluginInfo public function Returns info about the element's plugin.
RulesPlugin::processSettings public function Processes the settings e.g. to prepare input evaluators. 1
RulesPlugin::returnExport protected function Finalizes the configuration export.
RulesPlugin::returnVariables protected function Gets variables to return once the configuration has been executed. 2
RulesPlugin::root public function Gets the root element of the configuration.
RulesPlugin::save public function Saves the configuration to the database. 1
RulesPlugin::setParent public function Sets a new parent element.
RulesPlugin::setUpState public function Sets up the execution state for the given arguments.
RulesPlugin::__toString public function When converted to a string, just use the export format.
ViewsRulesLoop::$itemName protected property The name of the item this class represents in the info hook. Overrides RulesExtendable::$itemName
ViewsRulesLoop::$view protected property
ViewsRulesLoop::$viewLoopState protected property
ViewsRulesLoop::dependencies public function Calculates an array of required modules. Overrides RulesContainerPlugin::dependencies
ViewsRulesLoop::evaluate public function Evaluate, whereas by default new vars are visible in the parent's scope. Overrides RulesActionContainer::evaluate
ViewsRulesLoop::evaluateRow public function Evaluates a view row in the loop. Overrides ViewsRulesIterable::evaluateRow
ViewsRulesLoop::exportChildren protected function Overrides RulesContainerPlugin::exportChildren
ViewsRulesLoop::exportFlat protected function Determines whether the element should be exported in flat style. Overrides RulesContainerPlugin::exportFlat
ViewsRulesLoop::exportSettings protected function Overrides RulesPlugin::exportSettings
ViewsRulesLoop::getView public function
ViewsRulesLoop::getViewIterator public function
ViewsRulesLoop::importChildren protected function Overrides RulesContainerPlugin::importChildren
ViewsRulesLoop::importSettings protected function Overrides RulesPlugin::importSettings
ViewsRulesLoop::integrityCheck public function Makes sure the plugin is configured right. Overrides RulesContainerPlugin::integrityCheck
ViewsRulesLoop::label public function Returns the label of the element. Overrides RulesPlugin::label
ViewsRulesLoop::pluginParameterInfo public function Returns info about parameters needed by the plugin. Overrides RulesPlugin::pluginParameterInfo
ViewsRulesLoop::resetInternalCache public function Resets any internal static caches. Overrides RulesContainerPlugin::resetInternalCache
ViewsRulesLoop::resetView public function
ViewsRulesLoop::rowVariables public function
ViewsRulesLoop::stateVariables protected function Returns available state variables for an element. Overrides RulesContainerPlugin::stateVariables
ViewsRulesLoop::__construct public function Overrides RulesActionContainer::__construct