You are here

function views_plugin_row_rdf_node::render in Views Atom 7

Same name and namespace in other branches
  1. 6 views/views_plugin_row_rdf_node.inc \views_plugin_row_rdf_node::render()

Render a row object. This usually passes through to a theme template of some form, but not always.

Parameters

stdClass $row: A single row of the query result, so an element of $view->result.

Return value

string The rendered output of a single row, used by the style plugin.

Overrides views_plugin_row_rdf::render

File

./views_plugin_row_rdf_node.inc, line 17
Contains the RDF row style plugin.

Class

views_plugin_row_rdf_node
Plugin which performs a node_view on the resulting object and formats it as an RSS item.

Code

function render($row) {

  // For the most part, this code is taken from node_feed() in node.module
  global $base_url;
  $nid = $row->{$this->field_alias};
  if (!is_numeric($nid)) {
    return;
  }
  if (!empty($this->view->views_atom_nodes[$nid])) {
    $node = $this->view->views_atom_nodes[$nid];
  }
  else {
    $node = node_load($nid);
  }

  // Allow other modules to modify the node before we start serializing it.
  module_invoke_all('views_atom_prerender', $node);
  module_invoke_all('views_atom_prerender_node', $node);

  // We need to start with a DOMDocument because SimpleXML's namespace handling
  // is abysmal.  Fortunately we can swap back and forth as needed.
  // @todo: Add more common namespaces here if needed.
  $dom = new DOMDocument('1.0');
  $rdf_xml = $dom
    ->createElementNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'rdf:RDF');
  $dom
    ->appendChild($rdf_xml);

  // Get a SimpleXML version of the object for serious manipulation, since
  // its API is much easier to work with.
  $xml = simplexml_import_dom($dom);

  // Create the base entity element that wraps all Drupal data objects.
  $entity_xml = $xml
    ->addChild('entity', NULL, 'http://drupal.org/');

  // Node type is more generically "bundle", at least in Drupal 7 speak.
  $entity_xml
    ->addAttribute('type', 'node');
  $entity_xml
    ->addAttribute('bundle', check_plain($node->type));
  $entity_xml
    ->addChild('title', views_atom_sanitize($node->title));

  // Properties are primitive data associated with the entity.  These are
  // standard by entity type.  Those all get wrapped in a <properties> element.
  $properties_xml = $entity_xml
    ->addChild('properties');

  // Since we don't have a complete map of available properties, we'll just
  // treat any primitive values on the node object as properties.  That will
  // get more than we need, but it works well enough.
  foreach ($node as $property => $value) {

    // @todo, reexamine the use of empty() here. I've had to add the check for '0'
    if (is_scalar($value) && (!empty($value) || $value === '0')) {

      // We want to map the date fields to Atom/RDF format properly.  The others
      // we'll just send along as is.
      if (in_array($property, array(
        'created',
        'changed',
      ))) {
        $properties_xml
          ->addChild($property, date('c', $value));
      }
      else {
        $properties_xml
          ->addChild($property, views_atom_sanitize($value));
      }
    }
  }

  // Allow other modules the opportunity to get in on the XML conversion action.
  module_invoke_all('views_atom_render', $node, $entity_xml);
  module_invoke_all('views_atom_render_node', $entity_xml);
  drupal_alter('views_atom_render_rdf', $entity_xml, $node);

  // Force pretty formatting to make debugging easier.  It doesn't actually
  // affect parsing.  Note that because all objects in PHP are references
  // this $dom variable still has all of the changes made above using SimpleXML.
  // That's neat.
  $dom->formatOutput = TRUE;

  // This is stupid and bad, but I don't know of another way to supress the
  // <?xml crap.
  // @todo Find a better way to not get the XML declaration in the output.
  $output = $dom
    ->saveXML();
  return str_replace('<?xml version="1.0"?>' . "\n", '', $output);
}