Вы здесь

Отображение поддомена термина на странице ноды которая имеет связь с данным термином.

0

Не уверен что с этим вопросом помогут, но рискну.

Коротко и примерно:
- Есть словарь "Города", в нем просто города.
- Стоит модуль subdomain.
- При помощи модуля выше я указал что словарь "Города" должен иметь поддомены для терминов. Т.е. например термин Moscow будет иметь адрес http://moscow.example.com вместо того что по дефолту. Содержимое всё то же самое.
- Есть нода где есть прямая связь (одиночная) на город. Мне надо чтобы адрес у ноды был http://moscow.example.com/pathauto-generated - когда у ноды выбран город "Moscow".

У меня есть очень небольшой опыт с hook_url_inbound_alter() и hook_url_outbound_alter, которые, по всей видимости и надо использовать и их же использует subdomain.

К сожалению, я что-то вообще не въехал как делать подмену на уровне поддомена через них. Всё что дальше домена - вообще без проблем, а всё что до него я вообще не догоняю. Пересмотрел весь код subdomain - там черт ногу сломит, но вообще не понял какая именно хитрость оттуда влияет на поддомен.

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

P.s. в идеале бы вообще отказаться от subdomain, так как мне не нравится его код который гвоздями прибит, и мне по факту вообще не нужен поддомен для термина, а лишь для страницы ноды где есть термин, и генерить можно в принципе не лету из названия термина.

Версия Drupal: 
7.x
Связанные проекты: 
Subdomain
Вопрос задан 30.12.2016 - 16:02
Аватар пользователя Niklan
Niklan
445

Ответы

0

Кароче я после НГ на свежую голову разобрался что к чему.

Чтобы было term-subdomain.example.com/node/123 - надо чтобы у этой ноды было поле с данным термином чей поддомен нужно использовать.

Меня такой вариант не устраивал, это доп таблица, объем данных на сайте более 100к, мне ещё не хватало вводить туда лишнее поле ради такой штуки а subdomain не предоставляет вообще никакого API чтобы на каких-либо этапах внедрять в него, пришлось "хакнуть" и написать код прямо в него.

Так как у меня для терминов таксономии, то надо править subdomain_mode_term.inc. В нём есть метод get_content_subdomain() - в нём и проходит эта самая проверка может ли нода отображаться на этом поддомене или перекидывать с поддомена.

По умолчанию

  • Он смотрит в таблице taxonomy_index связи терминов с текущей страницей, которые появляются там только если в конкретной ноде есть явно поле с этой связью. У меня это на уровень ниже - тут и фейлило.
  • Если он нашел TID термина привязанного к этой ноде, он ищет его SID (Subdomain ID) в своё таблице subdomains, если там по этому SID есть поддомен - он отдает его в массиве $subdomains[$id] = 'subdomain' - в иных случаях FALSE.

Я просто добавил ниже собственную проверку, если он сам не смог определить то я ему помогаю:

if (!$subdomains[$nid]) {
  $subdomains[$nid] = MYMODULE_get_subdomain_for_nid($nid);
}

В своей функции я ищу TID по нужной мне связи. Т.е. я ищу связанный термин, а у него смотрю связь с термином который используется для поддомена (город). По его TID я также ищу в таблице subdomains есть ли там записи для него, и если есть возвращаю.

$query = db_select('subdomain', 'sd')
    ->condition('sd.sid', $city_tid)
    ->fields('sd', array('subdomain'));
  $result = $query->execute()->fetchField();

Таким образом, если у ноды есть связь с другйо сущностью, у другой сущности указан город, а для города указан поддомен, моя функция вернет его. Соответственно заполнится $subdomains[$nid] и subdomain отработает как нужно.

Короче тут без хака subdomain никак вообще, никаких альтеров он не предоставляет. Но учитывая что в него непосредственно пишется всего 3 строки, а модуль не обновлялся с 2014 года, и можно легко сделать патч - не совсем и проблема.

P.s. Как оказалось никакой хитрости нет. Он тупо не добавлят поддомены, а проверяет, если материалы связанны с ним, и если нет просто 301-ый редирект на основной домен. Так что hook_inbound outbound альтеры работали как нужно.

Ответ дан 12.01.2017 - 15:30
Аватар пользователя Niklan
Niklan
445