Heim > Artikel > Backend-Entwicklung > Führen Sie mehrere Vorlagen bedingt aus
php-Editor Yuzai führt Sie in eine leistungsstarke Technologie ein: die bedingte Ausführung mehrerer Vorlagen. Bei der Entwicklung einer Website müssen wir häufig verschiedene Vorlagendateien basierend auf unterschiedlichen Bedingungen dynamisch laden. Dies ist das Anwendungsszenario der bedingten Ausführung mehrerer Vorlagen. Durch den Einsatz dieser Technologie können wir entsprechende Vorlagendateien basierend auf dem Anmeldestatus, den Berechtigungen und anderen Bedingungen des Benutzers dynamisch laden und so eine flexiblere und personalisiertere Website-Oberfläche erreichen. Diese Technologie verbessert nicht nur die Skalierbarkeit und Wartbarkeit der Website, sondern bietet den Benutzern auch ein besseres Benutzererlebnis. In diesem Artikel stellen wir detailliert vor, wie Sie mit PHP mehrere Vorlagen bedingt ausführen, damit Sie sie besser in tatsächlichen Projekten anwenden können.
Ich habe eine Webseite mit zwei Ansichten, eine für anonyme Benutzer und eine für Admin-Benutzer. Ich möchte die Navigationsleiste nur für Admin-Benutzer anzeigen. Alles andere bleibt für beide Benutzertypen gleich.
Hier ist, was ich bisher versucht habe
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 }}
Ich gehe davon aus, dass die Dashboard-Vorlage nicht geparst wird, da ich die Vorlage „admin.html“ nicht übergebe, wenn ich die Vorlage für den anonymen Benutzer ausführe. Allerdings ist bei mir dieser Fehler aufgetreten:
template: index.html:18:14: executing "index.html" at <{{template "dashboard"}}>: template "dashboard" not defined
Wie kann dieses Problem gelöst werden, oder gibt es einen besseren Weg?
Verwenden Sie if
操作有条件地渲染 dashboard
Vorlage:
{{ if eq .name "admin" }} {{ template "dashboard" }} {{ end }}
Die Praxis besteht darin, die Vorlage nur einmal zu analysieren, anstatt sie bei jeder Anfrage zu analysieren:
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)) }
Das obige ist der detaillierte Inhalt vonFühren Sie mehrere Vorlagen bedingt aus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!