{"id":19250273,"url":"https://github.com/charcoalphp/cms","last_synced_at":"2025-07-14T22:39:27.978Z","repository":{"id":37490446,"uuid":"505905744","full_name":"charcoalphp/cms","owner":"charcoalphp","description":"[READ-ONLY] Charcoal Content Management System (CMS) Module","archived":false,"fork":false,"pushed_at":"2024-03-13T15:05:17.000Z","size":12561,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-05T06:19:55.625Z","etag":null,"topics":["charcoal","cms","content-management-system","php","read-only-repository"],"latest_commit_sha":null,"homepage":"https://github.com/charcoalphp/charcoal","language":"PHP","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/charcoalphp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-06-21T15:42:56.000Z","updated_at":"2022-06-21T16:20:39.000Z","dependencies_parsed_at":"2024-01-13T04:49:43.451Z","dependency_job_id":"2e617d43-a2c3-4fd7-a56b-9350bada1c45","html_url":"https://github.com/charcoalphp/cms","commit_stats":{"total_commits":341,"total_committers":14,"mean_commits":"24.357142857142858","dds":0.7243401759530792,"last_synced_commit":"8dcbe74bc68cd7404d4785efbf3abb0c1ba677fa"},"previous_names":[],"tags_count":88,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/charcoalphp%2Fcms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/charcoalphp%2Fcms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/charcoalphp%2Fcms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/charcoalphp%2Fcms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/charcoalphp","download_url":"https://codeload.github.com/charcoalphp/cms/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240342810,"owners_count":19786580,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["charcoal","cms","content-management-system","php","read-only-repository"],"created_at":"2024-11-09T18:16:41.106Z","updated_at":"2025-02-23T16:27:51.694Z","avatar_url":"https://github.com/charcoalphp.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Charcoal CMS\n============\n\nThe CMS package provides common objects and tools for building user-facing Web sites.\n\n## Installation\n\n```shell\ncomposer require charcoal/cms\n```\n\nFor Charcoal projects, the service provider can be registered from your configuration file:\n\n```json\n{\n    \"service_providers\": {\n        \"charcoal/cms/service-provider/cms\": {}\n    }\n}\n```\n\n## Usage\n\n### Objects\n\n* [Section](#section-object)\n* [Tag](#tag-object)\n* [Event](#event-object)\n* [FAQ](#faq-object)\n* [News](#news-object)\n\n### Section object\n\nA **section**, in Charcoal, is a reachable _page_ on the website, as part of the full hierarchical site map. They can be displayed in menus or breadcrumbs and be reached with a unique URL (`routable`).\n\nTypes of sections:\n\n* `blocks`\n  * Blocks sections define their content as a structured map of blocks.\n* `content`\n  * Content sections define their content in a single, simple _HTML_ property.\n* `empty`\n  * Empty sections are linked to a template but do not require any custom content.\n* `external`\n  * External sections are simply a redirect to an external (or internal) URL.\n\nAll section types, except _external_, make use of a `Template` object to be rendered. Typically, a charcoal `view` make sure of linking the `template` (by default, _mustache_\n\n\u003e Sections are standard Charcoal `Model`, meaning they are _describable_ with a `Metadata` object (which define a map of `properties`) and _storable_ with a `Source` object.\n\nBase section properties:\n\n| Interface     | Name                          | L10n | Type         | Description |\n| ------------- | ----------------------------- | :--: | ------------ | ----------- |\n| Section       | **section_type**              |      | choice       |\n| Section       | **title**                     | ✔    | string       |\n| Section       | **subtitle**                  | ✔    | html         |\n| Section       | **summary**                   | ✔    | html         |\n| Section       | **image**                     | ✔    | image        |\n| Section       | **template_ident**            |      | string       |\n| Section       | **template_options**          |      | structure    |\n| Section       | **content**                   | ✔    | html         |\n| Section       | **attachments**               | ✔    | multi-object |\n| Section       | **external_url**              | ✔    | url          | For external URLs. Note that all content-related properties are ignored if this property is set.\n| Content       | **id**                        |      | id           | The model's `key`.\n| Content       | **active**                    |      | bool         | Inactive events should not appear in public API / frontend.\n| Content       | **position**                  |      | int          | Default order property.\n| Authorable    | **created_by**                |      | string       | Admin user.\n| Authorable    | **last\\_modified_by**         |      | string       | Admin user.\n| Authorable    | **required\\_acl_permissions** |      | To do...     |\n| Timestampable | **created**                   |      | date-time    |\n| Timestampable | **last_modified**             |      | date-time    |\n| Hierarchical  | **master**                    |      | object       | `SectionInterface`.\n| Routable      | **slug**                      | ✔    | string       | Permalink. Auto-generated from title.\n\n#### Interfaces\n\nFrom model:\n\n* `Describable`: The objects can be defined by Metadata.\n* `Storable`: Objects have unique IDs and can be stored in storage / database.\n\nFrom content:\n\n* `Content`: A \"managed\" charcoal model (describable with metadata / storable).\n* `Authorable`: Creation and modification user (admin) are kept in the storage.\n* `Revisionable`: Copy of changes will be kept upon each object update in the storage.\n* `Timestampable`: Creation and modification time are kept into the storage.\n\nFrom [charcoal/object]:\n\n* `Hierarchicale`: The objects can be stacked hierarchically.\n* ~~`Publishable`: Objects have publish status, date and expiry. Allows moderation.~~\n* `Routable`: Objects are reachable through a URL.\n\nFrom [charcoal/cms]:\n\n* `Metatag`: The objects have meta-information for SEO purpose.\n* `Searchable`: Extra keywords can be used to help search engine.\n* `Templateable`: The objects can be rendered with a template / controller / config combo.\n\n#### Extending the section object\n\nThe `\\Charcoal\\Cms\\Section\\*` objects are `final`. To extend, use the `\\Charcoal\\Cms\\AbstractSection` base object instead, to make sure no metadata conflicts arise.\n\n### Tag object\n\n**Tag** objects link any objects together by providing an extra taxonomy layer. Tags may also be used to enhance internal search engines.\n\n### Event object\n\nCharcoal **Event** is a specialized content object to describe an event, which typically happens at a given date in a certain location.\n\nBase events properties:\n\n| Interface     | Name                          | L10n | Type      | Description |\n| ------------- | ----------------------------- | :--: | --------- | ----------- |\n| Event         | **title**                     | ✔    | string    |\n| Event         | **subtitle**                  | ✔    | html      |\n| Event         | **summary**                   | ✔    | html      |\n| Event         | **content**                   | ✔    | html      |\n| Event         | **image**                     | ✔    | image     |\n| Event         | **start_date**                |      | date-time |\n| Event         | **end_date**                  |      | date-time |\n| Event         | **info_url**                  | ✔    | image     |\n| Content       | **id**                        |      | id        | The model's `key`.\n| Content       | **active**                    |      | bool      | Inactive events should not appear in public API / frontend.\n| Content       | **position**                  |      | int       | Default order property.\n| Authorable    | **created_by**                |      | string    | Admin user.\n| Authorable    | **last\\_modified_by**         |      | string    | Admin user.\n| Authorable    | **required\\_acl_permissions** |      | To do...\n| Timestampable | **created**                   |      | date-time |\n| Timestampable | **last_modified**             |      | date-time |\n| Categorizable | **category**                  | ✔    | object    | `EventCategory`, or custom.\n| Publishable   | **publishDate**               |      | date-time |\n| Publishable   | **expiryDate**                |      | date-time |\n| Publishable   | **publishStatus**             |      | string    | `draft`, `pending`, or `published`.\n| Routable      | **slug**                      | ✔    | string    | Permalink. Auto-generated from title.\n| Metatag       | **meta_title**                | ✔    | string    |\n| Metatag       | **meta_description**          | ✔    | string    |\n| Metatag       | **meta_image**                | ✔    | image     |\n| Metatag       | **meta_author**               | ✔    | string    |\n| Templateable  | **controller_ident**          |      | string    |\n| Templateable  | **template_ident**            |      | string    |\n| Templateable  | **template_options**          |      | structure |\n\n#### Interfaces\n\nFrom model:\n\n* `Describable`: The objects can be defined by Metadata.\n* `Storable`: Objects have unique IDs and can be stored in storage / database.\n\nFrom content:\n\n* `Content`: A \"managed\" charcoal model (describable with metadata / storable).\n* `Authorable`: Creation and modification user (admin) are kept in the storage.\n* `Revisionable`: Copy of changes will be kept upon each object update in the storage.\n* `Timestampable`: Creation and modification time are kept into the storage.\n\nFrom [charcoal/object]:\n\n* `Categorizable`: The objects can be put into a category.\n* `Publishable`: Objects have publish status, date and expiry. Allows moderation.\n* `Routable`: Objects are reachable through a URL.\n\nFrom [charcoal/cms]:\n\n* `Metatag`: The objects have meta-information for SEO purpose.\n* `Searchable`: Extra keywords can be used to help search engine.\n* `Templateable`: The objects can be rendered with a template / controller / config combo.\n\n#### Extending the event object\n\nThe `\\Charcoal\\Cms\\Event` object is `final`. To extend, use the `\\Charcoal\\Cms\\AbstractEvent` base object instead, to make sure no metadata conflicts arise.\n\n#### Event categories\n\n**Event category** objects are simple `charcoal/object/category` used to group / categorize events. The default type is `Charcoal\\Cms\\EventCategory`.\n\n_Events_ implement the `Categorizable` interface, from [charcoal/object].\n\n### FAQ object\n\n**FAQ** objects are a special content type that is split in a \"question\" / \"answer\" format.\n\n#### FAQ categories\n\n**FAQ category** objects are simple `charcoal/object/category` used to group / categorize FAQ objects. The default type is `Charcoal\\Cms\\FaqCategory`.\n\n_FAQs_ implement the `Categorizable` interface, from [charcoal/object].\n\n### News object\n\nNews object are a special content type that with a specific news date.\n\nBase news properties:\n\n| Interface     | Name                          | L10n | Type      | Description |\n| ------------- | ----------------------------- | :--: | --------- | ----------- |\n| News          | **title**                     | ✔    | string    |\n| News          | **subtitle**                  | ✔    | html      |\n| News          | **summary**                   | ✔    | html      |\n| News          | **content**                   | ✔    | html      |\n| News          | **image**                     | ✔    | image     |\n| News          | **news_date**                 |      | date-time |\n| News          | **info_url**                  | ✔    | image     |\n| Content       | **id**                        |      | id        | The model's `key`.\n| Content       | **active**                    |      | bool      | Inactive news should not appear in public API / frontend.\n| Content       | **position**                  |      | int       | Default order property.\n| Authorable    | **created_by**                |      | string    | Admin user.\n| Authorable    | **last\\_modified_by**         |      | string    | Admin user.\n| Authorable    | **required\\_acl_permissions** |      | To do...\n| Timestampable | **created**                   |      | date-time |\n| Timestampable | **last_modified**             |      | date-time |\n| Categorizable | **category**                  | ✔    | object    | `NewsCategory`, or custom.\n| Publishable   | **publishDate**               |      | date-time |\n| Publishable   | **expiryDate**                |      | date-time |\n| Publishable   | **publishStatus**             |      | string    | `draft`, `pending`, or `published`.\n| Routable      | **slug**                      | ✔    | string    | Permalink. Auto-generated from title.\n| Metatag       | **meta_title**                | ✔    | string    |\n| Metatag       | **meta_description**          | ✔    | string    |\n| Metatag       | **meta_image**                | ✔    | image     |\n| Metatag       | **meta_author**               | ✔    | string    |\n| Templateable  | **controller_ident**          |      | string    |\n| Templateable  | **template_ident**            |      | string    |\n| Templateable  | **template_options**          |      | structure |\n\n#### Interfaces\n\nFrom model:\n\n* `Describable`: The objects can be defined by Metadata.\n* `Storable`: Objects have unique IDs and can be stored in storage / database.\n\nFrom content:\n\n* `Content`: A \"managed\" charcoal model (describable with metadata / storable).\n* `Authorable`: Creation and modification user (admin) are kept in the storage.\n* `Revisionable`: Copy of changes will be kept upon each object update in the storage.\n* `Timestampable`: Creation and modification time are kept into the storage.\n\nFrom [charcoal/object]:\n\n* `Categorizable`: The objects can be put into a category.\n* `Publishable`: Objects have publish status, date and expiry. Allows moderation.\n* `Routable`: Objects are reachable through a URL.\n\nFrom [charcoal/cms]:\n\n* `Metatag`: The objects have meta-information for SEO purpose.\n* `Searchable`: Extra keywords can be used to help search engine.\n* `Templateable`: The objects can be rendered with a template / controller / config combo.\n\n#### Extending the news object\n\nThe `\\Charcoal\\Cms\\News` object is `final`. To extend, use the `\\Charcoal\\Cms\\AbstractNews` base object instead, to make sure no metadata conflicts arise.\n\n#### News categories\n\n**News category** objects are simple `charcoal/object/category` used to group / categorize events. The default type is `Charcoal\\Cms\\NewsCategory`.\n\n_News_ implement the `Categorizable` interface, from [charcoal/object].\n\n## Resources\n\n* [Contributing](https://github.com/charcoalphp/.github/blob/main/CONTRIBUTING.md)\n* [Report issues](https://github.com/charcoalphp/charcoal/issues) and\n  [send pull requests](https://github.com/charcoalphp/charcoal/pulls)\n  in the [main Charcoal repository](https://github.com/charcoalphp/charcoal)\n\n[charcoal/cms]:    https://github.com/charcoalphp/cms\n[charcoal/object]: https://github.com/charcoalphp/object\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcharcoalphp%2Fcms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcharcoalphp%2Fcms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcharcoalphp%2Fcms/lists"}