Modları PrettyUrl Destekli Hale Getirmek.

Started by Özgür, April 04, 2009, 05:26:08 PM

Previous topic - Next topic

Özgür

Konuya başlamadan birşey söylemem gerekiyor. Buradaki çalışmalar prettyurls extras paketi esas alınarak yapılmıştır ve bu konudaki kodlamalar bana aittir. Hiçbir şekilde biri/biryer den alıntı değildir. Lütfen eğer alıntı yapacaksanız, ismimle paylaşın.

Moderatörlerden ricamdır : Konuyu herhangi bir bölüme taşıyacaksanız bile birkaç gün burada kalmasını istiyorum. Zira isteyen çok kişi vardı herkes tüm bölümleri kontrol etmiyor.

Bu konuda esasında modları nasıl prettyurl destekli hale getireceğinizi anlatacaktım. Ama son zamanlarda yaşadığım sorunlardan dolayı, sadece şimdiye kadar yaptığım modlar için gereken değişimleri anlatacağım.

Buradaki yapılanlardan ötürü sitenize gelebilecek zararlardan şahsım sorumlu değildir. Eğer kod bilginize ve değişimleri doğru yapabileceğinize güvenebiliyorsanız deneyin. Aksi taktirde konulara girmeme yada benzeri bir sorun olduğunda size yardım etmem mümkün değil.

Öncelikle bilmeniz gereken şeyler ;
PrettyUrl filter dediğimiz bir yapı kullanır. Bir filter 2 ana yapıdan oluşur. Filter'ın kendisi ve callback fonksiyonu. PrettyUrls için filterlar databasede tutulur ama admin panelinden değiştirme imkanına da sahipsiniz.
siteniz.com/forum/index.php?action=admin;area=pretty;sa=filters adresinde filterları düzenleyebilirsiniz. Burada göreceğiniz şey JSON ile kodlanmıştır.
Eğer sorun oluşturursa diye default değerlerini veriyorum.
{
    "boards": {
        "description": "Rewrite Board URLs",
        "enabled": 1,
        "filter": {
            "priority": 45,
            "callback": "pretty_urls_board_filter"
        },
        "rewrite": {
            "priority": 50,
            "rule": [
                "RewriteRule ^ROOTURL([-_!~*'()$a-zA-Z0-9]+)/?$ ./index.php?pretty;board=$1.0 [L,QSA]",
                "RewriteRule ^ROOTURL([-_!~*'()$a-zA-Z0-9]+)/([0-9]*)/?$ ./index.php?pretty;board=$1.$2 [L,QSA]"
            ]
        },
        "title": "Boards"
    },
    "topics": {
        "description": "Rewrite Topic URLs",
        "enabled": 1,
        "filter": {
            "priority": 40,
            "callback": "pretty_urls_topic_filter"
        },
        "rewrite": {
            "priority": 55,
            "rule": [
                "RewriteRule ^ROOTURL([-_!~*'()$a-zA-Z0-9]+)/([-_!~*'()$a-zA-Z0-9]+)/?$ ./index.php?pretty;board=$1;topic=$2.0 [L,QSA]",
                "RewriteRule ^ROOTURL([-_!~*'()$a-zA-Z0-9]+)/([-_!~*'()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/?$ ./index.php?pretty;board=$1;topic=$2.$3 [L,QSA]"
            ]
        },
        "title": "Topics"
    },
    "actions": {
        "description": "Rewrite Action URLs (ie, index.php?action=something)",
        "enabled": 1,
        "filter": {
            "priority": 55,
            "callback": "pretty_urls_actions_filter"
        },
        "rewrite": {
            "priority": 45,
            "rule": "#ACTIONS"
        },
        "title": "Actions"
    },
    "profiles": {
        "description": "Rewrite Profile URLs. As this uses the Username of an account rather than it's Display Name, it may not be desirable to your users.",
        "enabled": 0,
        "filter": {
            "priority": 50,
            "callback": "pretty_profiles_filter"
        },
        "rewrite": {
            "priority": 40,
            "rule": "RewriteRule ^profile/([^/]+)/?$ ./index.php?pretty;action=profile;user=$1 [L,QSA]"
        },
        "title": "Profiles"
    }
}


Birkaç filterda farkedeceğiniz gibi  "callback": "pretty_urls_actions_filter" şeklinde bir kod var. Bu bir filter'ın anlamlı ve doğru çalışması için PrettyUrls-Filters.php deki fonksiyona göre çalışmasını sağlar. Yani Bir filter kullanılırken, oradaki callback'ine göre çalışır.

İşin teorik kısmı bu kadar.

Şu aşamada size 2 modun SMF articles ve Smf Downloads modunun pretty url destekli olmasını anlatacağım.


Smf Articles | Makaleler Modu


PrettyUrls-Filters.php de bulun
?>
Üstüne ekleyin
function pretty_articles_filter($urls)
{
    global $boardurl, $scripturl;
   
// kategoriler
    $pattern = '~' . $scripturl . '(.*)action=articles;cat=([^;]+)~S';
    $replacement = $boardurl . '/makaleler/kategori/$2/';
    $replacement .= (strpos($replacement, '?') === false ? '?' : ';') . (isset($PHPSESSID[0]) ? $PHPSESSID[0] : '') . ';' . (isset($sesc[0]) ? $sesc[0] : '') . (isset($fragment[0]) ? $fragment[0] : '');
    foreach ($urls as $url_id => $url)
        if (!isset($url['replacement']))
            if (preg_match($pattern, $url['url']))
                $urls[$url_id]['replacement'] = preg_replace($pattern, $replacement, $url['url']);

   
    // makaleler
    $pattern = '~' . $scripturl . '(.*)sa=view;article=([^;]+)~S';
    $replacement = $boardurl . '/makaleler/$2/';
    $replacement .= (strpos($replacement, '?') === false ? '?' : ';') . (isset($PHPSESSID[0]) ? $PHPSESSID[0] : '') . ';' . (isset($sesc[0]) ? $sesc[0] : '') . (isset($fragment[0]) ? $fragment[0] : '');
    foreach ($urls as $url_id => $url)
        if (!isset($url['replacement']))
            if (preg_match($pattern, $url['url']))
                $urls[$url_id]['replacement'] = preg_replace($pattern, $replacement, $url['url']);
   
    return $urls;
}

siteniz.com/forum/index.php?action=admin;area=pretty;sa=filters adresine gidin. Son iki satırdaki     }
}
şeklindeki kodu bulun. iki parantezin arasına
,
    "articles": {
        "description": "articles",
        "enabled": 0,
        "filter": {
            "priority": 4,
            "callback": "pretty_articles_filter"
        },
        "rewrite": {
            "priority": 4,
            "rule": [
                "RewriteRule ^makaleler/([^/]+)/?$ index.php?action=articles;sa=view;article=$1 [L,QSA]",
                "RewriteRule ^makaleler/kategori/([^/]+)/?$ index.php?action=articles;cat=$1 [L,QSA]"
            ]
        },
        "title": "Articles modu pretty desteği"
    }

Ekleyin. Ve ardından "Save" i tıklayın. "Filters saved and updated" derse sorun yok demektir. Ama başka birşey yazarsa yukarıda verdiğim default değerleri kopyalayıp, kaydedin ve tekrar deneyin.
Bunları yaptıktan sonra pretty admin panelinden önce settings e girip articles için olan seçeneği işaretleyip, kaydedin. Sonra yine prettyurls admin panelinden maintenance bölümüne girip "Run maintenance tasks" ı tıklayın. Ardından sizinde göreceğiniz gibi artık makale modunda
tekil makale : site.com/forum/articles/makale/5/
kategori : site.com/forum/articles/kategori/5/
Şeklinde olacak.


Smf Downloads | Dosya Paylaşım Modu


PrettyUrls-Filters.php de bulun
?>
Üstüne ekleyin.
function pretty_downloads_filter($urls)
{
global $boardurl, $scripturl;

// demo kategorileri
$pattern = '~' . $scripturl . '(.*)action=downloads;cat=([^;]+)~S';
$replacement = $boardurl . '/downloads/kategori/$2/';
$replacement .= (strpos($replacement, '?') === false ? '?' : ';') . (isset($PHPSESSID[0]) ? $PHPSESSID[0] : '') . ';' . (isset($sesc[0]) ? $sesc[0] : '') . (isset($fragment[0]) ? $fragment[0] : '');
foreach ($urls as $url_id => $url)
if (!isset($url['replacement']))
if (preg_match($pattern, $url['url']))
$urls[$url_id]['replacement'] = preg_replace($pattern, $replacement, $url['url']);


// demolar
$pattern = '~' . $scripturl . '(.*)sa=view;down=([^;]+)~S';
$replacement = $boardurl . '/downloads/$2/';
$replacement .= (strpos($replacement, '?') === false ? '?' : ';') . (isset($PHPSESSID[0]) ? $PHPSESSID[0] : '') . ';' . (isset($sesc[0]) ? $sesc[0] : '') . (isset($fragment[0]) ? $fragment[0] : '');
foreach ($urls as $url_id => $url)
if (!isset($url['replacement']))
if (preg_match($pattern, $url['url']))
$urls[$url_id]['replacement'] = preg_replace($pattern, $replacement, $url['url']);

return $urls;
}

Filtersa yukarıda articles için anlattığım şekilde şunu ekleyin
,
"downloads": {
        "description": "downloads",
        "enabled": 0,
        "filter": {
            "priority": 5,
            "callback": "pretty_downloads_filter"
        },
        "rewrite": {
            "priority": 5,
            "rule": [
                "RewriteRule ^downloads/([^/]+)/?$ index.php?action=downloads;sa=view;down=$1 [L,QSA]",
                "RewriteRule ^downloads/kategori/([^/]+)/?$ index.php?action=downloads;cat=$1 [L,QSA]"
            ]
        },
        "title": "downloads modu pretty url"
    }


Yine yukarıda bahsettiğim gibi filter'ı aktif edip maintenance'yi çalıştırın.

- Özgür
So Long

Özgür

#1


Tags Modu Pretty Url (tam) desteği..



siteniz.com/forum/index.php?action=admin;area=pretty;sa=filters adresine gidin. Son iki satırdaki     }
}
şeklindeki kodu bulun. iki parantezin arasına
Filter =>
,
"tags": {
        "description": "Rewrite Tags URLs",
        "enabled": 0,
        "filter": {
            "priority": 5,
            "callback": "pretty_tags_filter"
        },
        "rewrite": {
            "priority": 5,
            "rule": [
                "RewriteRule ^tags/([^/]+)/?$ index.php?action=tags;name=$1 [L,QSA]",
                "RewriteRule ^tagscloud/?$ index.php?action=tags;cloud [L,QSA]"
            ]
        },
        "title": "Tags Mod Pretty Support"
    }

PrettyUrls-Filters.php de bulun
?>
Üstüne ekleyin

function pretty_tags_filter($urls)
{
global $boardurl, $scripturl;
// Tags
$pattern = '~' . $scripturl . '(.*)action=tags;name=([^;]+)~S';
$replacement = $boardurl . '/tags/$2';
$replacement .= (strpos($replacement, '?') === false ? '?' : ';') . (isset($PHPSESSID[0]) ? $PHPSESSID[0] : '') . ';' . (isset($sesc[0]) ? $sesc[0] : '') . (isset($fragment[0]) ? $fragment[0] : '');
foreach ($urls as $url_id => $url)
if (!isset($url['replacement']))
if (preg_match($pattern, $url['url']))
$urls[$url_id]['replacement'] = preg_replace($pattern, $replacement, $url['url']);


// Tagcloud
$pattern = '~' . $scripturl . '(.*)action=tags;cloud(.*)~S';
$replacement = $boardurl . '/tagscloud/';
$replacement .= (strpos($replacement, '?') === false ? '?' : ';') . (isset($PHPSESSID[0]) ? $PHPSESSID[0] : '') . ';' . (isset($sesc[0]) ? $sesc[0] : '') . (isset($fragment[0]) ? $fragment[0] : '');
foreach ($urls as $url_id => $url)
if (!isset($url['replacement']))
if (preg_match($pattern, $url['url']))
$urls[$url_id]['replacement'] = preg_replace($pattern, $replacement, $url['url']);
return $urls;
}
So Long

grafitus

Özgür seni seviyorum :)
Sana bunu soracam msn'den açık görseydim..Yazmışsın bile..Teşekkürler.Bu arada gönlümdeki repler senindir :)

Arveles

downloads için söylenenleri yaptım ancak, kategorilere girmeme rağmen downloads lara girmeye çalıştığımda ana sayfaya yönleniyor. (Linklerim /downloads/kategori/5/ şeklini aldı)
Elveda SMF...

Özgür

httaccess dosyanızı ekler misiniz? birde herhangi bir downloadsa girmek istediğinizde link olarak ne gözüküyor ?
So Long

Arveles

Elveda SMF...

Özgür

RewriteRule ^downloads/([^/]+)/?$ index.php?action=downloads;sa=view;down=$1 [L,QSA]
RewriteRule ^downloads/kategori/([^/]+)/?$ index.php?action=downloads;cat=$1 [L,QSA]

bu kodları # Rules for: actions dan ir üst satıra ekleyip tekrar dener misiniz?
So Long

Arveles

Zaten öyle görünüyor, ya da ben anlamadım :)

#Arsiv.php
RewriteRule ^arsiv.html arsiv.php
#    http://code.google.com/p/prettyurls/
#    .htaccess file generated automatically on: April 5, 2009, 2:14

RewriteEngine on

#    Rules for: downloads
RewriteRule ^downloads/([^/]+)/?$ index.php?action=downloads;sa=view;down=$1 [L,QSA]
RewriteRule ^downloads/category/([^/]+)/?$ index.php?action=downloads;cat=$1 [L,QSA]

#    Rules for: actions
RewriteRule ^(activate|admin|announce|arcade|announcements|arcade|attachapprove|buddy)/?$ ./index.php?pretty;action=$1 [L,QSA]
RewriteRule ^(calendar|clock|collapse|contact|coppa|credits|deletemsg|display)/?$ ./index.php?pretty;action=$1 [L,QSA]
RewriteRule ^(dlattach|editpoll|editpoll2|emailuser|findmember|forum|groups|help)/?$ ./index.php?pretty;action=$1 [L,QSA]
RewriteRule ^(affiliates|downloads|helpadmin|im|jseditor|jsmodify|links|jsoption)/?$ ./index.php?pretty;action=$1 [L,QSA]
RewriteRule ^(lock|lockvoting|login|login2|logout|markasread|mascot|mergetopics)/?$ ./index.php?pretty;action=$1 [L,QSA]
RewriteRule ^(mlist|mgallery|moderate|modifycat|modifykarma|movetopic|movetopic2|notify)/?$ ./index.php?pretty;action=$1 [L,QSA]
RewriteRule ^(notifyboard|openidreturn|pm|post|post2|printpage|profile|quotefast)/?$ ./index.php?pretty;action=$1 [L,QSA]
RewriteRule ^(quickmod|quickmod2|recent|register|register2|reminder|removepoll|removetopic2)/?$ ./index.php?pretty;action=$1 [L,QSA]
RewriteRule ^(reporttm|requestmembers|restoretopic|search|search2|sendtopic|sitemap|smstats)/?$ ./index.php?pretty;action=$1 [L,QSA]
RewriteRule ^(suggest|spellcheck|splittopics|SMFQuiz|stats|sticky|staff|tags)/?$ ./index.php?pretty;action=$1 [L,QSA]
RewriteRule ^(theme|trackip|about:mozilla|about:unknown|unread|unreadreplies|verificationcode|viewprofile)/?$ ./index.php?pretty;action=$1 [L,QSA]
RewriteRule ^(vote|viewquery|viewsmfile|who|\.xml|multiplayer|xmlhttp|form)/?$ ./index.php?pretty;action=$1 [L,QSA]

#    Rules for: boards
RewriteRule ^([-_!~*'()$a-zA-Z0-9]+)/?$ ./index.php?pretty;board=$1.0 [L,QSA]
RewriteRule ^([-_!~*'()$a-zA-Z0-9]+)/([0-9]*)/?$ ./index.php?pretty;board=$1.$2 [L,QSA]

#    Rules for: topics
RewriteRule ^([-_!~*'()$a-zA-Z0-9]+)/([-_!~*'()$a-zA-Z0-9]+)/?$ ./index.php?pretty;board=$1;topic=$2.0 [L,QSA]
RewriteRule ^([-_!~*'()$a-zA-Z0-9]+)/([-_!~*'()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/?$ ./index.php?pretty;board=$1;topic=$2.$3 [L,QSA]
Elveda SMF...

Özgür

bu konudaki ile o yabancı bölümdeki kodlar değişik. Sen ikisini birbirine karıştırmışsın. Zira kategoriler yabancı bölümdekinde category/ olarak görünüyor. Buradakinde kategori. Sizin filterınız kategori olarak çalışıyor ama httaccess category/ . Hemde bana verdiğiniz httaccess dosyasında bu satırlar yok. yani baştan alıp tekrar deneyin. Bu konudakileri kullanın (:
So Long

Arveles

Elveda SMF...

Özgür

Mod bunu destekleyecek bir yapıya sahip değil çünkü. Mod için olan bir eklentinin mod kadar büyük olamayacağını düşünüyorum. Önce makalenin başlığı veritabanından alıp  türkçeye uygun ve boşlukları vesair değiştrecek hale getirmem çok daha fazla zamanımı ve emeğimi alacaktır. Yapsam bile böyle birşeyi paylaşmayı düşünmem. Zira mod sahibi şuan benim yaptığımı dahi yapmış değil mod için. Ben bu şekilde kullandım. http://www.rockayseri.net/rk/demolar/grup/6/ ve bu şekilde olmasının yeterli olduğunu düşünüyorum.
So Long

Arveles

özgür çok teşekkür ederim, gece gece yordum seni..
Elveda SMF...

Evo™

Özgür hocam teşekkürler eline sağlık çok iyi oldu bu json kodlarını eklerken şöyle bir hata veriyor doğru yere eklememe rağmen.
There was an error with the JSON array you submitted

intFUSE

açacağım sitemde pretty kullanmak istiyordum ki zaten senin bu yaptığın çevirme işlemini yapıyordum baktım sen yayınlamışsın bıraktım uğraşmayı :) teşekkürler Özgürcüm :)

Özgür

@єνσℓυтιση™ herhangi bir virgül veya benzeri birşey atlıyor olmalısın. Buradaki kodları denedim sorun yok.  Daha önce herhangi bir mod için bunu denemiş miydin? filterdaki değerleri buraya kopyalarsan hatayı ulabiliriz (:

Quote from: Яespect* on April 05, 2009, 07:09:32 AM
açacağım sitemde pretty kullanmak istiyordum ki zaten senin bu yaptığın çevirme işlemini yapıyordum baktım sen yayınlamışsın bıraktım uğraşmayı :) teşekkürler Özgürcüm :)
Sağol Berkan.
So Long

Evo™

Özgür bendeki sürüm 0.90 olan sürümü sorun olur mu onunla mı ilgilidir. Ayrıca güncellememi önerir misin eski sürüm Türkçe idi çünkü.

Özgür

Quote from: єνσℓυтιση™ on April 05, 2009, 11:43:13 AM
Özgür bendeki sürüm 0.90 olan sürümü sorun olur mu onunla mı ilgilidir. Ayrıca güncellememi önerir misin eski sürüm Türkçe idi çünkü.

Hayır kesinlikle güncellemeni önermem. Çünkü Danni javascript hatası konusunda hiç acele etmiyor. Zaten tek değişim artık emaille yollanan konu urlleri de pretty destekli. 0.9 sürümünden kaynaklanmaz bu. Dediğim gibi muhtemelen ufak bir hata var. Özel mesajla filter ölümündeki kodları gönder bana ben bakayım istersen bir.
So Long

Evo™

Teşekkürler Özgür senin sitende gallery içinde vardı sanırım onuda yayınlamayı düşünüyor musun.

Özgür

Abi gallery için çok kararsızım. Şimdi eğer (1,6 sürümünde olmayacak ama) daha sonraki sürümlerde daha kaliteli bir yapıyla destek verilirse ve url yapısı değişirse, modu her güncellediğinizde o kodları silip benim kodları kodları koymanız gerekecek. Ben bunu önemsemiyorum kendi sitemde çünkü google kaygım yok rockayseride. Ama çoğu kişi bunu zaten google için yapıyor.
So Long

Evo™

Özgür bu işi mod yapımcılarına söylesende tam olarak id olarak değilde başlık ismine göre linki değiştirse olmuyor mu çok mu zor o olay.

Advertisement: