Гэтсби для генерации страниц при подаче новой переменной из Contentful CMS - PullRequest
0 голосов
/ 31 августа 2018

Итак, я создал блог Gatsby с продуктами, и он может программно генерировать страницы для каждого продукта. Я хочу добавить в этот проект, чтобы он также генерировал страницы для категорий товаров. На каждой странице категории будут отображаться все продукты этой категории. Контент подается с Contentful CMS.

Возможно ли это? добавить второй шаблон макета и создать такие страницы?

exports.createPages = ({ graphql, boundActionCreators }) => {
    const { createPage } = boundActionCreators

    return new Promise((resolve, reject) => {
        const blogPost = path.resolve('./src/templates/blog-post.js')
        const categoryPage = path.resolve('./src/templates/category-post.js')

        resolve(
            graphql(
                `
            {
              allContentfulBlog(limit: 200) {
                edges {
                  node {
                    id
                    categories
                    mainTitle
                    mainImg {
                      id
                    }
                    mainText {
                      childMarkdownRemark {
                        excerpt
                      }
                    }
                    slug
                  }
                }
              }
            }
          `
            )
                .then(result => {
                    if (result.errors) {
                        console.log(result.errors)
                        reject(result.errors)
                    }

                    result.data.allContentfulBlog.edges.forEach(edge => {
                        createPage({
                            path: edge.node.slug,
                            component: blogPost,
                            context: {
                                slug: edge.node.slug,
                            },
                        })
                    })
                    return
                })
                .then(result => {
                    result.forEach(category => {
                        createPage({
                            path: '/' + edge.node.category,
                            component: categoryPage,
                            context: {
                                slug: edge.node.category,
                            },
                        })
                    })
                })
        )
    })
}

Первый метод .then () в обещании работает просто отлично, и моя идея состоит в том, чтобы просто добавить второй .then () с шаблоном страниц категорий.

Терминал показывает: terminal

1 Ответ

0 голосов
/ 31 августа 2018

Вы можете вставить это после цикла страниц товаров, но у вас нет данных для категорий. Можно собрать его из продуктов, но это будет странный обходной путь.

Вам нужен отдельный запрос, отдельное обещание и составление обещаний (.all()) на верхнем уровне.

...