Моя доработка LS пригодится тем, кто хочет видеть ссылки на топики в блогах в виде http://www.newmusic.ru/blog/events/2174/zavtra-shpongle-live-v-moskve.html Все ищется и индексируется, как и прежде, по ID топика, поэтому эта переделка минимально затрагивает движок и абсолютно не сказывается на производительности системы...
Итак, для этого сначала подергаем базу, а именно таблицу prefix_topic,
добавив туда поле topic_url
ALTER TABLE `prefix_topic` ADD `topic_url` VARCHAR( 250 ) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT 'topic';
в корневую папку сайта (там где ваш index.php) заливаем файл i18n-ascii.txt
public function getTopUrl() {
return $this->_aData['topic_url'];
}
и редактируем
public function getTopicUrl() {
if ($this->getBlogType()=='personal') {
return DIR_WEB_ROOT.'/blog/'.$this->getTopicId().'/'.$this->getTopURL().'.html'; // ЧПУ /a
} else {
return DIR_WEB_ROOT.'/blog/'.$this->getBlogUrl().'/'.$this->getTopicId().'/'.$this->getTopURL().'.html'; // ЧПУ /a
}
}
Идем в TopicComment.mapper.class.php и
редактируем запросы, добавляя t.topic_url as topic_url:
1. в public function GetCommentsRatingByDate($sDate,$iLimit) {
$sql = "SELECT
c_full.*,
t.topic_title as topic_title,
t.topic_count_comment as topic_count_comment,
t.topic_url as topic_url,
2. в public function GetCommentsAll(&$iCount,$iCurrPage,$iPerPage) {
/**
* оптимизирован
*/
$sql = "SELECT
c_fast.*,
c_full.*,
u.user_profile_avatar as user_profile_avatar,
u.user_profile_avatar_type as user_profile_avatar_type,
u.user_login as user_login,
u.user_login_confirm as user_login_confirm,
b.blog_title as blog_title,
b.blog_type as blog_type,
b.blog_url as blog_url,
u_owner.user_login as blog_owner_login
FROM (
SELECT
c.comment_id,
t.topic_title as topic_title,
t.topic_count_comment as topic_count_comment,
t.topic_url as topic_url,
3. в public function GetCommentsAllGroup($iLimit) {
/**
* оптимизирован // здесь копать прямой эфир
*/
$sql = "SELECT
c.*,
t.topic_title as topic_title,
t.topic_count_comment as topic_count_comment,
t.topic_url as topic_url,
4. в public function GetCommentsByUserId($sId,&$iCount,$iCurrPage,$iPerPage) {
$sql = "SELECT
c.*,
t.topic_title as topic_title,
t.topic_count_comment as topic_count_comment,
t.topic_url as topic_url,
Идем в ActionTopic.class.php
Где protected function SubmitAdd() {
ищем
/**
* Теперь можно смело добавлять топик к блогу
*/
$oTopic=new TopicEntity_Topic();
$oTopic->setBlogId($oBlog->getId());
$oTopic->setUserId($this->oUserCurrent->getId());
$oTopic->setType('topic');
$oTopic->setTitle(getRequest('topic_title'));
Точно также как ActionTopic редактируем ActionLink, ActionQuestion (SubmitEdit в ActionQuestion не правим)!!!
Идем в ActionBlog.class.php
находим и комментируем старое и дописываем новое
//$this->AddEventPreg('/^(\d+)\.html$/i','EventShowTopicPersonal'); // было
$this->AddEventPreg('/^(\d+)+$/i','/^([\w\-\_)+]+)\.html$/i','EventShowTopicPersonal'); //стало
//$this->AddEventPreg('/^[\w\-\_]+$/i','/^(\d+)\.html$/i','EventShowTopic'); //было
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(\d+)+$/i','/^([\w\-\_)+]+)\.html$/i','EventShowTopic'); //стало
теперь осталось только везде отредактировать func_header_location
/**
* Если запросили не персональный топик то перенаправляем на страницу для вывода коллективного топика
*/
if ($oTopic->getBlogType()!='personal') {
func_header_location(DIR_WEB_ROOT.'/blog/'.$oTopic->getBlogUrl().'/'.$oTopic->getId().'/'.$oTopic->getTopicURL().'.html'); //ЧПУ
}
/**
* Если запросили топик из персонального блога то перенаправляем на страницу вывода коллективного топика
*/
if ($oTopic->getBlogType()=='personal') {
func_header_location(DIR_WEB_ROOT.'/blog/'.$oTopic->getId().'/'.$oTopic->getTopicURL().'.html'); //ЧПУ
}
/**
* Если номер топика правильный но УРЛ блога косяный то корректируем его и перенаправляем на нужный адрес
*/
if ($oTopic->getBlogUrl()!=$sBlogUrl) {
func_header_location(DIR_WEB_ROOT.'/blog/'.$oTopic->getBlogUrl().'/'.$oTopic->getId().'/'.$oTopic->getTopicURL().'.html'); //ЧПУ
}
/**
* Отправляем уведомление тому на чей коммент ответили
*/
if ($oCommentParent and $oCommentParent->getUserId()!=$oTopic->getUserId() and $oCommentNew->getUserId()!=$oCommentParent->getUserId()) {
$oUserAuthorComment=$this->User_GetUserById($oCommentParent->getUserId());
$this->Notify_SendCommentReplyToAuthorParentComment($oUserAuthorComment,$oTopic,$oCommentNew,$this->oUserCurrent);
}
func_header_location(DIR_WEB_ROOT.'/blog/'.$oTopic->getId().'/'.$oTopic->getTopicUrl().'.html#comment'.$oCommentNew->getId());
Привим шаблоны:
block.comments.tpl и comment_list.tpl
находим
ну если честно, то если вы смените заголовок, то урл изменится, но и старый будет работать ;)) вообще если вы руками напишите www.newmusic.ru/blog/events/2174/segodnya-prazdnik-u-rebyat.html то все равно откроется топик с ID 2174, поисковики конечно же по головке не погладят, если вы будете все время менять титули-урлы, но, а кто будет менять титули-урлы?
Мне просто хотелось порассуждать на тему того насколько вообще это так актуально на взгляд других людей ведь при достаточно обширной практике редактирования своих материалов чпу может быть не столь соответствующ отредактированному материалу.
Насколько вообще это может быть удобно? Не на ваш взгляд, Lora_GT. а на взгляд общественности?
Я не спорю с вами, тогда объясните пожалуйста почему вы комментируете даже не протестировав материал? получается, что вы заведомо создаёте в ветке флуд
Фича, несомненно, интересная и нужная. Сейчас ломаю голову как перейти на Ливстирит с вордпресса с сохранением старой структуры типа сайт/раздел/топик.html так понял ваш способ мне без напильника не подойдет :)
C сохранением старой структуры видимо не получится, сам переходил с помощью Redirect 301. Быть может в новом релизе будет что-то типа встроенной возможности ЧПУ…
Понимаю, что давний разговор, но может помнишь — и может быть какие-то новшества появились в этом вопросе? (Nice URL — рулит, но надо что-то для 301 по старым ссылкам при импорте материалов из другой CMS)
Это слишком избыточные урлы получаются: www.newmusic.ru/blog/events/2174/zavtra-shpongle-live-v-moskve.html
Если убрать 2174, то ещё приемлемо будет. Хотя с простой транслитерацией тоже поиграть можно. Много раз убеждался уже, что в неумелых руках такие ссылки превращаются в бардак. Необходима возможность руками изменять slug: и поисковикам хорошо, и посетителям.
про неумелые руки я лихо промолчу, умелый ты наш :))) предложи код, идеями тут любой из нас закидает по самые нехочу. давай, на раз два три, пару строк дабавь в TransUrl(), которые выкинут из урла предлоги и другой лишний мусор. ждем.
Могу предложить идею: =)
у сфинкса в апи есть функционал генерирования кейвордов из текста. отдаешь ему кусок текста, а он возвращает массив ключевых слов, по которым будет искать. обычно слова приведены к именительному падежу. иногда отрезаны окончания.
можно заджойнить этот список и его в качестве слага использовать :-)
Во-первых, про умеле ручки я говорил, когда имел ввиду клиентов, а не вас.
Во-вторых, код не предложу, т.к. за движком пока только слежу, но в его внутренностях не разьбирался.
А в том, что предложил идею, ничего плохого не вижу.
нет, вы не поняли, титуль не обрезается а дает пользователю понять, что больше 50 символов он не может использовать, тогда пользователь напишет «Админка 2: создание своего меню», не будет же он нелогичный тайтл на свой топик вешать.
И это не очень хорошо: а если всё же никак меньше 50 нельзя?
Ну а как правильно — я не знаю. Но мне кажется, лучше сочетать возможность использования slug (при чём активно призывать юзера его использовать) и обрезания, если slug не задан (со всеми теми проблемами, обсуждаемыми выше).
их (пользователей_ теги то не заставишь прописывать, а требовать прописывать слаг это вообще утопия…
а вот по моему опыту, ограничение символов в титуле работает практичсеки идеально ;)
Спасибо.
По поводу выше сказанного, в плане сео, не туда смотрите.
Проблема:
http://newmusic.ru/forum/house/111628/koktejmpo.html
http://newmusic.ru/forum/house/111628/ja-chelovek-molekula.html
Глюк словил. Из-за того, что в опросе нельзя редактировать вопрос (который является названием топика), при правке топика-опроса URL сбрасывается и зайти на топик уже нельзя. Приходится залезать в базу и указывать URL вручную.
Лечение:
1. Идём в classes/actions/ActionQuestion.class.php
2. Находим функцию protected function SubmitEdit($oTopic)
3. Удаляем или комментируем эти две строчки:
Подскажите как сделать, чтобы по старому урл вида blog/name/1234.html топик тоже был доступен, так же как по /blog/name/(1234)/tekst.html, а то поисковики явно не обрадуются если у уже давно работающего сайта включить данный хак…
попробовала RewriteRule покрутить, но что то не вышло :(
1. ничего что хак писался для более ранней версии ЛС? в частности для шаблона habra
2. если приложить чуточку сообразительности то все прекрасно работает и в ЛС 0.3.1 с шаблоном new (докозательство сайт в профайле)
Спасибо за доказательства, но если не сложно, напиши пожалуйста пост с изменениями, либо расшарь нужные файлы, в которых производились изменения, чтоб их сразу можно было залить. Моих знаний PHP и элементарной логики явно не хватает на то, чтоб сделать подобные изменения(знания PHP у меня ограничиваются на фразе «это что-то похожее на С++ ?»). Если сделаешь пост по теме ЧПУ в ЛС 0.3.1, то тебе будут благодарны многие!
И еще. Я у себя чуток накосяцил :)
Но думаю для первого раза простительно. Совет для отладки: Постим тестовый топик, с катор, и с коментариями. И этот топик проверяем со всех сторон. По всем ссылкам которые есть у топика. Если находим что что то отображается не совсем верно
Например .../2/ а хотелось бы .../2/topic/ то соответственно подставляем
{$oTopic->getTopicURL()} — в шаблоны по топику.
{$oComment->getTopURL()} — в шаблоны по коментариям
Посмотрел заметки в интернете о трпнслитерации Заметка А Заметка 2
и мне кажется что файл i18n-ansii.txt нужно изменить вот так:
; global transliteration
[default]
А = "A"
Б = "B"
В = "V"
Г = "G"
Д = "D"
Е = "E"
Ё = "JO"
Ж = "ZH"
З = "Z"
И = "I"
Й = "J"
К = "K"
Л = "L"
М = "M"
Н = "N"
О = "O"
П = "P"
Р = "R"
С = "S"
Т = "T"
У = "U"
Ф = "F"
Х = "H"
Ц = "C"
Ч = "CH"
Ш = "SH"
Щ = "SHCH"
Ы = "Y"
Э = "E"
Ю = "YU"
Я = "YA"
а = "a"
б = "b"
в = "v"
г = "g"
д = "d"
е = "e"
ё = "jo"
ж = "zh"
з = "z"
и = "i"
й = "j"
к = "k"
л = "l"
м = "m"
н = "n"
о = "o"
п = "p"
р = "r"
с = "s"
т = "t"
у = "u"
ф = "f"
х = "h"
ц = "c"
ч = "ch"
ш = "sh"
щ = "shch"
ы = "y"
э = "e"
ю = "yu"
я = "ya"
Ъ = ""
ъ = ""
Ь = ""
ь = ""
Проверял сочетания типа jozhik в поиске гугла и яши и они точно определяют что это Ёжик.
59 комментариев
Насколько вообще это может быть удобно? Не на ваш взгляд,
Естественно с возможностью его отключения))
Понимаю, что давний разговор, но может помнишь — и может быть какие-то новшества появились в этом вопросе? (Nice URL — рулит, но надо что-то для 301 по старым ссылкам при импорте материалов из другой CMS)
Если убрать 2174, то ещё приемлемо будет. Хотя с простой транслитерацией тоже поиграть можно. Много раз убеждался уже, что в неумелых руках такие ссылки превращаются в бардак. Необходима возможность руками изменять slug: и поисковикам хорошо, и посетителям.
у сфинкса в апи есть функционал генерирования кейвордов из текста. отдаешь ему кусок текста, а он возвращает массив ключевых слов, по которым будет искать. обычно слова приведены к именительному падежу. иногда отрезаны окончания.
можно заджойнить этот список и его в качестве слага использовать :-)
Плз, пинать только за идею не надо)
p.s. а что, часто стали пинать? :)))
я по прежнему уверен, что допускать к ЖУ типичных юзеров ДЛЕ вредно для движка, а точнее его репутации
Во-вторых, код не предложу, т.к. за движком пока только слежу, но в его внутренностях не разьбирался.
А в том, что предложил идею, ничего плохого не вижу.
Это хороший урл получается?
А бывает слов ещё больше. Я, например, делал «обрезание» по некоторому количеству слов, но тогда получается ещё больший бред. Например:
Получается:
Ну а как правильно — я не знаю. Но мне кажется, лучше сочетать возможность использования slug (при чём активно призывать юзера его использовать) и обрезания, если slug не задан (со всеми теми проблемами, обсуждаемыми выше).
а вот по моему опыту, ограничение символов в титуле работает практичсеки идеально ;)
в форме <input name="title" maxlength="50"> я имею ввиду
{$oComment->getTopicId()}.html
Спасибо.
По поводу выше сказанного, в плане сео, не туда смотрите.
Проблема:
http://newmusic.ru/forum/house/111628/koktejmpo.html
http://newmusic.ru/forum/house/111628/ja-chelovek-molekula.html
Если идти до конца по скользкой сеошной дорожке, тогда стоит делать так:
http://newmusic.ru/forum/house/111628/я-человек-молекула.html
Глюк словил. Из-за того, что в опросе нельзя редактировать вопрос (который является названием топика), при правке топика-опроса URL сбрасывается и зайти на топик уже нельзя. Приходится залезать в базу и указывать URL вручную.
Лечение:
1. Идём в classes/actions/ActionQuestion.class.php
2. Находим функцию protected function SubmitEdit($oTopic)
3. Удаляем или комментируем эти две строчки:
$output = TransURL(getRequest('topic_title'));
$oTopic->setUrl($output);
Но после публикации ТОПИКА выходит 404, так же выходит ошибка 404 при редактировании. Что делать? где я ошибся?
попробовала RewriteRule покрутить, но что то не вышло :(
1) block.comments.tpl — такого файла в стандартной сборке нет. Господа, где вы его нашли? (Стандартный шаблон New)
2) В файле comment_list.tpl нет такого {$oComment->getTopicId()}.html. Что же там заменять?
В общем, главный вопрос на последнем этапе, как правильно отредактировать файлы шаблона? (Я так понял, что это разные версии шаблонов)
2. если приложить чуточку сообразительности то все прекрасно работает и в ЛС 0.3.1 с шаблоном new (докозательство сайт в профайле)
Если шаблон стандартный new
В файле comment.tpl
заменить с
на
В файле comment_list.tpl
заменить с
на
В файле topic_list.tpl
заменить с
на
Но думаю для первого раза простительно.
Совет для отладки: Постим тестовый топик, с катор, и с коментариями. И этот топик проверяем со всех сторон. По всем ссылкам которые есть у топика. Если находим что что то отображается не совсем верно
Например .../2/ а хотелось бы .../2/topic/ то соответственно подставляем
{$oTopic->getTopicURL()} — в шаблоны по топику.
{$oComment->getTopURL()} — в шаблоны по коментариям
для файла topic_list.tpl
менять
/{$oTopic->getId()}
И еще нужно корректировать файл topic.tpl
с
на
Проверте что бы где нужно слеши стояли.
Простите что много постов.
и мне кажется что файл i18n-ansii.txt нужно изменить вот так:
Проверял сочетания типа jozhik в поиске гугла и яши и они точно определяют что это Ёжик.
Не могу найти в каком месте добавить функцию что бы был вид чпу /2/topic/
Спасибо