From 888fa27278a1791dc77385bfdb60a52df54e898b Mon Sep 17 00:00:00 2001 From: kabayan <> Date: Tue, 28 Aug 2007 17:55:45 +0000 Subject: Indonesian Blog Tutorial Day 1 and Day 2 --- .../protected/pages/Day1/id/CreateContact.page | 204 +++++++++++++++++++++ .../protected/pages/Day1/id/Setup.page | 164 +++++++++++++++++ .../protected/pages/Day1/id/ShareLayout.page | 180 ++++++++++++++++++ .../protected/pages/Day1/id/directories.gif | Bin 0 -> 3611 bytes .../protected/pages/Day1/id/directories2.gif | Bin 0 -> 4147 bytes .../protected/pages/Day1/id/directories3.gif | Bin 0 -> 3531 bytes .../protected/pages/Day1/id/output.gif | Bin 0 -> 13379 bytes 7 files changed, 548 insertions(+) create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/CreateContact.page create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/Setup.page create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/ShareLayout.page create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/directories.gif create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/directories2.gif create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/directories3.gif create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/output.gif (limited to 'demos/blog-tutorial/protected/pages/Day1') diff --git a/demos/blog-tutorial/protected/pages/Day1/id/CreateContact.page b/demos/blog-tutorial/protected/pages/Day1/id/CreateContact.page new file mode 100644 index 00000000..664363d0 --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day1/id/CreateContact.page @@ -0,0 +1,204 @@ + + +

Membuat Halaman Kontak

+ +

+Kita telah membuat halaman standar Home.page menggunakan piranti baris perintah PRADO. Halaman relatif statis karena ia tidak berisi konten dinamis. Dalam bagian ini, kita akan membuat halaman interaktif bernama Contact. +

+ +

+Kegunaan dari halaman Contact adalah untuk mengumpulkan umpan balik dari para pengguna sistem blog kita. Untuk melaksanakan tujuan ini, kita merencanakan untuk menyajikan para pengguna dengan sebuah formulir umpan balik yang harus diisi. Dalam formulir ini, kita akan mengharuskan para pengguna untuk menyediakan namanya, alamat email, dan konten umpan balik. Setelah formulir diisi dan dikirimkan, email yang berisi umpan balik akan dikirimkan ke administrator situs. +

+ +

+Untuk membuat halaman Contact, kita memerluka dua file di bawah direktori pages: file template halaman Contact.page dan file kelas halaman Contact.php. +

+ + + + +Halaman harus berupa file template (berekstensi .page) atau file kelas, atau keduanya: +

+ + +
+ + +

Membuat Template Halaman

+ +

+Pertama kita membuat file template untuk halaman Contact. +

+ +

+Kita menggunakan template untuk menghatur tata letak penyajian terhadap formulir umpan balik. Dalam template, kita menggunakan kotak teks untuk mengumpulkan nama pengguna, email dan umpan balik. Dan kita menggunakan validator guna memastikan bahwa pengguna menyediakan semua informasi ini sebelum mengirimkan formulir umpan balik. Seluruh template adalah sebagai berikut, +

+ + + +My Blog - Contact + +

Contact

+

Please fill out the following form to let me know your feedback on my blog. Thanks!

+ +<com:TForm> + +Your Name: +<com:TRequiredFieldValidator ControlToValidate="Name" + ErrorMessage="Please provide your name." + Display="Dynamic" /> +
+<com:TTextBox ID="Name" /> + +
+Your Email: +<com:TRequiredFieldValidator ControlToValidate="Email" + ErrorMessage="Please provide your email address." + Display="Dynamic" /> +<com:TEmailAddressValidator ControlToValidate="Email" + ErrorMessage="You entered an invalid email address." + Display="Dynamic" /> +
+<com:TTextBox ID="Email" /> + +
+Feedback: +<com:TRequiredFieldValidator ControlToValidate="Feedback" + ErrorMessage="Please provide your feedback." + Display="Dynamic" /> +
+<com:TTextBox ID="Feedback" + TextMode="MultiLine" + Rows="10" + Columns="40" /> + +
+<com:TButton Text="Submit" OnClick="submitButtonClicked" /> + +</com:TForm> + + + +
+ +

+Seperti kita lihat bahwa template terlihat sangat mirip dengan halaman HTML normal. Perbedaan utamanya adalah bahwa template berisi beberapa tag <com:>. Setap tag <com:> merujuk ke sebuah kontrol yang propertinya diinisialisasi dengan pasangan nama-nilai dalam tag. Sebagai contoh, <com:TButton> merujuk ke kontrol TButton guna menampilkan sebuah tombol di mana pengguna dapat di klik pengguna untuk mengirimkan formulir umpan balik. Untuk sintaks lengkap template, silahkan rujuk Tutorial Cepat. +

+ + +PRADO menyediakan kontrol untuk setiap tipe input HTML. Sebagai contoh, TTextBox menampilkan field input teks, TDropDownList menampilkan kotak kombo. Setiap kontrol adalah sebuah komponen yang dapat diakses dalam kode sebagai obyek dengan properti yang bisa dikonfigurasi. + + +

+Selain kontrol TTextBox, template juga menggunakan banyak kontrol validator yang memastikan input pengguna memuaskan aturan validasi spesifik. Sebagai contoh, untuk memastikan alamat email sah yang dilengkapi, kita menggunakan dua validator untuk memvalidasi kotak teks "email", seperti ditampilkan dalam kode berikut: +

+ + +Your Email: +<com:TRequiredFieldValidator + ControlToValidate="Email" + ErrorMessage="Please provide your email address." + Display="Dynamic" /> +<com:TEmailAddressValidator + ControlToValidate="Email" + ErrorMessage="You entered an invalid email address." + Display="Dynamic" /> +
+<com:TTextBox ID="Email" /> +
+
+ +

+Di bawah ini kita meringkas kontrol yang dipakai dalam template halaman: +

+ + + + +Menulis template dengan editor teks biasa dapat membosankan dan tidak intuitif untuk para desainer. Untuk memudahkan situasi ini, PRADO telah menyertakan dalam rilis ekstensi Adobe Dreamweaver yang mendukung pelengkapan-otomatis tag PRADO (misalnya menyertakan nama kontrol, nama properti, nama event, dll) dalam Dreamweaver. + + + +

Membuat Kelas Halaman

+ +

+Sekarang kita membuat kelas halaman Contact.php. Alasan kita membutuhkan kelas halaman adalah karena kita perlu merespon umpan balik yang dikirimkan oleh pengguna. + +

+Notice in the template we have the following line. The template essentially states that when a user clicks on the button, it should call the submitButtonClicked() method. Here OnClick is the name of the user click event, and the method must be defined in the page class. +

+ + + <com:TButton Text="Submit" OnClick="submitButtonClicked" /> + + +

+Selanjutnya kita menuliskan kelas halaman seperti berikut: +

+ + +IsValid) // memeriksa apakan validasi input berhasil + { + // mendapatkan nama pengguna, email, umpan balik dari kotak teks + $name = $this->Name->Text; + $email = $this->Email->Text; + $feedback = $this->Feedback->Text; + + // mengirimkan email ke administrator dengan informasi di atas + $this->mailFeedback($name, $email, $feedback); + } + } + + protected function mailFeedback($name, $email, $feedback) + { + // implementasi pengiriman email umpan balik + } +} +?> + + +

+Kode di atas sebagian besar cukup jelas. Kenyataannya, kami hanya menampilkan skema pemrograman pengendalian-event. Dalam pengendali event submitButtonClicked(), kita mengambil input pengguna. Sebagai contoh, $this->Name->Text mengembalikan nilai properti Text dari kontrol Name yang merupakan kotak teks yang mengumpulkan informasi nama pengguna. +

+ + +Nama kelas halaman harus sama seperti nama file. Ini juga persyaratan untuk penulisan komponen kelas PRADO. + + + +

Pengujian

+ +

+Contact yang baru saja kita buat dapat kita uji dengan URL http://hostname/blog/index.php?page=Contact. Jika kita mengklik pada tombol submit tanpa memasukan informasi apapun, kita akan melihat pesan kesalahan muncil di sebelah kotak teks terkait. Jika kita memasukan semua informasi yang diperlukan, metode mailFeedback() akan dipanggil. +

+ + + +

+Peningkatan berikutnya terhadap halaman ini adalah untuk menampilkan beberapa pesan konfirmasi pada halaman setelah pengguna mengirimkan umpan balik. Dan kemungkinan, browser akan dialihkan ke halaman lain jika pengiriman berhasil. Kita akan membiarkan tugas ini bagi para pembaca kita. +

+ + +Setiap validator mewakili aturan validasi. Satu kontrol input dapat dikaitkan dengan satu atau multipel validator. Validator melakukan validasi pada sisi klien dan sisi server. Pada sisi klien, yaitu browser, validasi dikerjakan dmenggunakan javascript; pada sisi server, validasi dikerjakan dengan menggunakan kode PHP. Validasi sisi-klien dapat dimatikan, sementara validasi sisi-server tidak bisa. Ini memastikan input pengguna selalu diperiksa oleh aturan validasi yang dietapkan. + + +
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/id/Setup.page b/demos/blog-tutorial/protected/pages/Day1/id/Setup.page new file mode 100644 index 00000000..16c8b498 --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day1/id/Setup.page @@ -0,0 +1,164 @@ + + +

Persiapan Awal

+ +

+Kita mulai dengan menyiapkan direktori dan file yang diperlukan oleh kebanyakan aplikasi PRADO. Kita menggunakan piranti baris perintah PRADO untuk melaksanakan tujuan ini. +

+ +

+Anggap blog adalah nama direktori untuk menampung seluruh sistem blog, dan URL untuk mengakses folder ini adalah http://hostname/blog/ (ganti hostname dengan nama host sebenarnya). +

+ +

+Di bawah direktori blog, kita menjalankan piranti baris perintah PRADO dengan perintah berikut (ganti path/ke dengan path sebenarnya ke instalasi kerangka kerja PRADO): +

+ +php path/ke/prado-cli.php -c . + + +

+Menjalankan perintah di atas akan membuat direktori dan file berikut: +

+ + + +

+Sekarang kita mempunyai kerangka aplikasi PRADO yang dapat diakses melalui URL http://hostname/blog/index.php yang menampilkan halaman Web dengan tulisan "Welcome to PRADO". +

+ +

+Sangat bermanfaat mempelajari lebih rinci mengenai direktori dan file yang baru saja kita buat. +

+ + +

File Awal

+ +

Naskah Entri

+ +

+Setiap aplikasi PRADO mempunyai naskah entri, sering dinamakan sebagai index.php. Dalam kebanyakan kasus, ia hanya naskah PHP yang secara langsung dapat diakses oleh pengguna Web. Ini mengurangi resiko terhadap ijin para pengguna Web untuk menjalankan naskah yang tidak diinginkan pada server. +

+ +

+Kegunaan utama dari naskah entri adalah untuk mengawali aplikasi PRADO dan membiarkan ia menangani permintaan pengguna. Naskah entri biasanya berisi pernyataan PHP berikut, +

+ + +run(); +?> + + + +Nama naskah entri tidak harus index.php. Ia dapat berupa nama apa saja selama server Web dapat mengatakan bahwa naskah adalah naskah PHP 5. Sebagai contoh, pada beberapa lingkungan hosting berbagi, seseorang mungkin perlu untuk menamai naskah sebagai index.php5 agar ia bisa ditangani dengan benar oleh server the Web. + + +

Konfigurasi Aplikasi

+

+File XML opsional application.xml berisi konfigurasi aplikasi. Kegunaan utamanya adalah untuk mengkustomisasi dalam cara yang bisa mengkonfigurasi turunan aplikasi yang dibuat dalam naskah entri. Sevagai contoh, kita dapat menghidupkan fitur pencatatan untuk sistem blog kita dengan bantuan konfigurasi aplikasi. +

+ +

+File application.xml yang sekarang kita miliki hampir kosong. Sebenarnya kita dapat menghapusnya dengan aman karena aplikasi pada saat ini hanya menggunakan seting standar PRADO. Seiring kita ke depan, kita akan merujuk kembali secara kontan dan menampilkan bagaimana untuk mengkonfigurasi aplikasi kita dalam application.xml. +

+ + +

Homepage

+ +

+Homepage (juga disebut halaman standar) Home.page adalah satu-satunya halaman yang dibuat oleh piranti baris perintah PRADO. Berisi konten dalam file ini yang muncul dalam browser saat mengunjungi URL http://hostname/blog/index.php. +

+ +

+Content in the file Home.page uses the PRADO template format, which is mostly like HTML enhanced with a few PRADO-specific tags. For example, in Home.page we see the following pure HTML content: +

+ + + + + Welcome to PRADO + + +

Welcome to PRADO!

+ + +
+ + +

Direktori Awal

+ +

Direktori protected

+ +

+Direktori protected, juga dikenal sebagai path basis aplikasi, adalah direktori akar yang menampung halaman, template, konfigurasi, data, dll. Nama protected menunjukan bahwa direktori ini harus disembunyikan dari para pengguna Web, karena file di bawah direktori ini berisi data sensitif. +

+ +

+Server Web berbeda mempunyai berbeda terhadap "melindungi" direktori. Untuk sever httpd Apache, cara termudah adalah untuk menempatkan file bernama .htaccess di bawah direktori dengan isi deny from all. +

+ + +

Direktori protected/runtime dan assets

+ +

+Direktori protected/runtime dan assets adalah dua direktori yang harus disetel bisa ditulisi oleh proses server Web. Direktori runtime menyimpan data sensitif (misalnya konfigurasi aplikasi yang diuraikan) yang dibuat saat menjalankan aplikasi PRADO, karena direktori assets menyimpan sumber daya yang dipublikasikan (misalnya file gambar, file javascript). +

+ + +Aman untuk menghapus file dan direktori di bawah protected/runtime dan assets. Sebenarnya para pengembang direkomendasikan untuk melakukan pekerjaan pembersihan ini ketika mereka memutakhirkan instalasi PRADO. + + + +

Direktori pages

+ +

+Direktori pages adalah akar direktori halaman yang menampung seluruh halaman dalam sebuah aplikasi PRADO. Ini mirip analogi terhadap direktori htdocs pada server Web httpd Apache. +

+ +

+Kita sudah melihat bagaimana cara mengakses homepage. Untuk mengakses halaman yang ditempatkan di bawah pages, menggunakan URL http://hostname/blog/index.php?page=path.ke.NamaHalaman. Berdasarkan URL ini, PRADO akan melihar halaman bernama NamaHalaman di bawah direktori pages/path/ke. URL yang kita pakai untuk mengakses homepage sebelumnya sama dengan http://hostname/blog/index.php?page=Home. +

+ + +

Kustomisasi

+ +

+Dimungkinkan untuk mengkustomisasi nama dan lokasi terhadap file dan direktori yang dijelaskan di atas. +

+ +

+Sebagai contoh, untuk meningkatkan keamanan, seseorang mungkin ingin memindahkan seluruh direktori protected ke tempat lain yang bukan folder Web. Untuk melakukannya, gunakan pernyataan PHP berikut untuk membuat turunan aplikasi dalam naskah entri: +

+ + +$application = new TApplication( 'path/ke/protected' ); + + +

+Untuk membuat lokasi akar direktori halaman dan mengubah nama homepage, seseorang dapat menetapkannya dalam konfigurasi aplikasi application.xml sebagai berikut: +

+ + + + + + + + + + +

+Setelah anda mempelajari lebih jauh mengenai PRADO, anda akan melihat bahwa PRADO adalah kerangka kerja fleksibel yang membolehkan anda untuk mengkustomisasi hampir setiap aspeknya. Kami akan menjelaskan lebih lanjut teknik kustomisasi setelah kita melanjutkan tutorial kita. +

+ +
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/id/ShareLayout.page b/demos/blog-tutorial/protected/pages/Day1/id/ShareLayout.page new file mode 100644 index 00000000..d505beed --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day1/id/ShareLayout.page @@ -0,0 +1,180 @@ + + +

Berbagi Tata Letak Umum

+ +

+Dalam bagian ini, kita akan menggunakan fitur master/content PRADO untuk membagi tata letak umum diantara halaman. Tata letak merujuk ke area yang sama atay sebagian besar sama untuk setelan halaman. Sebagai contoh, dalam sistem blog kita, semua halaman akan berbagi header yang sama, footer dan bar-samping yang berisi link jalan pintas. Implementasi langsung adalah untuk mengulang tata letak umum dalam setiap halaman. Akan tetapi, pendekatan ini adalah cenderung salah dan sulit untuk dipelihara. Fitur master/content membolehkan kita untuk menggunakan tata letak umum sebagai sebuah kontrol yang memusatkan logika dan penyajian tata letak umum untuk setiap halaman. +

+ + +Ini juga memungkinkan untuk membagi tata letak umum melalui penyertaan template, yang mirip inklusi file PHP. Akibat dari penyertaan inklusi template ini adalah bahwa ia tidak berdiri sendiri dan tidak membawa kelas untuk mengisi logika untuk tata letak umum. + + + +

Membuat Kontrol Master

+ +

+Sekarang kita membuat kontrol master MainLayout untuk mewakili tata letak umum berbagi dengan halaman blog kita. Kontrol MainLayout adalah kontrol template yang diperluas dari TTemplateControl. Ini mememerlukan file template MainLayout.tpl dan sebuah file kelas MainLayout.php yang ditempatkan di bawah direktori yang sama. Guna menjembatani pemeliharaan, kita membuat direktori baru protected/layouts untuk menampungnya. +

+ + + +

+Untuk saat ini, MainLayout hanya berisi header dan footer sederhana, seperti ditampilkan berikut ini. Kedepan, kita akan menambahkan bar-samping. Para pembaca juga disarankan untuk meningkatkan tata letak dengan fitur yang lainnya. +

+ + + +<com:THead /> + +<com:TForm> +
+ + + +
+<com:TContentPlaceHolder ID="Main" /> +
+ + + +
+</com:TForm> + + +
+ +

+Contoh di atas memperlihatkan konten dalam file template MainLayout.tpl. Tiga tag baru ini dipakai: +

+ + +

+File kelas MainLayout.php sangat sederhana: +

+ + + + + + +Nama ekstensi file untuk template halaman .page, sementara untuk template non-halaman yaitu .tpl. Ini untuk membedakan halaman dari kontrol lain. Keduanya menggunakan sintaks template yang sama. Untuk halaman, file kelasnya adalah opsional (standarnya TPage), sementara untuk kontrol non-halaman, file kelasnya adalah mandatori. Mirip dengan Java, nama file kelas harus sama seperti nama kelas. Harap berhati-hati mengenai sensitifitas-huruf pada sistem Linux/Unix. + + + +

Menggunakan Kontrol Master

+

+Untuk menggunakan kontrol master yang baru saja dibuat, kita akan memodifikasi Home.page dan Contact.page. Dalam keadaan tertentu, kita perlu untuk menghapus header dan footer darinya karena kontrol master akan bertanggung jawab untuk menampilkannya; dan kita perlu memberitahu dua halaman di mana mereka harus menggunakan MainLayout sebagai masternya. +

+ +

+Kode berikut memperlihatkan konten dalam Contact.page setelah perubahan: +

+ + +<%@ MasterClass="Application.layouts.MainLayout" Title="My Blog - Contact" %> + +<com:TContent ID="Main"> + +

Contact

+

Please fill out the following form to let me know your feedback on my blog. Thanks!

+ +...kotak teks dan validator untuk nama pengguna... + +...kotak teks dan validator untuk emali pengguna... + +...kotak teks dan validator untuk konten umpan balik... + +<com:TButton Text="Submit" OnClick="submitButtonClicked" /> + +</com:TContent> +
+ +

+Konten yang dikurung di dalam tag <com:TContent> tag akan disisipkan ke dalam tempat yang disiapkan oleh <com:TContentPlaceHolder> pada template master. +

+ + +Dimungkinkan untuk memiliki multipel TContentPlaceHolder dalam sebuah template master dan multipel TContent dakan tenokate konten. Mereka saling dipasangkan dengan nilai ID-nya. Juga dimungkinkan untuk membuat template konten menjadi master template konten lainnya dengan menempatkan TContentPlaceHolder di pembentuk. Ini disebut master berulang. + + +

+Selain <com:TContent>, kita juga melihat tag baru lain <%@ %> di atas, yang disebut tag kontrol template. Ia berisi pasangan nama-nilai yang dipakai untuk menginisialisasi properti terkait bagi pemilik template, yaitu, halaman Contact. +

+ +

+Dengan menyetel properti MasterClass sebagai Application.layouts.MainLayout, kita menginstruksikan halaman Contact untuk menggunakan MainLayout sebagai masternya. Di sini, kita sedang menggunakan format namespace untuk merujuk ke kelas MainLayout. +

+ + +Format namespace sebagian besar dipakai dalam pemrograman PRADO. Dipakai bersama dengan alias path. PRADO mendefinisikan dua alias path: System merujuk ke direktori framework pada instalasi PRADO, dan Application merujuk ke direktori protected. Namespace Application.layouts.MainLayout selanjutnya bisa diterjemahkan sebagai protected/layouts/MainLayout yang tepatnya adalah nama file (tanpa ekstensi .php) untuk kelas MainLayout. + + + +

Cara Alternatif Menetapkan Master

+ +

+Ada beberapa cara tambahan untuk menetapkan kelas master untuk sebuah halaman. +

+ +

+Kita dapat menetapkan master dalam kode seperti berikut untuk menghidupkan perubahan dinamis terhadap tata letak: +

+ + +MasterClass='Path.To.NewLayout'; + } + + // ... +} +?> + + +

+Dalam contoh di atas, kita menetapkan MasterClass dalam metode onPreInit() yang diturunkan dari TPage. Metode dipanggil oleh PRADO langsung setelah turunan halaman dibuat. Selanjutnya kita dapat menentukan secara dinamis tata letak yang dipakai saat halaman diminta. Sebagai contoh, ketika halaman yang diminta oleh pengguna terdaftar kita memakai tata letak A, dan tata letak B dipakai jika pengguna tamu yang meminta halaman. +

+ +

+Kita juga dapat menetapkan master dalam konfigurasi aplikasi atau konfigurasi halaman. Kode berikut memperlihatkan konfigurasi aplikasi yang dimutakhirkan untuk sistem blog kita: +

+ + + + + + + + + + + + + + +

+Dengan melakukan demikian, kita menghindari kesulitan pada penetapan master dalam setiap template halaman. Jika kita memutuskan untuk menggunakan master yang berbeda untuk halaman, kita hanya perlu mengubah konfigurasi aplikasi. Untuk alasan ini, dalam sistem blog kita, kita akan menggunakan pendekatan untuk menetapkan master. +

+ + +Ada urutan yang menentukan master yang mana yang sebenarnya diterapkan ketika ia ditetapkan dalam tempat multipel. Dalam keadaan tertentu, onPreInit() diambil lebih dulu di atas template halaman di atas konfigurasi aplikasi/halaman. Oleh karena itu, jika kita menetapkan MainLayout dalam konfigurasi aplikasi/halaman dan kita menetapkan SpecialLayout dalam Contact.page, master yang efektif adalah yang terakhir. + + +
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/id/directories.gif b/demos/blog-tutorial/protected/pages/Day1/id/directories.gif new file mode 100644 index 00000000..884e15bc Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day1/id/directories.gif differ diff --git a/demos/blog-tutorial/protected/pages/Day1/id/directories2.gif b/demos/blog-tutorial/protected/pages/Day1/id/directories2.gif new file mode 100644 index 00000000..edf264d0 Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day1/id/directories2.gif differ diff --git a/demos/blog-tutorial/protected/pages/Day1/id/directories3.gif b/demos/blog-tutorial/protected/pages/Day1/id/directories3.gif new file mode 100644 index 00000000..3451935f Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day1/id/directories3.gif differ diff --git a/demos/blog-tutorial/protected/pages/Day1/id/output.gif b/demos/blog-tutorial/protected/pages/Day1/id/output.gif new file mode 100644 index 00000000..9ad2bfb8 Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day1/id/output.gif differ -- cgit v1.2.3