123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- <?php
- /**
- * @file
- * Main functions and hook implementations of the FE Nodequeue module.
- */
- /**
- * Implements hook_features_api().
- */
- function fe_nodequeue_features_api() {
- return array(
- 'fe_nodequeue' => array(
- 'name' => t('Nodequeues'),
- 'feature_source' => TRUE,
- 'default_hook' => 'fe_nodequeue_export_fields',
- 'default_file' => FEATURES_DEFAULTS_INCLUDED_COMMON,
- ),
- );
- }
- /**
- * Implements hook_features_export_options().
- */
- function fe_nodequeue_features_export_options() {
- $options = array();
- $fields = db_query('SELECT * FROM {nodequeue_queue}');
- while ($obj = $fields->fetchObject()) {
- $options[$obj->name] = t('@name [@machine_name]', array('@name' => $obj->title, '@machine_name' => $obj->name));
- }
- return $options;
- }
- /**
- * Implements hook_features_export().
- */
- function fe_nodequeue_features_export($data, &$export, $module_name = '') {
- $pipe = array();
- $map = features_get_default_map('fe_nodequeue');
- foreach ($data as $name) {
- $export['dependencies']['fe_nodequeue'] = 'fe_nodequeue';
- // If another module provides this style, add it as a dependency.
- if (isset($map[$name]) && $map[$name] != $module_name) {
- $module = $map[$name];
- $export['dependencies'][$module] = $module;
- }
- // Otherwise, export the nodequeue.
- elseif ($queue = _fe_nodequeue_load_queue_by_name($name, TRUE)) {
- // Add dependencies for the roles that are associated with these queues.
- if ($queue->roles) {
- // Filter out roles that have the 'manipulate all queues' permission.
- // @see http://drupal.org/node/213074
- $manipulate_all_queues = array_keys(user_roles(FALSE, 'manipulate all queues'));
- $queue->roles = array_diff($queue->roles, $manipulate_all_queues);
- $roles = user_roles();
- foreach ($queue->roles as $index => $rid) {
- $export['features']['user_role'][$roles[$rid]] = $roles[$rid];
- // Convert the role from a rid to a 'machine name' for saving. This
- // will be converted back to a rid when the feature is reverted.
- $queue->roles[$index] = $roles[$rid];
- }
- }
- $export['features']['fe_nodequeue'][$name] = $name;
- }
- }
- return $pipe;
- }
- /**
- * Implements hook_features_export_render().
- */
- function fe_nodequeue_features_export_render($module_name = '', $data) {
- $code = array();
- $code[] = ' $nodequeues = array();';
- $code[] = '';
- $roles = user_roles();
- foreach ($data as $name) {
- // Clone the nodequeue object so that our changes aren't statically cached.
- $nodequeue_static = _fe_nodequeue_load_queue_by_name($name, TRUE);
- if (!empty($nodequeue_static) && $nodequeue = clone $nodequeue_static) {
- // Sort roles and types arrays into ascending order so that we can check
- // for overridden db data without being affected by the order in which
- // this array gets stored/loaded.
- if (!empty($nodequeue->roles)) {
- // Roles that have the 'Manipulate all queues' permission will not get
- // saved and will throw override messages as a result.
- $manipulate_all_queues = array_keys(user_roles(FALSE, 'manipulate all queues'));
- $nodequeue->roles = array_diff($nodequeue->roles, $manipulate_all_queues);
- foreach ($nodequeue->roles as $index => $rid) {
- $nodequeue->roles[$index] = $roles[$rid];
- }
- sort($nodequeue->roles);
- }
- if (!empty($nodequeue->types)) {
- sort($nodequeue->types);
- }
- // Remove the nodequeue id. This is specific to the current site and
- // should not be exported.
- unset($nodequeue->qid);
- // We don't care how many subqueues are in here since they get created
- // automatically.
- if (module_exists('smartqueue')) {
- unset($nodequeue->subqueues);
- }
- $nodequeue_export = features_var_export($nodequeue, ' ');
- $code[] = " // Exported nodequeues: {$nodequeue->name}";
- $code[] = " \$nodequeues['{$name}'] = {$nodequeue_export};";
- $code[] = "";
- }
- }
- $code[] = ' return $nodequeues;';
- $code = implode("\n", $code);
- return array('fe_nodequeue_export_fields' => $code);
- }
- /**
- * Implements hook_features_revert().
- */
- function fe_nodequeue_features_revert($module) {
- $defaults = features_get_default('fe_nodequeue', $module);
- if (empty($defaults)) {
- return;
- }
- // Revert.
- foreach ($defaults as $object) {
- if (empty($object['name'])) {
- continue;
- }
- // Assign the existing qid if a nodequeue with the same name already exists.
- $map = _fe_nodequeue_get_qid_map();
- if (isset($map[$object['name']])) {
- $object['qid'] = $map[$object['name']];
- }
- // Clear the qid if it is a new nodequeue.
- else {
- unset($object['qid']);
- }
- $result = _fe_nodequeue_save_queue((array) $object);
- }
- return TRUE;
- }
- /**
- * Implements hook_features_revert().
- */
- function fe_nodequeue_features_rebuild($module) {
- fe_nodequeue_features_revert($module);
- }
- /**
- * Implements hook_features_enable_feature().
- */
- function fe_nodequeue_features_enable_feature($module) {
- fe_nodequeue_features_revert($module);
- }
- /**
- * Save a nodequeue queue.
- *
- * @param array $settings
- * A nodequeue settings array.
- *
- * @return array
- * The updated settings array.
- */
- function _fe_nodequeue_save_queue(array $settings) {
- // Convert roles from names to rids.
- $roles = array_flip(user_roles());
- foreach ((array) $settings['roles'] as $index => $role) {
- // In case we are dealing with an old export with rids, don't do anything.
- if (is_int($role)) {
- continue;
- }
- if (isset($roles[$role])) {
- $settings['roles'][$index] = $roles[$role];
- }
- else {
- // Do not attempt to assign a role which does not exist.
- unset($settings['roles'][$index]);
- }
- }
- // Simulate checkboxes.
- $settings['roles'] = drupal_map_assoc($settings['roles']);
- $settings['types'] = drupal_map_assoc($settings['types']);
- // Simulate submitting.
- $form_state = array();
- $form_state['values'] = $settings;
- module_load_include('inc', 'nodequeue', 'includes/nodequeue.admin');
- nodequeue_edit_queue_form_submit(NULL, $form_state);
- // Reset static caches.
- // Note: we are currently using a variant of nodequeue_get_qid_map() that uses
- // drupal_static() instead of a static variable to cache the results.
- // @see http://drupal.org/node/1666556
- drupal_static_reset('_fe_nodequeue_get_qid_map');
- return $settings;
- }
- /**
- * Return a map of queue name to qid values to aid in various lookups.
- *
- * This is based on nodequeue_get_qid_map() but uses drupal_static() instead of
- * a static variable to cache the results.
- *
- * @see nodequeue_get_qid_map()
- *
- * @todo Add a link to the issue that converts this to drupal_static().
- * @todo Create a followup issue to remove this once the above issue is fixed.
- * We will need to keep this in for a while to provide backwards compatibility
- * for people running old versions of Nodequeue.
- *
- * @return array
- * A array of qids, keyed by machine name.
- */
- function _fe_nodequeue_get_qid_map() {
- $map = &drupal_static(__FUNCTION__, array());
- if (!$map) {
- $result = db_query("SELECT qid, name FROM {nodequeue_queue}");
- while ($get = $result->fetchObject()) {
- $map[$get->name] = $get->qid;
- }
- }
- return $map;
- }
- /**
- * Return a queue by its machine name.
- *
- * This is obviously not ideal due to the extra queries, but probably preferable
- * to changing current API calls.
- *
- * This is based on nodequeue_load_queue_by_name() but passes through the
- * $bypass_cache flag.
- *
- * @see nodequeue_load_queue_by_name()
- * @see http://drupal.org/node/1964144
- *
- * @param string $name
- * The queue machine name.
- * @param bool $bypass_cache
- * Boolean value indicating whether to bypass the cache or not.
- *
- * @return array
- * The queue definition, or an empty array if no queue was found with the
- * given machine name.
- */
- function _fe_nodequeue_load_queue_by_name($name, $bypass_cache = FALSE) {
- $map = _fe_nodequeue_get_qid_map();
- if (isset($map[$name])) {
- $queues = nodequeue_load_queues(array($map[$name]), $bypass_cache);
- if ($queues) {
- return current($queues);
- }
- }
- return array();
- }
|