Maison  >  Article  >  développement back-end  >  Exécuter conditionnellement plusieurs modèles

Exécuter conditionnellement plusieurs modèles

王林
王林avant
2024-02-09 11:48:09304parcourir

Exécuter conditionnellement plusieurs modèles

l'éditeur php Yuzai vous présente une technologie puissante : l'exécution conditionnelle de plusieurs modèles. Lors du développement d'un site Web, nous devons souvent charger dynamiquement différents fichiers de modèles en fonction de différentes conditions. Il s'agit du scénario d'application consistant à exécuter conditionnellement plusieurs modèles. En utilisant cette technologie, nous pouvons charger dynamiquement les fichiers modèles correspondants en fonction du statut de connexion, des autorisations et d'autres conditions de l'utilisateur, obtenant ainsi une interface de site Web plus flexible et personnalisée. Cette technologie améliore non seulement l'évolutivité et la maintenabilité du site Web, mais offre également aux utilisateurs une meilleure expérience utilisateur. Dans cet article, nous présenterons en détail comment utiliser PHP pour exécuter conditionnellement plusieurs modèles afin de vous aider à mieux les appliquer dans des projets réels.

Contenu de la question

J'ai une page Web avec deux vues, une pour les utilisateurs anonymes et une pour les utilisateurs administrateurs. Je souhaite afficher la barre de navigation uniquement pour les utilisateurs administrateurs. Tout le reste reste le même pour les deux types d’utilisateurs.

Voici ce que j'ai essayé jusqu'à présent

main.go

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))
}

index.html

<!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&#160;protected]/dist/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.jsdelivr.net/npm/[email&#160;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>

admin.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 }}

Mon hypothèse est que, comme je ne transmets pas le modèle admin.html lors de l'exécution du modèle pour l'utilisateur anonyme, le modèle de tableau de bord ne sera pas analysé. Cependant, j'ai rencontré cette erreur :

template: index.html:18:14: executing "index.html" at <{{template "dashboard"}}>: template "dashboard" not defined

Comment résoudre ce problème, ou existe-t-il une meilleure façon ?

Solution

Utiliser if 操作有条件地渲染 dashboard Modèle :

{{ if eq .name "admin" }} {{ template "dashboard" }} {{ end }}

La pratique consiste à analyser le modèle une seule fois au lieu de l'analyser à chaque demande :

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))
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer