Drupal nasıl çalışır? [kapalı]


151

Birisi Drupal 7 kontrol akışına mimari bir genel bakış sağlayabilir mi? Belki de bir sayfanın nasıl oluşturulduğu hakkında bir akış şeması anlamında. Drupal'ın nasıl çalıştığı konusunda hangi ek kaynaklara başvurmanızı önerirsiniz?


1
Soru? O zaman neden kendin
sormadın

O zamanlar bir yığın taşması olduğunu sanmıyorum. :)
Jeremy French

2
Drupal topluluğu her zaman dokümantasyonda yardımcı olacak insanları arar. Belgelerin beceriksiz veya öğreticilerin topal olup olmadığını neden yardım etmiyorsunuz? :)
Rimian

4
belgeleme, belgeleme veya çok fazla deneyim gerektiren bir anlayış gerektirir
Damon

Yanıtlar:


160

Drupal, kısmen nispeten derin bir işlev yığınına sahip olduğu için bu cephede kafa karıştırıcı olabilir. Her ne kadar yordamsal PHP olmasına rağmen, mimarisinde tamamen olay / dinleyici çalışır ve ana PHP betiğinde basit bir "akış" yoktur. Son zamanlarda bu konuda bir sunum yaptım ve slaytlar slayt paylaşımında yayınlandı, ancak hızlı bir üst düzey özet yararlı olabilir.

  • Drupal'ın index.php dosyası, ön taraf denetleyicisi olarak işlev görür. Tüm sayfa içinden geçirilir ve kullanıcının istediği "gerçek" URL / yol parametre olarak index.php'ye aktarılır.
  • Drupal'ın yol yönlendirici sistemi (MenuAPI), istenen yolu belirli bir eklenti modülüyle eşleştirmek için kullanılır. Bu eklenti modülü, sayfanın "birincil içeriğini" oluşturmaktan sorumludur.
  • Birincil sayfa içeriği oluşturulduktan sonra, Drupal'ın tema / arayüz sistemine içeriği dağıtan index.php temayı ('sayfa', $ içerik) çağırır. Orada, kenar çubukları / başlıklar / widget'lar vb.
  • Oluşturulan sayfa daha sonra apache'ye geri gönderilir ve kullanıcının tarayıcısına geri gönderilir.

Tüm süreç boyunca, Drupal ve üçüncü taraf eklenti modülleri olayları tetikliyor ve yanıt vermelerini dinliyor. Drupal bunu 'kanca' sistemi olarak adlandırır ve işlev adlandırma kuralları kullanılarak uygulanır. Örneğin, 'blog' modülü, blog_user () adlı bir işlevi uygulayarak 'kullanıcı' ile ilişkili olabilir. Drupal ifadesinde buna hook_user () denir .

Biraz hantal, ancak bir PHP tuhaflığı nedeniyle (yüklü tüm işlevlerin dahili bir hashtable tutar), Drupal'ın sadece yüklü eklentilerin bir listesini yineleyerek dinleyicileri hızlı bir şekilde kontrol etmesini sağlar. Her eklenti için, uygun şekilde adlandırılmış desende function_exists () öğesini çağırabilir ve varsa işlevi çağırabilir. ("'Login' olayını tetikliyorum. 'Mymodule_login' işlevi var mı? Bunu arayacağım. 'Yourmodule_login' var mı? Hayır? 'Nextmodule_login' hakkında ne dersiniz?" Vb. gayet iyi çalışıyor.

Drupal'da olan her şey , bu olaylardan birinin tetiklenmesi nedeniyle olur. MenuAPI, yalnızca 'url' olayını (hook_menu) tetiklediğinden ve tüm meta veri eklenti modüllerinin yanıt verdiği bir araya geldiğinden, farklı eklenti modülleri tarafından hangi URL'lerin / yolların işlendiğini bilir. ("'Haber / yeni' URL'siyle ilgileneceğim ve işte bu sayfanın oluşturulması gerektiğinde çağrılacak işlev ...") İçerik kaydediliyor çünkü Drupal'ın FormAPI'si bir sayfa oluşturmaktan sorumlu. bir modülün yanıt vermesi için 'bir form gönderildi' etkinliği. Saatlik bakım, hook_cron () tetiklendiğinden ve işlev adı olarak mymodulename_cron () içeren herhangi bir modülün işlevine sahip olacağı için gerçekleşir.

Diğer her şey nihayetinde sadece detaylardır - önemli detaylar, ancak bu temadaki varyasyonlar. index.php denetleyicidir, menü sistemi "geçerli sayfanın" ne olduğunu belirler ve o sayfayı oluşturma sürecinde birçok olay tetiklenir. Eklenti modülleri bu olaylara bağlanabilir ve iş akışını değiştirebilir / ek bilgi sağlayabilir / vb. Bu da birçok Drupal kaynağının modül yapmaya odaklanmasının nedeninin bir parçası. Modüller olmadan Drupal aslında 'Birisi bir sayfa istedi! Var mı? Hayır? Tamam, 404 kadar hizmet edeceğim. '


1
FWIW, D7'de biraz farklı (tema ('sayfa') gitti ve semboller artık kod kayıt defterinde önbelleğe alındı), ancak genel işlem aynı kalıyor.
FGM

2
Büyük açıklama Eaton, Burada takıldığınız için teşekkürler. Benim için sorum şu, ne olduğunu bulmak için her modülde var_dump koymak dışında, tüm bunları nasıl hata ayıklama?
Brian G

3
İyi soru. Ne hata ayıkladığınıza bağlıdır. Devel modülünü kurmak, size bazı yararlı araçlar vererek yardımcı olabilir. Adım (çoğu durumda) belirli bir sayfanın oluşturulmasından hangi modülün sorumlu olduğunu belirlemektir. hook_menu () URL'leri / yolları modüllerle eşleştirir, böylece yardımcı olabilir. Ardından menü geri aramasının ne yaptığını belirleme - bir form oluşturmak için drupal_get_form () veya HTML oluşturmak için bir tema ('some_custom_thing') çağırmak, vb. modülleri de ...
Eaton

Bu süper yararlı buldum. Drupal 7'nin nasıl farklı olduğunu biliyor musunuz?
Hortitude

D7 Güncellemesi: (ayrıca bakınız) drupal.org/node/350780
dreftymac

63

Drupal Sayfa Sunum Mekanizması

Drupal'ın nasıl çalıştığını anlamak için Drupal'ın sayfa sunum mekanizmasını anlamanız gerekir.

Kısacası, tüm çağrılar / url'ler / istekler, Drupal'ı çeşitli dosya / modüller dahil ederek ve sonra istek / url'ye hizmet vermek için modülde tanımlanan uygun işlevi çağırarak yükleyen index.php tarafından sunulur.

İşte Drupal'ın önyükleme sürecini açıklayan Pro Drupal Development kitabından alıntı,

Bootstrap Süreci

Drupal, bir dizi bootstrap aşamasından geçerek her istek üzerine kendini çizer. Bu aşamalar bootstrap.inc içinde tanımlanır ve aşağıdaki bölümlerde açıklandığı gibi devam eder.

Yapılandırmayı Başlat

Bu aşama Drupal'ın dahili yapılandırma dizisini doldurur ve sitenin temel URL'sini ($ base_url) oluşturur. Settings.php dosyası include_once () ile ayrıştırılır ve orada oluşturulan tüm değişken veya dize geçersiz kılmaları uygulanır. Ayrıntılar için / all / default / default.settings.php dosya sitelerinin “Değişken Geçersiz Kılmalar” ve “Dize Geçersiz Kılmalar” bölümlerine bakın.

Erken Sayfa Önbelleği

Yüksek düzeyde ölçeklenebilirlik gerektiren durumlarda, bir veritabanı bağlantısı denenmeden önce bir önbellek sisteminin çağrılması gerekebilir. İlk sayfa önbellek aşaması, page_cache_ fastpath () adında bir işlevi içeren ve içeriği tarayıcıya devralan ve döndüren bir PHP dosyası eklemenizi (include () ile) sağlar. Erken sayfa önbelleği, page_cache_fastpath değişkeni TRUE olarak ayarlanarak etkinleştirilir ve eklenecek dosya, cache_inc değişkeni dosyanın yoluna ayarlanarak tanımlanır. Örnek için önbellekleme bölümüne bakın.

Veritabanını Başlat

Veritabanı aşamasında, veritabanı türü belirlenir ve veritabanı sorguları için kullanılacak ilk bağlantı yapılır.

Ana Bilgisayar Adı / IP Tabanlı Erişim Kontrolü

Drupal, ana bilgisayarların ana bilgisayar adı / IP adresi temelinde yasaklanmasına izin verir. Erişim kontrol aşamasında, talebin yasaklanmış bir ana bilgisayardan gelip gelmediğini görmek için hızlı bir kontrol yapılır; öyleyse, erişim reddedilir.

Oturum İşlemeyi Başlat

Drupal, PHP'nin yerleşik oturum işleminden yararlanır, ancak veritabanı destekli oturum işlemeyi uygulamak için bazı işleyicileri kendi başlarına geçersiz kılar. Oturumlar, oturum aşamasında başlatılır veya yeniden oluşturulur. Mevcut kullanıcıyı temsil eden global $ kullanıcı nesnesi de burada başlatılır, ancak verimlilik için tüm özellikler kullanılamaz (gerektiğinde user_load () işlevine açık bir çağrı ile eklenir).

Geç Sayfa Önbelleği

Geç sayfa önbellek aşamasında, Drupal bir sayfanın sayfa önbelleğinden sunulup sunulmayacağını belirlemek için yeterli destek kodunu yükler. Bu, ayarları yapılandırma aşaması sırasında oluşturulan diziye veritabanından birleştirme ve modül kodunu yükleme veya ayrıştırma işlemlerini içerir. Oturum, isteğin anonim bir kullanıcı tarafından verildiğini ve sayfa önbelleğe almanın etkinleştirildiğini belirtirse, sayfa önbellekten döndürülür ve yürütme durdurulur.

Dil Belirleme

Dil belirleme aşamasında, Drupal'ın çok dilli desteği başlatılır ve geçerli sayfaya site ve kullanıcı ayarlarına göre hangi dilin kullanılacağına karar verilir. Drupal, dil desteğini belirlemek için yol öneki ve etki alanı düzeyinde dil anlaşması gibi çeşitli alternatifleri destekler.

yol

Yol aşamasında, yolları ve yol örtüşmesini işleyen kod yüklenir. Bu aşama, insan tarafından okunabilen URL'lerin çözümlenmesini sağlar ve dahili Drupal yolu önbelleğe alma ve aramaları yönetir.

Tam

Bu aşama, ortak işlevler, tema desteği ve geri arama eşlemesi, dosya işleme, Unicode, PHP görüntü araç setleri, form oluşturma ve işleme, posta işleme, otomatik sıralanabilir tablolar ve sonuç kümesi sayfalama desteği yükleyerek önyükleme işlemini tamamlar. Drupal'ın özel hata işleyicisi ayarlanmıştır ve etkinleştirilmiş tüm modüller yüklenir. Son olarak, Drupal init kancasını ateşler, böylece modüller talebin resmi olarak işlenmesinden önce bildirim alma şansına sahiptir.

Drupal önyüklemeyi tamamladığında, çerçevenin tüm bileşenleri kullanılabilir. Tarayıcının isteğini almanın ve onu kaldıracak PHP işlevine teslim etmenin zamanı geldi. URL'ler ve bunları işleyen işlevler arasındaki eşleme, hem URL eşleme hem de erişim kontrolü ile ilgilenen bir geri arama kayıt defteri kullanılarak gerçekleştirilir. Modüller geri çağırmalarını menü kancasını kullanarak kaydeder (daha fazla bilgi için bkz. Bölüm 4).

Drupal, tarayıcı isteğinin URL'sinin başarıyla eşlendiği bir geri arama olduğunu ve kullanıcının bu geri aramaya erişim iznine sahip olduğunu belirlediğinde, kontrol geri arama işlevine verilir.

Bir İsteği İşleme

Geri arama işlevi, isteği yerine getirmek için gereken verileri işlemek ve toplamak için gereken her şeyi yapar. Örneğin, http://example.com/ q = düğüm / 3 gibi içerik için bir istek alınırsa , URL node.module içindeki node_page_view () işleviyle eşlenir. Daha fazla işlem, bu düğümün verilerini veritabanından alır ve bir veri yapısına yerleştirir. O zaman tema zamanı.

Verileri Temalama

Tema, alınan, işlenen veya oluşturulan verilerin HTML'ye (veya XML veya başka bir çıktı biçimine) dönüştürülmesini içerir. Drupal, yöneticinin web sayfasına doğru bir görünüm ve his vermek için seçtiği temayı kullanır. Elde edilen çıktı daha sonra web tarayıcısına (veya başka bir HTTP istemcisine) gönderilir.


20

Eaton'ın cevabı iyi bir genel bakış sağlar. (Burada yeniyim, bu yüzden onu modifiye edemiyorum, dolayısıyla yorum.)

Benim için acımasız "aha" anı, her şeyin index.php aracılığıyla ve sonra modüllerin şelalesi (önce çekirdek, sonra siteye göre) aracılığıyla gerçekleştiğini fark etmekteydi. Çekirdek işlevselliği genişletmek için yeniden yazmayın. Bunun yerine modülü / sites / all / modülleri / veya / sites / [siteniz] / modüllerine kopyalayın ve THAT'ı genişletin veya bu yerlerde yeni bir modül oluşturun. Aynı temalar için. Modül dizinleri, tpl, css vb. Biçiminde ekran kodu da içerebilir.

Rails, Django vb.Gibi MVC tipi çerçeveleri daha sıkı kullanmaya alışkınsanız, tüm bunlar biraz kafa karıştırıcı olur. Modüller çok sayıda görüntü koduyla karışabilir ve başka birinin modüllerine veya şablonlarına bakarsanız, sonunda yığında geriye doğru yürürsünüz. PHP'de çalışmanın güzelliği / acısı.

İronik bir şekilde, "sadece bir uygulama oluşturun" bunu öğrenmenin en kötü yolu olabilir. Drupal, kontrol akışını anlayana kadar belirsiz olan kutudan çok şey yapar. Bir tpl dosyasında, örneğin l () gibi eğlenceli bir isme sahip bir fonksiyonun nereden geldiğini söyleyen hiçbir şey yoktur.


7

Ne kadar derin bir anlayış aradığınıza bağlıdır; Eğer php hakkında iyi bir bilginiz varsa, ben index.php ile başlayarak ve daha sonra include / bootstrap.inc ve daha sonra bu dizindeki diğer komut dosyalarına giderek, kod üzerinden okuma öneririz.

Anahtar dosyaları içerir:

  • menu.inc, URL'lerin içeriğe örtülü bir şekilde eşleştirilmesini gerçekleştirdiğinden, genel sistemin nasıl çalıştığını anlamak için çok önemlidir.
  • common.inc, API'nın temelini oluşturan gizemli işlevlerin çoğuna sahiptir.
  • module.inc, Eaton'ın bahsettiği kanca çağırmalarını ele alıyor
  • form.inc form görüntüleme, gönderme ve işleme ile ilgilenir
  • theme.inc sunum işler.

Modüller / dizinde bazı önemli işlevler de vardır; özellikle, modüller / düğüm / düğüm.modülü, genel olarak site içeriğini kapsüllemek için kullanılan düğüm sisteminin temelini oluşturur.

Kod, genel olarak, çok iyi yorumlanmış ve açıktır. Yorumlamada Doxygen işaretlemesinin kullanılması, kodun etkin bir şekilde kanonik dokümantasyon olduğu anlamına gelir.

Ayrıca, bir işlev tanımına hızla atlayabilen bir düzenleyici kullanarak bunu yapmaya yardımcı olur. Vim'i ctags ile birlikte kullanmak benim için çalışıyor; ctags'a .inc, .module vb. dosyaları php dosyası olarak endekslemelerini söylemelisiniz.


5

Drupal .php kodunu bir NetBeans projesine aktararak yük öğrendim. Daha sonra netbeans hata ayıklayıcısını çalıştırabilir ve sayfanın farklı aşamalarının bir araya gelmesini izleyebilirsiniz.


5

Konuyla ilgili en iyi kitaplar "Pro Drupal Development" ve "Drupal Kullanımı" dır.

"Pro Drupal Geliştirme", birkaç güzel akış şeması ve her bir Drupal API'sinin (formlar, tema, vb.) Kapsamlı özetlerini içerir. Özellikle kendi modüllerini ve temalarını yapan kişilere öğretici olmakla birlikte, Drupal'ı anlamak isteyen ortalama PHP meraklısı geliştirici için çok değerli. Bunun yanı sıra, çeşitli formlardaki alanları seçici bir şekilde gizlemek gibi şeyler üzerinde ekstra kontrol elde etmek için oluşturduğum her site için özel bir modül oluşturdum (genellikle uç formları için düğüm formlarını basitleştirmek amacıyla yapmak istersiniz. kullanıcılar), bu yüzden bu bilgiyi şapkanızın altında tutmak iyidir.

"Drupal kullanımı" galeriler, bloglar ve sosyal ağ siteleri gibi iyi şeylerin nasıl oluşturulacağını bilmek isteyen site geliştiricisini hedeflemektedir. Birkaç kullanım senaryosundan geçer ve her bir işi yapmak için mevcut modüllerin nasıl yapılandırılacağını gösterir. Bu süreçte, temel içerik modülleri olan "İçerik Oluşturma Kiti" (CCK) ve "Görünümler", nasıl özel bloklar ve şablonlar oluşturulacağı ve bir Drupal sitesi oluşturma giriş ve çıkışları hakkında bilgi edinirsiniz. Bu kitabı özellikle hızlanmak ve Drupal'ı hemen kullanmak isteyenler için öneriyorum. Bu süreçte Drupal'ın iç organizasyonunu anlarsınız.


5

Bu (Drupal 6 için) ve bu (Drupal 7 için) drupal için oldukça iyi bir mimari bakış. Daha fazla ayrıntı istiyorsanız , belgelerin çoğunun iyi olduğu bir şey yazmaya başlarım . Bunu elde etmek için somut bir şey olmadan yüksek bir ayrıntı düzeyinde öğrenmeye çalışmak, bir şeyi denemekten çok daha zor olacaktır.


4

Yeni katkıcı burada, konuşmaya 2 yıl geç kaldı ;-)

Https://stackoverflow.com/a/1070325/1154755 adlı kullanıcıya yanıt olarak

Çekirdek işlevselliği genişletmek için yeniden yazmayın. Bunun yerine modülü / sites / all / modülleri / veya / sites / [siteniz] / modüllerine kopyalayın ve THAT'ı genişletin veya bu yerlerde yeni bir modül oluşturun. Aynı temalar için.

Aslında, güncellemek için hiçbir zaman çekirdek bir modülü kopyalamak zorunda kalmadım. Drupal Hooks ihtiyacınız olan her şey olmalı.

Temalar için, evet, bazen gitmenin tek yolu budur, ancak genellikle ihtiyacınız olan sonucu elde etmek için bir alt tema oluşturabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.