Upgrading from 2.3 to 3.0 

This page takes an installation of academic_contacts4pages 2.3 straight to 3.0, without the step to 2.4. Version 3.0 drops TYPO3 12, renders the contact list with speaking classes and the profile images as responsive pictures, and renames the icons of the extension. From 2.4 it takes over the configuration per component, the content element that stays hidden until a site enables it, a position of its own for a contact in its contract and in its contacts role, and an upgrade wizard for the content elements of version 1.x. Version 3.0 replaces no step of 2.4 for this extension, so the page leaves none out. Work through the sections in order. Skip a step that does not apply to the installation.

Before you start 

Version 3.0 runs on TYPO3 13.4 from 13.4.35 on and on TYPO3 14.3 from 14.3.7 on, with PHP 8.2 or later.

academic_contacts4pages 3.0 needs these packages. Upgrade them first or in the same deployment, in this order:

  • fgtclb/environment-state-manager 2.x, new since 2.4, which academic_base 3.0 and academic_persons 3.0 require. Composer installs it on its own. A classic installation installs environment_state_manager 2.x before it activates either of them.
  • fgtclb/academic-base 3.0, the same release as this extension.
  • fgtclb/academic-persons 3.0, the same release as this extension. Its upgrade chapter has steps of its own.

The extension declares the system extension install as a dependency since 2.4, for its upgrade wizards. TYPO3 keeps that extension active in every installation, so this needs no action.

These changes have to ship in the same deployment as the update:

  • A site without the site set includes the page TSconfig of the component, or the content element is not offered, see Include the components.
  • A site package that imports a setup.typoscript of this extension imports the constants.typoscript of the same folder as well, or the plugin fails with a missing template, see Adjust your own configuration.
  • A view that renders the persons partials with replaced partial root paths lists the path of academic_base, see The contact image and the persons partials.

The module paths on this page are those of TYPO3 13, where the upgrade runs.

Update TYPO3 first 

Update TYPO3 to 13.4.35 or later while the site still runs 2.3, which supports TYPO3 13.4. Version 3.0 no longer installs on TYPO3 12, and Composer and the Extension Manager refuse it next to an older patch release of TYPO3 13.

Stay on TYPO3 13 until the upgrade is complete. This extension requires academic_persons, whose content element wizard reads the column tt_content.list_type , which TYPO3 14 removes, so it only runs on TYPO3 13, see its upgrade chapter. The same holds for the content element wizards of academic_jobs, academic_persons_edit and academic_projects when the installation also has them. Move to TYPO3 14.3.7 or later once they have run.

See Breaking: Removed TYPO3 v12 support and Important: TYPO3 13.4.35 or 14.3.7 is required.

Update the package 

composer require -W \
    'fgtclb/academic-base':'~3.0.0' \
    'fgtclb/academic-persons':'~3.0.0' \
    'fgtclb/academic-contacts4pages':'~3.0.0'
Copied!

On a classic installation, install environment_state_manager 2.x from the TER in Admin Tools > Extensions first, then update academic_base, academic_persons and academic_contacts4pages there, in this order. Run the commands of this page with typo3/sysext/core/bin/typo3 instead of vendor/bin/typo3 .

vendor/bin/typo3 cache:flush
Copied!

Update the database 

vendor/bin/typo3 extension:setup
Copied!

Or apply the changes in Admin Tools > Maintenance > Analyze Database Structure.

For this extension the comparison adds five columns to tx_academiccontacts4pages_domain_model_contact :

It also applies the changes of the index definitions TYPO3 13.4.35 and 14.3.7 bring, and those of academic_persons. The contract table of that extension, to which page contacts belong as inline children, gains the columns of a workspace aware table, so a contract and its page contacts are drafted and published together. The section Update the database of the upgrade chapter of academic_persons describes the comparison of that table on SQLite. See Important: The contact inline parent is now workspace aware.

Run the upgrade wizards 

Both wizards need the database changes of the previous section. Run them in this order, in Admin Tools > Upgrade > Upgrade Wizard or on the command line. Mind the identifiers, the first one is spelled without the s of Contacts.

  1. academicContact4pages_seedContactSecondarySorting, Seed the contact sort order of contracts and contacts roles. It fills the two new sort columns with the order the contract and contacts role forms show today. Run it right after the database comparison: until it has run, every contact holds 0 in both columns, and a contact saved in the backend gets no position of its own in those lists. Running it again is harmless.

    vendor/bin/typo3 upgrade:run academicContact4pages_seedContactSecondarySorting
    Copied!

    See Important: Contracts and contacts roles sort their contacts on their own.

  2. academicContacts4pages_pluginUpgradeWizard, Migrate the academic_contacts4pages plugins of version 1.x. It renames the content type academiccontacts4pages_contactslist of version 1.x to academiccontacts4pages_list in every content element, and carries the permission of backend user groups over. It replaces academicContact4pages_pluginUpgradeWizard of versions 2.0 to 2.3, which looked for a misspelled type and never migrated anything. The new wizard is a new class, and TYPO3 records a wizard as done by its class, so it is offered also where the old one is marked done. It is offered only while a content element or a backend user group of version 1.x is left, so an installation that started with 2.0 or later never sees it.

    vendor/bin/typo3 upgrade:run academicContacts4pages_pluginUpgradeWizard
    Copied!

    TypoScript, page TSconfig or templates of a site package that name the old type change it to academiccontacts4pages_list by hand. See Important: A new upgrade wizard migrates the plugins of version 1.x and Upgrading from version 1.x.

A wizard that TYPO3 recorded as done is offered again once it is marked undone. TYPO3 13 marks a wizard undone with vendor/bin/typo3 upgrade:mark:undone <identifier>.

Adapt the configuration 

The TypoScript and the page TSconfig are delivered per content element since 2.4, and the content element is hidden in the whole installation until the page TSconfig of its component is included. See Breaking: Site sets and static templates have been restructured.

The upgrade check 

The console command academic:upgrade:check of academic_base reads the stored configuration of the installation and reports the static templates, page TSconfig imports and site sets that no longer reach an academic extension. Run it on the staging copy right after the package update, and again once the steps of this section are done:

vendor/bin/typo3 academic:upgrade:check
Copied!

With the extension key and a site it also compares the template overrides of the site with the templates this extension ships:

vendor/bin/typo3 academic:upgrade:check academic_contacts4pages --site=<site identifier>
Copied!

A folder that overrides the persons partials for this plugin as well is checked with academic_persons. The check of academic_contacts4pages compares it with the partials of this extension, which ships no Profile/ partials, and reports every file in it as missing-upstream . Each finding, and what to do about it, is described in the upgrade check of academic_base.

Include the components 

  • Site set. A site that depends on the set fgtclb/academic-contacts4pages needs no change. The set keeps its name and brings the page TSconfig along.
  • Static template. The stored entry of 2.3 keeps working as Academic Contacts4Pages: Path up to 2.3 (deprecated, use All components) (academic_contacts4pages), which is removed in version 4.0. Replace it with Academic Contacts4Pages: All components (academic_contacts4pages) in the field Include TypoScript sets on the tab Advanced Options of the template record. That entry brings the shared plugin settings of academic_persons along, so remove a separate entry Academic Persons: Shared plugin settings (academic_persons), called Academic Persons Settings (academic_persons) in 2.3, from the same record. See Deprecation: The static template path of version 2.3.
  • Page TSconfig. A site without the site set adds Academic Contacts4Pages: All components (academic_contacts4pages) in the field Include static Page TSconfig (from extensions) on the tab Resources of its root page, see Include static page TSconfig. Without it the content element is not offered for new content.
  • Use one of the two mechanisms per site, see Do not combine both.

Until a component is included, an existing content element of it keeps rendering and keeps its type: academic_base shows the stored type in the field Type followed by (not enabled on this page), and saving keeps it. The warning of the 2.4 changelog entry that saving such a record rewrites its type describes the state before a fix that academic_base 2.4 carries as well, see its changelog entry. A content element that a page TSconfig of your own already turned into another type is not repaired. Correct it by hand from its record history.

Adjust your own configuration 

  • The page TSconfig directory is Configuration/TSconfig/ now, and the TypoScript moved into Configuration/TypoScript/List/. Take the new path of every @import from the table of the changelog entry linked above. An import of a missing file fails silently.
  • The setup reads constants now, the Fluid root paths of the plugin and the switch for the header of the content element. A site package that imports a setup.typoscript of this extension imports the constants.typoscript of the same folder into its constants as well. Without it the plugin fails with a missing template, and the header renders as if it were switched on:

    TypoScript constants of the site package
    @import 'EXT:academic_contacts4pages/Configuration/TypoScript/List/constants.typoscript'
    Copied!
  • A site whose content element layout renders no header can switch the header of the contact list on with plugin.tx_academiccontacts4pages.renderContentElementHeader = 1 , see Feature: The contact list can render the content element header and The header of the content elements.
  • A site package that replaces the shipped setup with a copy of its own adds plugin.tx_academiccontacts4pages.settings.groupByRole = 1 to the copy. Existing content elements store no value for the option Group by role and read this default, see Feature: Optional role grouping and one partial per contact.
  • A backend user group whose members set the language of a page contact needs tx_academiccontacts4pages_domain_model_contact:sys_language_uid in its allowed excludefields. A site that ran 2.3 on TYPO3 12 adds it, see Important: Translations of page contacts keep their parent.
  • The contacts take the crop variant and the gender placeholders of the persons lists, set in the site settings of academic_persons. See Important: Contacts follow the image settings of the persons extension.

Adapt templates and assets 

Classes and styles 

The templates render speaking classes now, shared by all academic extensions, and no classes of the theme they were developed with. The card of a contact is the profile item of academic_persons, which carries the speaking classes of that extension, see its chapter Styling. The extension ships no stylesheet. Move the selectors of the site stylesheet to the classes in the table of Breaking: Contact list carries speaking classes. The chapter Styling describes the markup, and An example names the stylesheets of the development instances as a starting point.

The contact image and the persons partials 

The image of a contact is a <picture> with WebP sources now, and a contact whose profile has no image shows the placeholder of the persons plugins. CSS that selects the image as a direct child of the card no longer matches. To keep contacts without an image empty, set plugin.tx_academicpersons.image.placeholder.default to an empty value. A view that renders Profile/Item, the plugin view with replaced partial root paths or the page view of a page template, lists the path of academic_base below the others:

plugin.tx_academiccontacts4pages.view.partialRootPaths {
    -1 = EXT:academic_base/Resources/Private/Partials/
}
Copied!

See Breaking: Profile images render as a responsive picture.

The partial Profile/Item.html of academic_persons, which renders every contact, is built from small partials now: the detail link, the name, the contracts and the image. The name leaves out an empty part and shows the academic title. A copy of Profile/Item.html keeps rendering what it rendered before. Drop it in favour of the small partial it was meant to change, described in the chapter Templates of academic_persons. This plugin reads the persons partials through partial root paths of its own, so an override of them is registered for plugin.tx_academiccontacts4pages as well as for plugin.tx_academicpersons . See Important: The profile item is built from small partials.

Icons 

The icons of the extension are replaced and have new identifiers. They are backend icons, registered in Configuration/Icons.php:

2.3 identifier 3.0 identifier
academic_contacts4pages tx-academiccontacts4pages-plugin-contacts
tx_academiccontacts4pages_domain_model_contact tx-academiccontacts4pages-record-contact
tx_academiccontacts4pages_domain_model_role tx-academiccontacts4pages-record-role

tx_academiccontacts4pages_domain_model_contract is removed without a successor, and the files Resources/Public/Icons/Contract.svg and Resources/Public/Icons/Role.svg are removed. Replace the identifiers in templates, page TSconfig, TCA overrides and PHP code, move a replacement icon in the Configuration/Icons.php of a site package to the new identifier, and change .icon-* selectors. See Breaking: Icons replaced and their identifiers renamed.

Template overrides 

Versions 2.4 and 3.0 change these templates and partials. A copy of one of them in a site package keeps rendering the copy, so compare each copy with the shipped file of 3.0 and take over the changes. The paths below are relative to Resources/Private/:

File What changed Entry
Templates/Contacts/List.html Contacts without a role are rendered after the role groups, from the new variable {contactsWithoutRole} . The option Group by role switches the role groups off, and every contact renders through the new partial Partials/Contacts/Item.html. The contacts sit in an ace-content, each group in an ace-itemlist, the outermost element carries academic-contacts4pages-list, and the header of the content element renders while settings.renderContentElementHeader is set. Important: Contacts without a role are listed too, Feature: Optional role grouping and one partial per contact, Classes and styles
Partials/Contacts/Item.html New. A site package that already ships a partial of that name in a partial root path of this plugin has it rendered for every contact now. Rename it, or turn it into the contact card. The role carries ace-role. Feature: Optional role grouping and one partial per contact, Classes and styles

The view variable {contacts} is a plain list now, no query result. A template that reads {contacts.first} gets nothing, see Important: Contacts without a visible profile are skipped.

The upgrade check with the extension key and a site compares a copy with the shipped file, see The upgrade check.

Adapt your code 

Check the result