array( 'render element' => 'form', ), 'social_media_links_platforms' => array( 'variables' => array( 'platform_values' => array(), 'icon_style' => array(), 'appearance' => array(), 'link_attributes' => array(), 'attributes' => array(), ), ), 'social_media_links_platform' => array( 'variables' => array( 'info' => array(), 'name' => NULL, 'value' => NULL, 'icon_style' => array(), 'appearance' => array(), 'attributes' => array(), ), ), ); } /** * Implements hook_ctools_plugin_directory(). */ function social_media_links_ctools_plugin_directory($module, $plugin) { if ($module == 'ctools' && $plugin == 'content_types') { return 'plugins/' . $plugin; } return FALSE; } /** * Implements hook_block_info(). */ function social_media_links_block_info() { $blocks['social-media-links'] = array( 'info' => t('Social Media Links'), // We cache per role, so that the edit/configure links display only if the // user has access. 'cache' => DRUPAL_CACHE_PER_ROLE, ); return $blocks; } /** * Implements hook_block_configure(). */ function social_media_links_block_configure($delta = '') { if ($delta === 'social-media-links') { $values = array( 'platforms' => variable_get('social_media_links_platforms', array()), 'appearance' => variable_get('social_media_links_appearance', array()), 'icon_style' => variable_get('social_media_links_icon_style', ''), 'link_attributes' => variable_get('social_media_links_link_attributes', array()), ); $form = social_media_links_form($values); return $form; } } function social_media_links_form($values) { $form = array(); // Platforms. $form['platforms'] = array( '#type' => 'fieldset', '#title' => t('Platforms'), '#collapsible' => TRUE, '#collapsed' => FALSE, '#tree' => TRUE, '#theme' => 'social_media_links_platforms_table', ); $platform_values = isset($values['platforms']) ? $values['platforms'] : array(); $platforms = social_media_links_platforms(); if (!empty($platform_values)) { // Combine the platforms with the weight value for sorting. foreach ($platforms as $key => $value) { if (isset($platform_values[$key]['weight'])) { $platforms[$key]['weight'] = $platform_values[$key]['weight']; } } uasort($platforms, 'drupal_sort_weight'); } $i = -10; foreach ($platforms as $key => $value) { $form['platforms'][$key] = array( 'platform_value' => array( '#type' => 'textfield', '#title' => $value['title'], '#title_display' => 'invisible', '#size' => 40, '#field_prefix' => $value['base url'], '#default_value' => isset($platform_values[$key]['platform_value']) ? $platform_values[$key]['platform_value'] : '', ), 'weight' => array( '#type' => 'weight', '#title' => t('Weight'), '#title_display' => 'invisible', '#delta' => 10, '#default_value' => isset($platform_values[$key]['weight']) ? $platform_values[$key]['weight'] : $i + 1, '#attributes' => array('class' => array('weight')), ), ); $i++; } // Appearance. $form['appearance'] = array( '#type' => 'fieldset', '#title' => t('Appearance'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#tree' => TRUE, ); $appearance_values = isset($values['appearance']) ? $values['appearance'] : array(); $form['appearance']['orientation'] = array( '#type' => 'select', '#title' => t('Orientation'), '#default_value' => isset($appearance_values['orientation']) ? $appearance_values['orientation'] : 'h', '#options' => array( 'v' => t('vertical'), 'h' => t('horizontal'), ), ); $form['appearance']['show_name'] = array( '#type' => 'checkbox', '#title' => t('Show name'), '#description' => t('Show the platform name next to the icon.'), '#default_value' => isset($appearance_values['show_name']) ? $appearance_values['show_name'] : 0, ); // Link Attributes. $form['link_attributes'] = array( '#type' => 'fieldset', '#title' => t('Link attributes'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#tree' => TRUE, ); $link_values = isset($values['link_attributes']) ? $values['link_attributes'] : array(); $form['link_attributes']['target'] = array( '#type' => 'select', '#title' => t('Default target'), '#default_value' => isset($link_values['target']) ? $link_values['target'] : '', '#options' => array( '' => t('Remove target attribute'), '_blank' => t('Open in a new browser window or tab (_blank)'), '_self' => t('Open in the current window (_self)'), '_parent' => t('Open in the frame that is superior to the frame the link is in (_parent)'), '_top' => t('Cancel all frames and open in full browser window (_top)'), ), ); $form['link_attributes']['rel'] = array( '#type' => 'select', '#title' => t('Default rel'), '#default_value' => isset($link_values['rel']) ? $link_values['rel'] : '', '#options' => array( '' => t('Remove rel attribute'), 'nofollow' => t('Set nofollow'), ), ); // Icon Sets. $form['icons'] = array( '#type' => 'fieldset', '#title' => t('Icon Sets'), '#collapsible' => TRUE, '#collapsed' => FALSE, ); $options = social_media_links_iconsets_options(); $form['icons']['icon_style'] = array( '#type' => 'select', '#title' => t('Icon Style'), '#default_value' => $values['icon_style'], '#options' => $options, ); // Generate the icon set table. $header = array( array( 'data' => t('Name'), 'style' => 'width: 150px;', ), t('Sizes'), t('Icon examples and download instructions'), ); $rows = array(); $icons = social_media_links_iconsets(); foreach ($icons as $iconset_name => $iconset) { if (isset($iconset['download url'])) { $name = '' . l($iconset['name'], $iconset['download url'], array('attributes' => array('target' => '_blank'))) . ''; } else { $name = '' . $iconset['name'] . ''; } if (isset($iconset['publisher'])) { $name .= '
' . t('by') . ' '; if (isset($iconset['publisher url'])) { $name .= l($iconset['publisher'], $iconset['publisher url'], array('attributes' => array('target' => '_blank'))); } else { $name .= $iconset['publisher']; } } $row = array( $name, implode('
', $iconset['styles']), ); if (!empty($iconset['path'])) { $row[] = _social_media_links_generate_example_table($platforms, $iconset); } else { $searchdirs = social_media_links_searchdirs($iconset_name); $str = '' . t('Not installed.') . '
'; $str .= t('To install: !download and install it into', array( '!download' => l(t('Download'), $iconset['download url'], array('attributes' => array('target' => '_blank'))), ) ); $str .= ' DRUPAL_ROOT/' . preg_replace('/,([^,]+) ?$/', " " . t('or') . " $1", implode(', ', $searchdirs), 1) . '.'; if (isset($iconset['additional instructions'])) { $str .= ' ' . $iconset['additional instructions']; } $row[] = $str; } $rows[] = $row; $vars = array( 'header' => $header, 'rows' => $rows, 'attributes' => array( 'id' => 'social-media-links-iconsets', ), ); $form['icons']['installed'] = array( '#markup' => theme('table', $vars), ); } return $form; } /** * Implements hook_block_save(). */ function social_media_links_block_save($delta = '', $edit = array()) { if ($delta === 'social-media-links') { variable_set('social_media_links_platforms', $edit['platforms']); variable_set('social_media_links_appearance', $edit['appearance']); variable_set('social_media_links_link_attributes', $edit['link_attributes']); variable_set('social_media_links_icon_style', $edit['icon_style']); } } /** * Implements hook_block_view(). */ function social_media_links_block_view($delta = '') { $block = array(); switch ($delta) { case 'social-media-links': $platforms = variable_get('social_media_links_platforms', array()); $platforms = _social_media_links_cleanup_platforms($platforms); if (count($platforms) > 0) { $block['subject'] = t('Follow Us'); $block['content'] = array( '#theme' => 'social_media_links_platforms', '#platform_values' => $platforms, '#icon_style' => variable_get('social_media_links_icon_style'), '#appearance' => variable_get('social_media_links_appearance'), '#link_attributes' => variable_get('social_media_links_link_attributes'), '#attributes' => array( 'class' => array('social-media-links', 'platforms'), ), ); // Add css to the block. $block['content']['#attached']['css'][] = drupal_get_path('module', 'social_media_links') . '/social_media_links.css'; } break; } return $block; } /** * Preprocesses variables for social media links platforms. * * @see theme_social_media_links_platforms() */ function template_preprocess_social_media_links_platforms(&$variables) { $platform_infos = social_media_links_platforms(); $icon_style = explode(':', $variables['icon_style']); // Apply the link settings to the render array. foreach ($variables['link_attributes'] as $key => $value) { if ($value == '') { unset($variables['link_attributes'][$key]); } } // Sort and loop over the platforms. uasort($variables['platform_values'], 'drupal_sort_weight'); foreach ($variables['platform_values'] as $platform_name => $platform_value) { // Build the platform data array. $variables['platforms'][$platform_name] = array( '#theme' => 'social_media_links_platform', '#name' => $platform_name, '#info' => $platform_infos[$platform_name], '#value' => $platform_value['platform_value'], '#icon_style' => $icon_style, '#appearance' => $variables['appearance'], '#attributes' => $variables['link_attributes'], ); } if ($variables['appearance']['orientation'] == 'h') { $variables['attributes']['class'][] = 'inline horizontal'; } else { $variables['attributes']['class'][] = 'vertical'; } } /** * Processes variables for social-media-links-platform.tpl.php. * * @see theme_social_media_links_platform() */ function template_preprocess_social_media_links_platform(&$variables) { $info = $variables['info']; $name = $variables['name']; $value = $variables['value']; $icon_style = $variables['icon_style']; // Call the url callback of the platform to create the link url. $variables['link'] = $info['base url'] . $value; if (isset($info['url callback'])) { $platform_url_changed = call_user_func($info['url callback'], $info['base url'], $value); if ($platform_url_changed) { $variables['link'] = $platform_url_changed; } } $variables['attributes']['title'] = check_plain($info['title']); $variables['icon_path'] = social_media_links_icon($icon_style[0], $name, $icon_style[1]); $variables['icon_alt'] = isset($info['image alt']) ? $info['image alt'] : $info['title'] . ' ' . t('icon'); } /** * Get the available platforms. * * @return array * Returns a list of platforms. */ function social_media_links_platforms() { $platforms = &drupal_static(__FUNCTION__); // Grab from cache or build the array. if (isset($platforms)) { return $platforms; } include_once 'social_media_links.platforms.inc'; $platforms = array(); $platforms = module_invoke_all('social_media_links_platform_info'); drupal_alter('social_media_links_platform_info', $platforms); return $platforms; } /** * Get all registered icon sets. * * @return array * Return a list of all registered platforms. */ function social_media_links_iconsets() { $sets = &drupal_static(__FUNCTION__); // Grab from cache or build the array. if (isset($sets)) { return $sets; } include_once 'social_media_links.iconsets.inc'; $sets = array(); $sets = module_invoke_all('social_media_links_iconset_info'); foreach ($sets as $key => $set) { if ($path = social_media_links_iconset_path($key)) { $sets[$key]['path'] = $path; } } drupal_alter('social_media_links_iconset_info', $sets); return $sets; } /** * Get informations about a specific icon set. * * @param string $iconset * Name of the icon set. * * @return array * Informations about the icon set. */ function social_media_links_iconset($iconset) { $sets = social_media_links_iconsets(); return isset($sets[$iconset]) ? $sets[$iconset] : FALSE; } /** * Get the path of a platform icon. * * @param string $iconset * Name of the icon set. * @param string $platform * Name of the platform. * @param string $style * Icon size. * * @return string * Path to the icon image. */ function social_media_links_icon($iconset, $platform, $style) { $iconset = social_media_links_iconset($iconset); return call_user_func($iconset['path callback'], $platform, $style); } /** * Returns an array with the possible locations of the installed iconsets. * * @param string $iconset * Optional: Name of the iconset. * * @return array * Possible path locations of the iconsets. */ function social_media_links_searchdirs($iconset = '') { $searchdirs = array(); $profile = drupal_get_path('profile', drupal_get_profile()); $config = conf_path(); // Similar to 'modules' and 'themes' directories in the root directory, // certain distributions may want to place libraries into a 'libraries' // directory in Drupal's root directory. $searchdirs[] = 'libraries'; // Similar to 'modules' and 'themes' directories inside an installation // profile, installation profiles may want to place libraries into a // 'libraries' directory. But exclude/ignore the standard drupal profiles. if (!in_array($profile, array('minimal', 'standard', 'testing'))) { $searchdirs[] = "$profile/libraries"; } // Always search sites/all/libraries. $searchdirs[] = 'sites/all/libraries'; // Also search sites//libraries. $searchdirs[] = "$config/libraries"; if (!empty($iconset)) { foreach ($searchdirs as $key => $dir) { $searchdirs[$key] = $dir . '/' . $iconset; } } return $searchdirs; } /** * Return an array of library directories. * * @return array * A list of library directories. */ function social_media_links_libraries() { $directories = &drupal_static(__FUNCTION__); // Grab from cache or build the array. if (isset($directories)) { return $directories; } $searchdirs = social_media_links_searchdirs(); // Add the social_media_links module directory. $searchdirs[] = drupal_get_path('module', 'social_media_links') . '/libraries'; $directories = array(); $nomask = array('CVS'); foreach ($searchdirs as $dir) { if (is_dir($dir) && $handle = opendir($dir)) { while (FALSE !== ($file = readdir($handle))) { if (!in_array($file, $nomask) && $file[0] != '.') { if (is_dir("$dir/$file")) { $directories[$file] = "$dir/$file"; } } } closedir($handle); } } return $directories; } /** * Return the library path of an icon set. * * @param string $iconset * Name of the icon set. * * @return string * Path of the icon set. */ function social_media_links_iconset_path($iconset) { $path = FALSE; $libraries = social_media_links_libraries(); if (array_key_exists($iconset, $libraries)) { $path = $libraries[$iconset]; } return $path; } /** * Get the list options for the icon set style select. * * @return array * Array with the select options. */ function social_media_links_iconsets_options() { $iconsets = social_media_links_iconsets(); $options = array(); foreach ($iconsets as $iconset_name => $iconset) { if (!empty($iconset['path'])) { foreach ($iconset['styles'] as $sid => $style) { $options[$iconset['name']][$iconset_name . ':' . $sid] = $style; } } } return $options; } /** * Theme function for the platforms. */ function theme_social_media_links_platforms(&$variables) { $output = ''; $platforms = $variables['platforms']; $attributes = $variables['attributes']; // Open the ul element. $output .= ''; $num_platforms = count($platforms); $i = 1; foreach ($platforms as $name => $platform) { $class = array($name); // Add first and last classes to the list of platforms to help out themers. if ($i == 1) { $class[] = 'first'; } if ($i == $num_platforms) { $class[] = 'last'; } $output .= '
  • $class)) . '>'; // Render the platform item. $output .= drupal_render($platform); $output .= '
  • '; $i++; } // Close the ul element. $output .= ''; return $output; } /** * Theme function for a single platform element. */ function theme_social_media_links_platform(&$variables) { $output = ''; $icon = theme_image(array( 'path' => $variables['icon_path'], 'alt' => $variables['icon_alt'], 'attributes' => array(), )); $options = array(); $options['attributes'] = $variables['attributes']; $options['html'] = TRUE; $output .= l($icon, $variables['link'], $options); if (!empty($variables['appearance']['show_name'])) { if ($variables['appearance']['orientation'] == 'h') { $output .= '
    '; } $title = check_plain($variables['attributes']['title']); $output .= '' . l($title, $variables['link'], $options) . ''; } return $output; } /** * Returns HTML for the platform table with tabledrag. */ function theme_social_media_links_platforms_table(&$variables) { $form = $variables['form']; $rows = array(); foreach (element_children($form) as $platform) { $form[$platform]['weight']['#attributes']['class'] = array('platforms-order-weight'); $rows[] = array( 'data' => array( '' . $form[$platform]['platform_value']['#title'] . '', array('class' => array('platform-cross'), 'data' => drupal_render($form[$platform]['platform_value'])), array('class' => array('tabledrag-hide'), 'data' => drupal_render($form[$platform]['weight'])), ), 'class' => array('draggable'), ); } $header = array( t('Platform'), '', array( 'class' => array('tabledrag-hide'), 'data' => t('Weight'), ), ); $output = theme('table', array( 'header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'platforms-order'), )); drupal_add_tabledrag('platforms-order', 'order', 'silbing', 'platforms-order-weight'); return $output; } /** * Helper function to clean up the platforms array from the empty * values. * * @param array $platforms * The array with the platforms. * * @return array * The cleaned platforms array. */ function _social_media_links_cleanup_platforms($platforms) { foreach ((array) $platforms as $key => $platform) { if (empty($platform['platform_value'])) { unset($platforms[$key]); } } return $platforms; } /** * Helper function to generate the icon set example table. * * @param array $platforms * Keyed array with all available platforms. * @param array $iconset * Array with the information about the icon set. * * @return string * The generated table markup. */ function _social_media_links_generate_example_table($platforms, $iconset) { if (!is_array($platforms) && count($platforms) == 0) { return ''; } $groups = array_chunk($platforms, 10, TRUE); $output = ''; // Use the first iconset style for the sample table. $style = key($iconset['styles']); foreach ($groups as $group) { $header = array(); $row = array(); foreach ($group as $platform_name => $platform) { $header[] = array( 'data' => $platform['title'], 'style' => 'text-align: center; ', ); $vars = array('path' => call_user_func($iconset['path callback'], $platform_name, $style)); if (file_exists($vars['path'])) { $row[] = array( 'data' => theme('image', $vars) . ' ', 'style' => 'text-align: center;', ); } else { $row[] = array( 'data' => '–', 'style' => 'text-align: center;', ); } } $vars = array( 'header' => $header, 'rows' => array('data' => $row), ); $output .= theme('table', $vars); $output .= '
    '; } return $output; }