# SEO

The SEO library allows for the management and injection of dynamic data into HTML tags for the purpose of Search Engine Optimisation.

## Usage

- Create a SEO collection

```go
// Create a collection and register global seo by default
collection := seo.NewCollection()

// Change the default global name
collection.SetGlobalName("My Global SEO")

// Change the default context db key
collection.SetDBContextKey("My DB")

// Change the default seo model setting
type MySEOSetting struct{
  QorSEOSetting
  publish
  l10n
}
collection.SetSettingModel(&MySEOSetting{})

// Turn off the default inherit the upper level SEO data when the current SEO data is missing
collection.SetInherited(false)

```

- Register and remove SEO

```go
// Register mutiple SEO by name
collection.RegisterSEOByNames("Not Found", "Internal Server Error")

// Register a SEO by model
type Product struct{
  Name  string
  Setting Setting
}
collection.RegisterSEO(&Product{})

// Remove a SEO
collection.RemoveSEO(&Product{}).RemoveSEO("Not Found")
```

- Configure SEO

```go
// Change the default SEO name when register a SEO by model

collection.RegisterSEO(&Product{}).SetName("My Product")

// Register a context Variable
collection.RegisterSEO(&Product{}).
          RegisterContextVariables("og:image", func(obj interface{}, _ *Setting, _ *http.Request) string {
						return obj.image.url
					}).
          RegisterContextVariables("Name", func(obj interface{}, _ *Setting, _ *http.Request) string {
						return obj.Name
					})


// Register setting variable
collection.RegisterSEO(&Product{}).
          RegisterSettingVaribles(struct{ProductTag string}{})
```

- Render SEO html data

```go
// Render Global SEO
collection.RenderGlobal(request)

// Render SEO by a name
collection.Render("product", request)

// Render SEO by a model
collection.Render(Product{}, request)
```