Как создать динамические URL-адреса в Gatsby из терминологических отношений в Drupal JSON: ответ API? - PullRequest
0 голосов
/ 28 июня 2019

Я использую Drupal 8 как безголовую CMS с Гэтсби, генерирующим статические страницы.

В Drupal я настроил несколько типов узлов (Article, Image, other ...). Все сущности имеют brand и category срочные отношения.

category - это одиночный выбор, а brand - это множественный выбор

Гэтсби создает страницы из моего шаблона по URL-адресам, как.

http://example.com/category-1/brand-1/
http://example.com/category-1/brand-2/
http://example.com/category-2/brand-1/
http://example.com/category-2/brand-2/

Статьи и узлы изображений с выбранными терминами будут отображаться на соответствующих URL.

Проблема, с которой я столкнулся, заключается в том, что я изменил термин бренда на множественный выбор, некоторые URL не создаются.

Из-за field_brand[0].name Гэтсби будет создавать URL только для первого выбора бренда в узле товара.

// gatsby-node.js

exports.createPages = ({ graphql, actions }) => {
  const { createPage } = actions;
  const pageTemplate = path.resolve(`src/templates/pageTemplate.js`);
  return graphql(`
    {
      taxonomyTermBrand {
        field_colours
        name
      }
      allNodeImage {
        nodes {
          relationships {
            field_image_drop {
              uri {
                url
              }
            }
          }
        }
      }
      allNodeArticle {
        nodes {
          body {
            processed
          }
          relationships {
            field_brand {
              name
            }
            field_category {
              name
            }
          }
        }
      }
    }
  `, { limit: 1 }).then(result => {

    if (result.errors) {
      throw result.errors
    }

    result.data.allNodeArticle.nodes.forEach(node => {
      const brand_path = node.relationships.field_brand[0].name;
      const category_path = node.relationships.field_category.name;

      createPage({
        path: `${category_path}/${brand_path}`,
        component: pageTemplate,
        context: {
          brandName: node.relationships.field_brand[0].name,
          categoryName: node.relationships.field_category.name,
        },
      })
    })
  })
}

По существу значение taxonomyTermBrand.name совпадает с node.relationships.field_brand[0].name, когда данные передаются в шаблон, но я не могу использовать taxonomyTermBrand.name, потому что path в createPage находится в allNodeArticle.forEach()

Есть ли лучший подход или другой способ задания путей и отображения помеченного содержимого на этих страницах?

1 Ответ

1 голос
/ 28 июня 2019

Я думаю, вы сможете сделать forEach для каждого из терминов field_brand для каждой из статей.

Что-то вроде:

result.data.allNodeArticle.nodes.forEach(node => {
  const brands = node.relationships.field_brand;
  const category = node.relationships.field_category.name;

  brands.forEach(brand => {
    createPage({
      path: `${category}/${brand.name}`,
      component: pageTemplate,
      context: {
        brandName: brand,
        categoryName: category,
      },
    })
  });
})
...