Есть текстовое поле, куда вводится УРЛ. Необходимо сделать так, чтобы этот урл можно было вводить как с протоколом, так и без.
Выводится эта ссылка в шаблоне:
<a title="Ссылка" href="http://<?php print $URL; ?>">Ссылка</a>
Тут видно, что если ввести урл с протоколом, то ссылка будет не рабочая, так как уже указан http://
Комментарии
Как вариант использовать специальное поле link. В Д7 это контрибный модуль, в Д8 в ядре
что если с помощью функции strpos сделать? Вот так:
{
print $URL;
} else {
print 'http://'.$URL;
}
А почему бы не сделать
echo l(...);
?а можно пример? не понял как применить. Проблему с протоколами эта функция ведь не решит.
Можно и нужно
Но это просто вариант вывода ссылки. Если переменная $URL будет указана баз протокола, то урл будет восприниматься как внутренний.
print l('Ссылка', 'https://newsite.ru'); // Результат – '<a href="https://newsite.ru">Ссылка</a>'
print l('Ссылка', 'newsite.ru'); // Результат – '<a href="https://site.ru/newsite.ru">Ссылка</a>'
Да и при этом не надо анализировать ничего
а нужно, чтобы была возможность писать урл как с протоколом так и без, при этом ссылка должна быть именно на внешний ресурс.
Тогда
Не, не работает. Всё равно относительная.
Работает 100% см.
global $language_url;
static $use_theme = NULL;
// Merge in defaults.
$options += array(
'attributes' => array(),
'html' => FALSE,
);
// Append active class.
if (($path == $_GET['q'] || ($path == '<front>' && drupal_is_front_page())) &&
(empty($options['language']) || $options['language']->language == $language_url->language)) {
$options['attributes']['class'][] = 'active';
}
// Remove all HTML and PHP tags from a tooltip. For best performance, we act only
// if a quick strpos() pre-check gave a suspicion (because strip_tags() is expensive).
if (isset($options['attributes']['title']) && strpos($options['attributes']['title'], '<') !== FALSE) {
$options['attributes']['title'] = strip_tags($options['attributes']['title']);
}
// Determine if rendering of the link is to be done with a theme function
// or the inline default. Inline is faster, but if the theme system has been
// loaded and a module or theme implements a preprocess or process function
// or overrides the theme_link() function, then invoke theme(). Preliminary
// benchmarks indicate that invoking theme() can slow down the l() function
// by 20% or more, and that some of the link-heavy Drupal pages spend more
// than 10% of the total page request time in the l() function.
if (!isset($use_theme) && function_exists('theme')) {
// Allow edge cases to prevent theme initialization and force inline link
// rendering.
if (variable_get('theme_link', TRUE)) {
drupal_theme_initialize();
$registry = theme_get_registry(FALSE);
// We don't want to duplicate functionality that's in theme(), so any
// hint of a module or theme doing anything at all special with the 'link'
// theme hook should simply result in theme() being called. This includes
// the overriding of theme_link() with an alternate function or template,
// the presence of preprocess or process functions, or the presence of
// include files.
$use_theme = !isset($registry['link']['function']) || ($registry['link']['function'] != 'theme_link');
$use_theme = $use_theme || !empty($registry['link']['preprocess functions']) || !empty($registry['link']['process functions']) || !empty($registry['link']['includes']);
}
else {
$use_theme = FALSE;
}
}
if ($use_theme) {
return theme('link', array('text' => $text, 'path' => $path, 'options' => $options));
}
// The result of url() is a plain-text URL. Because we are using it here
// in an HTML argument context, we need to encode it properly.
return '<a href="' . check_plain(url($path, $options)) . '"' . drupal_attributes($options['attributes']) . '>' . ($options['html'] ? $text : check_plain($text)) . '</a>';
}
Не работает, проверяю на сайте.
Проверьте код, при передаче absolute => TRUE делает внешние ссылки, проверено на многих сайтах.
В личку кинул сайт с доступом, посмотрите?
Ок, как освобожусь гляну.
Глянул просто для внешних начинайте с // например
Спасибо, но такой вариант не пойдет.
Во-первых // перед сайтом - это протокол текущего сайта, на котором ссылка стоит, то есть если на сайте с https протоколом стоит ссылка с урлом //site.ru, то эта ссылка будет вести именно на https://site.ru. Она не сработает если site.ru имеет незащищенный протокол http.
Во-вторых задача стоит именно в том, чтобы урл в поле можно было вставлять как копированием из адресной строки браузера (с протоколом), так и обычным ручным набором для пользователей, (site.ru, www.site.ru)
Тогда еще проще
parse_url
а тут как быть? Как её можно использовать?
$parse_url = parse_url($URL);
...
Это не подходит. В этой функции $URL должен быть обязательно с протоколом, или с //
Ну да на то он и url а не uri. Но никто не мешает проверить на наличие scheme.
)) Ну так задача стоит именно в том, чтобы урл в поле можно было вставлять как копированием из адресной строки браузера (с протоколом), так и обычным ручным набором для пользователей, (site.ru, www.site.ru)
Так пусть вставляют - Вы пропарсите, проверьте на протокол и обрабатывайте, как Вам надо.
Вобщем сделал так
{
print $URL;
} else {
print 'http://'.$URL;
}
А вот интересно, если на внешнем ssl , зачем его на http сласть?
А я бы проверял и исправлял на этапе заполнения поля. Мало ли в каких случаях и контекстах потом придется это поле отображать.
ок, тогда проще привести к единому формату. Отсюда вопрос. Как массово добавить к имеющимся значениям поля http:// ?
В восьмерке я для этого использую модуль Views Bulk Edit. В семерке не знаю.
В семерке значит Views Bulk Operations (VBO)
Сомневаюсь, так как VBE - это надстройка над VBO.