непавильный адрес картинки из-за чпу

Здравствуйте, у меня такой вопрос: в общем на сайте у меня включено ЧПУ и есть TV поле с картинкой. Но сама картинка не отображается на сайте, так как из-за чпу к её адресу приписывается ещё и адрес категории. То есть вот как это всё выглядит:

site.com/category/images/img.jpg

А должно быть так:

site.com/images/img.jpg

Скажите, как можно решить эту задачу?
marius
23 февраля 2022, 08:27
modx.pro
698
0

Комментарии: 13

Роман
23 февраля 2022, 09:39
+1
Дело не в чпу, а в том как вы выводите ссылку. Попробуйте перед адресом картинки поставить /
    marius
    23 февраля 2022, 09:41
    0
    Спасибо за ответ! Я уже это сделал и всё заработало. Только вот непонятно почему нужно делать именно так? Почему значок / стирает ненужную часть из URL? То есть если бы не было включено ЧПУ со вложенными URL то всё и так бы нормально работало.
    marius
    23 февраля 2022, 09:39
    0
    Странно, добавил в шаблоне перед [[*img]] знак / и картинка заработало, то есть теперь код выглядит так:

    Кто нибудь может что нибудь сказать по этому поводу? Правильное ли это решение, или нужно делать по другому?
      Александр Мельник
      23 февраля 2022, 16:41
      +1
      попробуйте в теге header добавить тег
      <base href="http://site.com/">
        Дима Сайт old см. профиль
        23 февраля 2022, 17:10
        0
        Нееет, не делайте этого, лучше формируйте URL правильно, как подсказали выше.
        Устанавливая тег base вы сломаете якорную навигацию если она есть. Это большая загадка, по какому недоразумению эта штука присутствует (или сейчас нет уже, не уверен) в дефолтном шаблоне modx сразу после установки. И даже видел абсурдные разговоры о том, что это «особенность движка» от лиц, которые не очень понимаю видимо как работает HTML в браузере… короче если вы точно не знаете нужен ли вам тег base (а 99.5% что не нужен) — не используйте его!

        Вы хотели подробностей, так вот:
        Вообще, контролировать наличие начального слеша можно несколькими способами (и к стати если запутаться, можно наткнуться на ошибку с // двумя начальными слэшами так что я например предпочитаю в верстке его добавлять именно так как и подсказал @Роман ) так как пути строятся из частей, каждой из которых в MODX можно управлять (а можно оставить по дефолту и всё тоже будет ок)

        На самом деле к любому ресурсу на сайте есть 2 пути, и оба необходимы:
        1) где на жестком диске на сервере лежит файл
        2) по какому uri его можно получить из интернета

        У вас «проблема» (которая на самом деле особенность построения любого относильеного uri в браузерах, подробности на MDN) с путём 2.

        Есть параметр baseUrl в настройках источника файлов (а он в свою очередь указан в вашей TV с картинкой) — можно в его значении поставить в начале этот слэш и тогда не придется его дописывать в верстке.

        Только не путайте с basePath — это путь до картинки на сервере (путь 1)

        Например картинки лежат на сервере в папке /home/user/data/www/site.ru/assets/img/ тогда в настройках Медиа -> Источники файлов -> Картинки будут такими:
        1) basePath = assets/img/
        2) baseUrl = /assets/img/

        Но как здесь видно,
        А первая часть пути до папки задается ещё раньше в файле конфига сайта /core/config/config.inc.php
        ....
        if (!defined('MODX_BASE_PATH')) {
            $modx_base_path= '/home/user/data/www/modx.pro/';
            $modx_base_url= '/';
            define('MODX_BASE_PATH', $modx_base_path);
            define('MODX_BASE_URL', $modx_base_url);
        }
        ....
        Если всё ещё не понятно, формулируйте вопросы, дожмём тему))
          Александр Мельник
          23 февраля 2022, 18:27
          0
          Поясните пожалуйста, почему тег base href ломает переход по якорю?
          Я использую данный тег на всех проектах, не только modx и он прекрасен.
          Не вижу никаких минусов и переходы по якорным ссылкам работают.
            Дима Сайт old см. профиль
            23 февраля 2022, 18:53
            0
            Потому что тег base переопределяет базовый url для работы всех ссылок в документе. Чтобы не повторять то, что уже написано, оставлю вот эту поясняющую ссылку на stackoverflow и предположу, что и у вас якорная навигация работает на JS, но чтобы сделать хорошо работающую якорную навигацию на JS (так чтобы и по прямым ссылкам работал скролл к нужной зоне, а не только по клику на якорь когда страница уже загружена) нужно приложить ряд дополнительных усилий (например парсить адресную строку), хотя всего этого можно избежать, не используя тег base для решения задач, которые вполне можно решить без него, не обрекая себя на «побочные эффекты» от его применения.
              Александр Мельник
              23 февраля 2022, 20:54
              0
              Нет, у меня вполне работают и стандартные якорные ссылки. Иногда, если нужна особая плавность перехода, могу сделать и на javascript.
              Та проблема которая описана на stackoverflow решается элементарно, нужно просто в якорной ссылке указывать не #id, а site.com#id
              Но даже если у использование base href и создаст какие то проблемы у кого-то, то мне кажется это еще не причина так негативно отзываться о таком замечательном теге, решающим куда больше проблем чем создающим)
                Дима Сайт old см. профиль
                23 февраля 2022, 22:32
                0
                То есть вы предлагаете каждый раз указывая якорную ссылку заботиться о том, чтобы она была указана не относительной, а абсолютной?

                Такой подход работает надежно ровно до той поры, пока контент-менеджеру (или прямо вам, но в спешке, когда «оперативка в голове занята») использовать якорную ссылку в поле content или другом, где у вас подключен HTML-редактор.

                В плюс к этому, указанные вами ссылки всё равно не будут работать на тестовом домене (не все их используют, ну ок, тогда читайте как «при переезде сайта на другой домен», что тоже редкость, но блин, это побочный эффект, которого бы не было).

                Это всё можно победить, конечно, если держать это в голове или описать в документации проекта (ага :) ) но я предлагаю, советую и рекомендую вместо того чтобы «стрелять себе в ногу» тегом base и потом лечить последствия, просто не заниматься самострелом, если позволите.
                Александр Мельник
                23 февраля 2022, 21:07
                0
                Дмитрий, а подскажите как вы например подключаете файлы стилей или скриптов на страницу?
                Указав base href = site.com/ Можно на любой странице подключить скрипт используя относительный путь относительно base href.
                <script src="assets/js/bundle.js">
                и на любой странице он будет подключен, вне зависимости от url
                А как поступаете вы? Для каждого скрипта указываете абсолютный путь?
                  Дима Сайт old см. профиль
                  23 февраля 2022, 22:26
                  0
                  Конечно, для каждого скрипта указываю абсолютный путь, ведь это всего лишь вместо
                  <script src="assets/js/bundle.js">
                  будет
                  <script src="/assets/js/bundle.js">
                  зато я точно знаю, что заберу скрипт от корня, а в вашем случае потенциально возможны неожиданности (по моему мнению, прошу не судить строго, может кому-то и нравится не держать пути под контролем а применять пути относительно директорий, а не корня)
                    Дима Сайт old см. профиль
                    23 февраля 2022, 22:42
                    0
                    Хочу добавить, что у меня вроде все проекты с ЧПУ и директории эти получается везде виртуальные, потому бессмысленно их учитывать в путях к статике, вот и «думаю от корня», соответственно так и пишу, от корня…
                      Максим
                      24 февраля 2022, 01:59
                      0
                      Вы хорошо описали! За это спасибо! Но, наверное, лучше эту тему подробнее описать в разделе уроки. И раздел будет наполняться и найти тему будет проще!
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          13