Manual:ContentHandler/tr

ContentHandler özelliği, her şey için vikimetine güvenmek yerine, viki sayfalarındaki gelişigüzel içerik türlerini destekleyen bir mekanizmadır. Vikiveri projesinin bir parçası olarak geliştirilmiştir ve 1.21 sürümünden bu yana MediaWiki çekirdeğinin bir parçasıdır.

ContentHandler mimarisine kanonik genel bakış için, MediaWiki kod belgelerinde ContentHandler adresinde bakın.

Kullanılabilir içerik işleyicilerinin bir listesi için sayfasına bakın.

Hakkında
Bu oldukça radikal değişikliğin ardındaki mantık, tüm içerik için vikimetine güvenmeye zorlanmanın MediaWiki'de pek çok şeyi oldukça hantal hâle getirmesidir. Keyfi sayfa içeriği türleri için yeni takılabilir mimari, umarız:


 * tex veya markdown gibi bazı veya tüm sayfalarda farklı bir biçimlendirme dili kullanın.
 * CSS ve JavaScript sayfaları için özel durumlardan kurtulun.
 * yapılandırılmış yapılandırma verilerini, örn. Gadgets uzantısının MediaWiki:Gadgets-definition veya LanguageConverter MediaWiki:Conversiontable*** sayfalarında ne kullandığı.
 * vikimetin sayfalarına veri "ekleri" sağlayın, ör. coğrafi veriler için (sayfa için bir "çok parçalı" içerik modeli kullanarak, çok parçalı mesaj biçimi kullanılarak e-posta eklerinin uygulanmasına benzer şekilde). (Not: Bu hiçbir zaman gerçekleşmedi ve şimdi ile değiştirildi.)
 * kategorilerin vb. vikimetinin kendisinde tutulmadığı, ancak yine de normal şekilde saklanıp sürümlendirildiği bir sisteme geçiş (yine çok parçalı içerik modeli kullanılarak).
 * Vikiveri için yapılandırılmış verileri sayfa içeriği olarak kolay ve yerel bir şekilde depolayın.

Tasarım fikiri
Buradaki fikir, diğer türden verileri tam olarak vikimetinin şu anda depolandığı şekilde depolamak, ancak MediaWiki'yi her sayfa için ilgilendiği içerik türünden haberdar etmektir. Bu şekilde, her türlü veri bir viki sayfasının içeriği olarak kullanılabilir ve aynen eskisi gibi depolanır ve sürümü oluşturulur. Bunu başarmak için MediaWiki çekirdeğinde aşağıdakiler uygulandı:


 * her sayfanın içerik modelini takip edin. Bu, öncelikle veritabanındaki tablosunda (ayrıca  ve  tablolarında) yapılır ve ,   ve   gibi ilgili çekirdek sınıflar aracılığıyla erişilebilir hâle getirilir. İçerik modeli, ister metin içeren bir dize, ister dizilerin iç içe geçmiş yapısı veya bir PHP nesnesi olsun, içeriğin yerel formunu tanımlar. İçerikle ilgili tüm işlemler kendi yerel formu üzerinde gerçekleştirilir.
 * her revizyonun içerik formatını (serileştirme formatı) takip edin. Bu, öncelikle veritabanındaki tablosunda (ayrıca  tablosunda ancak  tablosunda değil) yapılır ve   gibi ilgili çekirdek sınıflar aracılığıyla erişilebilir hâle getirilir. Serileştirme formatının yalnızca revizyon yüklenirken ve depolanırken geçerli olduğunu, içeriğin serileştirilmiş formunda hiçbir işlem yapılmadığını unutmayın.
 * Not: Düz metin içeriği (vikimetin gibi) söz konusu olduğunda, içeriğin yerel biçimi serileştirilmiş biçimle (yani bir dize) aynıdır. Bununla birlikte, makul bir şekilde, yerel vikimetin formu gelecekte bir çeşit AST veya DOM olabilir.
 * Not: tablosu geçerli revizyon için içerik modelini kaydederken,, içerik modelini ve serileştirme formatını kaydeder. Model ve format teoride revizyondan revizyona değişebilir, ancak bu kafa karıştırıcı olabilir ve anlamlı farklılıklara izin vermez.

Bu, içerik üzerinde herhangi bir işlem gerçekleştirmesi gereken tüm kodun, içeriğin yerel biçiminin farkında olması gerektiği anlamına gelir. Bu bilgi, iki sınıfa dayalı, takılabilir bir işleyici çerçevesi kullanılarak özetlenmiştir:


 * sınıfı, içeriği olduğu gibi temsil eder ve içeriğin yerel formunda gerçekleştirilecek tüm standart işlemler için bir arabirim sağlar. İçeriğin ait olduğu sayfa veya revizyon bilgisi yoktur. İçerik nesneleri genellikle, ancak zorunlu değildir, değişmezdir.
 * Somut İçeriğe erişimi olmayan bir içerik modelinin özellikleri hakkındaki bilgiyi temsil eden  sınıfı. En önemlisi, ContentHandler örnekleri, Content nesneleri için bir fabrika görevi görür ve serileştirme/seriyi kaldırma sağlar. ContentHandler nesneleri, her içerik modeli için bir tane olmak üzere durum bilgisiz tekil nesnelerdir.

ContentHandler ayrıca,  ,   vb. alt sınıfların uygun örneklerini oluşturmak için kullanılır. Bu şekilde, her içerik türü için özelleştirilmiş bir kullanıcı arabirimi, ContentHandler arabirimi aracılığıyla kolayca takılabilir.

Revizyon metnine herhangi bir şekilde erişen tüm kod, bunun yerine Content nesnesi tarafından sağlanan yöntemleri kullanmak için değiştirilmelidir. Revizyon metnine erişim sağlayan temel sınıflar (en önemlisi  ve  ) metin yerine uygun Content nesnesine erişim sağlayacak şekilde uyarlanmıştır.

Geriye dönük uyumluluk
Sayfaların vikimetin içerdiği varsayımı, MediaWiki kod tabanı aracılığıyla yaygındır. Kodun hâlâ bunu varsayan bölümleriyle, özellikle uzantılarla uyumlu kalmak, bu nedenle oldukça önemlidir. İyi bir uyumluluk sağlamanın doğru yolu elbette genel arayüzleri değiştirmemektir. Bu nedenle, revizyon içeriğine erişim sağlayan tüm yöntemler ( vb. gibi) yerinde kalır ve bunun yerine içerik nesnesine erişime izin veren alternatif bir yöntemle tamamlanır (örneğin  ). Metin tabanlı yöntemler artık kullanımdan kaldırılmıştır, ancak vikimetin içeren tüm sayfalar/revizyonlar için tam olarak eskisi gibi çalışacaktır. Bu aynı zamanda eylem API için de geçerlidir.

Bir sayfanın metnini almayı kolaylaştırmak için bir kolaylık yöntemi olan  sağlanmıştır. Vikimetin (aynı zamanda JS ve CSS) gibi düz metin tabanlı içerik modelleri için,  yalnızca metni döndürür, bu nedenle eski metin tabanlı yöntem, bu tür revizyonlar için daha önce olduğu gibi döndürür. Bununla birlikte, vikimetin (veya başka bir düz metin içerik modeli, böyle bir CSS) içermeyen bir sayfa/revizyonda metin tabanlı geriye dönük uyumlu bir yöntem çağrıldığında, davranış ayarına bağlıdır: ignore, boş döndürmesini sağlar, fail bir istisna oluşturmasına ve serialize içeriğin varsayılan serileştirmesini döndürmesine neden olur. Varsayılan, çoğu senaryoda muhtemelen en muhafazakar seçenek olan ignore olur.

Ancak düzenleme için metin olmayan içerik varsayılan olarak desteklenmez. ve eylem API'sindeki ilgili işleyiciler metinsel olmayan içerik için başarısız olacak.

Bağlantılar

 * ve  sınıfları :


 * Ayarlar :


 * ContentHandler kullanan uzantılar :
 * Uzantı ile yeni bir içerik modeli nasıl eklenir:
 * Temel örnek: Extension:Markdown
 * uzantısı
 * — tüm içerik modellerinin listesi (hem çekirdek hem de uzantılarda)
 * — tüm içerik modellerinin listesi (hem çekirdek hem de uzantılarda)