Сохранение HTML-шаблона в виде текстового поля в БД с использованием golang

Я новичок в го и эхо. Мне необходимо сохранить HTML-шаблон (шаблон электронной почты), который также будет содержать некоторые детали в качестве контекста. Так что это может быть сохранено в столбце тела (текст в MySQL) и будет запущено позже.

if user.Email !=""{
            visitingDetails := H{"user_name"      : user.Fname,
                                 "location"       : location.Name,
                                 "visitor_company": visitor.Company,
                                 "visitor_name"   : visitor.Fname +" "+visitor.Lname,
                                 "visitor_phone"  : visitor.Phone,
                                 "visitor_email"  : visitor.Email,
                                 "visitor_fname"  : visitor.Fname,
                                 "visitor_image"  : visitor.ProfilePicture,
                              }
            subject := visitor.Fname +" has come to visit you at the reception"
            body := c.Render(http.StatusOK,"email/user_notify_email.html",visitingDetails)
            emailJob := models.EmailJob{Recipients: visitor.Email , Subject: subject, Body: body}
            db.Create(&emailJob)
            if db.NewRecord(emailJob){
                fmt.Println("Unable to send email")
            }
        }

EmailJob

type EmailJob struct {
    Id              int       
    Recipients      string    
    Subject         string   
    Body            string          
    Sent            int        
    Error           string 
}

func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
    return t.templates.ExecuteTemplate(w, name, data)
}

body: = c.Render (http.StatusOK, "email / user_notify_email.html", visitDetails)

эта строка выдает ошибку, так как возвращает ошибку для рендера. Я не уверен, как я это сделаю? Надеюсь, я дал понять. Небольшая помощь будет высоко ценится.

2 ответа

Решение

Ты используешь context.Render метод неверно.

https://github.com/labstack/echo/blob/master/context.go#L111

// Render renders a template with data and sends a text/html response with status
// code. Renderer must be registered using `Echo.Renderer`.
Render(code int, name string, data interface{}) error

Методы Render визуализируют шаблон и отправляют его как ответ. Этот метод возвращает значение ошибки, если происходит что-то непредвиденное, это значение ошибки является его описанием. В противном случае оно равно nil, Смотрите: https://golang.org/pkg/errors/

Чтобы использовать Renderer, вы должны зарегистрировать его, и вы можете использовать этот зарегистрированный Renderer, чтобы получить отрендеренный текст шаблона и сохранить его в БД.

Вы можете увидеть пример рендерера в модульных тестах платформы Echo: https://github.com/labstack/echo/blob/master/context_test.go#L23

Надеюсь это поможет.

После нескольких вещей и понимания шаблона в golang. Я пришел к такому решению.

t, err := template.ParseFiles("templates/email/user_notify_email.html")
        if err != nil {
            fmt.Println("Error happend")
            fmt.Println(err)
            return c.JSON(http.StatusOK, data)
        }
        buf := new(bytes.Buffer)
        if err = t.Execute(buf, visitingDetails); err != nil {
            fmt.Println(err)
        }
        body := buf.String()

И теперь это тело можно хранить. Кузов предоставил шаблон, который мне нужен. Большая заслуга в этой статье https://medium.com/@dhanushgopinath/sending-html-emails-using-templates-in-golang-9e953ca32f3d

Другие вопросы по тегам