You are here

scald.features.inc in Scald: Media Management made easy 7

File name: scald.features.inc.

File

scald.features.inc
View source
<?php

/**
 * @file
 * File name: scald.features.inc.
 */

/**
 * Implements hook_features_export_options().
 */
function scald_context_type_features_export_options() {
  $options = array();

  // Get all contexts by types.
  $contexts = scald_contexts();
  $types = scald_types();
  foreach ($contexts as $cname => $cdata) {
    foreach ($types as $tname => $tdata) {
      $options[$cname . '-' . $tname] = drupal_ucfirst(check_plain($cdata['title'])) . ': ' . check_plain($tdata->title);
    }
  }
  return $options;
}

/**
 * Implements hook_features_export().
 */
function scald_context_type_features_export($data, &$export, $module_name = '') {

  // Add scald module as a dependency.
  $export['dependencies']['scald'] = 'scald';
  foreach ($data as $key => $name) {
    $context_name = _scald_context_type_extract($name, 'context');
    $context = scald_context_load($context_name);

    // Add dependency to module provider.
    $export['dependencies'][$context['provider']] = $context['provider'];

    // Add it to the export data.
    $export['features']['scald_context_type'][$name] = $name;
  }
  return $export;
}

/**
 * Implements hook_features_export_render().
 */
function scald_context_type_features_export_render($module, $data) {

  // Sanitize array if needed.
  foreach ($data as $key => $name) {
    unset($data[$key]);
    $data[$name] = $name;
  }

  // Iterate over data to export.
  $code = '  $contexts = array();' . "\n";
  foreach ($data as $key => $name) {
    $context_name = _scald_context_type_extract($name, 'context');
    $type_name = _scald_context_type_extract($name, 'type');

    // Clean context from other types.
    $context = _scald_context_type_clean($context_name, $type_name);

    // Export clean context config.
    $data[$name] = $context;

    // Generates code.
    $code .= '  $contexts[\'' . $name . '\'] = ' . features_var_export($data[$name], '  ') . ";" . "\n";
  }
  $code .= '  return $contexts;';

  // Try to find the old file "module.context_config.inc" and delete it.
  _scald_context_clean_export($module);
  return array(
    'scald_default_context_types' => $code,
  );
}

/**
 * Implements hook_features_revert().
 */
function scald_context_type_features_revert($module) {
  scald_context_type_features_rebuild($module);
}

/**
 * Implements hook_features_rebuild().
 */
function scald_context_type_features_rebuild($module) {
  $contexts = module_invoke($module, 'scald_default_context_types');
  $regroup = array();

  // Get default contexts and regroup by type.
  foreach ($contexts as $key => $context) {
    $context_name = _scald_context_type_extract($key, 'context');

    // Ensure there's at least a stub for each of the exported properties.
    $context = array_merge_recursive($context, array(
      'player' => array(),
      'transcoder' => array(),
      'data' => array(),
    ));
    if (!isset($regroup[$context_name])) {

      // Initialize this context.
      $regroup[$context_name] = $context;
    }
    else {

      // Merge types data.
      $regroup[$context_name]['player'] = array_merge_recursive($regroup[$context_name]['player'], $context['player']);
      $regroup[$context_name]['transcoder'] = array_merge_recursive($regroup[$context_name]['transcoder'], $context['transcoder']);
      $regroup[$context_name]['data'] = array_merge_recursive($regroup[$context_name]['data'], $context['data']);
    }
  }

  // Once whole contexts are regrouped.
  foreach ($regroup as $name => $data) {
    $config = scald_context_config_load($name);
    foreach (scald_types() as $type) {
      if (isset($data['transcoder'][$type->type])) {
        $config->transcoder[$type->type] = $data['transcoder'][$type->type];
      }
      if (isset($data['player'][$type->type])) {
        $config->player[$type->type] = $data['player'][$type->type];
      }

      // At this point data is per-context, not per-context-per-bundle so this
      // is a little redundant to store on every bundle.  But if #2600088 is
      // resolved then this framework should support existing exports without
      // needing to change.
      if (isset($data['data'][$type->type])) {
        $config->data = $data['data'][$type->type];
      }
    }
    scald_context_config_save($config);
  }
  cache_clear_all('*', 'cache_scald', TRUE);
}

/**
 * Helper function to extract context name and type name from a string.
 *
 * @param string $string
 *   The array key to extract the context/type name from.
 * @param string $object
 *   The object name to extract : can be type or context.
 *
 * @return string
 *   The machine name of the extracted object.
 */
function _scald_context_type_extract($string, $object = 'context') {
  $regex = "/(.+)-(.+)/";
  preg_match($regex, $string, $matches);
  if ($object == 'context') {
    return $matches[1];
  }
  else {
    return $matches[2];
  }
}

/**
 * Helper function to clean a context given a type.
 *
 * @param string $name
 *   The context machine name.
 * @param string $type
 *   The type machine name.
 *
 * @return array
 *   Array with player, transcoder and data.
 */
function _scald_context_type_clean($name, $type) {
  $config = scald_context_config_load($name);
  return array(
    'player' => array(
      $type => $config->player[$type],
    ),
    'transcoder' => array(
      $type => $config->transcoder[$type],
    ),
    // At this point data is per-context, not per-context-per-bundle so this
    // is a little redundant to store on every bundle.  But if #2600088 is
    // resolved then this framework should support existing exports without
    // needing to change.
    'data' => array(
      $type => $config->data,
    ),
  );
}

/**
 * Helper function to clean old CTools export files.
 *
 * Used when the user choose to switch to new feature export,
 * after recreating the features.
 * It warns about deprecation of the old "module.context_config.inc" file.
 */
function _scald_context_clean_export($module) {
  $path = drupal_get_path('module', $module) . '/' . $module . '.context_config.inc';
  if (file_exists($path)) {
    features_log(t('The file @filename has been deprecated and can be removed.', array(
      '@filename' => $path,
    )), 'status');
  }
}

Functions

Namesort descending Description
scald_context_type_features_export Implements hook_features_export().
scald_context_type_features_export_options Implements hook_features_export_options().
scald_context_type_features_export_render Implements hook_features_export_render().
scald_context_type_features_rebuild Implements hook_features_rebuild().
scald_context_type_features_revert Implements hook_features_revert().
_scald_context_clean_export Helper function to clean old CTools export files.
_scald_context_type_clean Helper function to clean a context given a type.
_scald_context_type_extract Helper function to extract context name and type name from a string.