PHPackages                             pushword/flat-file - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. pushword/flat-file

Abandoned → [pushword/flat](/?search=pushword%2Fflat)Symfony-bundle[Utility &amp; Helpers](/categories/utility)

pushword/flat-file
==================

Transform Pushword in a FlatFile CMS.

0.1.9980(2y ago)2207MITPHP

Since Dec 29Pushed 1w agoCompare

[ Source](https://github.com/Pushword/flat)[ Packagist](https://packagist.org/packages/pushword/flat-file)[ Docs](https://pushword.piedweb.com/extension/flat)[ RSS](/packages/pushword-flat-file/feed)WikiDiscussions main Synced 6d ago

READMEChangelogDependencies (7)Versions (1006)Used By (0)

Flat File CMS with Pushword
===========================

[](#flat-file-cms-with-pushword)

Transform Pushword in a FlatFile CMS.

[![Latest Version](https://camo.githubusercontent.com/504b78bdd9aff4b22a884e82f34d8b0b5b7cedafb5dcce2ebf942ab8f7fd6c6a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f70757368776f72642f70757368776f72642e7376673f7374796c653d666c6174266c6162656c3d72656c65617365)](https://github.com/Pushword/Pushword/tags)[![Software License](https://camo.githubusercontent.com/f251623e510f5909f16ae3f4e6e548dac11340b9fde1a99be26b015b39272c00/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c6174)](LICENSE)[![GitHub Tests Action Status](https://camo.githubusercontent.com/ebaee4a77cc185e85aab1aa72cfb4f2762172279da76e987cd924e2023b5089e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f50757368776f72642f50757368776f72642f72756e2d74657374732e796d6c3f6272616e63683d6d61696e)](https://github.com/Pushword/Pushword/actions)

[![Code Coverage](https://camo.githubusercontent.com/bfd5327946a29468214fb761d1e42db99bd266f13a7c6d805bb34c0a46db3d8a/68747470733a2f2f636f6465636f762e696f2f67682f50757368776f72642f50757368776f72642f6272616e63682f6d61696e2f67726170682f62616467652e737667)](https://codecov.io/gh/Pushword/Pushword/tree/main)[![Type Coverage](https://camo.githubusercontent.com/b77fa8a783b6a362947e80ac6817621bb8114209fb8fb124ec8a50085fbf3a35/68747470733a2f2f73686570686572642e6465762f6769746875622f70757368776f72642f70757368776f72642f636f7665726167652e737667)](https://shepherd.dev/github/pushword/pushword)[![Total Downloads](https://camo.githubusercontent.com/a76f4801b7f01832ededd01e2912f8f833ead97001c672697595a32f36832074/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f70757368776f72642f636f72652e7376673f7374796c653d666c6174)](https://packagist.org/packages/pushword/core)

Documentation
-------------

[](#documentation)

Visit [pushword.piedweb.com](https://pushword.piedweb.com/extension/flat)

Contributing
------------

[](#contributing)

If you're interested in contributing to Pushword, please read our [contributing docs](https://pushword.piedweb.com/contribute) before submitting a pull request.

Credits
-------

[](#credits)

- [PiedWeb](https://piedweb.com)
- [All Contributors](https://github.com/Pushword/Core/graphs/contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](https://pushword.piedweb.com/license#license) for more information.

[![PHP Packages Open Source](https://raw.githubusercontent.com/Pushword/Pushword/f5021f4c5d5d3ab3f2858ec2e4bdd70818806c6a/packages/admin/src/Resources/assets/logo.svg)](https://dev.piedweb.com)

---

Schéma du flux `pw:flat:sync`
=============================

[](#schéma-du-flux-pwflatsync)

 ```
flowchart TD
    Start([pw:flat:sync]) --> LockCheck{Webhook Lock?}
    LockCheck -->|Oui| Blocked[Sync bloquée]
    LockCheck -->|Non| MediaCheck{MediaSync}

    MediaCheck -->|Fichiers plus récents| MediaImport[IMPORT Médias]
    MediaCheck -->|DB plus récente| MediaExport[EXPORT Médias]

    MediaImport --> MI1[1. Parser index.csv]
    MI1 --> MI2[2. Valider fichiers + préparer renommages]
    MI2 --> MI3[3. Supprimer médias absents du CSV]
    MI3 --> MI4[4. Importer fichiers mediaDir + contentDir/media]
    MI4 --> MI5[5. Régénérer index.csv]
    MI5 --> PageCheck

    MediaExport --> ME1[Écrire index.csv + copier fichiers]
    ME1 --> PageCheck

    PageCheck{PageSync} -->|Fichiers plus récents| PageImport[IMPORT Pages]
    PageCheck -->|DB plus récente| PageExport[EXPORT Pages]

    PageImport --> PI1[1. Importer redirection.csv]
    PI1 --> PI2[2. Importer fichiers .md]
    PI2 --> PI3[3. finishImport - relations]
    PI3 --> PI4[4. Supprimer pages orphelines]
    PI4 --> PI5[5. Régénérer index.csv]
    PI5 --> ConvCheck

    PageExport --> PE1[Écrire .md + index.csv + redirection.csv]
    PE1 --> ConvCheck

    ConvCheck{ConversationSync?} -->|Activé| ConvSync[Sync Conversations]
    ConvCheck -->|Non| UserCheck
    ConvSync --> UserCheck

    UserCheck{UserSync?} -->|Activé| UserSync[Sync users.yaml ↔ DB]
    UserCheck -->|Non| End
    UserSync --> End([Fin])

    Blocked --> EndBlocked([Échec])

    style Start fill:#e1f5ff
    style MediaImport fill:#fff4e1
    style PageImport fill:#fff4e1
    style MediaExport fill:#e1ffe1
    style PageExport fill:#e1ffe1
    style End fill:#e1f5ff
    style Blocked fill:#ffcccc
    style EndBlocked fill:#ffcccc
```

      Loading Détails du processus
--------------------

[](#détails-du-processus)

### Webhook Lock

[](#webhook-lock)

Avant toute synchronisation, le système vérifie si un **webhook lock** est actif. Ce verrou est utilisé pendant les workflows d'édition externe (ex: CI/CD) pour éviter les conflits.

### Décision Import/Export

[](#décision-importexport)

`PageSync` et `MediaSync` déterminent indépendamment la direction :

- **MediaSync** : Compare le hash SHA1 des fichiers avec `Media->getHash()` en DB
- **PageSync** : Compare `filemtime()` avec `Page->getUpdatedAt()`, avec gestion des conflits via `ConflictResolver`

### Import Médias (Fichiers → DB)

[](#import-médias-fichiers--db)

1. **Parser `index.csv`** - Charge les métadonnées (id, fileName, name, alt, projectDir)
2. **Valider fichiers** - Vérifie l'existence des fichiers référencés
3. **Préparer renommages** - Détecte les fichiers renommés via leur ID
4. **Supprimer médias orphelins** - Supprime les médias en DB absents du CSV
5. **Importer fichiers** - Depuis `mediaDir` et `contentDir/media`
6. **Régénérer `index.csv`** - Reflète l'état final de la DB

### Import Pages (Fichiers → DB)

[](#import-pages-fichiers--db)

1. **Importer `redirection.csv`** - Charge les redirections
2. **Importer fichiers `.md`** - Parse le front matter YAML + contenu markdown
3. **finishImport** - Résout les relations (parentPage, mainImage, translations)
4. **Supprimer pages orphelines** - Pages en DB sans fichier `.md` ni entrée redirection
5. **Régénérer `index.csv`** - Avec les IDs auto-générés

### Export (DB → Fichiers)

[](#export-db--fichiers)

**Pages** :

- Écrit `{slug}.md` avec front matter YAML
- Génère `index.csv` (métadonnées) et `redirection.csv`

**Médias** :

- Écrit `index.csv` avec les métadonnées
- Copie les fichiers si `copyMedia` est configuré

### UserSync (optionnel)

[](#usersync-optionnel)

Synchronisation bidirectionnelle entre `config/users.yaml` et la DB :

- Exporte les utilisateurs DB manquants vers le YAML
- Importe/met à jour les utilisateurs depuis le YAML
- Les mots de passe restent uniquement en DB

### ConversationSync (optionnel)

[](#conversationsync-optionnel)

Interface pour synchroniser les conversations (implémenté par le package conversation)

###  Health Score

40

—

FairBetter than 88% of packages

Maintenance64

Regular maintenance activity

Popularity14

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity63

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~2 days

Total

1005

Last Release

11d ago

Major Versions

0.1.9974 → 1.0.0-rc02024-09-09

### Community

Maintainers

![](https://www.gravatar.com/avatar/afce4cf517928a50560237f1410d5957271fd808671b2216687ecf1422adaee0?d=identicon)[Robin D.](/maintainers/Robin%20D.)

---

Top Contributors

[![RobinDev](https://avatars.githubusercontent.com/u/3944894?v=4)](https://github.com/RobinDev "RobinDev (285 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/pushword-flat-file/health.svg)

```
[![Health](https://phpackages.com/badges/pushword-flat-file/health.svg)](https://phpackages.com/packages/pushword-flat-file)
```

###  Alternatives

[grumpydictator/firefly-iii

Firefly III: a personal finances manager.

22.8k69.3k](/packages/grumpydictator-firefly-iii)[civicrm/civicrm-core

Open source constituent relationship management for non-profits, NGOs and advocacy organizations.

728272.9k20](/packages/civicrm-civicrm-core)[shlinkio/shlink

A self-hosted and PHP-based URL shortener application with CLI and REST interfaces

4.8k4.3k](/packages/shlinkio-shlink)[craftcms/feed-me

Import content from XML, RSS, CSV or JSON feeds into entries, categories, Craft Commerce products, and more.

292927.5k22](/packages/craftcms-feed-me)[troydavisson/phrets

RETS library in PHP

463355.6k](/packages/troydavisson-phrets)[firefly-iii/data-importer

Firefly III Data Import Tool.

7545.8k](/packages/firefly-iii-data-importer)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
