Тема: Скрипт сам изменяет вид url у статей

Всем доброго времени суток!

Што такое и почему так? Strawberry 1.1.1 . ЧПУ включено. В шаблон post = "{title}.html" . Создал я статейку, вбил для неё урл который мне симпатичен (допустим gornyi-altai ) - все ок, все работает. Но почему при повторном редактировании он сам изменяет ссылку на gornyi-altai-2, gornyi-altai-3, и т.д... Я уже не знаю что с ним делать.. sad

2

Re: Скрипт сам изменяет вид url у статей

При редактировании проверяется наличие дублей. Если Вы уверены, что статей с одинаковым урлом нет и кеш почищен, это фантастика hmm
Кстати, а база какая?

Я не крутой ...
... я только учусь!

Re: Скрипт сам изменяет вид url у статей

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

Кэш чищу - не помогает.

Отредактировано Kater (10 Mar 2009 15:13:09)

Re: Скрипт сам изменяет вид url у статей

Kater, проверьте пару соображений:

1. Нет ли у вас случайно категории с УРЛ-ом "gornyi-altai"?

2. При редактировании новости попробуйте очитстить поле "URL (при желании)". Какой УРЛ установится для новости после её сохранения?

Re: Скрипт сам изменяет вид url у статей

1. Неа, точно нет.

2. Получается так gornyi-altai-2.. так же и со многими остальными.. была статья про Египет, УРЛ был вида "egipet". Сейчас зашел в редактирование, сохранил, зашел обратно а УРЛ уже вида "egipet-3".. Нашел статью с УРЛом "vystavka-bonapart-i-egipet-proxodit-v-parizhe", но она же создана на много позже, да и там много других слов.. Статья с названием "Египет" только одна. Это прям 100%.

Отредактировано Kater (10 Mar 2009 15:58:43)

Re: Скрипт сам изменяет вид url у статей

Kater, попробуйте так. В файле inc/mod/editnews.mdu найдите строку

'url'      => ($url ? namespace($url) : namespace(totranslit($title))),

и замените её на эту

'url'      => ($url ? $url : namespace(totranslit($title))),

Re: Скрипт сам изменяет вид url у статей

Все примитивно просто. Странно, что еще никто не понял суть проблемы. Надеюсь хоть догадывались.

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

Решение не сложное - поправить функцию namespace, для сверки id редактируемой и найденой новости с урл-дубликатом.
Само решение будет вечером - извините, нет времени.


ANT-soft немного опередил. Он близок к истине )

Отредактировано Walkmann (10 Mar 2009 16:57:06)

Re: Скрипт сам изменяет вид url у статей

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

Дело в том, что функция namespace при апдейте полей проверяет наличие в данном поле базы каких-либо данных. А при редактировании новости, данные там уже были, даже если пользователь стёр содержимое окна "URL". Попробуйте обойти этот момент?

Walkmann, вот вы говорите "всё примитивно просто". Прочтите первый пост автора темы и, не заглядывая в остальные, постарайтесь понять о чём речь. Ну допустим, вы - телепат, но остальные к сожалению простые люди.

Получится с функцией namespace - отпишитесь?

Re: Скрипт сам изменяет вид url у статей

Да, Вы правы, помогло! big_smile Заменил строку ту и новости стали нормально сохранятся! smile Спасибо большое! wink

10

Re: Скрипт сам изменяет вид url у статей

ANT-Soft,

Walkmann, вот вы говорите "всё примитивно просто". Прочтите первый пост автора темы и, не заглядывая в остальные, постарайтесь понять о чём речь. Ну допустим, вы - телепат, но остальные к сожалению простые люди.

я ж никому не запрещал в другие посты смотреть, с чего бы это мне их не почитать и по ним не сориентироватся ?
Тем не менее, что бы там ни было - сориентировался я не правильно big_smile
В namespace все же есть проверка на "саму себя" - за это отвечает допуск, в одну "находку":

return totranslit($str.(($count and [b]$count != 1[/b]) ? ' '.$count : ''));

Само дело все же остается в namespace, но я немного озадачен - на первый взгляд все чинно.
фантастика (c) HunterAlex

Kater
Отказ от использования проверки url'а от ANT'а, в целом правильное решение, но может подвести, если создать одну новость, с урл, скажем, url01 а затем создать вторую новость, с урл someurl01 и попытатся отредактировать этот someurl01 на url01 -> новость сохранится и будут в базе две новости с одинаковым адресом. В итоге, полная версия одной из них не будет отображаться на сайте. Вот такой вот ньюанс, за которым надо следить (что не сложно, в принципе, и хлопот не создает. особенно учитывая, что пока это единственное решение)

Если удастся найти причину, то я отпишусь.

Отредактировано Walkmann (10 Mar 2009 19:25:45)

Re: Скрипт сам изменяет вид url у статей

Walkmann, спасибо за предупреждение, буду иметь введу. smile

Re: Скрипт сам изменяет вид url у статей

function namespace($str){
/*fix*/
global $sql, $mod, $id;

    if (!$sql->select(array('table' => 'news', 'where' => array("id != $id", 'and', "url = $str"))))
    {
        return $str;
    }
    else
    {
        $count = 1;
        while ($sql->select(array('table' => 'news', 'where' => array("id != $id", 'and', "url = $str-$count"))))
        {
            ++$count;
        }

        return $str.'-'.$count;
    }
/*fix*/

/*
global $sql, $mod;

    foreach ($sql->select(array('table' => 'news')) as $row){
        if (@preg_match("/$str([0-9]+)?/i", $row['url'])){
            $result[] = $row['id'];
        }

        if (@preg_match("/$str([0-9]+)?/i", $row['id'])){
            $result[] = $row['id'];
        }
    }

    $count = count($result);

    if ($mod == 'addnews'){
        $count++;
    }

return totranslit($str.(($count and $count != 1) ? ' '.$count : ''));
*/
}

Re: Скрипт сам изменяет вид url у статей

ANT-Soft пишет:

Kater, попробуйте так. В файле inc/mod/editnews.mdu найдите строку

'url'      => ($url ? namespace($url) : namespace(totranslit($title))),

и замените её на эту

'url'      => ($url ? $url : namespace(totranslit($title))),

а можно добавить:
если есть новость с таким же УРЛ то вывести ошибки с сообщением?

Strawberry 1.1.1