Bagaimana cara kerja Drupal? [Tutup]

151

Bisakah seseorang memberikan gambaran arsitektur aliran kontrol Drupal 7? Mungkin dalam arti diagram alur tentang bagaimana suatu halaman dihasilkan. Sumber daya tambahan apa yang akan Anda sarankan untuk berkonsultasi tentang cara kerja Drupal?

domoaringatoo
sumber
1
Pertanyaan? Lalu mengapa tidak Anda bertanya sendiri :-)
liori
Saya tidak berpikir ada stack overflow saat itu. :)
Jeremy French
2
Komunitas Drupal selalu mencari orang untuk membantu dokumentasi. Mengapa tidak membantu jika dokumentasi ceroboh atau tutorial timpang? :)
Rimian
4
mendokumentasikan membutuhkan pemahaman .. yang membutuhkan dokumentasi atau banyak pengalaman
Damon

Jawaban:

160

Drupal dapat membingungkan pada bagian depan ini, sebagian karena ia memiliki tumpukan fungsi yang relatif dalam. Meskipun PHP prosedural itu murni event / pendengar yang didorong dalam arsitekturnya, dan tidak ada "aliran" sederhana dalam skrip PHP utama untuk Anda perhatikan. Baru-baru ini saya melakukan presentasi tentang subjek ini , dan slide diposting di slideshare, tetapi ringkasan tingkat tinggi yang cepat mungkin berguna.

  • File index.php Drupal berfungsi sebagai pengontrol sisi depan. Semua halaman disalurkan melalui itu, dan jalur "aktual" yang diminta pengguna diteruskan ke index.php sebagai parameter.
  • Sistem router jalur Drupal (MenuAPI) digunakan untuk mencocokkan jalur yang diminta dengan modul plugin yang diberikan. Modul plugin itu bertanggung jawab untuk membangun "konten utama" halaman.
  • Setelah konten halaman utama dibangun, index.php memanggil tema ('halaman', $ content), yang menyerahkan konten ke sistem tema / skinning Drupal. Di sana, itu dibungkus sidebar / header / widget / dll.
  • Halaman yang diberikan kemudian dikembalikan ke apache dan akan dikirim kembali ke browser pengguna.

Selama seluruh proses itu, modul plugin Drupal dan pihak ketiga menembakkan peristiwa, dan mendengarkannya untuk merespons. Drupal menyebut ini sistem 'pengait', dan itu diimplementasikan menggunakan konvensi penamaan fungsi. Modul 'blog', misalnya, dapat mencegat 'pengguna' yang terkait dengan mengimplementasikan fungsi bernama blog_user (). Dalam bahasa Drupal, itu disebut hook_user () .

Agak kikuk, tetapi karena kekhasan PHP (ini membuat hastabel internal dari semua fungsi yang dimuat), ini memungkinkan Drupal untuk dengan cepat memeriksa pendengar hanya dengan mengulangi daftar plugin yang diinstal. Untuk setiap plugin dapat memanggil function_exists () pada pola yang dinamai dengan tepat, dan memanggil fungsi jika ada. ("Saya memecat acara 'login'. Apakah fungsi 'mymodule_login' ada? Saya akan menyebutnya. Apakah 'yourmodule_login' ada? Tidak? Bagaimana kalau 'nextmodule_login'?" Dll.) Sekali lagi, sentuhannya kikuk tapi itu bekerja dengan cukup baik.

Segala sesuatu yang terjadi di Drupal terjadi karena salah satu peristiwa yang dipecat. MenuAPI hanya tahu tentang url / jalur apa saja yang ditangani oleh modul plugin yang berbeda karena ia menjalankan acara 'menu' (hook_menu) dan mengumpulkan semua modul plugin metadata merespons. ("Saya akan url url 'news / baru-baru ini', dan inilah fungsi untuk memanggil ketika halaman itu perlu dibangun ...") Konten hanya akan disimpan karena FormupI dari Drupal bertanggung jawab untuk membangun halaman, dan memadamkannya. acara 'formulir diajukan' agar modul merespons. Pemeliharaan setiap jam terjadi karena hook_cron () dipicu, dan modul apa pun dengan mymodulename_cron () sebagai nama fungsi akan dipanggil fungsinya.

Yang lainnya pada akhirnya hanyalah detail - detail penting, tetapi variasi pada tema itu. index.php adalah pengontrolnya, sistem menu menentukan apa itu "halaman saat ini", dan banyak peristiwa dipecat dalam proses membangun halaman itu. Modul plugin dapat menghubungkan ke peristiwa itu dan mengubah alur kerja / menyediakan informasi tambahan / dll. Itu juga bagian dari alasan begitu banyak sumber daya Drupal fokus membuat modul. Tanpa modul, Drupal tidak benar-benar MELAKUKAN apa pun selain mengatakan, 'Seseorang meminta halaman! Apakah itu ada Tidak? OK, saya akan menyajikan 404. '

Eaton
sumber
1
FWIW, ini sedikit berbeda di D7 (tema ('halaman') hilang dan simbol-simbol sekarang di-cache dalam registri kode), tetapi proses keseluruhan tetap sama.
FGM
2
Penjelasan hebat Eaton, Terima kasih telah nongkrong di sini. Pertanyaan saya untuk Anda adalah, bagaimana Anda men-debug semua ini, selain menempatkan var_dump di setiap modul untuk mencari tahu apa yang terjadi?
Brian G
3
Pertanyaan bagus. Tergantung pada apa yang Anda debug. Menginstal modul devel dapat membantu dengan memberikan Anda beberapa alat yang bermanfaat. Langkah (dalam banyak kasus) mengidentifikasi modul apa yang bertanggung jawab untuk membangun halaman tertentu. hook_menu () memetakan url / path ke modul, sehingga dapat membantu. Kemudian mengidentifikasi apa yang dilakukan panggil balik menu - memanggil drupal_get_form () untuk membangun formulir, atau tema ('some_custom_thing') untuk membuat HTML, dll. Perhatikan penggunaan fungsi seperti drupal_alter () atau module_invoke_all () yang memicu acara untuk lainnya modul juga ...
Eaton
Saya menemukan ini sangat membantu. Apakah Anda tahu perbedaan Drupal 7?
Hortitude
Pembaruan D7: (lihat juga) drupal.org/node/350780
dreftymac
63

Mekanisme Penyajian Halaman Drupal

Untuk memahami cara kerja Drupal, Anda perlu memahami mekanisme penyajian halaman Drupal.

Singkatnya, semua panggilan / url / permintaan dilayani oleh index.php yang memuat Drupal dengan memasukkan berbagai termasuk file / modul dan kemudian memanggil fungsi yang sesuai, didefinisikan dalam modul, untuk melayani permintaan / url.

Berikut adalah kutipan dari buku, Pro Drupal Development, yang menjelaskan proses bootstrap Drupal,

Proses Bootstrap

Drupal bootstraps sendiri pada setiap permintaan dengan melewati serangkaian fase bootstrap. Fase-fase ini didefinisikan dalam bootstrap.inc dan melanjutkan sebagaimana dijelaskan di bagian berikut.

Inisialisasi Konfigurasi

Fase ini mengisi array konfigurasi internal Drupal dan membuat URL basis ($ base_url) dari situs. File settings.php diurai melalui include_once (), dan setiap variabel atau string yang ditimpa ada diterapkan. Lihat bagian “Override Variable” dan “Override String” dari situs file / all / default / default.settings.php untuk detailnya.

Cache Halaman Awal

Dalam situasi yang membutuhkan skalabilitas tingkat tinggi, sistem caching mungkin perlu dipanggil sebelum koneksi basis data bahkan dicoba. Fase cache halaman awal memungkinkan Anda memasukkan (dengan menyertakan ()) file PHP yang berisi fungsi yang disebut page_cache_ fastpath (), yang mengambil alih dan mengembalikan konten ke browser. Tembolok halaman awal diaktifkan dengan mengatur variabel page_cache_fastpath ke TRUE, dan file yang akan dimasukkan ditentukan dengan mengatur variabel cache_inc ke jalur file. Lihat bab tentang caching sebagai contoh.

Inisialisasi Basis Data

Selama fase database, jenis database ditentukan, dan koneksi awal dibuat yang akan digunakan untuk permintaan database.

Hostname / Kontrol Akses Berbasis IP

Drupal memungkinkan pelarangan host atas dasar per-hostname / alamat IP. Pada fase kontrol akses, pemeriksaan cepat dilakukan untuk melihat apakah permintaan tersebut berasal dari host yang dilarang; jika demikian, akses ditolak.

Inisialisasi Penanganan Sesi

Drupal mengambil keuntungan dari penanganan sesi bawaan PHP tetapi mengesampingkan beberapa penangan dengan miliknya sendiri untuk mengimplementasikan penanganan sesi yang didukung basis data. Sesi diinisialisasi atau dibangun kembali pada fase sesi. Objek global $ user yang mewakili pengguna saat ini juga diinisialisasi di sini, meskipun untuk efisiensi tidak semua properti tersedia (mereka ditambahkan oleh panggilan eksplisit ke fungsi user_load () bila diperlukan).

Cache Halaman Akhir

Pada fase cache halaman akhir, Drupal memuat kode pendukung yang cukup untuk menentukan apakah akan melayani halaman dari cache halaman atau tidak. Ini termasuk menggabungkan pengaturan dari database ke dalam array yang telah dibuat selama fase konfigurasi inisialisasi dan memuat atau menguraikan kode modul. Jika sesi menunjukkan bahwa permintaan dikeluarkan oleh pengguna anonim dan caching halaman diaktifkan, halaman dikembalikan dari cache dan eksekusi berhenti.

Penentuan Bahasa

Pada tahap penentuan bahasa, dukungan multibahasa Drupal diinisialisasi dan keputusan dibuat mengenai bahasa apa yang akan digunakan untuk melayani halaman saat ini berdasarkan pengaturan situs dan pengguna. Drupal mendukung beberapa alternatif untuk menentukan dukungan bahasa, seperti awalan jalur dan negosiasi bahasa tingkat domain.

Path

Pada fase path, kode yang menangani path dan path aliasing dimuat. Fase ini memungkinkan URL yang dapat dibaca manusia diselesaikan dan menangani caching dan pencarian path Drupal internal.

Penuh

Fase ini menyelesaikan proses bootstrap dengan memuat pustaka fungsi umum, dukungan tema, dan dukungan untuk pemetaan panggilan balik, penanganan file, Unicode, toolkit gambar PHP, pembuatan dan pemrosesan formulir, penanganan surat, tabel yang dapat diurutkan secara otomatis, dan hasil paging yang diatur. Penangan kesalahan khusus Drupal diatur, dan semua modul yang diaktifkan dimuat. Akhirnya, Drupal melepaskan kait init, sehingga modul memiliki kesempatan untuk diberitahukan sebelum proses resmi permintaan dimulai.

Setelah Drupal menyelesaikan bootstrap, semua komponen framework tersedia. Saatnya untuk mengambil permintaan browser dan menyerahkannya ke fungsi PHP yang akan menanganinya. Pemetaan antara URL dan fungsi yang menanganinya diselesaikan menggunakan registri panggilan balik yang menangani pemetaan URL dan kontrol akses. Modul mendaftarkan panggilan balik mereka menggunakan kait menu (untuk rincian lebih lanjut, lihat Bab 4).

Ketika Drupal telah menentukan bahwa ada panggilan balik yang URL permintaan browser berhasil dipetakan dan bahwa pengguna memiliki izin untuk mengakses panggilan balik itu, kontrol diserahkan ke fungsi panggilan balik.

Memproses Permintaan

Fungsi panggilan balik melakukan pekerjaan apa pun yang diperlukan untuk memproses dan mengumpulkan data yang diperlukan untuk memenuhi permintaan. Misalnya, jika permintaan untuk konten seperti http://example.com/ q = node / 3 diterima, URL dipetakan ke fungsi node_page_view () di node.module. Pemrosesan lebih lanjut akan mengambil data untuk simpul itu dari database dan memasukkannya ke dalam struktur data. Lalu, saatnya bertema.

Mereka Data

Mereka melibatkan transformasi data yang telah diambil, dimanipulasi, atau dibuat menjadi HTML (atau XML atau format output lainnya). Drupal akan menggunakan tema yang dipilih administrator untuk memberikan tampilan dan nuansa yang benar pada halaman web. Output yang dihasilkan kemudian dikirim ke browser web (atau klien HTTP lainnya).

amitgoyal
sumber
20

Jawaban Eaton memberikan gambaran yang bagus. (Saya baru di sini jadi saya tidak bisa memperbaikinya, demikian komentarnya.)

Momen "aha" brutal bagi saya adalah menyadari segala sesuatu terjadi melalui index.php, dan kemudian melalui air terjun modul (inti pertama, kemudian oleh situs). Untuk memperluas fungsionalitas inti, jangan menulis ulang. Alih-alih menyalin modul ke / sites / all / modules / atau / sites / [yoursite] / modules dan perluas ITU, atau buat modul baru di tempat-tempat itu. Sama untuk tema. Direktori modul dapat berisi kode tampilan juga, dalam bentuk tpl, css dll.

Jika Anda terbiasa untuk memperketat kerangka kerja tipe MVC seperti Rails, Django dll. Semua ini menjadi sedikit membingungkan. Modul dapat bercampur dalam banyak kode tampilan, dan jika Anda melihat modul atau templat orang lain pada akhirnya Anda akan berjalan mundur melewati tumpukan. Itulah keindahan / rasa sakit bekerja di PHP.

Ironisnya, "hanya membangun aplikasi" mungkin merupakan cara terburuk untuk mempelajari ini. Drupal melakukan banyak hal di luar kotak yang tidak jelas sampai Anda mengetahui aliran kontrol. Tidak ada dalam file tpl yang memberi tahu Anda dari mana fungsi dengan nama menyenangkan seperti l () berasal, misalnya.

axoplasma
sumber
7

Itu tergantung pada seberapa dalam pemahaman yang Anda cari; jika Anda memiliki pengetahuan yang baik tentang php, saya akan menyarankan membaca kode itu sendiri, dimulai dengan index.php, dan kemudian pergi ke include / bootstrap.inc, dan kemudian beberapa skrip lain di direktori itu.

Kuncinya termasuk file:

  • menu.inc sangat penting untuk memahami cara kerja sistem secara keseluruhan, karena menangani banyak pemetaan implisit dari URL ke konten.
  • common.inc memiliki sebagian besar fungsi misterius yang membentuk basis API.
  • module.inc menangani permintaan hook yang disebutkan Eaton
  • form.inc berkaitan dengan tampilan formulir, pengiriman dan pemrosesan
  • theme.inc menangani presentasi.

Ada juga beberapa fungsi utama dalam direktori modules /; khususnya, modules / node / node.module membentuk dasar dari sistem node, yang secara umum apa yang digunakan untuk merangkum konten situs.

Kode ini, secara umum, sangat baik dikomentari dan jelas. Penggunaan marka Doxygen dalam komentar berarti bahwa kode secara efektif adalah dokumentasi kanonik.

Ini juga membantu untuk melakukan ini menggunakan editor yang dapat dengan cepat melompat ke definisi suatu fungsi. Menggunakan vim dalam kombinasi dengan ctag bekerja untuk saya; Anda harus memberi tahu ctag untuk mengindeks file .inc, .module, dll. sebagai file php.

intuisi
sumber
5

Saya belajar banyak dengan mengimpor kode .php drupal ke proyek NetBeans. Anda kemudian dapat menjalankan debugging netbeans dan menonton berbagai fase halaman secara bersamaan.

Ben Hammond
sumber
5

Buku-buku terbaik tentang masalah ini adalah "Pengembangan Pro Drupal" dan "Menggunakan Drupal."

"Pengembangan Pro Drupal" mencakup beberapa diagram alur yang bagus dan ringkasan menyeluruh dari masing-masing API Drupal (formulir, tema, dll.). Ini dimaksudkan untuk menjadi sangat instruktif bagi orang yang membuat modul dan tema mereka sendiri, tetapi memiliki banyak nilai bagi pengembang PHP-savvy rata-rata yang ingin memahami Drupal. Selain itu, saya telah membuat modul khusus untuk setiap situs yang saya buat, hanya untuk mendapatkan kontrol ekstra atas hal-hal seperti menyembunyikan bidang secara selektif pada berbagai bentuk (yang umumnya ingin Anda lakukan demi menyederhanakan bentuk simpul untuk akhir pengguna), jadi ada baiknya memiliki pengetahuan ini di bawah topi Anda.

"Menggunakan Drupal" ditujukan untuk pengembang situs yang ingin tahu cara membangun barang bagus seperti galeri, blog, dan situs jejaring sosial. Itu melewati beberapa kasus penggunaan dan menunjukkan cara mengkonfigurasi modul yang ada untuk melakukan setiap pekerjaan. Dalam prosesnya, Anda akan dibiasakan dengan modul tambahan penting "Content Construction Kit" (CCK) dan "Views," cara membuat blok dan templat khusus, dan seluk beluk dalam memelihara situs Drupal. Saya merekomendasikan buku ini terutama bagi mereka yang ingin meningkatkan kecepatan dan sebenarnya MENGGUNAKAN Drupal segera. Dalam prosesnya Anda mendapatkan pemahaman tentang organisasi internal Drupal.

Scott Lahteine
sumber
5

Ini (untuk Drupal 6) & ini (untuk Drupal 7) adalah gambaran arsitektur drupal yang cukup bagus. Jika Anda ingin lebih detail maka saya akan mulai menulis sesuatu yang sebagian besar dokumentasinya bagus. Mencoba mempelajarinya pada tingkat detail yang tinggi tanpa sesuatu yang konkret untuk dicapai akan jauh lebih sulit daripada mencoba sesuatu.

Jeremy French
sumber
4

Kontributor baru di sini, 2 tahun terlambat dalam percakapan ;-)

Membalas https://stackoverflow.com/a/1070325/1154755

Untuk memperluas fungsionalitas inti, jangan menulis ulang. Alih-alih menyalin modul ke / sites / all / modules / atau / sites / [yoursite] / modules dan perluas ITU, atau buat modul baru di tempat-tempat itu. Sama untuk tema.

Sebenarnya, saya tidak pernah menyalin modul inti untuk memperbaruinya. Drupal Hooks harus sesuai kebutuhan Anda.

Untuk tema, ya, kadang-kadang itu satu-satunya cara untuk pergi, tetapi sering kali, Anda dapat membangun subtitle untuk mendapatkan hasil yang Anda butuhkan.

Robin Millette
sumber