cpsit / typo3-personio-jobs
TYPO3 CMS Extension to integrate jobs from Personio Recruiting API
Installs: 2 818
Dependents: 0
Suggesters: 0
Security: 0
Stars: 3
Watchers: 5
Forks: 2
Open Issues: 4
Type:typo3-cms-extension
pkg:composer/cpsit/typo3-personio-jobs
Requires
- php: ~8.2.0 || ~8.3.0 || ~8.4.0
- ext-json: *
- ext-mbstring: *
- cuyz/valinor: ^2.0
- eliashaeussler/valinor-xml: ^1.0
- psr/event-dispatcher: ^1.0
- psr/http-message: ^1.0 || ^2.0
- symfony/console: ^5.4 || ^6.0 || ^7.0
- symfony/dependency-injection: ^6.4 || ^7.0
- typo3/cms-core: ^12.4 || ~13.0.0
- typo3/cms-extbase: ^12.4 || ~13.0.0
- typo3/cms-frontend: ^12.4 || ~13.0.0
Requires (Dev)
- armin/editorconfig-cli: ^2.0
- brotkrueml/schema: ^3.0
- eliashaeussler/version-bumper: ^3.0
- ergebnis/composer-normalize: ^2.29
- friendsofphp/php-cs-fixer: ^3.57
- helmich/typo3-typoscript-lint: ^3.0
- phpstan/extension-installer: ^1.2
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.2
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-strict-rules: ^1.6
- phpunit/phpcov: ^9.0 || ^10.0
- saschaegerer/phpstan-typo3: ^1.8
- ssch/typo3-rector: ^2.0
- typo3/coding-standards: ^0.8.0
- typo3/testing-framework: ^8.2.7 || ^9.2.0
Suggests
- brotkrueml/schema: Include JSON schema on job detail pages (^3.0)
Conflicts
- cuyz/valinor: 1.8.0
- dev-main
- 0.6.0
- 0.5.12
- 0.5.11
- 0.5.10
- 0.5.9
- 0.5.8
- 0.5.7
- 0.5.6
- 0.5.5
- 0.5.4
- 0.5.3
- 0.5.2
- 0.5.1
- 0.5.0
- 0.4.2
- 0.4.1
- 0.4.0
- 0.3.0
- 0.2.3
- 0.2.2
- 0.2.1
- 0.2.0
- 0.1.0
- dev-renovate/brotkrueml-schema-4.x
- dev-renovate/major-github-artifact-actions
- dev-renovate/lock-file-maintenance
- dev-feature/language-support
- dev-feature/pagination
- dev-feature/add-tests
This package is auto-updated.
Last update: 2025-10-27 06:56:04 UTC
README
TYPO3 extension personio_jobs
π¦Β Packagist | π₯Β TYPO3 extension repository | πΎΒ Repository | πΒ Issue tracker
An extension for TYPO3 CMS that integrates jobs from Personio Recruiting API into TYPO3. It provides a console command to import jobs into modern-typed value objects. In addition, plugins for list and detail views are provided with preconfigured support for Bootstrap v5 components.
π Features
- Console command to import jobs from Personio Recruiting API
- Usage of modern-typed value objects during the import process
- Plugins for list and detail view
- Optional support for JSON Schema on job detail pages using EXT:schema
- Compatible with TYPO3 12.4 LTS and 13.0
π₯ Installation
Composer
composer require cpsit/typo3-personio-jobs
π‘ If you want to use the JSON schema feature, you must
additionally require the schema extension:
composer require brotkrueml/schema
TER
Alternatively, you can download the extension via the TYPO3 extension repository (TER).
First-step configuration
Once installed, make sure to include the TypoScript setup at
EXT:personio_jobs/Configuration/TypoScript in your root template.
β‘ Usage
Plugins
The extension provides two plugins:
Command-line usage
personio-jobs:import
typo3 personio-jobs:import <storage-pid> [options]
The following command parameters are available:
| Command parameter | Description | Required | Default | 
|---|---|---|---|
| storage-pid | Storage pid of imported jobs | β | β | 
| -f,--force | Enforce re-import of unchanged jobs | β | no | 
| --no-delete | Do not delete orphaned jobs | β | no | 
| --no-update | Do not update imported jobs that have been changed | β | no | 
| --dry-run | Do not perform database operations, only display changes | β | no | 
π‘ Increase verbosity with --verbose or -v to show all changes,
even unchanged jobs that were skipped.
Code usage
The Personio job import process can also be triggered directly within PHP. For this, two services exist:
- PersonioApiServiceprovides the main functionality to fetch jobs from Personio API and return them as hydrated- Jobmodels. Note that these jobs are not yet persisted. Instead, they only represent the current Personio job feed as strong-typed value objects.
- PersonioImportServiceprovides additional functionality to actually persist imported jobs. Under the hood, the previously mentioned- PersonioApiServiceis called to fetch jobs, followed by their actual persistence. For the import process, a set of import settings is available:- int $storagePid: Page ID where to persist new or updated jobs.
- bool $updateExistingJobs = true: Define whether to update jobs that were already imported, but have changed in the meantime.
- bool $deleteOrphans = true: Define whether to delete jobs that are no longer available on Personio.
- bool $forceImport = false: Select whether existing, unchanged jobs should be re-imported.
- bool $dryRun = false: Do not perform any persistence operations, just fetch and validate jobs.
 
Fetch jobs from Personio API
use CPSIT\Typo3PersonioJobs\Service\PersonioApiService; use TYPO3\CMS\Core\Utility\GeneralUtility; $apiService = GeneralUtility::makeInstance(PersonioApiService::class); $jobs = $apiService->getJobs(); foreach ($jobs as $job) { echo 'Successfully fetched job: ' . $job->getName() . PHP_EOL; }
Import jobs from Personio API
use CPSIT\Typo3PersonioJobs\Service\PersonioImportService; use TYPO3\CMS\Core\Utility\GeneralUtility; $importService = GeneralUtility::makeInstance(PersonioImportService::class); $result = $importService->import(); foreach ($result->getNewJobs() as $newJob) { echo 'Imported new job: ' . $newJob->getName() . PHP_EOL; } foreach ($result->getUpdatedJobs() as $updatedJob) { echo 'Updated job: ' . $updatedJob->getName() . PHP_EOL; } foreach ($result->getRemovedJobs() as $removedJob) { echo 'Removed job: ' . $removedJob->getName() . PHP_EOL; } foreach ($result->getSkippedJobs() as $skippedJob) { echo 'Skipped job: ' . $skippedJob->getName() . PHP_EOL; }
JSON schema
In combination with EXT:schema, a JSON schema for a single job is included
on job detail pages. It is rendered as type JobPosting and includes some
generic job properties.
β οΈ The schema extension must be installed to use this feature. Read more in
the installation section above.
π Configuration
TypoScript
The following TypoScript constants are available:
| TypoScript constant | Description | Required | Default | 
|---|---|---|---|
| plugin.tx_personiojobs.view.templateRootPath | Path to template root | β | β | 
| plugin.tx_personiojobs.view.partialRootPath | Path to template partials | β | β | 
| plugin.tx_personiojobs.view.layoutRootPath | Path to template layouts | β | β | 
Extension configuration
The following extension configuration options are available:
| Configuration key | Description | Required | Default | 
|---|---|---|---|
| apiUrl | URL to Personio job page, e.g. https://my-company.jobs.personio.de | β | β | 
Routing configuration
On each import, a slug is generated. The slug can be used for an advanced routing configuration of job detail pages.
Example:
# config/sites/<identifier>/config.yaml routeEnhancers: PersonioJobDetail: type: Extbase limitToPages: # Replace with the actual detail page id - 10 extension: PersonioJobs plugin: Show routes: - routePath: '/job/{job_title}' _controller: 'Job::show' _arguments: job_title: job defaultController: 'Job::show' aspects: job_title: type: PersistedAliasMapper tableName: tx_personiojobs_domain_model_job routeFieldName: slug
β° Events
PSR-14 events can be used to modify jobs and job schemas. The following events are available:
π§ Migration
0.4.x β 0.5.x
Decouple import process
Import process is moved to a separate service class.
- All import operations are now performed by the new
PersonioImportServiceclass.
- PersonioServicewas renamed to- PersonioApiService. Replace all usages of this class by the new class name.
- Import results are now properly displayed by objects of the new
ImportResultclass.
- Public methods in AfterJobsImportedEventhave changed to match the newImportResultclass. Use the new public methodAfterJobsImportedEvent::getImportResult()instead of previously available methods.
0.3.x β 0.4.x
Finalize SchemaFactory
SchemaFactory is now final and cannot
be extended anymore.
- Remove classes extending from SchemaFactory.
- Replace customizations of the SchemaFactoryby an event listener for theEnrichJobPostingSchemaEventPSR-14 event.
π§βπ» Contributing
Please have a look at CONTRIBUTING.md.
π Credits
The Personio logo as part of all distributed icons is a trademark of Personio SE & Co. KG.
β License
This project is licensed under GNU General Public License 2.0 (or later).