Рейтинг:-1

Лучший способ ввести внутреннюю ссылку

флаг ng

Как я могу ввести внутреннюю ссылку, которая работает для разных длин пути и продолжает работать, когда я загружаю свой сайт на рабочий сервер?

Скажи, что у меня есть страница здесь http://локальный/сайт1/веб/страница1 и я хочу создать блок в нижнем колонтитуле со ссылкой на эту страницу.

Если я использую относительную ссылку (например, Страница 1) Это сработает, когда я буду на этой странице...
http://локальный/сайт1/веб/
Но этого не произойдет, если я нахожусь на многосегментном пути, например...
http://localhost/site1/web/about/terms/

Если я создам ссылку, относящуюся к серверу (например, /сайт1/веб/страница1)
Не будет работать при смене сервера...
http://mysite.com/
(Я разрабатываю сайт локально на своем ПК, и когда сайт готов, я загружаю его на свой хостинг).
Кроме того, это не сработает, если я захочу клонировать сайт...
http://локальный/сайт2/веб/

Абсолютные пути (например,http://локальный/сайт1/веб/страница1)
также не будет работать, когда я запущу сайт на живом сервере.

Попробовал модуль linkit. Это работает для вышеуказанных случаев, но только для некоторых типов ссылок (например, я не смог заставить его работать для ссылок на представления).

Модуль pathologic исправил эту проблему в Drupal 7, но еще не готов для Drupal 9.

Я получил наилучшие результаты, используя модуль php (он предоставляет фильтр, который вы можете добавить в текстовый формат). Но я считаю, что использование этого модуля не одобряется.

<?php
use Drupal\Core\Link;
use Drupal\Core\Url;
print(Url::fromUserInput('/node/1')->toString());
?> 

Я пропустил лучшую альтернативу? (Было бы удобно, если бы был способ сделать ссылки, относящиеся к каталогу drupal 'web'.)

Jaypan avatar
флаг de
Блоки являются объектами контента, а не объектами конфигурации, и поэтому обычно не переносятся между экземплярами, что делает это спорным вопросом для большинства систем, поскольку блок должен создаваться отдельно для каждого экземпляра, что позволяет установить путь для этого конкретного экземпляра. Если вы переносите свои блоки между локальными средами и удаленными средами, как вы это делаете?
Kevin avatar
флаг in
Использовать блок меню? Что не так со ссылками в меню? У меня никогда не было проблем с подключением в WYSIWYG, как это.
Jaypan avatar
флаг de
Это может быть не меню.
флаг ng
@Jaypan Я не хочу вносить изменения непосредственно на работающий сайт, а вместо этого разрабатываю сайт на своем локальном ПК, и когда я исправляю все ошибки и т. д., я копирую файлы на удаленный сервер и импортирую базу данных. Поэтому мне просто нужно изменить данные базы данных в settings.php. Таким образом, блоки переносятся вместе с остальной частью друпала. Кроме того, потребности моих различных клиентов обычно очень похожи, поэтому я часто могу повторно использовать сайт drupal. Отсюда и необходимость клонирования.
apaderno avatar
флаг us
Вы пробовали модуль *Custom Menu Links*, который входит в состав ядра Drupal?
флаг ng
@apaderno Да. Я использую этот модуль. Мой вопрос больше о ссылках в целом. У меня может быть блок нижнего колонтитула, где он содержит ссылки на внутренние страницы (например, Условия и положения), заявление об авторских правах, номера телефонов. Так что блок меню не идеален.
Kevin avatar
флаг in
Почему вы не вводите относительный путь? "/некоторые/псевдоним"?
флаг ng
@kevin "/some/alias" приведет меня к "http://localhost/some/alias". Но мне нужно перейти на "http://localhost/site1/some/alias/". т.е. У меня есть несколько сайтов на одном сервере, когда я разрабатываю.
Kevin avatar
флаг in
Относительный путь не зависит от домена.
флаг ng
@kevin это относительный путь (без косой черты): «some/alias», и он не зависит от домена, но не работает, если количество сегментов в пути изменяется.
флаг cn
Оба являются относительными путями. Без косой черты относительно текущего пути, с косой чертой относительно корня домена. То, что вы пытаетесь сделать, это обслуживать несколько сайтов из подпапок в одном домене, и да, это может стать неудобным для ручного связывания. Я не верю, что существует универсальное решение, но по моему опыту, если вы можете решить эту проблему в конфигурации веб-сервера с помощью перезаписи, зачастую это проще сделать там, чем пытаться заставить Drupal дополнить каждую ссылку в сайт
флаг ng
Спасибо @Clive. Может быть, я не правильно разрабатываю сайты. Из интереса, как вы разрабатываете сайты? Вы работаете непосредственно на действующем сайте или у вас есть только один сайт, работающий локально, чтобы вы могли, например, `http://localhost/page1` локально, а затем `http://mysite.com/page1` на рабочем сервере? Или вы делаете что-то еще?
флаг cn
Думаю, мой мир немного другой; характер сайтов, которые я создаю, означает, что всем контентом управляют клиенты, и моя работа состоит в том, чтобы убедиться, что архитектура/развертывание поддерживают это без необходимости перемещать контент (перезапись производственной базы данных является последним средством, потому что сайт вполне может собирать данные во время разработки). Если есть новая функция, она создается в коде, тестовый контент создается в среде stage/uat и утверждается, затем функция запускается, а реальный контент создается в prod. Из местных разработчиков я предпочитаю Лэндо.
Рейтинг:1
флаг de

В Drupal 8+ миграция баз данных не рекомендуется, так как это перезапишет любые изменения, сделанные на вашем рабочем сервере между перезаписями. Вместо этого был создан API конфигурации, позволяющий переносить конфигурацию сайта — то есть параметры, которые определяют, что такое сайт, что он делает и как он работает — между экземплярами без необходимости перезаписывать базу данных. Существует также Migration API, но, по моему опыту, обычно проще воссоздать контент в рабочей среде после того, как сначала поэкспериментируете с ним в staging/local, чем настроить Migration API.

Вот учебник, который я написал по использованию API конфигурации: https://www.morpht.com/blog/drupal-8-configuration-part-1-configuration-api

Если бы я был на вашем месте, я бы перестал нажимать базы данных и вместо этого переключился на использование API конфигурации для управления вашим сайтом в нескольких средах. Затем вы можете создать свой блок в рабочей среде и перенести базу данных в свою локальную установку, чтобы получить этот экземпляр блока в вашей локальной установке.

Если вы не хотите переключаться на миграцию конфигурации и предпочитаете продолжать увеличивать базу данных, то я вижу два решения:

  1. Используйте фильтр PHP, который вы упомянули в своем посте.
  2. Создайте пользовательский блок с помощью кода, а не через пользовательский интерфейс администратора, и создайте свою ссылку с классом URL, как вы показали в большинстве случаев.

Хотя первый вариант не рекомендуется, как и весь процесс увеличения базы данных, поэтому, если вы собираетесь увеличивать базу данных, вы также можете использовать входной фильтр PHP.

флаг ng
Спасибо @Jaypan. Я буду читать об этом.У меня нет доступа к консоли для большинства учетных записей cPanel виртуального хостинга моих клиентов (я могу только загружать файлы, использовать phpmyadmin и изменять несколько настроек). Я предполагаю, что «API конфигурации» здесь невозможен? Я просто занимаюсь веб-дизайном в качестве хобби и создаю сайты для небольших организаций, так что временное отключение сайтов, пока я их обновляю, не является проблемой.
Jaypan avatar
флаг de
Вы по-прежнему можете использовать API конфигурации.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.