om_maximenu.utils.inc in OM Maximenu 7
Same filename and directory in other branches
OM Maximenu Admin Utilities
@author: Daniel Honrade http://drupal.org/user/351112
File
inc/om_maximenu.utils.incView source
<?php
// $Id$
/**
* @file
* OM Maximenu Admin Utilities
*
* @author: Daniel Honrade http://drupal.org/user/351112
*
*/
define('OM_MAXIMENU_PATH', drupal_get_path('module', 'om_maximenu'));
/**
* Sorting by weight
*
*/
function om_sort_by_weight($a, $b) {
return $a['weight'] - $b['weight'];
}
/**
* Converts string either to a title or a class
*
*/
function om_string_name($string = NULL, $class = TRUE) {
// for the purpose of just showing the classes and title
// any tags are stripped off
$string = trim(strip_tags($string));
// if there are slashes
$string = stripslashes($string);
// ignores characters other than a-z, A-Z, 0-9
$string_class = preg_replace('/[^a-zA-Z0-9-]+/', ' ', $string);
// allows all characters
$string_title = $string;
// space and underscore are converted depending on use
$pattern = '/[ _]+/';
$string = $class == FALSE ? ucwords(preg_replace($pattern, ' ', $string_title)) : strtolower(preg_replace($pattern, '-', $string_class));
// if result is none for non-class
if (empty($string) && $class == FALSE) {
$string = 'Script Link';
}
return $string;
}
/**
* Link Options
*
*/
function om_maximenu_link_option($content = array()) {
// img hover replacement class
$icon_option = isset($content['icon_option']) && $content['icon_option'] == 1 ? 'class="om-hover"' : '';
// title, icon options
$link_title = stripslashes(t($content['link_title']));
$link_title_option = $content['link_title_option'];
$link_icon = !empty($content['path_icon']) ? '<img ' . $icon_option . ' src="' . url($content['path_icon']) . '" alt="' . om_string_name($link_title, FALSE) . '" />' : '';
if ($link_title_option == 'title_icon') {
$link_option = $link_icon . ' ' . $link_title;
}
elseif ($link_title_option == 'icon') {
$link_option = $link_icon;
}
else {
$link_option = $link_title;
}
// description as subtitle
$link_subtitle = !empty($content['description']) && $content['description_option'] != 'hover' ? '<span class="om-subtitle">' . check_plain($content['description']) . '</span>' : '';
return $link_option . $link_subtitle;
}
/**
* Link attribute
*
*/
function om_maximenu_link_attrib($content = array()) {
// initialize link attributes and classes
$attributes = array();
// id link attributes
if (!empty($content['id'])) {
$attributes['id'] = om_string_name($content['id']);
}
// user added custom classes
$custom_classes = '';
$classes = explode(' ', $content['class']);
foreach ($classes as $ckey => $class) {
$custom_classes .= ' ' . om_string_name($class);
}
$title_class = om_string_name($content['link_title']);
if (empty($title_class)) {
$title_class = 'script';
}
// class link attributes
$attributes['class'] = 'om-link' . $custom_classes . ' link-' . $title_class;
// active class
$uri = trim(request_uri());
$path_relative = base_path() . $content['path'];
if (!empty($content['path']) && $_GET['q'] == $content['path']) {
$attributes['class'] .= ' active';
}
if (!empty($content['path']) && $path_relative == $uri) {
$attributes['class'] .= ' active';
}
if ($content['path'] == '<front>' && drupal_is_front_page()) {
$attributes['class'] .= ' active';
}
// link description options
if (!empty($content['description']) && $content['description_option'] == 'hover') {
$attributes['title'] = check_plain($content['description']);
}
// relationship
if (!empty($content['rel'])) {
$attributes['rel'] = $content['rel'];
}
// target
if (!empty($content['target']) && $content['target'] != '_self') {
$attributes['target'] = $content['target'];
}
return $attributes;
}
/**
* Classes aggregator
*
*/
function om_maximenu_classes($links = array()) {
$classes = array();
// bubble, simple, no_style
$classes[] = $links['skin'];
// style
if (isset($links['style']) && !empty($links['style'])) {
if ($links['style'] == 'scrollh' || $links['style'] == 'scrollv') {
$classes[] = 'tabbed-' . $links['style'];
}
else {
$classes[] = 'style-' . $links['style'];
}
}
// block, float, main_menu
$classes[] = $links['output'];
if ($links['output'] == 'block') {
// row, column
$classes[] = isset($links['block_options']['stacking']) ? $links['block_options']['stacking'] : 'row';
// up, right, down, left
$classes[] = isset($links['block_options']['direction']) ? $links['block_options']['direction'] : 'block-down';
}
elseif ($links['output'] == 'float') {
// left, middle, right
$classes[] = isset($links['float_options']['orientation']) ? $links['float_options']['orientation'] : 'horizontal';
$classes[] = isset($links['float_options']['stacking']) ? $links['float_options']['stacking'] : 'row';
$classes[] = isset($links['float_options']['x_origin']) ? $links['float_options']['x_origin'] : 'left';
$classes[] = isset($links['float_options']['y_origin']) ? $links['float_options']['y_origin'] : 'bottom';
}
elseif ($links['output'] == 'main_menu') {
// no class
}
// fisheye dock class
if (isset($links['float_options']['dock'])) {
$classes[] = 'dock';
}
$out = '';
foreach ($classes as $key => $class) {
$out .= ' om-maximenu-' . om_string_name($class);
}
return $out;
}
/**
* OM Maximenu inline styling
*
*/
function om_maximenu_inline_style($links = array()) {
$out = '';
if ($links['output'] == 'block') {
// do nothing now, maybe in the future
}
elseif ($links['output'] == 'float') {
// fixed/absolute
$position = isset($links['float_options']['position']) && $links['float_options']['position'] == 'absolute' ? 'absolute' : 'fixed';
// left/middle/right
if (isset($links['float_options']['x_origin']) && $links['float_options']['x_origin'] != 'middle') {
$x_origin = isset($links['float_options']['x_origin']) ? $links['float_options']['x_origin'] : 'left';
$x_value = isset($links['float_options']['x_value']) ? $links['float_options']['x_value'] : 10;
$x_px = $x_value != 0 ? 'px' : '';
$x_prop = $x_origin . ': ' . $x_value . $x_px . '; ';
}
else {
$x_prop = '';
// jquery will determine the position
}
// top/bottom
$y_origin = isset($links['float_options']['y_origin']) ? $links['float_options']['y_origin'] : 'bottom';
$y_value = isset($links['float_options']['y_value']) ? $links['float_options']['y_value'] : 10;
$y_px = $y_value != 0 ? 'px' : '';
$y_prop = $y_origin . ': ' . $y_value . $y_px . '; ';
$out = ' style="position: ' . $position . '; ' . $x_prop . $y_prop . '" ';
}
elseif ($links['output'] == 'main_menu') {
// do nothing now, maybe in the future
}
return $out;
}
/**
* Link classes processor
*
*/
function om_maximenu_link_classes($content = array(), $permission = array(), $count = 0, $total = 0) {
// initialize link classes
$classes = array();
// standard li classes
if ($count == 1) {
$classes[] = 'first';
}
if ($count == $total) {
$classes[] = 'last';
}
// link title class
$classes[] = 'leaf-' . $content['link_title'];
// active class
$uri = trim(request_uri());
$path_relative = base_path() . $content['path'];
if (!empty($content['path']) && $_GET['q'] == $content['path']) {
$classes[] = ' active';
}
if (!empty($content['path']) && $path_relative == $uri) {
$classes[] = ' active';
}
if ($content['path'] == '<front>' && drupal_is_front_page()) {
$classes[] = ' active';
}
// user role class
if (is_array($permission)) {
foreach ($permission as $pkey => $pval) {
$classes[] = 'leaf-role-' . $pval;
}
}
// title, icon options
$link_title_option = $content['link_title_option'];
if ($link_title_option == 'title_icon') {
$classes[] = 'om-leaf-title-icon';
}
elseif ($link_title_option == 'icon') {
$classes[] = 'om-leaf-icon';
}
$out = 'om-leaf';
foreach ($classes as $key => $class) {
$out .= ' ' . om_string_name($class);
}
return $out;
}
/**
* Link visibility per user role
*
*/
function om_maximenu_link_visible($roles = array()) {
global $user;
// user roles
$user_id = $user->uid;
$user_roles = $user->roles;
// user permission to view the link
// roles
// 1 - anonymous
// 2 - authenticated
$permission = array();
$anyone = 0;
foreach ($roles as $role => $value) {
// check roles
if ($value != 0 && isset($user_roles[$role])) {
$permission[$role] = $user_roles[$role];
}
// for all roles are unchecked
if ($value != 0) {
$anyone++;
}
}
// the link will be visible if the user has permission
if (!empty($permission)) {
return $permission;
}
elseif ($anyone == 0) {
// the links is for everybody
return 1;
}
else {
return 0;
}
}
/**
* OM Maximenu get styles from /skin directory
* - reads directory names
*/
function om_maximenu_skin_get() {
$files = array();
$dir = OM_MAXIMENU_PATH . '/skin/';
$folders = scandir($dir);
$excluded_files = array(
'.',
'..',
'.cvs',
'.svn',
'.git',
);
foreach ($folders as $key => $val) {
if (!in_array($val, $excluded_files)) {
is_dir($dir . $val) ? $files[$val] = om_string_name($val, FALSE) : '';
}
}
return $files;
}
/**
* Block edit link
*
*/
function om_maximenu_block_edit($module, $delta, $title = NULL) {
$vars = array();
// Display 'edit block' for custom blocks.
if ($module == 'block') {
$options = array(
'attributes' => array(
'title' => t('Edit this block\'s content.'),
'class' => array(
'block-edit',
),
),
'query' => drupal_get_destination(),
'html' => TRUE,
);
$vars[] = l(t('edit block'), 'admin/structure/block/manage/' . $module . '/' . $delta . '/configure', $options);
}
else {
$options = array(
'attributes' => array(
'title' => t('Configure ' . $title),
'class' => array(
'block-config',
),
),
'query' => drupal_get_destination(),
'html' => TRUE,
);
$vars[] = l(t('configure'), 'admin/structure/block/manage/' . $module . '/' . $delta . '/configure', $options);
}
// Display 'edit view' for Views blocks.
if ($module == 'views' && user_access('administer views')) {
//list($view_name, $view_block) = explode('-block', $delta);
$view = explode('-block', $delta);
$view_name = isset($view[0]) ? $view[0] : '';
$view_block = isset($view[1]) ? $view[1] : '';
$options = array(
'attributes' => array(
'title' => t('Edit this view.'),
'class' => array(
'block-edit-view',
),
),
'query' => drupal_get_destination(),
'html' => TRUE,
);
$vars[] = l(t('edit view'), 'admin/structure/views/view/' . $view_name . '/edit/block' . $view_block, $options);
}
elseif (($module == 'menu' || $module == 'system') && user_access('administer menu')) {
$menu_name = $delta;
$options = array(
'attributes' => array(
'title' => t('Edit this menu.'),
'class' => array(
'block-edit-menu',
),
),
'query' => drupal_get_destination(),
'html' => TRUE,
);
$vars[] = l(t('edit menu'), 'admin/structure/menu/manage/' . $menu_name, $options);
}
$out = '<div class="edit-block">' . implode(' ', $vars) . '</div>';
return $out;
}
/**
* Menu Visibility
*
*/
function om_maximenu_menu_visibility($menu_visibility = FALSE) {
if ($menu_visibility['pages']) {
if ($menu_visibility['visibility'] < 2) {
$path = drupal_get_path_alias($_GET['q']);
$page_match = drupal_match_path($path, $menu_visibility['pages']);
if ($path != $_GET['q']) {
$page_match = $page_match || drupal_match_path($_GET['q'], $menu_visibility['pages']);
}
$page_match = !($menu_visibility['visibility'] xor $page_match);
}
elseif (module_exists('php')) {
$page_match = php_eval($menu_visibility['pages']);
}
else {
$page_match = FALSE;
}
}
else {
$page_match = TRUE;
}
return $page_match;
}
/**
* Block Configure Page - Get delta visiblity value form _om_maximenu_variable;
*
*/
function om_maximenu_form_alter(&$form, $form_state, $form_id) {
switch ($form_id) {
case 'block_admin_configure':
if ($form['module']['#value'] == 'om_maximenu') {
$form['#submit'][] = '_om_maximenu_block_admin_configure_submit_handler';
}
break;
case 'block_admin_display_form':
$form['#submit'][] = '_om_maximenu_block_admin_display_submit_handler';
break;
}
}
/**
* Updates OM Maximenu variable on saving block configuration
*
*/
function _om_maximenu_block_admin_configure_submit_handler(&$form, $form_state) {
$delta = $form_state['values']['delta'];
$delta = explode('-', $delta);
if ($delta[1] == 'maximenu') {
global $_om_maximenu_variable;
$maximenu = $_om_maximenu_variable;
$delta = $delta[2];
$maximenu[$delta]['menu_visibility']['visibility'] = $form_state['values']['visibility'];
$maximenu[$delta]['menu_visibility']['pages'] = $form_state['values']['pages'];
variable_set('om_maximenu', $maximenu);
}
}
/**
* Updates OM Maximenu variable on saving block display
*
*/
function _om_maximenu_block_admin_display_submit_handler(&$form, $form_state) {
global $_om_maximenu_variable;
$maximenu = $_om_maximenu_variable;
$blocks = $form_state['values']['blocks'];
$count = 0;
foreach ($blocks as $module_delta => $values) {
if ($values['module'] == 'om_maximenu') {
$delta = explode('-', $values['delta']);
$delta = $delta[2];
$maximenu[$delta]['block_options']['region'] = $values['region'];
$maximenu[$delta]['block_options']['weight'] = $values['weight'];
$count++;
}
}
// will only process if OM Maximenu blocks are present
if ($count != 0) {
variable_set('om_maximenu', $maximenu);
}
}
/**
* Block db updater
*
*/
function om_maximenu_update_blocks_db($menu_id = 0, $maximenu_content = array()) {
if ($menu_id != 0) {
if ($maximenu_content['output'] == 'block') {
$theme_default = variable_get('theme_default', 'garland');
$existing = db_select('block', 'n')
->fields('n')
->condition('module', 'om_maximenu', '=')
->condition('delta', 'om-maximenu-' . $menu_id, '=')
->condition('theme', $theme_default, '=')
->execute()
->fetchObject();
if (!empty($existing->delta)) {
// if the menu is existing
$status = !empty($maximenu_content['block_options']['region']) ? 1 : 0;
db_update('block')
->fields(array(
'status' => $status,
'weight' => $maximenu_content['block_options']['weight'],
'region' => $maximenu_content['block_options']['region'],
'visibility' => (int) $maximenu_content['menu_visibility']['visibility'],
'pages' => trim($maximenu_content['menu_visibility']['pages']),
))
->condition('module', 'om_maximenu')
->condition('delta', 'om-maximenu-' . $menu_id)
->condition('theme', $theme_default)
->execute();
}
else {
// because we are handling the visibility, etc., we have to handle everything to synch with blocks settings
$status = !empty($maximenu_content['block_options']['region']) ? 1 : 0;
db_insert('block')
->fields(array(
'module' => 'om_maximenu',
'delta' => 'om-maximenu-' . $menu_id,
'theme' => $theme_default,
'status' => $status,
'weight' => $maximenu_content['block_options']['weight'],
'region' => $maximenu_content['block_options']['region'],
'visibility' => (int) $maximenu_content['menu_visibility']['visibility'],
'pages' => trim($maximenu_content['menu_visibility']['pages']),
'cache' => -1,
))
->execute();
}
}
elseif ($maximenu_content['output'] == 'float') {
// menu as float must be deleted from block table
db_delete('block')
->condition('module', 'om_maximenu')
->condition('delta', 'om-maximenu-' . $menu_id)
->execute();
}
elseif ($maximenu_content['output'] == 'main_menu') {
// menu as main_menu must be deleted from blocks table
db_delete('block')
->condition('module', 'om_maximenu')
->condition('delta', 'om-maximenu-' . $menu_id)
->execute();
}
}
}
/**
* Get the hierarchy of menus
*
*/
function om_menu_tree_options(&$options, $menus, $menu_name = 'navigation') {
global $_om_maximenu_existing_menus;
$existing = $_om_maximenu_existing_menus[$menu_name];
static $level = 1;
// count level for indents on divs on html file
$tab = '-';
// init tab for indents on divs on html file
// for source formating
// calculates number of tabs
for ($i = 1; $i < $level; $i++) {
$tab .= '-';
}
foreach ($menus as $mlid => $link_title) {
if (isset($existing[$mlid])) {
$level++;
$options[$mlid] = $tab . $link_title;
om_menu_tree_options($options, $existing[$mlid], $menu_name);
$level--;
}
else {
$options[$mlid] = $tab . $link_title;
}
}
}
/**
* Path queries
*
* On D7 $option['query'] becomes purely an array
* cannot accept anymore a string
*
*/
function om_path_query($path_query = array()) {
//dsm($path_query);
$out = array();
$queries = explode('&', $path_query);
if (!empty($queries)) {
foreach ($queries as $kquery => $query) {
if (!empty($query)) {
$query = explode('=', $query);
if (!empty($query) && isset($query[0]) && isset($query[1])) {
$out[$query[0]] = $query[1];
}
else {
drupal_set_message(t('Invalid input.'));
}
}
}
}
else {
$query = explode('=', $path_query);
if (!empty($query) && isset($query[0]) && isset($query[1])) {
$out[$query[0]] = $query[1];
}
else {
drupal_set_message(t('Invalid input.'));
}
}
return $out;
}
Functions
Name![]() |
Description |
---|---|
om_maximenu_block_edit | Block edit link |
om_maximenu_classes | Classes aggregator |
om_maximenu_form_alter | Block Configure Page - Get delta visiblity value form _om_maximenu_variable; |
om_maximenu_inline_style | OM Maximenu inline styling |
om_maximenu_link_attrib | Link attribute |
om_maximenu_link_classes | Link classes processor |
om_maximenu_link_option | Link Options |
om_maximenu_link_visible | Link visibility per user role |
om_maximenu_menu_visibility | Menu Visibility |
om_maximenu_skin_get | OM Maximenu get styles from /skin directory |
om_maximenu_update_blocks_db | Block db updater |
om_menu_tree_options | Get the hierarchy of menus |
om_path_query | Path queries |
om_sort_by_weight | Sorting by weight |
om_string_name | Converts string either to a title or a class |
_om_maximenu_block_admin_configure_submit_handler | Updates OM Maximenu variable on saving block configuration |
_om_maximenu_block_admin_display_submit_handler | Updates OM Maximenu variable on saving block display |
Constants
Name![]() |
Description |
---|---|
OM_MAXIMENU_PATH | @file OM Maximenu Admin Utilities |