me_path_autocomplete.module in Menu Editor 7
Find node paths on menu item creation via autocomplete.
This is a shameless clone of http://drupal.org/project/mpac by stBorchert
File
me_path_autocomplete/me_path_autocomplete.moduleView source
<?php
/**
* @file
* Find node paths on menu item creation via autocomplete.
*
* This is a shameless clone of
* http://drupal.org/project/mpac
* by stBorchert
*/
/**
* Implements hook_menu().
*
* @return array
* An array of menu items.
*/
function me_path_autocomplete_menu() {
$items = array();
$items['mepac/autocomplete'] = array(
'title' => 'Menu path autocomplete',
'description' => 'Autocomplete callback for menu path autocomplete',
/* @see me_path_autocomplete() */
'page callback' => 'me_path_autocomplete',
'access callback' => 'user_access',
'access arguments' => array(
'access content',
),
'type' => MENU_CALLBACK,
);
return $items;
}
/**
* Page callback for 'mepac/autocomplete'.
*
* Finds nodes and URL aliases based on title.
* Sets a http header, and prints json output.
*
* @param string $string
* Title of element to find.
*
* @see mpac_autocomplete()
*/
function me_path_autocomplete($string = NULL) {
$args = func_get_args();
/** @noinspection SuspiciousAssignmentsInspection */
$string = implode('/', $args);
$matches = _me_path_autocomplete_get_matches($string);
drupal_json_output($matches);
}
/**
* @param string $string
*
* @return string[]
*/
function _me_path_autocomplete_get_matches($string) {
$string = strtolower($string);
// @todo Do we need to filter this?
// See https://www.drupal.org/node/2785261 in mpac issue queue.
# $title = filter_xss_admin($string);
$matches = _me_path_autocomplete_get_matches_for_placeholders($string);
if ($string === '') {
return $matches;
}
$like_placeholder = strlen($string) > 3 ? "%" . db_like($string) . "%" : db_like($string) . "%";
$matches += _me_path_autocomplete_get_matches_for_nodes($like_placeholder);
$matches += _me_path_autocomplete_get_matches_for_aliases($like_placeholder);
return $matches;
}
/**
* @param string $string
*
* @return string[]
*
* @see _mpac_get_matches_for_nodes()
*/
function _me_path_autocomplete_get_matches_for_placeholders($string) {
$matches = array();
/* @see hook_menu_editor_placeholders() */
foreach (module_invoke_all('menu_editor_placeholders') as $placeholder_code => $placeholder_path) {
if ($string === '' || false !== strpos($placeholder_code, $string)) {
$matches[$placeholder_code] = htmlentities($placeholder_code);
}
}
return $matches;
}
/**
* @param string $like_placeholder
*
* @return string[]
*
* @see _mpac_get_matches_for_nodes()
*/
function _me_path_autocomplete_get_matches_for_nodes($like_placeholder) {
$q = db_select('node', 'n');
$q
->fields('n');
$q
->condition('title', $like_placeholder, 'LIKE');
$q
->range(0, 8);
$matches = array();
foreach ($q
->execute() as $node) {
// Add node path and title to list.
if (node_access('view', $node) && $node->status) {
$node_title = check_plain($node->title);
$nid = $node->nid;
$lang = $node->language !== LANGUAGE_NONE ? $node->language . ': ' : '';
$matches['node/' . $node->nid] = $lang . "{$node_title} [nid:{$nid}]";
}
}
return $matches;
}
/**
* @param string $like_placeholder
*
* @return string[]
*
* @see _mpac_get_matches_for_aliases()
*/
function _me_path_autocomplete_get_matches_for_aliases($like_placeholder) {
if (!module_exists('path')) {
return array();
}
// Get a list of all URL aliases where the destination matches the given
// string.
$q = db_select('url_alias');
$q
->fields('url_alias');
$q
->condition('alias', $like_placeholder, 'LIKE');
$q
->range(0, 8);
$matches = array();
foreach ($q
->execute() as $alias) {
// Add alias source and destination to list (and add a special marker to
// the item).
$lang = $alias->language !== LANGUAGE_NONE ? $alias->language . ': ' : '';
$src = check_plain($alias->source);
$dst = check_plain($alias->alias);
$matches[$alias->source] = $lang . "{$dst} | {$src}";
}
return $matches;
}
/**
* Implements hook_form_FORM_ID_alter().
*
* Change path field to autocomplete field.
*
* @param array $form
* @param array $form_state
*/
function me_path_autocomplete_form_menu_editor_overview_form_alter(array &$form, array &$form_state) {
foreach (element_children($form) as $element_key) {
$form[$element_key]['link_path']['#autocomplete_path'] = 'mepac/autocomplete';
}
}
Functions
Name![]() |
Description |
---|---|
me_path_autocomplete | Page callback for 'mepac/autocomplete'. |
me_path_autocomplete_form_menu_editor_overview_form_alter | Implements hook_form_FORM_ID_alter(). |
me_path_autocomplete_menu | Implements hook_menu(). |
_me_path_autocomplete_get_matches | |
_me_path_autocomplete_get_matches_for_aliases | |
_me_path_autocomplete_get_matches_for_nodes | |
_me_path_autocomplete_get_matches_for_placeholders |