Configuration
This extension ships its frontend TypoScript and its backend page TSconfig in two forms: as TYPO3 site sets, and as classic static templates plus page TSconfig files that are selected on a page. Both forms read the very same files, so they configure an installation identically.
Pick one of them per site and stay with it — see Do not combine both for what happens otherwise.
What the sets contain
This extension ships two content elements, so it ships two component sets, one
set for the
styles. override described below, and one
aggregate set that depends on all of them.
Both content elements are driven by one Extbase plugin, so they share one
TypoScript block,
plugin.. That block is
shipped once, in Configuration/, and every component includes
it. Which component sets a site names therefore decides which content elements
the backend offers, not how much TypoScript is loaded.
| Set | Delivers |
|---|---|
fgtclb/ | The Program List content element. |
fgtclb/ | The Program Details content element. |
fgtclb/ | The
styles. override only. No content
element, and nothing this extension is otherwise made of — see
The content load override. |
fgtclb/ | Everything above. This is the set to use unless you deliberately want a subset, and it is the name this extension published before the sets were cut per component — a site configuration that depends on it needs no change. |
Every content element set depends on fgtclb/, the set
of EXT:academic_base that labels the content element group all
academic extensions sort their elements into.
What the sets do not control
The page type Academic program (doktype 20) and its backend layout AcademicProgram are not part of any set, and enabling or not enabling a set never changes them.
That is deliberate, not an oversight. Both are values stored on
pages
records: a page carries doktype = 20 and backend_
long before any site configuration is read. Were they delivered by an opt-in
set, every page tree on a site that does not use that set would show
[ MISSING LABEL ] for the layout, the layout could not be picked for
a new page, and the page type would disappear from the page tree wizard.
They are therefore registered installation-wide — the page type in TCA
(Configuration/TCA/Overrides/pages.php), the backend layout in the
always-included Configuration/page.tsconfig — and stay available on every
site of the installation.
What a set does deliver for that page type is its frontend rendering: the
page
object that picks the Fluid template of the page type is part
of the shared TypoScript block, so a site that includes no set of this extension
renders such a page with whatever its own site package defines.
The content load override
Configuration/TypoScript/ContentLoad/setup.typoscript redefines
styles. for the whole site so that it selects
col only. This is an installation-wide rendering change, it
applies to every page of the site and not only to the pages of this extension,
and three academic extensions ship the same override.
It is therefore a set of its own, fgtclb/. The
aggregate set depends on it, so a site on fgtclb/ keeps what
it had; a site that wants the content elements without the override names the
component sets it needs instead of the aggregate.
The page type of this extension does not need the override: it renders its
content itself, see The content of a program page.
A site needs the set only for a template of its own that renders
styles.. Version 3.0 removes it.
The content of a program page
A program page renders the content elements of its main column
(
col) below the program data, in their manual order and in
the language of the page. Every set and every static template of this extension
delivers that, except the content load override on its own, which is not
needed for it.
The content is the variable
program of the page object,
defined inside the condition on the program page type, so it exists on program
pages only. It is a
CONTENT
object that renders the records
through the
tt_ object of the site, and it works for a
FLUIDTEMPLATE
page object and, on TYPO3 v13, for a
PAGEVIEW
one alike.
To render another column, or to slide the content from the parent pages, change the variable inside the same condition:
[page && traverse(page, "doktype") == 20]
page.10.variables.programContent {
select.where = {#colPos}=1
}
[END]
A page template of your own renders it as
{program.
Changed in version 2.4
The page template rendered the global object
styles. before, see
Important: The program page renders its own content.
Include the site set
Important
Site sets arrived in TYPO3 v13.1. On TYPO3 v12 they do nothing at all —
the core has no set API, the folder Configuration/ is never
read, and a
dependencies
key in a site configuration is stored and
ignored. On v12, use the static templates and the page TSconfig files
described below; they deliver exactly the same files.
Add the set to the config. of the site that should offer the content
elements:
base: 'https://example.com/'
rootPageId: 1
+dependencies:
+ - fgtclb/academic-programs
See also TYPO3 Explained, Using a site set as dependency in a site.
Include static templates
For an installation that still configures its frontend through
sys_ records, the same files are registered as static templates
and as selectable page TSconfig files.
Tip
On TYPO3 v13 we recommend the site set; on TYPO3 v12 this is the only
mechanism there is. If you use the site set, do not press the backend button
Create a root TypoScript record on that site. The
sys_ record it creates carries the flag
Clear for constants and setup, and that flag discards everything
the site sets contributed. An installation that is already in that state
gets its configuration back by selecting the static templates below in that
very record.
Include static TypoScript
Edit the
sys_ record of the site root and add the entry to
Include static (from extensions):
| Entry | Delivers |
|---|---|
| Academic Programs: Program List (academic_programs) | The TypoScript of the Program List content element. |
| Academic Programs: Program Details (academic_programs) | The same for Program Details. |
| Academic Programs: Content load override (academic_programs) | The
styles. override on its own. |
| Academic Programs: All components (academic_programs) | Every component this extension ships, in one entry. |
| Academic Programs: Shared plugin settings and page rendering (academic_programs) | The shared
plugin. block and the
page
object of the page type, on their own. This is
the entry an installation stored before the configuration was cut
per component, and it keeps working — but it does not make any
content element selectable, which the page TSconfig below does, and
it no longer carries the content load override. |
Include static page TSconfig
Edit the page record of the site root, tab Resources, field Page TSconfig, and add the entry:
| Entry | Delivers |
|---|---|
| Academic Programs: Program List (academic_programs) | Makes the Program List content element selectable, and configures its entry in the new content element wizard. |
| Academic Programs: Program Details (academic_programs) | The same for Program Details. |
| Academic Programs: All components (academic_programs) | Every component this extension ships, in one entry. |
The setting is inherited by every page below the one it is set on.
The category filters
The filter form of the Program List offers one select per category
type of the group programs. Three settings change which of them it offers and
how, for the whole site:
| Site setting and constant | Default | Meaning |
|---|---|---|
plugin. | empty | The category types to offer, in this order, as a comma separated
list of type identifiers, for example
degree,location. Empty offers every type that has a
category, in the order of the category types of the group. |
plugin. | 0 | How many filters the form shows right away. The others follow in a More filters section the visitor opens, which is open already while one of its filters has a value. 0 shows every filter. |
plugin. | 0 | Leaves out a category no listed program carries, instead of offering it as a disabled option. A selected category is always offered. A filter whose categories are all left out still renders, with its "All" option only. |
plugin:
tx_academicprograms:
filter:
categoryTypes: 'degree,location'
visibleCount: 1
hideDisabledOptions: true
The settings are site settings of the aggregate set fgtclb/
and constants of the same names for a site on static templates. A site that
depends on fgtclb/ alone gets the defaults, but
the site settings editor does not offer the settings there.
Site settings exist from TYPO3 v13 on. On TYPO3 v12, set the constants.
A type is offered only when at least one category of that type exists, and an identifier that is no type of the group is ignored. The settings decide what the form offers, not what the list accepts: a link that filters by a category of a type the form does not offer still filters the list.
The "All" option of a filter
The first option of each filter, the one that selects no category, reads the
label
sys_ of this extension, and
falls back to
sys_ ("All options") where a
type has none. The extension ships no label per type; a site adds them in
TypoScript, for every content element of the extension or for one plugin:
plugin.tx_academicprograms._LOCAL_LANG {
default.sys_category.programs.allOptions.degree = All degrees
de.sys_category.programs.allOptions.degree = Alle Abschlüsse
}
# Only in the program list:
plugin.tx_academicprograms_programlist._LOCAL_LANG.default.sys_category.programs.allOptions.degree = All degrees
A language file override works as well, as for any label of this extension:
$GLOBALS, pointing
from EXT:academic_programs/Resources/Private/Language/locallang.xlf
to a file of the site package.
Templates
The partial Program/ renders the selects from the
variable
{filter:
{filter and
{filter hold the identifiers of the offered types, in their
order, before and behind More filters. Where that variable does not
reach the partial — a project controller that overrides
list, or
a template that renders the partial with arguments of its own instead of
{_ — it offers every type with a category, as before, and the filter
types and the visible count have no effect there. To use them, let the
overriding action call the parent action, and pass
filter on in a
template that renders the partial.
New in version 2.4
Up to 2.3 the form offered every type with a category, all of them right away and with one "All" label, and anything else needed an override of the partial.
Content Security Policy
The selects of the form of the Program List submit it when the
visitor changes one of them, through the inline event handler
onchange="this.. A nonce does not cover an event handler
attribute, so the frontend policy of TYPO3 blocks it once a site enforces that
policy. The extension therefore allows exactly this handler text in its
Configuration/ContentSecurityPolicies.php, which TYPO3 loads on its
own: the directive script- of the frontend policy gets
'unsafe- and 'sha256-.
script- is not changed. Every site that inherits the default frontend
policy gets both sources. A site whose csp. sets
inherit, and a site package whose copy of
Program/ or Program/
uses another handler text, add the hash of that text in the csp. of
the site:
mutations:
- mode: extend
directive: 'script-src-attr'
sources:
- "'unsafe-hashes'"
- "'sha256-osjxnKEPL/pQJbFk1dKsF7PYFmTyMWGmVSiL9inhxJY='"
The hash is the base64 encoded SHA-256 of the handler text, without the quotes of the attribute. A policy the web server or a proxy sends is not covered and needs the same sources itself. This works the same on TYPO3 v12 and v13.
A site whose policy allows inline scripts already, with 'unsafe- in
script-, or in default- where it has no script-, gets no
script- from the extension: a listener of academic_base
takes it out again, unless the site declares the directive itself. The browser
then reads script- for the handlers of the form, as for the site's own
handlers. On a page whose script- keeps a nonce, a browser ignores
'unsafe- and blocks both. TYPO3 v12 never drops a nonce: a page that
uses one, and every page with uncached content such as the plugin of this form,
sends it.
For a visitor without JavaScript the form renders a submit button inside
<noscript>
, labelled
filter.. A visitor with JavaScript
does not see it.
Changed in version 2.4
The policy allows the handler, and the form renders the button. See Important: The filter form works under a security policy.
Do not combine both
A site that uses the site set and the static template reads the shipped
files twice. The site set is applied before the
sys_ record, so
the second read happens after the site settings and after
config/ — and it resets every constant
the extension ships a default for back to that default. For this extension that
is the
plugin. constants block: the three Fluid
root paths and the settings of the category filters.
Nothing else is damaged: the Constants and Setup fields
of the
sys_ record, the page TSconfig of a page and the page
TSconfig files selected on a page are all applied afterwards and still win. Use
one mechanism per site and the question does not arise.