স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে গোতে নেস্টেড টেম্পলেটগুলি থাকা কি সম্ভব?


88

অজগর রানটাইমে জিনজার মতো নেস্টেড টেম্পলেটগুলি কীভাবে পাব। টিবিসি বলতে যা বোঝায় তা হ'ল জিনজা / জ্যাঞ্জো-টেম্পলেটগুলির মতো বেস টেমপ্লেটগুলির ব্লকগুলিতে কেবল ফাইল টেমপ্লেটগুলির উত্তরাধিকার সূত্রে আমি কীভাবে গুচ্ছ টেমপ্লেট পেয়েছি inherit এটি কি কেবল html/templateস্ট্যান্ডার্ড লাইব্রেরিতে ব্যবহার করেই সম্ভব ?

যদি এটি কোনও সম্ভাবনা না থাকে তবে আমার বিকল্পগুলি কী। গোঁফ একটি বিকল্প বলে মনে হচ্ছে তবে আমি কি সেই সূক্ষ্ম সূক্ষ্ম বৈশিষ্ট্যগুলি html/templateযেমন প্রসঙ্গে সংবেদনশীল পলায়ন ইত্যাদি অনুপস্থিত করব ? অন্য কোন বিকল্প থার?

(পরিবেশ: গুগল অ্যাপ ইঞ্জিন, গো রানটাইম ভি 1, দেব - ম্যাক ওএসএক্স সিংহ)

পড়ার জন্য ধন্যবাদ.

উত্তর:


133

হ্যা এটা সম্ভব. এ html.Templateআসলে টেম্পলেট ফাইলগুলির একটি সেট। আপনি যদি এই সেটে একটি সংজ্ঞায়িত ব্লক কার্যকর করেন, তবে এই সেটটিতে সংজ্ঞায়িত অন্যান্য সমস্ত ব্লকের অ্যাক্সেস রয়েছে।

আপনি যদি নিজেরাই এই জাতীয় টেম্পলেট সেটগুলির মানচিত্র তৈরি করেন তবে জিনজা / জাঙ্গো যে অফার দেয় তা আপনার কাছে মূলত একই নমনীয়তা থাকে। পার্থক্যটি হ'ল এইচটিএমএল / টেমপ্লেট প্যাকেজের ফাইল সিস্টেমে সরাসরি অ্যাক্সেস নেই, সুতরাং আপনাকে নিজেরাই টেমপ্লেটগুলি বিশ্লেষণ করতে এবং রচনা করতে হবে।

দুটি ভিত্তিক পৃষ্ঠা ("index.html" এবং "other.html") সহ নিম্নোক্ত উদাহরণটি বিবেচনা করুন যা উভয়ই "বেস.html" থেকে উত্তরাধিকার সূত্রে প্রাপ্ত:

// Content of base.html:
{{define "base"}}<html>
  <head>{{template "head" .}}</head>
  <body>{{template "body" .}}</body>
</html>{{end}}

// Content of index.html:
{{define "head"}}<title>index</title>{{end}}
{{define "body"}}index{{end}}

// Content of other.html:
{{define "head"}}<title>other</title>{{end}}
{{define "body"}}other{{end}}

এবং টেমপ্লেট সেট নিম্নলিখিত মানচিত্র:

tmpl := make(map[string]*template.Template)
tmpl["index.html"] = template.Must(template.ParseFiles("index.html", "base.html"))
tmpl["other.html"] = template.Must(template.ParseFiles("other.html", "base.html"))

আপনি এখন কল করে আপনার "index.html" পৃষ্ঠাটি রেন্ডার করতে পারেন

tmpl["index.html"].Execute("base", data)

এবং আপনি কল করে আপনার "other.html" পৃষ্ঠাটি রেন্ডার করতে পারেন

tmpl["other.html"].Execute("base", data)

কিছু কৌশল (যেমন আপনার টেম্পলেট ফাইলগুলির একটি সামঞ্জস্যপূর্ণ নামকরণের কনভেনশন) দিয়ে tmplমানচিত্রটি স্বয়ংক্রিয়ভাবে উত্পন্ন করা এমনকি সম্ভব ।


4
ডিফল্ট ডেটা পাওয়া সম্ভব, উদাহরণস্বরূপ, "মাথা" এর জন্য?
গ্রেগজz

18
আমি এখানে যুক্ত করব যে সত্যিকারের টেম্পলেটগুলি রেন্ডার করতে আমাকে কল করতে হয়েছিল tmpl["index.html"].ExecuteTemplate(w, "base", data)
Hermansc

বেস.html দুটি বার পার্স করা এবং সংরক্ষণ করা হয়। আপনি golang.org/pkg/text/template/#example_Template_share
মার্টেন ও।

4
নেস্টেড টেম্পলেটটিতে ডেটা দেওয়ার সময় আমার সমস্যা হচ্ছে। থেকে প্রাপ্ত তথ্য {{ .SomeData }}অভ্যন্তরীণ টেমপ্লেটে প্রদর্শিত হবে না। বাইরের কাজ
0xAffe

এটা যদি template.ParseFiles("index.html", "base.html")হয় ব্যাপার template.ParseFiles("base.html", "index.html")?
শাকরা

10

দ্রষ্টব্য, আপনি যখন আপনার বেস টেমপ্লেটটি সম্পাদন করেন, আপনাকে অবশ্যই শিশু টেম্পলেটগুলিতে মানগুলি দিতে হবে, এখানে আমি কেবল "" পাস করি। যাতে সবকিছু নিচে চলে যায়।

টেমপ্লেট এক প্রদর্শন করে {{।}}

{{define "base"}}
<html>
        <div class="container">
            {{.}}
            {{template "content" .}}
        </div>
    </body>
</html>
{{end}}

টেমপ্লেট দুটি প্রদর্শন করে {{.ডোমেনস}} যা পিতামাতার মধ্যে চলে গেছে।

{{define "content"}}
{{.domains}}
{{end}}

দ্রষ্টব্য, আমরা যদি {{টেমপ্লেট "সামগ্রী" ব্যবহার করি। {{টেমপ্লেট "সামগ্রী" এর পরিবর্তে।।।

DomainsData := make(map[string]interface{})
    DomainsData["domains"] = domains.Domains
    if err := groupsTemplate.ExecuteTemplate(w, "base", DomainsData); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }

4
মডেলটি পাস করার একটি বিবরণ আমি আটকে গিয়েছিলাম। ;) ধন্যবাদ
প্যাট্রিক

4
আমিও - কিছুটা বের করেছিলাম :)
রবার্ট কিং

4
কি! আমি বিশ্বাস করতে পারি না যে little {টেমপ্লেট}} স্থানধারকটির শেষে ছোট্ট ছোট বিন্দুর এত অর্থ ছিল! কেন পৃথিবীতে টিউটোরিয়ালগুলির কোথাও উল্লেখ করা হয়নি, বা এমনকি সরকারী গো ডকুমেন্টেশন ?? আমি flabbergasted ... কিন্তু আপনার উত্তর পেয়ে খুব খুশি! আপনাকে অনেক ধন্যবাদ, এখন আমার টেমপ্লেটগুলি বেশ কয়েকটি স্তরের বাসা বাঁধে সুন্দর করে!
গুইনথ ল্লেওলিন

ঠিক ঠিক, আমি একই জিনিসটি বের করার চেষ্টা করছিলাম!
devforfu

5

অন্যান্য টেম্পলেট প্যাকেজগুলির সাথে কাজ করার পরে, এখন আমি বেশিরভাগ দিন স্ট্যান্ডার্ড এইচটিএমএল / টেম্পলেট প্যাকেজ নিয়ে কাজ করি, আমি অনুমান করি যে এটি সরবরাহ করে এমন সরলতা এবং অন্যান্য গুডির প্রশংসা না করার জন্য আমি নির্বোধ। আমি নিম্নলিখিত পরিবর্তনগুলির সাথে স্বীকৃত উত্তরের জন্য খুব অনুরূপ পন্থা ব্যবহার করি

অতিরিক্ত baseটেম্পলেট দিয়ে আপনার বিন্যাসগুলি মোড়ানোর দরকার নেই , প্রতিটি পার্স করা ফাইলের জন্য একটি টেম্পলেট ব্লক তৈরি করা হয় যাতে এটি অনর্থক হয়, আমি যেতে নতুন সংস্করণে প্রদত্ত ব্লক ক্রিয়াটিও ব্যবহার করতে চাই, যা আপনাকে অনুমতি দেয় যদি আপনি শিশু টেম্পলেটগুলিতে একটি সরবরাহ না করেন তবে ডিফল্ট ব্লক সামগ্রী

// base.html
<head>{{block "head" .}} Default Title {{end}}</head>
<body>{{block "body" .}} default body {{end}}</body>

এবং আপনার পৃষ্ঠা টেমপ্লেটগুলি একই হতে পারে

// Content of index.html:
{{define "head"}}<title>index</title>{{end}}
{{define "body"}}index{{end}}

// Content of other.html:
{{define "head"}}<title>other</title>{{end}}
{{define "body"}}other{{end}}

টেমপ্লেটগুলি কার্যকর করতে এখন আপনাকে এটির মতো কল করতে হবে

tmpl["index.html"].ExecuteTemplate(os.Stdout, "base.html", data)

4

পঙ্গো ব্যবহার করুন যা গো টেমপ্লেটগুলির একটি দুর্দান্ত সেট যা জ্যাঙ্গোর মতো টেম্পলেট উত্তরাধিকারের জন্য {{প্রসারিত}} এবং {{ব্লক}} ট্যাগগুলিকে সমর্থন করে।


4

আমি কয়েকদিন ধরে এই উত্তরে ফিরে আসছি, শেষ পর্যন্ত বুলেটটি বিট করলাম এবং এর জন্য একটি ছোট বিমূর্ত স্তর / প্রাক প্রসেসর লিখেছি। এটি মূলত:

  • টেমপ্লেটগুলিতে 'প্রসারিত' কীওয়ার্ড যুক্ত করে।
  • ওভাররাইডিংকে 'সংজ্ঞায়িত' কলগুলি মঞ্জুরি দেয় (সুতরাং গ্রেগরির জন্য ডিফল্ট মানগুলি সম্ভব)
  • অ সংজ্ঞাযুক্ত 'টেম্পলেট' কলগুলিকে মঞ্জুরি দেয়, তারা কেবল একটি খালি স্ট্রিং দেয়
  • এর ডিফল্ট মান সেট করে। 'টেম্পলেট' এ কল। পিতামাতার

https://github.com/daemonl/go_sweetpl

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.