Новый модуль Handy alias для гибкого создания синонимов страниц

Аватар пользователя Stutzer Stutzer 24 сентября 2010 в 8:28

Друзья, рад представить вам новый модуль Handy Alias, который я здесь уже упоминал несколько раз. Наконец-то я зарелизил его стабильную версию на drupal.org.

Скажу сразу, это модуль для перфекционистов. Если в двух словах, то он позволяет аттачить к словарям, терминам и нодам псевдонимы, которые позже можно использовать для формирования адресов с помощью всеми любимого pathauto. Если термин имеет родителей, то с помощью токена [term-handy-alias-path] можно получить цепочку терминов по аналогии со стандартным токеном [termpath-raw]. Это решает проблемы с транслитерированными уродливыми адресами страниц и отображением структуры словаря в URL-е. Кроме этого, для заданных типов контента можно настроить добавление псевдо-расширения .html, но это уже для тех, кто знает толк в извращениях.

Ниже попробую изложить суть работы модуля в картинках и примерах.

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

Итак, пошаговое руководство к действию на примере сайта по автотематике:

  1. Скачиваем и устанавливаем модули Handy Alias, token, Pathauto 2.x
  2. Создаем тип материала «автомобиль». Для создаваемого материала включаем опцию «Enable handy alias for this content type» и «Attach .html pseudo-extension to node aliases». Это позволит нам при создании материалов типа «автомобиль» задавать алиасы, которые будт доступны под токеном [node-handy-alias]

  3. Далее создаем словарь «Типы автомобилей». Включаем опцию «Enable handy alias for terms of this vocabulary». Здесь же необходимо указать типы контента, для которых данный словарь будет использоваться в качестве «поставщика» алиасов. В нашем случае, это «автомобиль». Поставщик алиасов... Госпади! Проще показать код, чем описать как и что он делает! Да, и кроме того, можно, но не обязательно, задать алиас самому словарю (он будет доступен под токеном [vocab-handy-alias]). Честно говоря, я не уверен, что сам до конца понимаю, для чего нужен этот токен, но он существует и работает, это факт!

  4. Кстати, после того, как вы первый раз ткнете по галочке «Enable handy alias for terms of this vocabulary», автоматом отключатся такие возможности словаря как «Tags», «Multiply select» и возможность выбрать несколько родителей для термина.

  5. Теперь осталось наполнить словарь деревом терминов, задать для каждого из них по синониму и…

  6. …перейти к настройкам модуля pathauto. А именно, идем в раздел Patterns и задаем шаблоны алиасов для типа материала «автомобиль» и терминов словаря «Типы автомобилей» следующим образом: [vocab-handy-alias]/[term-handy-alias-path]/[node-handy-alias] и [vocab-handy-alias]/[term-handy-alias-path] соответственно

  7. Все! Подготовка закончена, время создавать контент. При создании материала мы можем наблюдать дополнительное поле под заголовком, где можно указать алиас для ноды. Если не указать, будет использован node id.

  8. Нажимаем сохранить и радуемся симпатичному урлу в адресной строке

  9. А дальше создаем пару представлений, одним из которых переопределяем стандартный системный путь «taxonomy/term/%» и т.д.

  10. Словом, еще несколько незначительных доработок и ваш новый прекрасный сайт практически готов!

Вот такой вот модуль. Я до сих пор не уверен, что он нужен кому-то, кроме меня, но он есть, залит на drupal.org и хочет быть использован людьми!

хабрапользователи могут прочитать то же самое на хабре.

---

Комментарии

Аватар пользователя graker graker 24 сентября 2010 в 11:38

Классно. Спасибо.

Такой вопрос:
а можно ограничиться пунктом 7 и использовать Handy-alias только для изменения части синонима, соответствующей заголовку?

В смысле, такая логика: у меня есть новости и для них pathauto автоматом генерит синоним news/2010/09/24/zagolovok. Так, для новости с заголовком "Новость 1" будет news/2010/09/24/novost_1. Так вот, я правильно понимаю, можно использовать handy-alias просто чтобы novost_1 заменить на то, что напишу я, а первые 4 токена оставить без изменений?

И еще вопрос: модуль не будет конфликтовать, если я уберу галочку "генерировать синонимы" и введу синоним для отдельно взятой ноды руками?

Аватар пользователя Stutzer Stutzer 24 сентября 2010 в 22:08

graker wrote:
Такой вопрос:
а можно ограничиться пунктом 7 и использовать Handy-alias только для изменения части синонима, соответствующей заголовку?
И еще вопрос: модуль не будет конфликтовать, если я уберу галочку "генерировать синонимы" и введу синоним для отдельно взятой ноды руками?

Все верно, можно использовать только часть возможностей. В вашем случае, только псевдоним для нод без участия каких-либо словарей с терминами.
И да, если вы уберете галочку «Automatic alias» при создании ноды, то сможете задать произвольный путь к ноде. Т.е. стандартная функциональность модуля pathauto ни коим образом не нарушается.

Аватар пользователя dobradmin dobradmin 25 сентября 2010 в 22:00

graker wrote:
Классно. Спасибо.

Такой вопрос:
а можно ограничиться пунктом 7 и использовать Handy-alias только для изменения части синонима, соответствующей заголовку?

В смысле, такая логика: у меня есть новости и для них pathauto автоматом генерит синоним news/2010/09/24/zagolovok. Так, для новости с заголовком "Новость 1" будет news/2010/09/24/novost_1. Так вот, я правильно понимаю, можно использовать handy-alias просто чтобы novost_1 заменить на то, что напишу я, а первые 4 токена оставить без изменений?

И еще вопрос: модуль не будет конфликтовать, если я уберу галочку "генерировать синонимы" и введу синоним для отдельно взятой ноды руками?

поле в сск для формирования окончания... я так делаю всегда, ну и мне кажется полегче решение (все равно на 90% уверен что cck вы используете.)
А вот сильно мне понравилось как реализована такая же штука в битриксе - она использует гулопереводчик, те не просто транслитирует а переводит..

Аватар пользователя Stutzer Stutzer 25 сентября 2010 в 22:41

dobradmin wrote:
А вот сильно мне понравилось как реализована такая же штука в битриксе - она использует гулопереводчик, те не просто транслитирует а переводит..

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

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 24 сентября 2010 в 12:38

vitg wrote:
Вещь нужная, но в чем преимущество над PathAuto?

В чем преимущество магнитолы над автомобилем?
В чем преимущество автомобиля у которого есть магнитола над автомобилем у которого её нет - об этом и статья Wink

Аватар пользователя FORTIS FORTIS 24 сентября 2010 в 12:03

"vitg" wrote:
Вещь нужная, но в чем преимущество над PathAuto?

оно в дополнение к Pathauto, а в чем преимущесьво - про это целый пост=)

Аватар пользователя marazmus marazmus 24 сентября 2010 в 12:37

Очень полезный модуль, спасибо Smile Особенно пригодится при переносе работающих сайтов на Друпал, у которых алиасы категорий уже созданы, и неохота ломать голову редиректами их на новые "друпальные" алиасы. Кто не понял, что я имел в виду, я не виноват Biggrin

Аватар пользователя igorek igorek 24 сентября 2010 в 13:23

"Stutzer" wrote:
автоматом отключатся такие возможности словаря как «Tags», «Multiply select» и возможность выбрать несколько родителей для термина.

Жаль что это не работает...

Аватар пользователя Stutzer Stutzer 24 сентября 2010 в 22:05

Отвечаю на вопрос по поводу отключения функция Tags, Multiply select и множественного выбора родителей.

igorek wrote:
Жаль что это не работает...

G.A. Vinogradov wrote:
А какого хрена спрашивается? Одно между прочим другому не мешает.

А как, по-вашему, однозначно построить путь до ноды из терминов словаря, когда включен множественный выбор или, тем более, тэги?
Т.е., скажем у нас есть нода, которая одновременно относится к двум терминам словаря. Какой из этих терминов использовать при генерации пути? Тем более с тэгами.
Ну и с несколькими родителями, думаю, тоже все ясно.
Можно, конечно, создавать всевозможные псевдонимы для одной ноды, но это плохо скажется на сайте, поскольку ни гугл ни яндекс таких фокусов не любит. Да и пользователь может запутаться.

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 25 сентября 2010 в 11:21

Stutzer wrote:
Отвечаю на вопрос по поводу отключения функция Tags, Multiply select и множественного выбора родителей.
G.A. Vinogradov wrote:
А какого хрена спрашивается? Одно между прочим другому не мешает.

А как, по-вашему, однозначно построить путь до ноды из терминов словаря, когда включен множественный выбор или, тем более, тэги?
Т.е., скажем у нас есть нода, которая одновременно относится к двум терминам словаря. Какой из этих терминов использовать при генерации пути? Тем более с тэгами.
Ну и с несколькими родителями, думаю, тоже все ясно.
Можно, конечно, создавать всевозможные псевдонимы для одной ноды, но это плохо скажется на сайте, поскольку ни гугл ни яндекс таких фокусов не любит. Да и пользователь может запутаться.

Вы рассмотрели только один вариант использования своего модуля - генерацию пути при жестко заданной иерархии для конечно ноды.
Рассмотрите другой вариант использования:
Я проставляю теги для всех автомобилей и хочу использовать к ним handy-alias.
И хочу видеть, например, такие адреса:
/toyota/4wd
/nissan/hatchback

Поэтому ваш запрет - является искусственно вызванным и ненужным, он сильно уменьшает полезность модуля.

Аватар пользователя Stutzer Stutzer 25 сентября 2010 в 12:49

G.A. Vinogradov wrote:
Рассмотрите другой вариант использования:
Я проставляю теги для всех автомобилей и хочу использовать к ним handy-alias.
И хочу видеть, например, такие адреса:
/toyota/4wd
/nissan/hatchback

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

Аватар пользователя dobradmin dobradmin 25 сентября 2010 в 22:03

у вас термины toyota, nissan, 4wd, hatchback в одном словаре? как их порядок определить?

Аватар пользователя kv4 kv4 25 ноября 2010 в 17:10

Обрадовался было, что наконец нашёл то, что нужно. Однако, модуль не работает совместно с Hierarchical Select.
Hierarchical Select автоматически ставит галочку на "Множественный выбор", а Handy Alias её убирает.

Делема.

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 24 сентября 2010 в 13:33

Quote:
Кстати, после того, как вы первый раз ткнете по галочке «Enable handy alias for terms of this vocabulary», автоматом отключатся такие возможности словаря как «Tags», «Multiply select» и возможность выбрать несколько родителей для термина.

А какого хрена спрашивается? Одно между прочим другому не мешает.

Аватар пользователя qwaker qwaker 24 сентября 2010 в 13:35

Вот этого модуля мне не хватало три месяца назад. весь мозг вынес тогда. спасибо Stutzer за решение!!

Аватар пользователя Lex-DRL Lex-DRL 28 сентября 2010 в 12:06

"Stutzer" wrote:
А как, по-вашему, однозначно построить путь до ноды из терминов словаря, когда включен множественный выбор или, тем более, тэги?

Если вопрос не риторический, то, как вариант - так же, как в [termpath-raw]. Т.е. тупо выбирать первый термин.

Аватар пользователя Шалтай Шалтай 1 октября 2010 в 18:11

Quote:
Если термин имеет родителей, то с помощью токена [term-handy-alias-path] можно получить цепочку терминов по аналогии со стандартным токеном [termpath-raw]. Это решает проблемы с транслитерированными уродливыми адресами страниц и отображением структуры словаря в URL-е.

Возможно, если изначально знать про токен [termalias], то не пришлось бы этот писать модуль.
С другой стороны, создание модуля - всёж развлечение!

Аватар пользователя wkolidore wkolidore 6 октября 2010 в 17:00

Наконец-то! Этого модуля мне так нехватало Smile
Блин... все еще не хватает Sad
Прелесть таксономии как раз и заключается в том, что один материал может принадлежать нескольким категориям.
Хотелось бы вот так: множественный выбор терминов + определенный термин (например, первый по списку) — берется в качестве основы для создания адреса.
Сам пока остановился на том, что алиасы нод отдельно, алиасы категорий отдельно, хотя колупался долго.

Аватар пользователя xxandeadxx xxandeadxx 7 октября 2010 в 1:30

после включения модуля:

Quote:
Warning: Call-time pass-by-reference has been deprecated in \sites\all\modules\handyalias\handyalias.module on line 190

Warning: Call-time pass-by-reference has been deprecated in \sites\all\modules\handyalias\handyalias.module on line 195

Warning: Call-time pass-by-reference has been deprecated in \sites\all\modules\handyalias\handyalias.module on line 199

PHP Version 5.2.8

Аватар пользователя Stutzer Stutzer 7 октября 2010 в 23:58

xxandeadxx wrote:
после включения модуля: Warning: Call-time ... PHP Version 5.2.8

Спасибо, исправил у себя, включу в следующий релиз. Если мешает уберите в названных вами строках знак & перед параметром &$vocab

Аватар пользователя dmi3 dmi3 19 ноября 2010 в 12:38

у меня тоже такие ошибки были. убрл & перед $vocab

Сейчас в логах постоянно такие ошибки:
[Fri Nov 19 10:53:22 2010] [warn] mod_fcgid: stderr: PHP Warning: Call-time pass-by-reference has been deprecated in /httpdocs/sites/all/modules/handyalias/handyalias.lib.inc on line 61
[Fri Nov 19 10:54:20 2010] [warn] mod_fcgid: stderr: PHP Warning: Call-time pass-by-reference has been deprecated in /httpdocs/sites/all/modules/handyalias/handyalias.lib.inc on line 61
[Fri Nov 19 10:55:25 2010] [warn] mod_fcgid: stderr: PHP Warning: Call-time pass-by-reference has been deprecated in /httpdocs/sites/all/modules/handyalias/handyalias.lib.inc on line 61

Аватар пользователя Stutzer Stutzer 5 декабря 2010 в 5:35

Paldru wrote:
А для D7 планируется?

Честно говоря, по серьезному до семерки еще руки не дошли, много проектов на 6-ке. В следующем году, думаю, сделаю веточку для 7.

Аватар пользователя petrovnn petrovnn 21 декабря 2010 в 21:03

Возможно реализовать такое поведение?:

* если юзер ввел хенди-алиас, ставим для тайтла хенди
* если юзер не ввел хенди (на странице ноды), то делаем транслитерацию (вместо nid)

Я сам ненавижу уродливые урлы. Поэтому конечно буду стараться ставить нормальные алиасы.
Но кроме меня сайт будут наполнять другие юзеры, которые могут и забить на это поле для ручного алиаса, и вот для них, хотелось-бы сделать транслитерацию.

Я понимаю, что в pathauto это разные подстановочные шаблоны: [node-handy-alias] и стандартный [title-raw].

Спрашиваю потому что нормальные урлы все-таки нужны, не только для поисковиков, но и для аськи (я делаю для корпоративной системы документооборота), так вот, гораздо приятнее получить по аське ссылку как минимум на транслитерацию юзер-генерейтед-заголовка.

PS.
Автору респект - очень полезный плагин и серьезное поползновение к действительно полезному и универсальному решению.

Ну а если прикрутить гугл-транслейт - это вообще была-бы сказка. Жаль у меня нет времени и достаточного количества знаний чтобы помочь автору в этом.

Аватар пользователя B00StER B00StER 27 декабря 2010 в 11:55

Вроде бы хороший модуль, дополняющий функционал терминов таксономии, который, по идее, должен был быть "из коробки". Но есть и непонятные моменты. В частности, опция "Free content types" в настройках словаря. Если в ней ничего не выбрано, то в свойствах терминов этого словаря не появляется поле "Term Alias". А если выбрать какой-то тип контента, то в настройках других словарей этот тип пропадет

Пример: делаем некий каталог товаров. В нем заведен тип ноды "товар" и два словаря: "Типы продукции" и "Бренды". Два отдельных словаря потому, что один и тот же бренд может производить несколько разных типов продукции. Соответственно, каждой конечной ноде, описывающей один товар, присваивается один тип и один бренд. В итоге хочется видеть URL вида: site.com/type_alias/brand_alias/item_alias.html.

Что нужно для этого сделать?

Аватар пользователя Stutzer Stutzer 28 декабря 2010 в 0:59

B00StER wrote:
Пример: делаем некий каталог товаров. В нем заведен тип ноды "товар" и два словаря: "Типы продукции" и "Бренды". Два отдельных словаря потому, что один и тот же бренд может производить несколько разных типов продукции. Соответственно, каждой конечной ноде, описывающей один товар, присваивается один тип и один бренд. В итоге хочется видеть URL вида: site.com/type_alias/brand_alias/item_alias.html.

Что нужно для этого сделать?

Дело в том, что один тип контента может быть связан только с одним handyalias-словарем. Тем не менее, простых словарей, связанных с типом контента, может быть сколько угодно. Сделано это по той причине, что у ноды должен быть всего один адрес. Соответственно, если нода принадлежала бы двум handyalias-словарям, то не понятно, по какому принципу модулю выбирать словарь для построения пути. По этой причине, типы контента, связанные с одним handyalias-словарем уже недоступны в других handyalias-словарях. Надеюсь, понятно объясняю.

По этой причние, ваш случай, к сожалению, с помощью текйщей версии модуля не решается. Но, спасибо за идею, постараюсь учесть ваши требования в следующей версии модуля.

Аватар пользователя B00StER B00StER 28 декабря 2010 в 3:11

Stutzer wrote:

Дело в том, что один тип контента может быть связан только с одним handyalias-словарем. Тем не менее, простых словарей, связанных с типом контента, может быть сколько угодно. Сделано это по той причине, что у ноды должен быть всего один адрес. Соответственно, если нода принадлежала бы двум handyalias-словарям, то не понятно, по какому принципу модулю выбирать словарь для построения пути.

Как это непонятно? У нас же есть порядок следования словарей, который можно изменять в /admin/content/taxonomy. Он как раз и предназначен для однозначного формирования URL'а.

По поводу уникальности адреса ноды: если пользоваться базовым функционалом pathauto (не устанавливая handyalias), то мы можем присвоить ноде термины из двух словарей, и все отлично работает. Плюс в любом случае остается возможность открыть ноду непосредственно по ее собственному алиасу или id. Для исключения этих ситуаций существует модуль globalredirect, который отдает 301 по всем дублирующим URL'ам.

Что я хочу сказать: дополнительные ограничители, встроенные в handy alias, конечно, полезны, но было бы здорово иметь возможность их отключения, чтобы свести деятельность модуля к простому добавлению поля "handy alias" ко всем терминам всех словарей.

Аватар пользователя luk911 luk911 15 апреля 2011 в 15:07

B00StER wrote:

По поводу уникальности адреса ноды: если пользоваться базовым функционалом pathauto (не устанавливая handyalias), то мы можем присвоить ноде термины из двух словарей, и все отлично работает. Плюс в любом случае остается возможность открыть ноду непосредственно по ее собственному алиасу или id. Для исключения этих ситуаций существует модуль globalredirect, который отдает 301 по всем дублирующим URL'ам.

не подскажете новичку, как с помощью базового функционала pathauto сделать алис вида /vocabulary1-term/vocabulary2-term/node-title

в Content paths я не вижу токенов для терминов словарей ...
уточню, пользуюсь 7 версией

Аватар пользователя Zaboev Sergey Zaboev Sergey 21 апреля 2011 в 17:33

Очень хороший модуль.

Но у меня есть вопрос - При добавлении ноды, я отмечаю её каким либо термином из словаря, который является дочерним. Так вот в этом случае товар не отображается на странице термина-родителя. И ещё по хлебным крошкам - стандартные функции не позволяют отображать дерево терминов словаря к которому относится нода, т.е. не видно хлебных крошек при просмотре страницы с полным описанием ноды.

Может быть, есть решение этих вопросов?

Спасибо.

Аватар пользователя Arturus Arturus 13 ноября 2012 в 7:41

У меня никак не получалось вывести алиасы для терминов ([termalias-raw])

Token 6.x-1.19
CCK 6.x-2.9
Drupal 6.26

И только установив Ваш модуль настроил синонимы как надо и получил красивые урлы, спасибо!

Аватар пользователя petrovnn petrovnn 10 октября 2013 в 13:07

аналогичной функциональности можно добиться с помощью Entity API + Entity token
пруф

UPD
Поясню.
Нужно создать дополнительное поле, в нем вручную писать алиас (например термина), при сохранении ноды для генерации компонента пути урла будет браться не транслитерация этого компонента, а тот алиас который мы сами написали в термине таксономии на который ссылается нода, которую мы сохраняем.

Если у термина на который ссылается нода нет ручного алиаса, то тогда этот компонент пропускается.

В общем это то-же самое что и HA, только средствами Entity Token. Наверное поэтому автор и не стал делать модуль для семерки, только скромно умолчал о том что функциональность можно повторить с помощью другого контибовского модуля

Аватар пользователя sergeybelya sergeybelya 10 октября 2013 в 13:14

Честно не могу понять смысл поста, Pathauto, Token и Transliteration зачем тогда? Использую их на всех проектах. К чему усложнять?