---
title: "Important: Contacts without a visible profile are skipped"
manual: "Academic Contacts for Pages"
version: "main"
source: "Changelog/3.0/Important-ContactsWithoutVisibleProfileAreSkipped.rst"
rendered: "2026-09-18T06:17:05+00:00"
---

# Important: Contacts without a visible profile are skipped {#important-contacts-without-a-visible-profile-are-skipped}

## Description {#description}

A contact of a page points at a contract of **EXT:academic_persons**,
and that contract points at a profile. Both are relations, and Extbase resolves
a relation with fresh query settings: a hidden contract, or a profile that is
hidden, outside its start and end time or restricted to a frontend user group
the visitor does not belong to, resolved to nothing instead of raising an error.
The contact record itself was still visible, so the contacts of a page rendered
an empty card below its role heading - a person who had left the institution
kept a slot on the page.

The contacts content element and the data processor
`\FGTCLB\AcademicContacts4pages\DataProcessing\ContactsProcessor` now leave
such a contact out. Both ask the same service for the contacts of a page, so
they cannot drift apart, and a page template of a project no longer needs a
guard of its own.

## Impact {#impact}

-   A contact whose contract or profile is not visible to the visitor is not
    rendered, in the content element and in the page data processor alike.
-   A role heading is rendered only while at least one shown contact carries that
    role. The role of a single hidden person disappears with that person, instead
    of heading an empty group.
-   The plugin option **Show hidden records** is unchanged in meaning: it
    shows hidden *contact records*, and never a hidden contract or profile. A
    hidden contact pointing at a visible person is still shown with the option
    enabled; a visible contact pointing at a hidden person is not.
-   The view variable `{contacts}` and the processed key `contacts` are
    now a plain list instead of a query result. Fluid is unaffected -
    `<f:for>` and `<f:count>` behave identically - but PHP reading
    either as a query result has to accept a list.
-   `ContactsProcessor` is published as a service and takes its collaborator
    through the constructor. A project that *subclasses* the processor and names
    the subclass in TypoScript has to let its own `Services.yaml` autowire
    that subclass; otherwise TYPO3 instantiates it without arguments.

Nothing has to be configured, and no data is migrated. Making a person visible
again restores every contact pointing at it.

## Affected Installations {#affected-installations}

Every installation rendering page contacts whose database holds a hidden
contract, or a profile that is hidden, timed or restricted to a frontend user
group. Installations that carry a patch or a template guard against empty
contact cards can drop it.
