editor php Yuzai memperkenalkan anda kepada teknologi berkuasa: melaksanakan berbilang templat secara bersyarat. Apabila membangunkan tapak web, kami selalunya perlu memuatkan fail templat yang berbeza secara dinamik berdasarkan keadaan yang berbeza Ini ialah senario aplikasi melaksanakan berbilang templat secara bersyarat. Dengan menggunakan teknologi ini, kami boleh memuatkan fail templat yang sepadan secara dinamik berdasarkan status log masuk pengguna, kebenaran dan syarat lain, dengan itu mencapai antara muka tapak web yang lebih fleksibel dan diperibadikan. Teknologi ini bukan sahaja meningkatkan kebolehskalaan dan kebolehselenggaraan tapak web, tetapi juga memberikan pengguna pengalaman pengguna yang lebih baik. Dalam artikel ini, kami akan memperkenalkan secara terperinci cara menggunakan PHP untuk melaksanakan berbilang templat secara bersyarat untuk membantu anda menerapkannya dengan lebih baik dalam projek sebenar.
Saya mempunyai halaman web dengan dua paparan, satu untuk pengguna tanpa nama dan satu untuk pengguna pentadbir. Saya mahu menunjukkan bar navigasi hanya untuk pengguna pentadbir. Semua yang lain tetap sama untuk kedua-dua jenis pengguna.
Ini yang saya cuba setakat ini
package main import ( "log" "net/http" "text/template" "github.com/julienschmidt/httprouter" ) func basicauth(h httprouter.handle, requireduser, requiredpassword string) httprouter.handle { return func(w http.responsewriter, r *http.request, ps httprouter.params) { // get the basic authentication credentials user, password, hasauth := r.basicauth() if hasauth && user == requireduser && password == requiredpassword { // delegate request to the given handle h(w, r, ps) } else { // request basic authentication otherwise w.header().set("www-authenticate", "basic realm=restricted") http.error(w, http.statustext(http.statusunauthorized), http.statusunauthorized) } } } func anonymous(w http.responsewriter, r *http.request, _ httprouter.params) { t, err := template.parsefiles("index.html") if err != nil { log.fatalln(err) } err = t.execute(w, map[string]string{"name": "anonymous"}) if err != nil { log.fatalln(err) } } func admin(w http.responsewriter, r *http.request, _ httprouter.params) { t, err := template.parsefiles("index.html", "admin.html") if err != nil { log.fatalln(err) } err = t.execute(w, map[string]string{"name": "admin"}) if err != nil { log.fatalln(err) } } func main() { user := "admin" pass := "1234" router := httprouter.new() router.get("/", anonymous) router.get("/admin/", basicauth(admin, user, pass)) log.fatal(http.listenandserve(":8080", router)) }
<!doctype html> <html lang="en"> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{{ .name }}</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script> <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script> <script> function counter() { document.getelementbyid("x").innerhtml = "x: " + document.queryselectorall('.x').length; document.getelementbyid("y").innerhtml = "y: " + document.queryselectorall('.y').length; document.getelementbyid("z").innerhtml = "z: " + document.queryselectorall('.z').length; } </script> </head> <body onload="counter()"> {{ template "dashboard" }} <nav class="navbar fixed-bottom"> <div class="container-fluid nav-justified"> <span id="x" class="navbar-brand nav-item"></span> <span id="y" class="navbar-brand nav-item"></span> <span id="z" class="navbar-brand nav-item"></span> </div> </nav> </body> </html>
{{ define "dashboard" }} <nav class="navbar"> <div class="container-fluid nav-justified"> <span class="nav-item"> <a class="navbar-brand" href="/a">a</a> </span> <span class="nav-item"> <a class="navbar-brand" href="/b">b</a> </span> <span class="nav-item"> <a class="navbar-brand" href="/c">c</a> </span> </div> </nav> {{ end }}
Andaian saya ialah kerana saya tidak memasukkan templat admin.html semasa melaksanakan templat untuk pengguna tanpa nama, templat papan pemuka tidak akan dihuraikan. Walau bagaimanapun, saya mengalami ralat ini:
template: index.html:18:14: executing "index.html" at <{{template "dashboard"}}>: template "dashboard" not defined
Bagaimana untuk menyelesaikan masalah ini, atau adakah cara yang lebih baik?
Gunakan if
操作有条件地渲染 dashboard
Templat:
{{ if eq .name "admin" }} {{ template "dashboard" }} {{ end }}
Amalan adalah untuk menghuraikan templat sekali sahaja dan bukannya menghuraikannya pada setiap permintaan:
package main import ( "log" "net/http" "sync" "text/template" "github.com/julienschmidt/httprouter" ) func BasicAuth(h httprouter.Handle, requiredUser, requiredPassword string) httprouter.Handle { return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { user, password, hasAuth := r.BasicAuth() if hasAuth && user == requiredUser && password == requiredPassword { h(w, r, ps) } else { w.Header().Set("WWW-Authenticate", "Basic realm=Restricted") http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) } } } func Anonymous(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { err := tmpl.Execute(w, map[string]string{"Name": "Anonymous"}) if err != nil { log.Fatalln(err) } } func Admin(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { err := tmpl.Execute(w, map[string]string{"Name": "Admin"}) if err != nil { log.Fatalln(err) } } var ( tmpl *template.Template tmplOnce sync.Once ) func main() { user := "admin" pass := "1234" tmplOnce.Do(func() { tmpl = template.Must(template.ParseFiles("index.html", "admin.html")) }) router := httprouter.New() router.GET("/", Anonymous) router.GET("/admin/", BasicAuth(Admin, user, pass)) log.Fatal(http.ListenAndServe(":8080", router)) }
Atas ialah kandungan terperinci Laksanakan berbilang templat secara bersyarat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!