Создание статических маршрутов, которые отображают шаблоны - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь создать страницу (в многосайтовом проекте с апострофом, чтобы для каждого сайта существовала уникальная страница) в / profile, или / account, или /account/profile.

Я создал следующее на /sites/lib/modules/account-profile/index.js следующее и адаптировал его из Как Apostrophe обрабатывает запросы страница:

module.exports = {
  afterConstruct: function(self) {
    self.addDispatchRoutes();
  },
  construct: function(self, options) {
    self.addDispatchRoutes = function() {
      self.dispatch("/account/:profile", self.showPage);
    };
    self.showPage = function(req, callback) {
      return (
        req.params.profile,
        (err, doc) => {
          // handle err, if no err...
          if (!doc) {
            // Let Apostrophe render the 404 page
            req.notFound = true;
          }
          req.template = self.renderer("profile", { doc: doc });
          return callback(null);
        }
      );
    };
  }
};

после включения:

"account-profile": {
   extend: "apostrophe-custom-pages"
 }

в app.js

Проблема, с которой я столкнулся, заключается в том, что функция showPage никогда не запускается, когда я нажимаю, например, /account/profile.

Я понимаю, что: бит профиля для соответствия / бит аккаунта / профиля немного сомнителен, но я также не могу понять, как отобразить шаблон при выполнении чего-то вроде:

self.apos.app.get("/account/profile", async function(req, res, callback) {
  req.template = self.renderer("profile", { doc: "hi" });
  // now what?
});

Я предполагаю, что упускаю что-то довольно простое, но я довольно тщательно отсканировал документы и не могу найти этот пропущенный бит.

1 Ответ

0 голосов
/ 16 января 2019

Вы очень близки в своем нижнем примере! Чтобы создавать страницы на статических маршрутах, я обычно использую тот же код, который вы указали в своем вопросе. Чтобы вернуть страницу из вашего apos.app.get, вам нужно сделать что-то вроде этого:

self.apos.app.get('/account/profile', function(req, res){
    // Place any data you need to access in your template here:
    req.data = {};

    // self.sendPage is what will actually return the page and render the template 'profile.html' in your views folder.
    // You can change 'profile' to the name of your template minus '.html' - e.g. 'page.html' would just be 'page'
    return self.sendPage(req, 'profile', {});
});

Кусочек, который вам не хватает, кажется sendPage. Этот метод фактически отображает страницу, используя шаблон, указанный во втором аргументе метода.

Если вы укажете это в своем методе построения, у вас будет новый маршрут на вашем сайте, доступ к которому можно получить, перейдя в / account / profile. Он отобразит шаблон, расположенный в папке представлений вашего модуля.

Первоначально я нашел эту информацию на этой странице:

https://apostrophecms.org/docs/technical-overviews/how-apostrophe-handles-requests.html

в разделе «Отображение полной HTML-страницы из маршрута».

...