# apostrophe-custom-pages
# Inherits from: apostrophe-doc-type-manager
A base class for modules that enhance the functionality of a page type.
Extra fields can be added to the page settings modal in the usual way via
the addFields
option, and Express-style routes can be added to handle
URLs that extend beyond the slug of the page using the dispatch
method.
The apostrophe-pieces-pages module is a good example of a subclass of this module.
# Options
# name
The name, typically singular, of the page type. If it is not set,
and the name of the module ends in -pages
, name
is set to the name
of the module with -pages
changed to -page
. If the name of the module
does not end in -pages
, the name of the page type is identical to the
name of the module.
# scene
Normally, anonymous site visitors receive only the stylesheets and scripts
included in the anon
asset scene (those that are pushed with
{ when: 'always' }
). If your page will use assets, such as
Apostrophe's schemas and modals, that are normally reserved for logged-in users
then you will want to set scene
to user
in order to load them every time
when this type of page is visited.
# Methods
# dispatch(*pattern *, , middleware..., handler) [dispatch]
Add an Express-style route that responds when "the rest" of the URL, beyond the page slug itself, matches a pattern.
For instance, if the page slug is /poets
, the URL is
/poets/chaucer
, and this method has been called with
('/:poet', self.poetPage)
, then the poetPage
method will
be invoked with (req, callback)
.
Special case: if the page slug is simply /poets
(with no slash) and
there is a dispatch route with the pattern /
, that route will be invoked.
Dispatch routes can also have middleware. Pass middleware functions as
arguments in between the pattern and the handler. Middleware is invoked
with (req, stop, callback)
. If your middleware wishes to prevent the
handler from being invoked, call stop(null)
rather than callback(null)
.
Otherwise the chain of middleware continues and, at the end, the handler is invoked.
# pageServe(req, callback) [dispatch]
Called for us by apostrophe-pages
when any page is accessed.
Checks first to make sure that the page that best matches the longest
prefix of the URL (req.data.bestPage
) is of the appropriate type
for this module. If so, the remainder of the URL is compared to the
dispatch routes that have been added via the dispatch
method, and
the appropriate route, if any, is invoked, with req.data.page
being set.
If there are no matches, a 404 not found response occurs.
If there are no dispatch routes for this module, an exact match of
the URL sets req.data.page
, otherwise a 404 not found response occurs.
# match(req, rule, url) [dispatch]
Match a URL according to the provided rule as registered
via the dispatch method. If there is a match, req.params
is
set exactly as it would be by Express and true
is returned.
Invoked by the pageServe
method.
# acceptResponsibility(req) [dispatch]
Called by pageServe
. Accepts responsibility for
the current URL by assigning req.data.bestPage
to
req.page
and implementing the scene
option, if set
for this module.
# getAutocompleteProjection(query) [api]
# getAutocompleteTitle(doc, query) [api]
Returns a string to represent the given doc
in an
autocomplete menu. doc
will contain only the fields returned
by getAutocompleteProjection
. query.field
will contain
the schema field definition for the join the user is attempting
to match titles from. The default behavior is to return
the title
property, but since this is a page we are including
the slug as well.
# getEditPermissionName() [api]
Returns the minimum permission name that should be checked for
to determine if this user has some edit privileges for
this doc type (not necessarily every instance of it),
for example the ability to create one. Determines
admin bar menu item visibility. For pages this is always
edit-apostrophe-page
because page types can be switched.
# getAdminPermissionName() [api]
Returns the minimum permission name that should be checked for
to determine if this user has blanket admin privileges for
this doc type. For pages this is always admin-apostrophe-page
because page types can be switched.
# composeSchema() [api]
Extend composeSchema
to flag the use of field names
that are forbidden or nonfunctional in page types,
i.e. path, rank, level