https://github.com/tayron/gopaginacao
Biblioteca em Golang para geração de paginação usando como modelo de layout Twitter Bootstrap 4
https://github.com/tayron/gopaginacao
golang-library library paginator
Last synced: 12 months ago
JSON representation
Biblioteca em Golang para geração de paginação usando como modelo de layout Twitter Bootstrap 4
- Host: GitHub
- URL: https://github.com/tayron/gopaginacao
- Owner: tayron
- License: mit
- Created: 2020-09-09T18:46:49.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2020-09-17T20:11:14.000Z (almost 6 years ago)
- Last Synced: 2025-01-20T23:33:53.763Z (over 1 year ago)
- Topics: golang-library, library, paginator
- Language: Go
- Homepage:
- Size: 49.8 KB
- Stars: 1
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Go Paginação
Biblioteca para gerar paginação

## Importação
Para importar basta execuar o comando: ```go get -u github.com/tayron/gopaginacao```
## Configuração
Deve-se criar variavel de ambiente com o valor ```NUMERO_REGISTRO_POR_PAGINA=5``` portanto recomenda-se criação de um arquivo ```.env```
para este tipo de configuração.
## Alterando template
Caso deseja-se alterar o template, deve-se realizar um fork deste projeto e alterar o template no arquivo **gopaginacao.go**.
No inicio do arquivo segue as constantes com layout que seguem modelo de paginação do Twitter Bootstrap 4 (https://getbootstrap.com/docs/4.0/components/pagination)
```
const estruturaContainerMenu = "
- %s
const estruturaItemMenu = "
const estruturaItemMenuSelecionado = "
const estruturaItemMenuDesabilitado = "
```
## Como utilizar
No handler basta informar o **número total de registros** que existe no banco de dados, também deve ser necessário informar
o **objeto de requisição: http.Request** que será necessário para recuperar qual página foi selecionada.
Exemplo:
```
numeroTotalRegistro := models.ObterNumeroProdutos()
htmlPaginacao, offset, err := gopaginacao.CriarPaginacao(numeroTotalRegistro, r)
```
A função ```CriarPaginacao(numeroTotalRegistro, r)``` irá retornar três informações:
* O Html da páginação que deverá ser impresso na tela, ela contém o html da páginação e deve ser informado como parametro
usando a função **emplate.HTML()** do pacote **"html/template"**, exemplo:
```
parameters := struct {
Produtos []models.Produto
Paginacao template.HTML
}{
Produtos: listaProdutos,
Paginacao: template.HTML(htmlPaginacao),
}
```
* O Offset usado na consulta dos dados a serem exibidos na página selecionada, exemplo: ```models.BuscarTodosProdutos(offset)``` e a SQL deverá implementar a consulta de forma semelhante a: ```SELECT id, nome, cor, tamanho FROM produtos ORDER BY id DESC LIMIT ? OFFSET ?```, passando limite de registro configurado no arquivo .env.
* O Erro caso seja informado na páginação alguma informação inválida
## Exempĺo completo da implementação
Por fim o handler deve ser semelhante ao exemplo abaixo:
```
func ProdutoHandler(w http.ResponseWriter, r *http.Request) {
numeroTotalRegistro := models.ObterNumeroProdutos()
htmlPaginacao, offset, err := gopaginacao.CriarPaginacao(numeroTotalRegistro, r)
var listaProdutos []models.Produto
if err == nil {
listaProdutos = models.BuscarTodosProdutos(offset)
}
parameters := struct {
Produtos []models.Produto
Paginacao template.HTML
}{
Produtos: listaProdutos,
Paginacao: template.HTML(htmlPaginacao),
}
... resto do código ...
}
```
Exemplo da consulta no banco:
```
func BuscarTodosProdutos(offset int) []Produto {
db := database.ObterConexao()
defer db.Close()
var sql string = `SELECT id, nome, cor, tamanho FROM produtos ORDER BY id DESC LIMIT ? OFFSET ?`
numeroRegistro := os.Getenv("NUMERO_REGISTRO_POR_PAGINA")
rows, err := db.Query(sql, numeroRegistro, offset)
if err != nil {
panic(err)
}
defer rows.Close()
var listaProdutos []Produto
for rows.Next() {
var produtoStruct Produto
rows.Scan(&produtoStruct.ID,
&produtoStruct.Nome,
&produtoStruct.Cor,
&produtoStruct.Tamanho)
listaProdutos = append(listaProdutos, produtoStruct)
}
return listaProdutos
}
```
Exemplo da contagem de registros no banco:
```
func ObterNumeroProdutos() int {
db := database.ObterConexao()
defer db.Close()
var sql string = `SELECT count(0) FROM produtos`
rows, err := db.Query(sql)
if err != nil {
panic(err)
}
defer rows.Close()
var numeroProdutos int = 0
for rows.Next() {
rows.Scan(&numeroProdutos)
}
return numeroProdutos
}
```
## Exibindo páginação no HTML
Na tela de listagem dos deve-se imprimir a páginação usando o comando ```{{.Paginacao}}```, exemplo completo:
```
#
Referencia
Cor
Tamanho
{{- range $produto := .Produtos -}}
{{$produto.ID}}
{{$produto.Nome}}
{{$produto.Cor}}
{{$produto.Tamanho}}
{{ end }}
{{.Paginacao}}
```