array( 'item' => NULL, 'module' => NULL, ), 'template' => 'php.export', 'path' => drupal_get_path('module', 'custom_formatters') . '/engines', ); } /** * Settings form callback for Custom Formatters PHP engine. */ function custom_formatters_engine_php_settings_form(&$form) { $form['code']['#description'] = t('Enter the PHP code that will be evaluated. You should NOT include %php tags. The $variables object is available.', array('%php' => '')); $form['code']['#attributes']['class'][] = 'syntax-php'; $form['settings'] = array( '#type' => 'container', ); // Additional debugging modes. $form['preview']['options']['dpm'] = array( '#type' => 'container', ); $form['preview']['options']['dpm']['vars'] = array( '#type' => 'checkbox', '#title' => t('Output $variables array (requires Devel module).'), '#default_value' => module_exists('devel'), '#disabled' => !module_exists('devel'), ); $form['preview']['options']['dpm']['html'] = array( '#type' => 'checkbox', '#title' => t('Output raw HTML (requires Devel module).'), '#default_value' => module_exists('devel'), '#disabled' => !module_exists('devel'), ); } /** * Render callback for Custom Formatters PHP engine. */ function custom_formatters_engine_php_render($formatter, $obj_type, $object, $field, $instance, $langcode, $items, $display) { global $theme_path, $theme_info, $conf; // Store current theme path. $old_theme_path = $theme_path; // Restore theme_path to the theme, as long as php_eval() executes, // so code evaluated will not see the caller module as the current theme. // If theme info is not initialized get the path from theme_default. if (!isset($theme_info)) { $theme_path = drupal_get_path('theme', $conf['theme_default']); } else { $theme_path = dirname($theme_info->filename); } // Build variables array for formatter. $variables = array( '#obj_type' => $obj_type, '#object' => $object, '#field' => $field, '#instance' => $instance, '#langcode' => $langcode, '#items' => $items, '#display' => $display, ); ob_start(); $output = eval($formatter->code); $output = !empty($output) ? $output : ob_get_contents(); ob_end_clean(); // Preview debugging; Show the available variables data. if (module_exists('devel') && isset($formatter->preview) && $formatter->preview['options']['dpm']['vars']) { dpm($variables); } // Recover original theme path. $theme_path = $old_theme_path; return $output; } /** * Export callback for Custom Formatters PHP engine. */ function custom_formatters_engine_php_export($item, $module) { $formatter = clone $item; if (isset($formatter->fapi)) { ob_start(); eval($formatter->fapi); ob_get_clean(); if (isset($form)) { $formatter->form = $form; } } // Modify #default_value for hook_field_formatter_settings_form() export. include drupal_get_path('module', 'form_builder') . '/examples/form_builder_examples.module'; foreach (element_children($form) as $key) { if (isset($form[$key]['#default_value'])) { unset($form[$key]['#default_value']); } $form[$key]['#default_value'] = "[default-value::{$key}]"; } $formatter->fapi = form_builder_examples_export_recurse($form); preg_match_all('/\'\[default-value::(.*)?\]\'/', $formatter->fapi, $matches, PREG_SET_ORDER); foreach ($matches as $match) { $formatter->fapi = str_replace($match[0], "\$settings['{$match[1]}']", $formatter->fapi); } return theme('custom_formatters_php_export', array('item' => $formatter, 'module' => $module)); } /** * Help callback for Custom Formatters PHP engine. */ function custom_formatters_engine_php_help() { return t('A PHP Formatter is essentially a standard Drupal API Field Formatter, the primary difference is that all availble parameters have been bundled into a $variables array for ease of use.') . "
\n" . t('The Formatter should be PHP code that returns either a value or Render Array and it should NOT include tags.') . "\n"; }