Janji jQuery. Bagaimana membuat janji bekerja untuk Anda?

Saya hanya ingin menarik data dari situs untuk otorisasi dan apa yang terjadi.

file_get_contents

file_get_contents - dengan alirannya, ternyata, metode ini memalukan dan banyak server dengan bodohnya dapat dengan mudah memblokir permintaan seperti itu ke halaman. Untuk unduhan sederhana situs terverifikasi - metode ini sangat diperlukan. Sangat sederhana dan nyaman.

Berikut adalah satu halaman yang dapat memuat data dengan permintaan POST:

$result = file_get_contents($url, false, stream_context_create(array('http' => array('method' => 'POST','header' => 'Content-Type: application/xml','content' => $xml))));

versi yang diformat:

pir:http_request

require_once "HTTP/Request.php";
$req =& new HTTP_Request("http://www.php.net");
$req->setMethod(HTTP_REQUEST_METHOD_POST);
$req->addPostData("Foo", "bar");
if (!PEAR::isError($req->sendRequest())) (
$response1 = $req->getResponseBody();
) kalau tidak (
$respon1 = "";
}
$req->setMethod(HTTP_REQUEST_METHOD_GET);
$req->setURL("http://pear.php.net");
$req->clearPostData();
if (!PEAR::isError($req->sendRequest())) (
$respons2 = $req->getResponseBody();
) kalau tidak (
$respon2 = "";
}
echo $respon1;
echo $respon2;
?>

Metode Uroztsky hanya membuat marah melihat ke dalam ember seperti itu. Tentu saja, saya dapat menyisir kode ini yang diambil dari sini: http://pear.php.net/manual/pl/package.http.http-request.intro.php

Tapi sepertinya berhasil, tapi sepertinya omong kosong.

Pecl_Http

Omong kosong macam apa ini - beberapa ekstensi PHP yang aneh, yang tidak dapat saya temukan contohnya, tetapi di php.net ini adalah MANUAL RAKSASA.

Namun, saya menemukan sesuatu untuk dilihat, saya harap Anda sendiri akan memberikan lebih banyak contoh:

$permintaan = Permintaan::pabrik($url); $request->method("POST"); $request->headers($header); $request->post($post_params); $permintaan->eksekusi();

keriting

Metode paling global, yang digunakan dalam 90% kasus, tetapi mereka mengatakan bahwa itu tidak selalu berhasil.

if($curl = curl_init()) (

curl_setopt($curl, CURLOPT_URL, 'http://situssaya.ru/penerima.php');

curl_setopt($curl, CURLOPT_RETURNTRANSFER,benar);

curl_setopt($curl, CURLOPT_POST, benar);

curl_setopt($curl, CURLOPT_POSTFIELDS, "a=4&b=7");

$keluar = curl_exec($curl);

curl_close($curl);

Kode CURL sama jeleknya dengan pantatku, apa pun yang dikatakan orang.

soket

Saya akan memberi Anda contoh langsung:

$fp = fsockopen($url, 80, $errno, $errstr, 30);

echo "KESALAHAN: $errstr ($errno)
\n";

$error="ERROR: $errstr ($errno)";

$out = "DAPATKAN / HTTP/1.1\r\n";

$out .="User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.13 (KHTML, seperti Gecko) Chrome/24.0.1284.0 Safari/537.13\r\n";
$keluar .= "Host: $url\r\n";

$out .= "Perujuk: http://situs";

$out .= "Koneksi: Tutup\r\n\r\n";

$keluar .= "\r\n";
fwrite($fp, $keluar);

while (!feof($fp)) (

$src.=fgets($fp, 128);

Ini adalah contoh dari kehidupan, lebih buruk di mana-mana, tetapi bekerja di mana-mana dan selalu, tidak ada perpustakaan yang dibutuhkan, hanya air mata di mata saya. Bahkan PHP4 sudah cukup.

snoopy

Mereka mengatakan sesuatu yang lebih keren dari Snoopy. Saya tidak memeriksanya, saya melihat kodenya, tidak ada dokumentasi. Menarik tapi memakan waktu.

Zend_http_client/Zend:http

Dokumentasi bahkan dalam bahasa Rusia sesuatu. Besar, kuat, membosankan.

Buzz – Pustaka Permintaan HTTP Sederhana

Buzz adalah perpustakaan lain untuk permintaan HTTP. Berikut adalah contoh kode:

1 $request = new Buzz\Message\Request("HEAD" , "/" , "http://google.com");
2 $respons = new Buzz\Message\Response();
3
4 $klien = new Buzz\Client\FileGetContents();
5 $klien ->send($request , $respon);
6
7 echo $permintaan;
8 echo $jawaban;

Belum melihat dan belum menemukan jawabannya, tetapi Anda pasti harus melihatnya.

Permintaan – Permintaan HTTP Mudah

Pustaka Permintaan akan memudahkan untuk membuat permintaan HTTP. Jika Anda (seperti saya) tidak dapat mengingat sintaks Curl dengan cara apa pun, maka perpustakaan ini cocok untuk Anda, kode contoh.

Di PHP, variabel $_POST yang telah ditentukan digunakan untuk membentuk dari metode = "posting" dalam nilai koleksi.

$_POST Variabel

Bentuk variabel $_POST yang telah ditentukan digunakan untuk mengumpulkan dari metode = "posting" dalam nilai.

Formulir informasi dikirim dengan metode POST dari, untuk siapa saja tidak terlihat (tidak ditampilkan di bilah alamat browser), dan jumlah informasi yang dikirim juga tidak terbatas.

Catatan: Namun, secara default, jumlah maksimum informasi yang dikirim ke metode POST adalah 8 MB (dapat diubah dengan mengatur file php.ini post_max_size).

Contoh

form.html kode filenya sebagai berikut:

(situs web)

名字: 年龄:

Ketika pengguna mengklik tombol "Kirim", URL-nya mirip dengan yang berikut:

http://www..php

File "Welcome.php" sekarang dapat mengumpulkan variabel $_POST ke data formulir (Perhatikan bahwa nama bidang formulir akan secara otomatis menjadi kunci array $_POST):

欢迎 !
你的年龄是 岁。

Demo diakses melalui browser sebagai berikut:

Kapan menggunakan metode = "posting"?

Informasi dari formulir dengan metode pengiriman POST, tidak terlihat oleh siapa pun, dan jumlah informasi yang dikirim juga tidak terbatas.

Namun, karena tag tidak ditampilkan di URL, halaman ini tidak dapat di-bookmark.

Variabel PHP $_REQUEST

Variabel $_REQUEST yang telah ditentukan sebelumnya berisi $_GET, $_POST dan konten $_COOKIE.

$_REQUEST Variabel dapat digunakan untuk mengumpulkan data formulir yang dikirim melalui metode GET dan POST.

Contoh

Anda dapat "welcome.php" file dimodifikasi sebagai berikut kode, dapat menerima $_GET, $_POST dan data lainnya.

欢迎 !
你的年龄是 岁。

Banyak orang mulai menulis proyek untuk bekerja dengan satu tugas, tanpa menyiratkan bahwa itu dapat tumbuh menjadi sistem manajemen multi-pengguna, katakanlah, konten atau, Tuhan melarang, produksi. Dan semuanya tampak hebat dan keren, semuanya bekerja sampai Anda mulai memahami bahwa kode yang ditulis seluruhnya terdiri dari kruk dan hardcode. Kode dicampur dengan tata letak, permintaan, dan kruk, terkadang bahkan tidak terbaca. Masalah mendesak muncul: ketika menambahkan fitur baru, Anda harus mengutak-atik kode ini untuk waktu yang sangat lama, mengingat "apa yang tertulis di sana?" dan mengutuk diri sendiri di masa lalu.

Anda mungkin pernah mendengar tentang pola desain dan bahkan membolak-balik buku hebat ini:

  • E. Gamma, R. Helm, R. Johnson, J. Vlissides “Teknik Desain Berorientasi Objek. Pola desain";
  • M. Fowler "Arsitektur Aplikasi Perangkat Lunak Perusahaan".
Dan banyak, tidak takut dengan manual dan dokumentasi besar, mencoba mempelajari salah satu kerangka kerja modern dan, dihadapkan dengan kesulitan pemahaman (karena adanya banyak konsep arsitektur yang secara cerdik terkait satu sama lain), mereka menunda studi dan penerapannya. alat-alat modern di bagian belakang kompor.

Artikel yang disajikan akan bermanfaat terutama untuk pemula. Bagaimanapun, saya berharap bahwa dalam beberapa jam Anda akan dapat memperoleh gambaran tentang penerapan pola MVC yang mendasari semua kerangka kerja web modern, serta mendapatkan "makanan" untuk refleksi lebih lanjut tentang " Bagaimana cara melakukannya". Di akhir artikel, pilihan tautan bermanfaat disediakan yang juga akan membantu Anda memahami kerangka kerja web (selain MVC) terdiri dari dan cara kerjanya.

Pemrogram PHP yang keras tidak mungkin menemukan sesuatu yang baru untuk diri mereka sendiri dalam artikel ini, tetapi komentar dan komentar mereka pada teks utama akan sangat membantu! Karena tanpa teori, praktik tidak mungkin, dan tanpa praktik, teori tidak ada gunanya, maka pada awalnya akan ada sedikit teori, dan kemudian kita akan beralih ke praktik. Jika Anda sudah terbiasa dengan konsep MVC, Anda dapat melewati bagian teori dan langsung praktik.

1. Teori

Pola MVC menjelaskan cara sederhana untuk membangun struktur aplikasi yang bertujuan untuk memisahkan logika bisnis dari antarmuka pengguna. Hasilnya, aplikasi lebih mudah untuk diskalakan, diuji, dipelihara, dan tentu saja diimplementasikan.

Pertimbangkan skema konseptual template MVC (menurut saya, ini adalah skema paling sukses yang pernah saya lihat):

Dalam arsitektur MVC, model menyediakan data dan aturan logika bisnis, tampilan bertanggung jawab atas antarmuka pengguna, dan pengontrol menyediakan interaksi antara model dan tampilan.

Alur kerja aplikasi MVC yang khas dapat dijelaskan sebagai berikut:

  1. Saat pengguna memasukkan sumber daya web, skrip inisialisasi membuat instance aplikasi dan meluncurkannya untuk dieksekusi.
    Ini menampilkan tampilan, katakanlah, halaman utama situs.
  2. Aplikasi menerima permintaan dari pengguna dan menentukan pengontrol dan tindakan yang diminta. Dalam kasus halaman utama, tindakan default dilakukan ( indeks).
  3. Aplikasi membuat instance controller dan menjalankan metode aksi,
    yang, misalnya, berisi panggilan ke model yang membaca informasi dari database.
  4. Setelah itu, tindakan menghasilkan tampilan dengan data yang diterima dari model dan menampilkan hasilnya kepada pengguna.
Model- berisi logika bisnis aplikasi dan termasuk metode pengambilan sampel (ini bisa berupa metode ORM), pemrosesan (misalnya, aturan validasi) dan menyediakan data spesifik, yang sering kali membuatnya sangat tebal, yang cukup normal.
Model tidak boleh berinteraksi langsung dengan pengguna. Semua variabel yang terkait dengan permintaan pengguna harus diproses di controller.
Model tidak boleh menghasilkan HTML atau kode rendering lainnya, yang dapat berubah tergantung pada kebutuhan pengguna. Kode tersebut harus ditangani dalam tampilan.
Model yang sama, misalnya: model otentikasi pengguna dapat digunakan baik di pengguna maupun di bagian administrasi aplikasi. Dalam hal ini, Anda dapat memindahkan kode umum ke dalam kelas terpisah dan mewarisi darinya, mendefinisikan metode khusus untuk subaplikasi di ahli waris.

Melihat- digunakan untuk mengatur tampilan eksternal data yang diterima dari pengontrol dan model.
Tampilan berisi markup HTML dan sisipan kecil kode PHP untuk merayapi, memformat, dan menampilkan data.
Sebaiknya tidak mengakses database secara langsung. Model harus melakukan ini.
Seharusnya tidak bekerja dengan data yang diterima dari permintaan pengguna. Tugas ini harus dilakukan oleh pengontrol.
Itu dapat langsung mengakses properti dan metode pengontrol atau model untuk mendapatkan data siap-output.
Tampilan biasanya dibagi menjadi template umum yang berisi markup umum untuk semua halaman (misalnya, header dan footer) dan bagian template yang digunakan untuk menampilkan output data dari model atau menampilkan formulir entri data.

Pengontrol- tautan yang menghubungkan model, tampilan, dan komponen lain ke dalam aplikasi yang berfungsi. Controller bertanggung jawab untuk menangani permintaan pengguna. Pengontrol tidak boleh berisi kueri SQL. Lebih baik menyimpannya dalam model. Pengontrol tidak boleh berisi HTML atau markup lainnya. Itu layak untuk dibawa ke tempat terbuka.
Dalam aplikasi MVC yang dirancang dengan baik, pengontrol biasanya sangat tipis dan hanya berisi beberapa lusin baris kode. Apa yang tidak bisa dikatakan tentang Stupid Fat Controllers (SFC) di CMS Joomla. Logika pengontrol cukup khas dan sebagian besar dikeluarkan di kelas dasar.
Model, di sisi lain, sangat tebal dan berisi sebagian besar kode yang terkait dengan pemrosesan data. struktur data dan logika bisnis yang dikandungnya biasanya cukup spesifik untuk aplikasi tertentu.

1.1. Pengontrol Depan dan Pengontrol Halaman

Dalam kebanyakan kasus, interaksi pengguna dengan aplikasi web terjadi melalui tautan. Lihat sekarang di bilah alamat browser - Anda menerima teks ini dari tautan ini. Tautan lain, seperti yang ada di sisi kanan halaman ini, akan membawa Anda ke konten lain. Dengan demikian, tautan mewakili perintah khusus ke aplikasi web.

Saya harap Anda telah memperhatikan bahwa situs yang berbeda dapat memiliki format yang sama sekali berbeda untuk membuat bilah alamat. Setiap format dapat mewakili arsitektur aplikasi web. Meskipun hal ini tidak selalu terjadi, dalam banyak kasus ini adalah fakta yang jelas.

Pertimbangkan dua opsi untuk bilah alamat, yang menampilkan beberapa teks dan profil pengguna.

Perkiraan kode pemrosesan dalam kasus ini:
switch($_GET["action"]) ( case "about" : require_once("about.php"); // "Tentang Kami" page break; case "contacts" : require_once("contacts.php"); // page "Contacts" break; case "feedback" : require_once("feedback.php"); // page "Feedback" break; default: require_once("page404.php"); // halaman "404" break; )
Saya rasa hampir semua orang pernah melakukan ini sebelumnya.

Dengan menggunakan mesin perutean URL, Anda dapat mengonfigurasi aplikasi Anda untuk menerima permintaan seperti ini untuk menampilkan informasi yang sama:
http://www.example.com/contacts/feedback

Di sini, kontak adalah pengontrol, dan umpan balik adalah metode pengontrol kontak yang membuat formulir umpan balik, dan seterusnya. Kami akan kembali ke masalah ini di bagian praktis.

Perlu juga diketahui bahwa router dari banyak kerangka kerja web memungkinkan Anda membuat rute URL arbitrer (tentukan arti setiap bagian URL) dan aturan untuk memprosesnya.
Sekarang kita memiliki pengetahuan teoretis yang cukup untuk melanjutkan ke praktik.

2. Latihan

Pertama, mari kita buat struktur file dan folder berikut:


Ke depan, saya akan mengatakan bahwa kelas dasar Model, View dan Controller akan disimpan di folder inti.
Anak-anak mereka akan disimpan di direktori pengontrol, model, dan tampilan. Mengajukan index.php ini adalah titik masuk ke aplikasi. Mengajukan bootstrap.php memulai pengunduhan aplikasi, termasuk semua modul yang diperlukan, dll.

Mari kita pergi secara berurutan; buka file index.php dan isi dengan kode berikut:
ini_set("kesalahan_tampilan", 1); require_once "aplikasi/bootstrap.php";
Seharusnya tidak ada pertanyaan di sini.

Selanjutnya, mari kita langsung ke musim gugur bootstrap.php:
require_once "inti/model.php"; require_once "inti/view.php"; require_once "inti/controller.php"; require_once "inti/rute.php"; Rute::mulai(); // mulai routernya
Tiga baris pertama akan menyertakan file kernel yang saat ini tidak ada. Baris terakhir menyertakan file dengan kelas router dan memulainya untuk dieksekusi dengan memanggil metode static start.

2.1. Menerapkan Router URL

Untuk saat ini, mari kita menyimpang dari implementasi pola MVC dan fokus pada perutean. Langkah pertama yang perlu kita lakukan adalah menulis kode berikut ke dalam .htaccess:
RewriteEngine Pada RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule .* index.php [L]
Kode ini akan mengalihkan pemrosesan semua halaman ke index.php, yang kita butuhkan. Ingat di bagian pertama kita berbicara tentang Front Controller?!

Kami akan menempatkan perutean di file terpisah route.php ke direktori inti. Dalam file ini, kami akan menjelaskan kelas Route, yang akan menjalankan metode pengontrol, yang pada gilirannya akan menghasilkan tampilan halaman.

Konten file Route.php

class Route ( static function start() ( // controller dan action default $controller_name = "Main"; $action_name = "index"; $routes = meledak("/", $_SERVER["REQUEST_URI"]); // get nama pengontrol if (!empty($routes)) ( $controller_name = $routes; ) // dapatkan nama tindakan if (!empty($routes)) ( $action_name = $routes; ) // tambahkan awalan $model_name = " Model_ ".$controller_name; $controller_name = "Controller_".$controller_name; $action_name = "action_".$action_name; // kaitkan file dengan kelas model (mungkin ada atau tidak ada file model) $model_file = strtolower( $model_name). ".php"; $model_path = "application/models/".$model_file; if(file_exists($model_path)) ( include "application/models/".$model_file; ) // kaitkan file kelas controller $controller_file = strtolower ($controller_name).".php"; $controller_path = "application/controllers/".$controller_file; if(file_exists($controller_path)) ( include "application/controllers/".$controller_f ile; ) else ( /* itu akan benar untuk membuang pengecualian di sini, tetapi untuk kesederhanaan kami akan segera mengarahkan ulang ke halaman 404 */ Route::ErrorPage404(); ) // create a controller $controller = new $controller_name; $aksi = $nama_aksi; if(method_exists($controller, $action)) ( // panggil aksi pengontrol $controller->$action(); ) else ( // juga akan lebih masuk akal untuk melempar pengecualian di sini Route::ErrorPage404(); ) ) function ErrorPage404() ( $host = "http://".$_SERVER["HTTP_HOST"]."/"; header("HTTP/1.1 404 Tidak Ditemukan"); header("Status: 404 Tidak Ditemukan" ); header("Lokasi:".$host."404"); ) )


Saya perhatikan bahwa kelas mengimplementasikan logika yang sangat disederhanakan (terlepas dari kode yang banyak) dan bahkan mungkin memiliki masalah keamanan. Hal ini dilakukan dengan sengaja, karena. menulis kelas perutean yang lengkap setidaknya layak mendapatkan artikel terpisah. Mari kita lihat poin-poin utamanya...

Elemen larik global $_SERVER["REQUEST_URI"] berisi alamat lengkap yang digunakan pengguna.
Misalnya: example.ru/contacts/feedback

Menggunakan fungsi meledak alamat dibagi menjadi beberapa komponen. Hasilnya, kami mendapatkan nama pengontrol, untuk contoh yang diberikan, ini adalah pengontrol kontak dan nama tindakan, dalam kasus kami - masukan.

Selanjutnya, file model terhubung (model mungkin hilang) dan file pengontrol, jika ada, dan akhirnya, instance pengontrol dibuat dan tindakan dipanggil, sekali lagi, jika dijelaskan di kelas pengontrol.

Jadi, ketika Anda pergi, misalnya, ke alamat:
example.com/portfolio
atau
example.com/portfolio/index
Router akan melakukan hal berikut:

  1. hubungkan file model_portfolio.php dari folder model yang berisi kelas Model_Portfolio;
  2. sertakan file controller_portfolio.php dari folder controllers yang berisi kelas Controller_Portfolio;
  3. akan membuat instance dari kelas Controller_Portfolio dan memanggil tindakan default - action_index yang dijelaskan di dalamnya.
Jika pengguna mencoba mengakses alamat pengontrol yang tidak ada, misalnya:
contoh.com/ufo
maka akan dialihkan ke halaman 404:
contoh.com/404
Hal yang sama akan terjadi jika pengguna mengakses tindakan yang tidak dijelaskan di controller.

2.2. Kembali ke Implementasi MVC

Mari masuk ke folder inti dan tambahkan tiga file lagi ke file route.php: model.php, view.php dan controller.php


Biarkan saya mengingatkan Anda bahwa mereka akan berisi kelas dasar, yang sekarang akan kita mulai tulis.

Isi file model.php
Model kelas ( fungsi publik get_data() ( ) )
Kelas model berisi satu metode pengambilan data kosong yang akan ditimpa di kelas turunan. Saat kita membuat kelas turunan, semuanya akan menjadi lebih jelas.

Isi file view.php
class View ( //public $template_view; // di sini Anda dapat menentukan tampilan publik default. function generate($content_view, $template_view, $data = null) ( /* if(is_array($data)) ( // convert array elemen ke dalam variabel extract($data); ) */ include "application/views/".$template_view; ) )
Tidak sulit menebak metodenya menghasilkan dirancang untuk membentuk pandangan. Parameter berikut diteruskan ke sana:

  1. $content_file - tampilan yang menampilkan konten halaman;
  2. $template_file - template umum untuk semua halaman;
  3. $data adalah larik yang berisi elemen konten halaman. Biasanya diisi dengan model.
Fungsi include secara dinamis menghubungkan template umum (tampilan), di dalamnya tampilan akan disematkan
untuk menampilkan konten halaman tertentu.

Dalam kasus kami, template umum akan berisi header, menu, sidebar dan footer, dan konten halaman akan dimuat dalam formulir terpisah. Sekali lagi, ini dilakukan untuk kesederhanaan.

Isi file controller.php
class Controller ( publik $model; publik $view; function __construct() ( $this->view = new View(); ) function action_index() ( ) )
metode indeks_tindakan adalah tindakan yang dipanggil secara default, kami akan menimpanya saat mengimplementasikan kelas turunan.

2.3. Menerapkan kelas turunan Model dan Controller, membuat View's

Sekarang kesenangan dimulai! Situs kartu nama kami akan terdiri dari halaman-halaman berikut:
  1. rumah
  2. Jasa
  3. Portofolio
  4. Kontak
  5. Dan juga - halaman "404"
Setiap halaman memiliki pengontrolnya sendiri dari folder pengontrol dan tampilan dari folder tampilan. Beberapa halaman mungkin menggunakan model atau model dari folder model.


File disorot pada gambar sebelumnya. template_view.php adalah template yang berisi markup umum untuk semua halaman. Dalam kasus paling sederhana, itu bisa terlihat seperti ini:
rumah
Untuk memberikan situs tampilan yang rapi, kami akan membuat template CSS dan mengintegrasikannya ke dalam situs kami dengan mengubah struktur markup HTML dan menyertakan file CSS dan JavaScript:

Di akhir artikel, di bagian "Hasil", ada tautan ke repositori GitHub dengan proyek di mana integrasi templat sederhana telah dilakukan.

2.3.1. Membuat halaman utama

Mari kita mulai dengan pengontrol controller_main.php, ini kode nya :
class Controller_Main extends Controller ( function action_index() ( $this->view->generate("main_view.php", "template_view.php"); ) )
Metode menghasilkan instance dari kelas View, nama file template umum dan tampilan dengan konten halaman dilewatkan.
Selain tindakan indeks, pengontrol tentu saja dapat berisi tindakan lain.

Kami membahas file dengan tampilan umum sebelumnya. Pertimbangkan file konten main_view.php:

Selamat datang!

TIM OLOLOSHA adalah tim spesialis pengembangan situs web kelas satu dengan pengalaman bertahun-tahun dalam mengumpulkan topeng Meksiko, patung perunggu dan batu dari India dan Ceylon, relief dan patung yang dibuat oleh para ahli Afrika Khatulistiwa lima atau enam abad yang lalu.. .


Ini berisi markup sederhana tanpa panggilan PHP.
Untuk menampilkan halaman utama, Anda dapat menggunakan salah satu alamat berikut:

Contoh penggunaan tampilan yang menampilkan data yang diterima dari model akan dibahas nanti.

2.3.2. Membuat Halaman Portofolio

Dalam kasus kami, halaman Portofolio adalah satu-satunya halaman yang menggunakan model.
Model biasanya menyertakan metode pengambilan data, misalnya:
  1. metode pustaka pgsql atau mysql asli;
  2. metode perpustakaan yang mengimplementasikan abstraksi data. Misalnya, metode perpustakaan PEAR MDB2;
  3. metode ORM;
  4. metode untuk bekerja dengan NoSQL;
  5. dan sebagainya.
Untuk kesederhanaan, kami tidak akan menggunakan kueri SQL atau pernyataan ORM di sini. Sebagai gantinya, kami mensimulasikan data nyata dan segera mengembalikan serangkaian hasil.
File model model_portfolio.php masukkan ke dalam folder model. Ini dia isinya:
class Model_Portfolio memperluas Model ( fungsi publik get_data() ( kembali array(array("Tahun" => "2012", "Situs" => "http://DunkelBeer.ru", "Deskripsi" => "Bir Dunkel Gelap dari pabrikan Jerman Löwenbraü diproduksi di Rusia oleh perusahaan pembuat bir "SUN InBev"."), array("Tahun" => "2012", "Situs" => "http://ZopoMobile.ru", "Deskripsi" => "Katalog ponsel Zopo Cina berbahasa Rusia berdasarkan OS dan aksesori Android.", // todo); ) )

Kelas pengontrol model terkandung dalam file controller_portfolio.php, ini kode nya :
class Controller_Portfolio extends Controller ( function __construct() ( $this->model = new Model_Portfolio(); $this->view = new View(); ) function action_index() ( $data = $this->model->get_data( ); $this->view->generate("portfolio_view.php", "template_view.php", $data); ) )
menjadi variabel data array yang dikembalikan oleh metode ditulis dapatkan_data, yang kami pertimbangkan sebelumnya.
Variabel ini kemudian diteruskan sebagai parameter metode. menghasilkan, yang juga diteruskan: nama file dengan template umum dan nama file yang berisi tampilan dengan konten halaman.

Tampilan yang berisi konten halaman ada dalam file portfolio_view.php.

Portofolio

Semua proyek dalam tabel berikut adalah fiktif, jadi jangan coba-coba mengikuti tautan yang disediakan. "; } ?>
TahunProyekKeterangan
".$row["Tahun"]."".$row["Situs"]."".$row["Deskripsi"]."


Semuanya sederhana di sini, tampilan menampilkan data yang diterima dari model.

2.3.3. Membuat sisa halaman

Sisa halaman dibuat dengan cara yang sama. Kode mereka tersedia di repositori di GitHub, tautan yang disediakan di akhir artikel, di bagian "Hasil".

3. Hasil

Dan inilah yang terjadi pada akhirnya:

Tangkapan layar situs kartu nama yang dihasilkan



Tautan ke GitHub: https://github.com/vitalyswipe/tinymvc/zipball/v0.1

Tetapi dalam versi ini, saya membuat sketsa kelas-kelas berikut (dan tipe yang sesuai):

  • Controller_Login di mana tampilan dibuat dengan formulir untuk memasukkan login dan kata sandi, setelah mengisi prosedur otentikasi yang dilakukan dan, jika berhasil, pengguna diarahkan ke panel admin.
  • Contorller_Admin dengan tindakan indeks yang memeriksa apakah pengguna sebelumnya diotorisasi di situs sebagai administrator (jika demikian, tampilan admin ditampilkan) dan tindakan logout untuk logout.
Otentikasi dan otorisasi adalah topik yang berbeda, jadi tidak dibahas di sini, tetapi hanya tautan yang ditunjukkan di atas yang disediakan sehingga ada sesuatu untuk dikembangkan.

4. Kesimpulan

Pola MVC digunakan sebagai dasar arsitektur di banyak kerangka kerja dan CMS, yang dibuat untuk dapat mengembangkan solusi yang lebih kompleks secara kualitatif dalam waktu yang lebih singkat. Ini dimungkinkan dengan meningkatkan tingkat abstraksi, karena kompleksitas struktur yang dapat dioperasikan oleh otak manusia ada batasnya.

Tetapi menggunakan kerangka kerja web seperti Yii atau Kohana, yang terdiri dari beberapa ratus file, saat mengembangkan aplikasi web sederhana (misalnya, situs kartu nama) tidak selalu disarankan. Sekarang kita bisa membuat model MVC yang cantik agar tidak mencampur kode Php, Html, CSS dan JavaScript dalam satu file.

Artikel ini lebih merupakan titik awal untuk mempelajari CMF daripada contoh sesuatu yang benar-benar benar yang dapat Anda ambil sebagai dasar aplikasi web Anda. Mungkin itu bahkan menginspirasi Anda dan Anda sudah berpikir untuk menulis microframework atau CMS Anda sendiri berdasarkan MVC. Tapi, sebelum menciptakan roda berikutnya dengan "blackjack and whores", pikirkan lagi, mungkin akan lebih bijaksana untuk mengarahkan upaya Anda untuk pengembangan dan membantu komunitas dari proyek yang ada?!

P.S .: Artikel telah ditulis ulang dengan mempertimbangkan beberapa komentar yang tersisa di komentar. Kritik sangat membantu. Dilihat dari tanggapan: komentar, banding pribadi, dan jumlah pengguna yang menambahkan pos ke favorit mereka, ide untuk menulis pos ini ternyata tidak terlalu buruk. Sayangnya, tidak mungkin untuk memperhitungkan semua keinginan dan menulis lebih banyak dan lebih detail karena kurangnya waktu ... tetapi mungkin kepribadian misterius yang minus versi aslinya akan melakukan ini. Semoga berhasil dengan proyek Anda!

5. Pilihan tautan bermanfaat tentang masalah ini

Artikel ini sangat sering menyentuh topik kerangka kerja web - ini adalah topik yang sangat luas, karena bahkan kerangka kerja mikro terdiri dari banyak komponen yang secara cerdik dihubungkan satu sama lain dan akan membutuhkan lebih dari satu artikel untuk membicarakan komponen ini. Namun, saya memutuskan untuk memberikan di sini sedikit pilihan tautan (yang saya kunjungi saat menulis artikel ini) yang dalam satu atau lain cara berhubungan dengan topik kerangka kerja.

Tag: Tambahkan tag

Dalam pelajaran ini, kita akan melihat teknik untuk melewatkan data antara formulir dan halaman. Metode ini adalah POST dan GET. Kami akan membicarakan masing-masing secara terpisah dan lebih terinci. Secara umum, perlu untuk komunikasi antar bentuk. Misalnya, kami mengisi beberapa bidang di halaman dan kami perlu mentransfernya ke halaman lain untuk diproses.

DAPATKAN metode di PHP

Mari kita mulai dengan metode GET. Ini adalah saat semua variabel dan nilainya diteruskan langsung melalui alamat. Sekarang, dengan sebuah contoh, Anda akan melihat semuanya, dan bahkan memahami cara kerja sebagian besar situs dan forum.
Misalnya, kami memiliki halaman html seperti ini:

Halaman dengan contoh variabel yang lewat menggunakan Get tautan

Lihat tautannya? Ini kompleks dan terdiri dari beberapa bagian. Mari kita hancurkan semuanya:
https://situs- alamat domain atau, demikian juga disebut, host.
index.php- halaman php yang akan memproses permintaan.
? - simbol pemisahan antara alamat dan blok dengan variabel.
Berikutnya adalah variabel dan nilainya, yang dipisahkan oleh simbol & .
nama=Sergey— nama variabel dan nilainya Sergey.
umur = 22- sama, variabel usia, nilai 22.

Semua diurutkan, sekarang mari kita lihat bagaimana diproses di php menggunakan metode GET.
Halaman index.php, seperti yang Anda ingat, kami melewatinya:

Saran pertama: SELALU periksa variabel untuk kebenaran: untuk kekosongan, untuk kepatuhan dengan nilai-nilai yang valid, dan seterusnya. Karena semuanya ditransmisikan melalui bilah alamat, data dapat dengan mudah diubah dan merusak situs. Sekarang untuk kode itu sendiri: kami, dengan bantuan , memeriksa kekosongan nama dan variabel usia dan, jika tidak kosong, kemudian menampilkannya, dan jika kosong, maka cukup laporkan.
Semuanya sederhana, setuju? Misalnya, Anda dapat membuat halaman html dan membuat tautan melalui variabel di menu, dan memproses variabel di index.php dan menampilkan satu atau lain halaman tergantung pada nilai yang diterima. Nah, kita akan membicarakannya nanti, dalam artikel tentang membuat situs di php dari awal. Agar tidak ketinggalan apa pun, saya menyarankan Anda untuk berlangganan RSS.

Metode POST di PHP

Untuk mendemonstrasikan cara kerja metode ini, kita memerlukan sedikit lebih dari sekadar baris sederhana dengan alamat :) Anda perlu membuat halaman html dengan formulir untuk diisi, tapi tidak apa-apa, saya akan memberikan contoh yang sudah jadi untuk Anda:

Halaman dengan contoh variabel yang lewat menggunakan Post

Isi kolom untuk transfer informasi:

Masukkan nama Anda:

Masukkan Umur anda:

Jadi, kami telah membuat halaman html dengan bentuk sederhana. Ingat, metode POST hanya dapat digunakan pada formulir.
Parameter pertama dari formulir adalah "metode", itu mendefinisikan metode yang akan kita gunakan untuk mengirimkan. Seperti yang Anda duga, itu GET atau POST. Dalam hal ini, jika GET disetel, maka semua nama bidang (dalam bentuk nama variabel), serta nilainya, diteruskan dengan referensi, seperti di bagian tentang metode GET. Jika POST disetel, maka semua nama dan nilai variabel akan dikirimkan sebagai permintaan browser ke server web. Artinya, mereka tidak akan terlihat di bilah alamat. Dalam banyak kasus, ini sangat berguna. POST juga lebih aman, yang dapat dimengerti, karena variabel dengan nilainya tidak lagi mudah untuk diedit, meskipun mungkin juga.

Parameter bentuk kedua adalah "aksi". Ini adalah jalur dan nama file skrip tempat kami meneruskan data. Dalam kasus kami, ini adalah index.php. Jalur ini juga dapat dilalui secara penuh, yaitu seperti ini: action="https://my_site.ru/index.php". Jika Anda tidak menentukan nilai parameter "tindakan", maka semua informasi akan ditransfer ke skrip utama, yaitu halaman indeks index.php situs Anda, yang cukup logis.

Sekarang kami akan menerima data dari formulir kami. Karena kami meneruskannya ke index.php, maka kode halaman khusus ini akan berada di bawah ini:

"; echo "nama - "; echo $_POST["nama_pengguna"]; echo "
umur - "; echo $_POST["umur"]; echo " tahun"; ) else ( echo "Variabel tidak mencapai. Periksa semuanya lagi."; ) ?>

Jangan lupa untuk memeriksa kekosongan dan nilai yang valid. Selanjutnya, kita perlu mengklarifikasi mengapa variabel kita disebut persis nama_pengguna dan umur? Dan Anda melihat bidang formulir yang kami buat di atas. Lihat disana masukan nama="nama_pengguna" type="teks"? Di sinilah parameter nama menetapkan nama variabel yang akan kita terima menggunakan bidang ini. Sama halnya dengan usia. Saya harap itu jelas. Nah, mendapatkan variabel dan nilainya melalui POST hampir sama dengan GET yang kita bahas di atas.

Nah, pelajarannya ternyata besar, tapi salah satu yang paling berguna, karena melewati variabel antara formulir dan halaman persis interaktivitas yang kita gunakan PHP.

26 Januari , 2017

Janji, janji, panggilan balik neraka, Objek yang ditangguhkan, saat itu, kapan dan resolusi ...
Kata-kata ini berasal dari setiap tiang telegraf. Ada perasaan bahwa saya adalah orang bodoh terakhir di planet ini yang tidak menggunakan janji. Setelah menjadi sedih tentang ini, saya mulai berurusan dengan topik ini. Tetapi seperti dalam kasus git rebase, ternyata ada banyak informasi tentang janji di Internet, tetapi ada sedikit penjelasan di jari. Dan karena ada sesuatu yang tidak ada di Internet, Anda harus membuatnya sendiri.

Saya memiliki sedikit minat pada teori umum dan seluk-beluk hal yang luar biasa ini. Saya melihat sesuatu yang asing dari sudut pandang kemungkinan manfaat darinya. Oleh karena itu, lebih baik mencari penjelasan rinci tentang mekanisme kerja janji di blog lain. Kita akan melihat contoh kerja praktek dengan janji jquery. Dan pada akhirnya, kita akan mencari tahu apakah ini layak untuk ditangani secara lebih rinci, atau apakah masih legal untuk menulis banyak kode di $.ajax.success.

Kapan kita membutuhkan janji sama sekali?

Sebuah contoh yang khas. Kami sedang mencari proyek baru di mana pengembang backend yang baik telah membuat banyak permintaan API kecil yang melakukan tindakan yang ditentukan secara ketat. Satu permintaan - satu operasi kecil. Secara umum, beginilah seharusnya ketika membangun layanan REST. Tapi untuk saat ini, mari kita tinggalkan pamer tentang REST dan turun ke bumi.

Dalam proyek imajiner kami, ada sebuah entitas Pengguna, dengan cara pemrograman pengguna, dan Order - order. Dan ada beberapa permintaan get dan post yang melakukan operasi seperti ini:

  • 1. DAPATKAN php/pengguna/info.php- mendapatkan informasi tentang pengguna
  • 2. DAPATKAN php/pengguna/pesanan.php- menerima pesanan pengguna
  • 3. POST php/user/new.php- menambahkan pengguna baru
  • 4. POST php/pesan/new.php- menambahkan pesanan
  • 5. POSTING php/pesan/applyBonus.php- menerapkan bonus ke pesanan (menghapus jumlah tertentu dari pesanan tertentu)

Ini adalah kueri sederhana yang melakukan manipulasi basis data sederhana. Dan di depan, kami memiliki serangkaian tugas yang turun untuk mengeksekusi permintaan tertentu, menunggu respons dari mereka, menguraikan dan meneruskan respons ini ke permintaan berikutnya.

Bahkan jika kita perlu mengirim satu permintaan dan mengeksekusi beberapa kode dengan sukses, itu tidak terlihat bagus. Bagaimana jika kita mengambil hasil dari permintaan pertama dan mengirimkannya ke yang kedua? Dan jika Anda perlu menjalankan 2 permintaan secara berurutan, menunggu data diterima, menggunakan data ini di permintaan ketiga, dan hanya setelah itu melakukan beberapa tindakan? Kengeriannya selesai.

Anda bertanya: apa persyaratan liar ini, di mana Anda perlu melakukan 3 permintaan ajax secara berurutan dan baru kemudian melakukan beberapa tindakan yang bermanfaat? Dan sekarang kami akan menguraikan selusin tugas yang akan kami gunakan dengan janji. Tugas akan menjadi lebih rumit dan topik ini akan menjadi yang terakhir dari tiga permintaan berturut-turut. Dan yang paling penting, kami akan menulis kode yang memungkinkan kami mengelola kombinasi permintaan ajax dengan bijaksana. Mari kita mulai.

Tugas apa yang akan kita selesaikan?

Saya memposting seluruh daftar:

  • 1. Mudah mendapatkan informasi tentang pengguna - 1 dapatkan permintaan
  • 2. Mendapatkan daftar pesanan pengguna - 1 mendapatkan permintaan
  • 3. Menerima pesanan terakhir - 1 dapatkan-permintaan + pemrosesan data pada klien
  • 4. Jumlah total semua pesanan pengguna - 1 dapatkan-permintaan + pemrosesan data pada klien
  • 5. Menambahkan pengguna - 1 permintaan posting
  • 6. Menambahkan pesanan - 1 post-request
  • 7. Menambahkan pesanan dengan pendaftaran pengguna - 2 permintaan pasca. Kueri kedua menggunakan hasil yang pertama.
  • 8. Menerapkan bonus untuk pesanan - 1 post-request
  • 9. Menerapkan bonus ke pesanan terakhir pengguna - 2 dapatkan dan 1 permintaan posting

Seperti yang Anda lihat, sebagian besar tugas tidak terlalu sulit. Mereka dapat dengan mudah diselesaikan dengan panggilan balik $.ajax.success biasa. Tetapi pertama-tama, kode Anda akan cepat berantakan, kedua, akan sulit untuk menggunakannya kembali, dan ketiga, bayangkan jenis alas kaki apa yang harus Anda tulis untuk menyelesaikan masalah nomor 9 dengan tiga permintaan berturut-turut.

Kami secara bertahap akan memperumit tugas untuk membiasakan diri dengan kode javascript yang mungkin tidak biasa. Antarmuka terlihat seperti ini: untuk setiap tugas di atas, kami akan membuat satu tombol. Mengklik tombol akan meluncurkan urutan permintaan yang diinginkan sesuai dengan nomor tugas.

Tentu saja, tidak terlalu mengesankan, tetapi kita tidak perlu membawa keindahan, tetapi untuk memahami bagaimana membuat janji bekerja untuk keuntungan kita. Judul artikel yang menyedihkan cukup konsisten dengan isinya. Kami akan menulis beberapa modul js yang memungkinkan Anda melakukan dan menggabungkan tugas apa pun yang Anda inginkan hanya dengan menggunakan 5 permintaan api ke server. Tapi pertama-tama, kode server ini perlu ditulis.

Kami menulis kode server. Tentu saja PHP

Mari kita cepat membuat sketsa 5 skrip php. Dan pada saat yang sama kami akan menganalisis parameter apa yang akan mereka terima dan apa yang harus dikembalikan. Di root proyek, kami akan membuat folder php, dan di dalamnya 2 lagi - pengguna dan pesanan. Mari kita lihat semua file permintaan satu per satu.

PHP. Mendapatkan informasi tentang pengguna

DAPATKAN /php/pengguna/info.php

If ($_SERVER["REQUEST_METHOD"] === "GET") ( // Menerima data dari array $_GET $userId = (int)$_GET["userId"]; // Ekstrak informasi pengguna dari database.. .sleep(1); // Mengembalikan email pengguna dan bonus echo json_encode(array("email" => " [dilindungi email]", "bonus" => Rand(500, 1000)))); ) else ( header("Metode HTTP/1.0 405 Tidak Diizinkan"); echo json_encode(array("error" =>

Kami mengambil parameter userId sebagai input, lalu menunggu 1 detik (mensimulasikan beberapa pekerjaan yang berguna) dan mengembalikan email pengguna dan bonus dalam objek json. Kami akan menghasilkan bonus secara acak sehingga tidak terlalu sedih untuk melacak nomor yang sama.

Ada satu poin: jika kami mencoba mengakses skrip dengan permintaan non-GET, kami akan mengembalikan kesalahan http 405 dengan teks yang sesuai di bidang kesalahan. Abaikan saja untuk saat ini, kami akan menyebutkannya di akhir artikel.

Tentu saja, dalam kehidupan nyata Anda akan memiliki kode yang masuk ke database, tetapi posting ini bukan tentang itu. Sekarang kita hanya perlu mensimulasikan permintaan, dengan sedikit memperhatikan parameter input dan format respons dari server. Semua ini akan berguna saat menulis kode js dengan janji. Kami akan menulis 4 permintaan API yang tersisa dengan analogi.

PHP. Daftar pesanan pengguna

DAPATKAN /php/pengguna/pesanan.php

If ($_SERVER["REQUEST_METHOD"] === "GET") ( // Menerima data dari array $_GET $userId = (int)$_GET["userId"]; // Ekstrak informasi pengguna dari database.. sleep(1); // Kembalikan pesanan pengguna echo json_encode(array("orders" => array(array("orderId" => rand(1, 5), "summa" => rand(1000, 1500)), array ("orderId" => rand(10, 20), "summa" => rand(2000, 5000)), array("orderId" => rand(30, 50), "summa" => rand(10000, 20000) )))); ) else ( header("Metode HTTP/1.0 405 Tidak Diizinkan"); echo json_encode(array("error" => "Metode tidak didukung")); )

Kami menerima userId, mengembalikan array objek dengan dua bidang: id dan jumlah pesanan.

PHP. kreasi pengguna

POST /php/user/new.php

If ($_SERVER["REQUEST_METHOD"] === "POST") ( // Menerima data dari array $_POST $email = $_POST["email"]; $name = $_POST["name"]; // Seperti menambahkan pengguna ke database... sleep(1); // Mengembalikan id pengguna yang dibuat, misalnya - random echo json_encode(array("userId" => rand(1, 100))); ) else ( header("Metode HTTP/ 1.0 405 Tidak Diizinkan"); echo json_encode(array("error" => "Metode tidak didukung")); )

Pada input dari array $_POST, kami mengambil email dan nama, mengembalikan id pengguna yang dibuat.

PHP. Menambahkan pesanan

POST /php/order/new.php

If ($_SERVER["REQUEST_METHOD"] === "POST") ( // Menerima data dari array $_POST $userId = (int)$_POST["userId"]; $summa = (int)$_POST[" summa "]; // Tambahkan perintah ke database... sleep(1); // Kembalikan id dari pesanan yang dibuat, misalnya - random echo json_encode(array("orderId" => rand(1, 1000) )); ) else ( header("Metode HTTP/1.0 405 Tidak Diizinkan"); echo json_encode(array("error" => "Metode tidak didukung")); )

Kami menerima id pengguna dan jumlah pesanan, mengembalikan id pesanan yang dibuat.

PHP. Menerapkan bonus untuk pesanan

POST /php/order/applyBonus.php

If ($_SERVER["REQUEST_METHOD"] === "POST") ( // Terima data dari array $_POST $orderId = (int)$_POST["orderId"]; $bonus = (int)$_POST["bonus "]; // Tambahkan pesanan ke database... sleep(1); // Kembalikan kode sukses echo json_encode(array("code" => "success")); ) else ( header("HTTP/1.0 405 Metode Tidak Diizinkan"); echo json_encode(array("error" => "Metode tidak didukung")); )

Di pintu masuk - id pesanan dan jumlah bonus, pintu keluar hanyalah kode sukses, kata mereka, semuanya berjalan dengan baik.

Setelah persiapan selesai, mari beralih ke sisi klien dan kode js.

Bingkai proyek dan persiapan html

Mari buat file index.html di root proyek. Di bagian kepala, tulis ini

Janji jQuery

Beberapa gaya tepat di bagian kepala - jadilah itu. Mari kita menempatkan berikut ini di dalam tubuh.

Janji jQuery

1. Informasi umum tentang pengguna 2. Daftar pesanan 3. Pesanan terakhir 4. Jumlah total semua pesanan 5. Menambahkan pengguna

6. Menambahkan pesanan 7. Menambahkan pesanan dengan kreasi pengguna 8. Menerapkan bonus ke pesanan 9. Menerapkan bonus ke pesanan terakhir pengguna

Di sini kita melihat 9 tombol, dengan mengklik di mana operasi di atas diluncurkan. Setiap kali tugas akan menjadi lebih sulit. Kami akan mengimplementasikan fungsionalitas secara berurutan. Dan pada akhirnya, kami terkejut untuk mencatat bahwa kami menulis fungsi yang menunggu dua permintaan ajax diselesaikan dan menggunakan hasilnya di yang ketiga, dan setelah menyelesaikan yang ketiga, melakukan sesuatu yang lain ... Kedengarannya sulit, tetapi ternyata tidak lebih sulit daripada mengirim satu-satu permintaan get untuk data. Jumlah kode untuk semua 9 tugas akan kurang lebih sama - masing-masing sepuluh baris sederhana.

4 file js disertakan di akhir index.html. jquery, segera masukkan ke folder js, biarkan file user.js dan order.js kosong untuk saat ini. Dan dengan main.js kita akan bekerja sedikit dan menulis kode inisialisasi dasar untuk aplikasi kita.

rintisan utama.js

Struktur umum file tersebut adalah

// Modul aplikasi utama "gunakan ketat"; var app = (function() ( var userId = Math.round(Math.random() * 100); // Dapatkan informasi tentang fungsi pengguna _userInfo() ( // ... ) // Dapatkan daftar pesanan pengguna function _userOrders() ( // ... ) // Fungsi pesanan pengguna terakhir _userLastOrder() ( // ... ) // Jumlah total semua fungsi pesanan _userTotalSummaOrders() ( // ... ) // Menambahkan pengguna function _userNew() ( // ... ) // Menambahkan fungsi pesanan _orderNew() ( // ... ) // Menambahkan pesanan dengan pembuatan fungsi pengguna _orderNewWithUser() ( // ... ) / / Menerapkan bonus ke fungsi pesanan _orderApplyBonus() ( // ... ) // Menerapkan bonus ke fungsi pesanan terakhir pengguna _userApplyBonusToLastOrder() ( // ... ) // Menangkap kesalahan dalam fungsi janji onCatchError(respons) ( // ... ) // Melampirkan event ke fungsi tombol _bindHandlers() ( $("#user-info-btn").on("click", _userInfo); $("#user-orders-btn") .on("klik", _userOrders); $("# pengguna- last-order-btn").on("klik", _userLastOrder); $("#user-total-summa-orders-btn").on("klik", _userTotalSummaOrders); $("#pengguna-baru-btn").on("klik", _penggunaBaru); $("#pesanan-baru-btn").on("klik", _pesananBaru); $("#order-new-with-user-btn").on("click", _orderNewWithUser); $("#order-apply-bonus-btn").on("klik", _orderApplyBonus); $("#user-apply-bonus-to-last-order-btn").on("klik", _userApplyBonusToLastOrder); ) // Fungsi inisialisasi aplikasi init() ( _bindHandlers(); ) // Kembalikan pengembalian luar ( onCatchError: onCatchError, init: init ) ))(); // Jalankan aplikasi $(document).ready(app.init);

Disini kami telah menyiapkan modul aplikasi - modul utama aplikasi. Variabel userId, global untuk seluruh modul, diambil secara acak sebagai contoh. Berikut ini adalah 9 fungsi yang diluncurkan dengan menekan tombol yang sesuai. Dengan komentar Anda dapat dengan mudah melacak mereka.

Fungsi onCatchError diaktifkan ketika ada yang tidak beres dalam permintaan ajax. _bindHandlers mengaitkan semua 9 acara klik, init adalah fungsi inisialisasi modul dasar. Blok kembali mengembalikan fasad modul, yaitu metode yang dapat diakses dari luar. onCatchError dikembalikan ke luar karena akan digunakan di modul pengguna dan pesanan. Berikutnya adalah $(document).ready(app.init) - ini memulai aplikasi.

Skemanya adalah sebagai berikut: kode aktual yang menerima data dan mengirimkannya ke server akan ditempatkan di modul user.js dan order.js. Artinya, ada implementasi utama, inti dari aplikasi. Dan di main.js, di tempat yang tepat di mana //... sekarang berada, beberapa baris kode akan ditulis menggunakan kemampuan modul pengguna dan pesanan.

Jangan khawatir jika Anda belum merokok sampai akhir, sekarang semuanya akan menjadi jelas.

Mendapatkan informasi pengguna

Tugas pertama adalah mengirim permintaan ajax ke server, mendapatkan info dan melakukan sesuatu dengannya. Tampaknya ada sesuatu untuk menjadi pintar? Kami menulis seperti ini ribuan kali

$.ajax(( url: "php/user/info.php", data: ( userId: userId ), metode: "get", tipe data: "json", sukses: function(response) ( // Lakukan sesuatu dengan respons ), error: function(response) ( // Lakukan sesuatu saat error ), ));

Tetapi bukan tanpa alasan kami ingin berurusan dengan janji, dan bahkan menghapus seluruh proyek untuk ini, meskipun kecil. Selain itu, $.ajax sudah mengembalikan janji dan akan menjadi dosa untuk tidak menggunakannya. Karena itu, mari kita tarik napas dan tulis kode yang sedikit berbeda.

FILE /js/user.js

// Pengguna Modul "gunakan ketat"; var user = (function() ( // Informasi umum tentang pengguna // Mengembalikan objek - email dan fungsi bonus pengguna getInfo(params) ( return $.ajax(( url: "php/user/info.php", data : ( userId: params.userId ), metode: "get", tipe data: "json" )).then(function(data) ( return ( email: data.email, bonus: data.bonus ); )).fail( app.onCatchError); ) // Kembali ke luar pengembalian ( info: getInfo ) ))();

Ini adalah kerangka modul pengguna dan fungsi pertama yang menggunakan janji. Terlihat sangat familier - $.ajax yang sama, tetapi tidak ada fungsi panggilan balik untuk memulai. Sebagai gantinya, kami menentukan data apa yang akan dikembalikan sebagai hasil kueri. Di blok kemudian ... kembali, kami mengatakan bahwa kami mengharapkan objek dari janji dari dua bidang: email dan bonus. Seperti yang kita ingat, mereka adalah yang dikembalikan dari backend atas permintaan php/user/info.php.

getInfo(params) - kami meneruskan objek dengan parameter ke fungsi. Dalam kasus kami, ini adalah satu-satunya, userId, tetapi Anda memahami bahwa objek itu nyaman karena Anda dapat mentransfer data sebanyak yang Anda suka di dalamnya. Oleh karena itu, kedepannya kita akan menggunakan objek sebagai parameter. Namun, dan sebagai tanggapan dari server juga.

Fail(app.onCatchError) memberitahu Anda untuk memanggil metode onCatchError modul aplikasi jika ada yang tidak beres dengan permintaan. Masalahnya bisa berbeda: kesalahan sisi server, metode permintaan yang salah, atau url yang tidak valid. Abaikan apa yang dilakukan metode onCatchError ini untuk saat ini, kami akan mencari tahu di akhir artikel.

Perhatikan juga bahwa metode user.info tidak tahu apa-apa tentang bagaimana data akan digunakan. Tugasnya adalah mengembalikan data, dan apa yang harus dilakukan dengannya, biarkan kode yang disebut user.info mencari tahu. Dan menurut saya, ini keren, karena Anda bisa melihat pemisahan logika yang jelas. Modul pengguna tahu bagaimana berinteraksi dengan server, tetapi tidak tahu apa yang diinginkan browser darinya. Modul ini dapat dianggap sebagai lapisan antara manipulasi javascript dari dom browser dan backend kita. Sama seperti kode php adalah lapisan yang sama antara browser klien dan database.

Tapi kami terbawa memikirkan modul dan getInfo. Mari kita lihat cara menggunakannya dalam praktik - ini ada di fungsi _userInfo dari modul aplikasi. Kami dengan hati-hati menulis sebuah rintisan untuk itu, mari kita isi dengan kode

// Dapatkan informasi tentang fungsi pengguna _userInfo() ( user.info((userId: userId)).done(function(userInfo) ( console.log("userInfo: ", userInfo); )); )

Dan hanya ini yang dipanggil saat tombol diklik! Kami menarik metode info dari modul pengguna. Tidak getInfo adalah fungsi internal. Ini adalah info, karena kami menentukannya di pengguna di blok kembali (...)

user.info((userId: userId)) mengembalikan janji kepada kami. Lebih jauh di sepanjang rantai, kami memanggil selesai dengan fungsi panggilan balik, di mana kami meneruskan hasil dari janji. Izinkan saya mengingatkan Anda bahwa ini adalah objek formulir (email: " [dilindungi email]", bonus: 12345). Kami tidak akan melakukan sesuatu yang istimewa dengan hasil ini, kami hanya akan menampilkannya di konsol. Tetapi tidak ada yang menghentikan Anda untuk melakukan beberapa manipulasi dengan data ini. Bahkan dimungkinkan untuk mengalokasikan fungsi terpisah untuk ini, di mana Anda meneruskan objek userInfo.

Mari kita lihat kembali kode yang dihasilkan dan bandingkan dengan permintaan $.ajax biasa dan lakukan semua manipulasi yang diperlukan dengan sukses-e. Tampaknya kodenya sama, kecuali menjadi sedikit lebih besar. Tapi ada sesuatu yang berubah. Kode menjadi lebih bersih. Itu dibagi menjadi 2 bagian logis: akuisisi data dan pemrosesan data. Investasi lebih sedikit. Fungsi lebih pendek.

Jika Anda masih tidak percaya pada manfaat praktis dari pendekatan ini, maka di bawah ini saya dapat meyakinkan Anda tentang hal ini. Tapi pertama-tama, mari kita tulis kode untuk mendapatkan daftar pesanan pengguna - salinan karbon dari contoh sebelumnya.

Dapatkan daftar pesanan pengguna

Tambahkan kode berikut ke modul pengguna

// Daftar pesanan pengguna // Mengembalikan array pesanan dalam format (id pesanan, jumlah pesanan) fungsi getOrders(params) ( return $.ajax(( url: "php/user/orders.php", data: ( userId: params.userId ), metode: "get", dataType: "json" )).then(function(data) ( return data.orders; )).fail(app.onCatchError); ) return ( info: getInfo, pesanan: getOrders, )

Dan di main.js, isi fungsi lain dengan kode

// Dapatkan daftar fungsi pesanan pengguna _userOrders() ( user.orders((userId: userId)).done(function(userOrders) ( console.log("userOrders: ", userOrders); )); )

Tidak ada yang baru di sini, kami mengirim permintaan, menerima daftar pesanan, menampilkannya di konsol. Tapi di paragraf berikutnya, itu akan jauh lebih menarik.

Dapatkan pesanan terakhir pengguna

Misalkan kita membutuhkan informasi bukan tentang semua pesanan, tetapi tentang satu, yang terakhir. API backend hanya memungkinkan kita untuk mendapatkan semua pesanan secara keseluruhan, dalam sebuah array. Tidak ada masalah, kita dapat dengan mudah mengeluarkan objek pesanan terpisah pada klien, tetapi bagaimana mengaturnya?

Tentu saja, $.ajax yang sama akan membantu kita, tetapi berapa banyak kode yang harus kita simpan dan tempel dalam kasus ini? Kami tidak tahu seberapa sering pesanan terakhir harus ditarik dan ke fungsi mana untuk mengirim data yang diterima. Tentu saja, Anda dapat merampingkan kode apa pun, menulis fungsi pembungkus untuk permintaan ajax, dan meneruskan fungsi penangan hasil yang diperlukan ke $.ajax.success ... Tetapi Anda harus mengakui, ini bukan cara yang paling nyaman, meskipun sudah biasa

Oleh karena itu, dalam rangka menguasai janji, kami akan membuat tipuan seperti itu dengan telinga kami dan menulis satu fungsi lagi di modul pengguna

// Pesanan terakhir pengguna // Kembalikan fungsi pesanan (objek) terakhir getLastOrder(params) ( return getOrders(params).then(function(orders) ( return orders.slice(-1); )); ) return ( info: getInfo , pesanan: getOrders, lastOrder: getLastOrder, )

Lihat apa yang telah kita lakukan. Kami mengambil metode siap pakai yang mengembalikan janji lain yang menerima daftar pesanan. Perintah di .then(function(orders)) mendapatkan persis array pesanan yang diterima dari backend. Maka tinggal mengembalikan elemen terakhir dari array melalui return orders.slice(-1);

Keuntungan dari rantai seperti itu sudah bisa dilihat di sini. Fungsi getLastOrder bahkan tidak tahu bagaimana semua pesanan diambil. Tidak ada permintaan ajax yang terlihat di sini, ini ditangani dengan metode lain. Kami hanya menggunakan hasil jadi.

Dan menggunakan ini di main.js saat tombol diklik semudah contoh sebelumnya.

// Fungsi Pesanan Terakhir Pengguna _userLastOrder() ( user.lastOrder((userId: userId)).done(function(lastOrder) ( console.log("userLastOrder: ", lastOrder); )); )

Mari kita tulis fungsi lain untuk menyematkan.

Mendapatkan jumlah semua pesanan pengguna

// Jumlah total pesanan fungsi getTotalSummaOrders(params) ( return getOrders(params).then(function(orders) ( return orders.reduce(function(total, currOrder) ( return total + currOrder.summa; ), 0); ) ); ) return ( info: getInfo, pesanan: getOrders, lastOrder: getLastOrder, totalSummaOrders: getTotalSummaOrders )

// Jumlah total dari semua fungsi pesanan _userTotalSummaOrders() ( user.totalSummaOrders((userId: userId)).done(function(totalSumma) ( console.log("userTotalSummaOrders: ", totalSumma); )); )

Kami menggunakan penerima yang sama. Kami mengambil metode getOrders(params) yang sudah jadi dan menghitung jumlah pesanan menggunakan pengurangan. Dan lagi, alih-alih selusin baris kode dengan panggilan balik, kita melihat 2 fungsi yang singkat dan berbeda. Selain itu, user.totalSummaOrders() dapat terus digunakan di mana saja, tanpa khawatir tentang bagaimana data yang dikembalikan ke sana akan digunakan.

Menambahkan pengguna baru

// Menambahkan pengguna // Mengembalikan id dari fungsi pengguna yang dibuat newUser(params) ( return $.ajax(( url: "php/user/new.php", data: ( // beberapa data tentang email pengguna baru : params.email, nama: params.name ), metode: "post", tipe data: "json" )).then(function(data) ( return data.userId; )).fail(app.onCatchError); ) return ( info: getInfo, pesanan: getOrders, lastOrder: getLastOrder, totalSummaOrders: getTotalSummaOrders, newUser: newUser )

// Menambahkan fungsi pengguna _userNew() ( var data = ( email: " [dilindungi email]", nama: "Webdevkin" ); user.newUser(data).done(function(userId) ( console.log("userNew: ", userId); )); )

Itu terlihat sedikit lebih lama, tetapi hanya karena kita meneruskan objek dari dua bidang ke server. Sisa kode sesederhana mendapatkan informasi. Jangan lupa metode itu: "posting" sudah digunakan di sini

Dan sekarang yang lebih menarik, mari kita mulai menggabungkan permintaan ajax. Mari buat modul order.js baru.

Menambahkan pesanan

// Urutan Modul "gunakan ketat"; var order = (function() ( // Menambahkan pesanan // Mengembalikan id dari fungsi pesanan yang dibuat _createOrder(params) ( return $.ajax(( url: "php/order/new.php", data: ( / / beberapa data pesanan baru userId: params.userId, summa: params.summa ), metode: "post", dataType: "json" )).then(function(data) ( return data.orderId; )).fail(app . onCatchError); ) // Menambahkan pesanan // Mengembalikan id dari fungsi pesanan yang dibuat newOrder(params) ( if (params.userId) ( // userId diketahui, kami segera menambahkan order return _createOrder(params); ) else ( // Anda harus membuat pengguna terlebih dahulu return user.newUser(params).then(function(userId) ( return _createOrder((userId: userId, summa: params.summa)); )); ) ) // Return pengembalian luar ( newOrder: newOrder ) ))() ;

Ada 2 fungsi di sini. _createOrder secara langsung menambahkan pesanan. Bekerja sama dengan menambahkan pengguna. Kami tidak akan memanggil metode ini langsung dari luar - semua pekerjaan akan melalui NewOrder.

Apa yang istimewa dari dia? Kita perlu sedikit penyimpangan di sini...

Bagaimana cara kerja pemesanan online?
Seringkali, pemesanan dilakukan dengan dua cara: untuk pengguna terdaftar dan tamu. Bagi mereka yang terdaftar, semuanya jelas: kami mengambil userId (sebagai aturan, disimpan di backend di sesi), kami mentransfer data pesanan dari klien, kami menambahkan pesanan ke database. Lepota.
Tetapi jika "tamu" telah memasuki situs, maka kami juga harus memastikan bahwa pesanan telah dilakukan. Tetapi Anda masih perlu mendapatkan pengguna di dalamnya, pesanan itu harus diikat dengan bodoh ke seseorang. Anda dapat memaksa seseorang untuk mendaftar secara terpisah di situs, kembali ke checkout, dan, sebagai pengguna penuh, mengirim data pesanan ke server.
Atau Anda dapat bertindak secara manusiawi: kumpulkan minimal data pengguna (nama + email), data pesanan dan dalam satu gerakan dan daftarkan pengguna dan tambahkan pesanan kepadanya. Tidak ada gerakan yang tidak perlu - lebih banyak kegembiraan bagi pembeli.

Singkatnya, ternyata fungsi newOrder tidak hanya dapat melakukan penambahan pesanan, tetapi juga pra-penambahan pengguna. Kebutuhan ini diverifikasi dengan adanya parameter userId di params. Jika tidak ada, maka pertama-tama kita tambahkan pengguna, dapatkan userId-nya dan mulai menambahkan pesanan _createOrder dengannya

Jika params.userId diketahui, maka _createOrder dijalankan secara langsung. Manipulasi yang cukup rumit diimplementasikan oleh 5-6 baris kode yang sama. Setiap kali kami melakukan tugas yang semakin kompleks, tetapi kami tidak mengamati komplikasi kode yang signifikan. Serangkaian metode sederhana yang mengembalikan janji memungkinkan kita untuk menggabungkan kueri dengan cara apa pun dan merakit fungsionalitas kompleks seperti konstruktor Lego.

Mari kita periksa bagaimana menambahkan perintah ke app.js bekerja - mari kita tulis handler untuk dua tombol lagi di main.js.

// Menambahkan fungsi pesanan _orderNew() ( var data = ( userId: userId, summa: 7000 ); order. newOrder(data).done(function(orderId) ( console.log("orderCreate: ", orderId); ) ); ) // Menambahkan pesanan dan membuat fungsi pengguna _orderNewWithUser() ( var data = ( email: " [dilindungi email]", nama: "Webdevkin", summa: 10.000 ); order.newOrder(data).then(function(orderId) ( console.log("orderNewWithUser: ", orderId); )); )

Terapkan bonus untuk memesan

// Terapkan bonus untuk pesanan // Kembalikan true jika berhasil fungsi applyBonus(params) ( return $.ajax(( url: "php/order/applyBonus.php", data: ( orderId: params.orderId, bonus: params. bonus ), metode: "post", tipe data: "json" )).then(function() ( return true; )).fail(app.onCatchError); ) // Kembali ke luar return ( newOrder: newOrder, applyBonus: applyBonus )

// Menerapkan bonus ke fungsi pesanan _orderApplyBonus() ( order.applyBonus((orderId: 5, bonus: 200)).then(function(result) ( console.log("orderApplyBonus: ", result); )); )

Semuanya akrab di sini. Kami membutuhkan fungsi sebagai perantara untuk mendemonstrasikan cara membuat 3 permintaan ajax. Anda hanya perlu membuat kasus yang membutuhkan 3 permintaan berturut-turut.

Ya Mudah! Mari kita berfantasi. Pada hari ulang tahun perusahaan, manajemen memutuskan untuk memberikan bonus kepada semua pelanggannya dan menghapus jumlah ini dari pesanan terakhir pengguna. Bagaimana bonus diperoleh bukan urusan kami, kami perlu mendapatkan jumlah bonus dan id pesanan terakhir. Ini adalah 2 permintaan get yang dapat dieksekusi secara paralel. Setelah menunggu data ini, kami akan mengirimkan permintaan (ketiga) lain ke server, yang sudah diposting, yang akan menerapkan bonus yang ditentukan ke pesanan yang diinginkan.

Sebuah contoh, tentu saja, dibuat-buat, tetapi demi seni itu akan dilakukan. Kami menulis kode.

Menerapkan bonus untuk pesanan terakhir pengguna

// Terapkan bonus untuk pesanan terakhir // Kembalikan true jika berhasil fungsi applyBonusToLastOrder(params) ( var infoPromise = this.info(params), lastOrderPromise = this.lastOrder(params); return $.when(infoPromise, lastOrderPromise).then ( function(userData, lastOrderInfo) ( return order.applyBonus(( orderId: lastOrderInfo.orderId, bonus: userData.bonus )); )); ) return ( info: getInfo, orders: getOrders, lastOrder: getLastOrder, totalSummaOrders: getTotalSummaOrders, newUser : pengguna baru, applyBonusToLastOrder: applyBonusToLastOrder )

Di sini kita telah menggunakan konstruksi $.when yang baru. Intinya adalah kita memberikan beberapa janji untuk itu, menunggu hasilnya, dan meneruskan panggilan balik ke fungsi then - apa yang ingin kita lakukan dengan hasil ini. Dalam kasus kami, kami mengekstrak bonus pengguna dari yang pertama, dan id pesanan terakhir dari yang kedua. Dan kami memberikan data ini ke metode ketiga. Dan itu saja.

Ini adalah penggunaan janji terakhir dan paling berbelit-belit dalam proyek pengujian kami. Pikirkan berapa banyak kode yang akan kita tulis untuk urutan seperti itu sebelumnya, tanpa mengetahui cara menggunakan janji.

Kami memeriksa pekerjaan di main.js seperti ini

// Menerapkan bonus ke fungsi pesanan terakhir pengguna _userApplyBonusToLastOrder() ( user.applyBonusToLastOrder((userId: userId)).then(function(result) ( console.log("userApplyBonusToLastOrder: ", result); )); )

Pemrosesan kesalahan

Dunia kita tidak sempurna, dan pada tahap apa pun permintaan itu dapat terganggu. Kita perlu entah bagaimana menangani kasus seperti itu dan mengingat metode app.onCatchError. Mari kita lihat implementasinya

// Menangkap kesalahan dalam fungsi janji onCatchError(response) ( var json = response.responseJSON, message = (json && json.error) ? json.error: response.statusText; console.log("ERROR: ", message); )

Apa yang terjadi di sini? Pada parameter respons, kita akan menemukan informasi tentang kesalahan yang telah menimpa kita. Kami pertama-tama menarik konten respons ke dalam objek json. Dan kemudian kami memeriksanya untuk keberadaan bidang kesalahan yang tidak dapat dipahami.

Jika kita kembali ke bagian kode php, kita akan melihat bahwa tidak ada yang misterius di bidang ini. Kami sendiri mengembalikannya dari backend jika terjadi ketidakcocokan metode (kode http 405). Ketika, misalnya, kami mencoba membuat pengguna menggunakan metode GET. Saya menulis kode php ini semata-mata untuk menunjukkan bahwa kami sendiri dapat menghasilkan penyebab kesalahan yang memadai dan melaporkannya kepada pengguna. Dengan cara yang sama, respons seperti itu dapat dilontarkan jika terjadi kesalahan selama validasi parameter input atau selama penulisan ke database.

Jadi, di json.error kita akan menemukan deskripsi kesalahan yang dihasilkan di backend. Tetapi ini akan berfungsi jika permintaan telah mencapai server. Jika kami membuat kesalahan, misalnya, dengan URL atau server tidak merespons, maka dalam kasus ini kami menganalisis respons reguler dari objek xhr response.statusText.

Apa yang harus dilakukan dengan informasi kesalahan ini terserah Anda. Seringkali beberapa jenis pesan tidak mencolok seperti "ada yang tidak beres" ditampilkan. Misalnya, kita akan menulis console.log("ERROR: ", message) dan ini akan mengakhiri artikel.

Hasil, demo, dan sumber

Saya harap saya meyakinkan Anda bahwa janji layak untuk dilihat, bukan hanya demi baris tambahan dalam resume. Tentu saja, dalam artikel kami bahkan tidak mempertimbangkan semua kemungkinan mereka dengan cermat. Faktanya, kami hanya menyentuh kasus khusus - janji yang dikembalikan oleh metode $.ajax standar, dan secara singkat - $.kapan. Tetapi di sisi lain, mereka memastikan bahwa Anda dapat bekerja dengan ini dan menggunakannya untuk menulis kode yang sederhana dan mudah diperluas untuk tugas-tugas yang cukup beragam dan kompleks.

Di sini Anda dapat meninjau kode. Dan lihat di sini. Hanya dengan mengklik tombol, Anda tidak akan melihat apa pun. Buka konsol, tab Jaringan, dan lihat urutan kueri yang dijalankan, data yang diteruskan, dan hasil yang dikembalikan. Pastikan bahwa dalam beberapa permintaan berturut-turut semua parameter dilewatkan dengan benar.

Dan tentu saja, bagikan pemikiran dan pertimbangan Anda sendiri di komentar.

Tampilan