Add home_welcome and home_subtitle fields (zh/en) to site_settings so
the home page heading and subtitle are editable from the admin panel,
falling back to the i18n defaults when empty. Wire them through the
config cache, SetUserContext, DefaultData, and home.html.
Fix the /admin/settings/site page rendering blank: Go templates cannot
invoke methods on an interface{}-wrapped struct, so pre-compute
SiteLogoIsURL in the handler instead of calling .Site.LogoIsURL() in
the template.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
113 lines
3.7 KiB
Go
113 lines
3.7 KiB
Go
package models
|
|
|
|
import "time"
|
|
|
|
// SiteSetting holds the singleton (id=1) global display configuration:
|
|
// logo, top-left title, header banner text, and footer text, each with
|
|
// zh/en variants that fall back to i18n defaults when empty.
|
|
type SiteSetting struct {
|
|
ID uint `gorm:"primarykey" json:"id"`
|
|
Logo string `gorm:"size:512" json:"logo"` // local filename (served under /uploads/logos) OR a full URL
|
|
LogoTextZh string `gorm:"size:255" json:"logo_text_zh"` // top-left title (zh)
|
|
LogoTextEn string `gorm:"size:255" json:"logo_text_en"` // top-left title (en)
|
|
HeaderTextZh string `gorm:"size:512" json:"header_text_zh"` // header banner text (zh)
|
|
HeaderTextEn string `gorm:"size:512" json:"header_text_en"` // header banner text (en)
|
|
HomeWelcomeZh string `gorm:"size:255" json:"home_welcome_zh"` // home page welcome heading (zh)
|
|
HomeWelcomeEn string `gorm:"size:255" json:"home_welcome_en"` // home page welcome heading (en)
|
|
HomeSubtitleZh string `gorm:"size:512" json:"home_subtitle_zh"` // home page subtitle (zh)
|
|
HomeSubtitleEn string `gorm:"size:512" json:"home_subtitle_en"` // home page subtitle (en)
|
|
FooterTextZh string `gorm:"size:512" json:"footer_text_zh"` // footer text (zh)
|
|
FooterTextEn string `gorm:"size:512" json:"footer_text_en"` // footer text (en)
|
|
UpdatedBy uint `gorm:"index" json:"updated_by"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// TableName overrides the default GORM table name.
|
|
func (SiteSetting) TableName() string {
|
|
return "site_settings"
|
|
}
|
|
|
|
// LogoIsURL reports whether the logo value is an external URL rather than a
|
|
// local filename.
|
|
func (s *SiteSetting) LogoIsURL() bool {
|
|
if s == nil || s.Logo == "" {
|
|
return false
|
|
}
|
|
return len(s.Logo) >= 4 && (s.Logo[:4] == "http")
|
|
}
|
|
|
|
// LogoText returns the title for the given language code, falling back to the
|
|
// other language when the requested one is empty.
|
|
func (s *SiteSetting) LogoText(lang string) string {
|
|
if lang == "zh" {
|
|
if s.LogoTextZh != "" {
|
|
return s.LogoTextZh
|
|
}
|
|
return s.LogoTextEn
|
|
}
|
|
if s.LogoTextEn != "" {
|
|
return s.LogoTextEn
|
|
}
|
|
return s.LogoTextZh
|
|
}
|
|
|
|
// HeaderText returns the header banner text for the given language code,
|
|
// falling back to the other language when the requested one is empty.
|
|
func (s *SiteSetting) HeaderText(lang string) string {
|
|
if lang == "zh" {
|
|
if s.HeaderTextZh != "" {
|
|
return s.HeaderTextZh
|
|
}
|
|
return s.HeaderTextEn
|
|
}
|
|
if s.HeaderTextEn != "" {
|
|
return s.HeaderTextEn
|
|
}
|
|
return s.HeaderTextZh
|
|
}
|
|
|
|
// HomeWelcome returns the home page welcome heading for the given language,
|
|
// falling back to the other language when the requested one is empty.
|
|
func (s *SiteSetting) HomeWelcome(lang string) string {
|
|
if lang == "zh" {
|
|
if s.HomeWelcomeZh != "" {
|
|
return s.HomeWelcomeZh
|
|
}
|
|
return s.HomeWelcomeEn
|
|
}
|
|
if s.HomeWelcomeEn != "" {
|
|
return s.HomeWelcomeEn
|
|
}
|
|
return s.HomeWelcomeZh
|
|
}
|
|
|
|
// HomeSubtitle returns the home page subtitle for the given language,
|
|
// falling back to the other language when the requested one is empty.
|
|
func (s *SiteSetting) HomeSubtitle(lang string) string {
|
|
if lang == "zh" {
|
|
if s.HomeSubtitleZh != "" {
|
|
return s.HomeSubtitleZh
|
|
}
|
|
return s.HomeSubtitleEn
|
|
}
|
|
if s.HomeSubtitleEn != "" {
|
|
return s.HomeSubtitleEn
|
|
}
|
|
return s.HomeSubtitleZh
|
|
}
|
|
|
|
// FooterText returns the footer text for the given language code, falling
|
|
// back to the other language when the requested one is empty.
|
|
func (s *SiteSetting) FooterText(lang string) string {
|
|
if lang == "zh" {
|
|
if s.FooterTextZh != "" {
|
|
return s.FooterTextZh
|
|
}
|
|
return s.FooterTextEn
|
|
}
|
|
if s.FooterTextEn != "" {
|
|
return s.FooterTextEn
|
|
}
|
|
return s.FooterTextZh
|
|
}
|