locomotivemtl / charcoal-attachment
Charcoal Attachments Module
Installs: 7 209
Dependents: 3
Suggesters: 0
Security: 0
Stars: 1
Watchers: 16
Forks: 0
Open Issues: 0
Requires
- php: >=7.1
- locomotivemtl/charcoal-config: ~0.8
- locomotivemtl/charcoal-core: ~0.4
- locomotivemtl/charcoal-object: ~0.5
- locomotivemtl/charcoal-translator: ~0.3
Requires (Dev)
- locomotivemtl/charcoal-admin: ~0.8
- mockery/mockery: ^1.0
- php-coveralls/php-coveralls: ^2.2
- phpunit/phpunit: ^7.5
- squizlabs/php_codesniffer: ^3.3
Suggests
- locomotivemtl/charcoal-admin: To use the attachment widgets, actions, and scripts.
- dev-master / 0.11.x-dev
- 0.11.0
- 0.10.7
- 0.10.6.1
- 0.10.6
- 0.10.5.3
- 0.10.5.2
- 0.10.5.1
- 0.10.5
- 0.10.4.2
- 0.10.4.1
- 0.10.4
- 0.10.3.1
- 0.10.3
- 0.10.2
- 0.10.1.4
- 0.10.1.3
- 0.10.1.2
- 0.10.1.1
- 0.10.1
- 0.10.0.2
- 0.10.0.1
- 0.10.0
- 0.9.3.1
- 0.9.3
- 0.9.2
- 0.9.1.1
- 0.9.1
- 0.9.0
- 0.8.3
- 0.8.2
- 0.8.1
- 0.8
- 0.7.5
- 0.7.4
- 0.7.3
- 0.7.2
- 0.7.1.3
- 0.7.1.2
- 0.7.1.1
- 0.7.1
- 0.7
- 0.6.2
- 0.6.1.2
- 0.6.1.1
- 0.6.1
- 0.6
- 0.5.2
- 0.5.1
- 0.5
- 0.4.2.1
- 0.4.2
- 0.4.1
- 0.4.0
- 0.3.0
- 0.2.4
- 0.2.3
- 0.2.2
- 0.2.1
- 0.2
- 0.1
- dev-feature/fix-backend-active
- dev-feature/camelizePropertiesAndUseArrayAccess
- dev-feature/mducharme-tests
- dev-feature/mcaskill-labeller
This package is auto-updated.
Last update: 2024-11-07 22:01:14 UTC
README
Attachments add support for working with relationships between models. Also provided are a usable set of basic attachments: Document, Embed, Image, Gallery, Link Video, amongst others.
How to install
The preferred (and only supported) way of installing _charcoal-attachment is with composer:
★ composer require locomotivemtl/charcoal-attachment
Dependencies
- PHP 7.1+
locomotivemtl/charcoal-core
locomotivemtl/charcoal-base
locomotivemtl/charcoal-admin
locomotivemtl/charcoal-ui
locomotivemtl/charcoal-translation
Objects
Objects in the charcoal-attachments
module extends Content
, from charcoal-object
, which is an AbstractModel
, from charcoal-core
.
In addition from the default metadata provided by Content
, the following properties are default for all Attachment
objects:
Standard properties (used by all attachments objects):
Specialized properties which can be used differently, depending on context:
All attachments are assumed to have a title
, subtitle
, description
and keywords
. Some attachments also
Read the
charcoal-object
documentation for the other default properties provided by theContent
object (andRevisionableInterface
).
Read the
charcoal-core
documention for the other default properties provided byAbstractModel
(andDescribableInterface
andStorableInterface
).
Type of Attachment objects
- Accordion
- A
Container
(grouping) attachment, used for accordion type of display. - By default, support
text
,image
,gallery
andembed
attachments.
- A
- Attachment
- The most generic attachment, can be anything.
- Container
- Base "grouping" attachment.
- Embed
- Embedded content, typically video embed code.
- Force the
file
property to be animage
, anddescription
to behtml
.
- File
- An uploadable Document.
- Link
- A URL (link to a resource).
- Image
- An uploadable image
- Force the
file
property to be animage
.
- Gallery
- A
Container
(grouping) attachment, used for a gallery of multiple images. - Is limited to
image
attachments.
- A
- Text
- Text (HTML) content.
- Video
Widgets
The module provides his own admin widgets namespaced as Charcoal\Admin.
BUT HOW
The setup is fairly easy, but you need to remember a few things in order for it to work.
Configurations
Add the views path and metadata path to the config file.
"metadata": { "paths": [ "...", "vendor/locomotivemtl/charcoal-attachment/metadata/" ] }, "view": { "paths": [ "...", "vendor/locomotivemtl/charcoal-attachment/templates/" ] }, "translations": { "paths": [ "...", "vendor/locomotivemtl/charcoal-attachment/translations/" ] }
Then, we need to add the necessary routes for the widgets in admin.json config file.
"routes": { "actions": { "join": { "ident": "charcoal/admin/action/join", "methods": [ "POST" ] }, "add-join": { "ident": "charcoal/admin/action/add-join", "methods": [ "POST" ] }, "remove-join": { "ident": "charcoal/admin/action/remove-join", "methods": [ "POST" ] } } }
Usage
You need to make your object(s) "Attachment Aware", so that it knows it can have attachments. To do that, use/implement attachmentAware:
use Charcoal\Attachment\Traits\AttachmentAwareTrait; use Charcoal\Attachment\Interfaces\AttachmentAwareInterface;
Then, just add in the widget in the edit dashboard or the form like this:
"attachment": { "title": "Documents", "type": "charcoal/admin/widget/attachment", "group": "main", "attachable_objects": { "charcoal/attachment/object/file": { "label": "Document / File" } } }
Available attachable objects as provided by the current modile are:
charcoal/attachment/object/image
charcoal/attachment/object/gallery
charcoal/attachment/object/file
charcoal/attachment/object/link
charcoal/attachment/object/text
charcoal/attachment/object/video
To create a new attachment, you need to extend the base Attachment object charcoal/attachment/object/attachment
and provide a "quick" form.
To remove unnecessary join when deleting an object, you need to add this to your object:
public function preDelete() { // AttachmentAwareTrait $this->removeJoins(); return parent::preDelete(); }
Documentation
Attachment widget can be use more than once in a form. In order for it to work properly, you need to define a group ident group
different for each instanciated widgets.
"attachment": { "type": "charcoal/admin/widget/attachment", "group": "main" }
In this case, we set the group to "main". If none defined, the default group will be "generic". Without those ident, widgets won't be able to know which attachments are his.
You can than access a perticular "group" attachments calling the object's method "attachments(group_ident)". In this case, $object->attachments('main')
will return attachments associated with the widgets that has the group set to "main".
Attachment creation
The one thing you need to know about the attachment is that it is all in a single table. You can't associate custom objects with other objects if they are not attachments
.
Then, how could you create new attachments? It all depends on what you want.
Adding or modifying properties
IF you need to add properties to an existing attachment, you can always extend it. Let's say you want to change the editor options for the description field given with the attachments. The first step is to create a new object that will extend the existing one.
/** * Extended text class. */ namespace My\Namespace; use Charcoal\Attachment\Object\Text as AttachmentText; class Text extends AttachmentText { }
Now that we have the extend, let's add to the JSON by creating a my/namespace/text.json
file.
{ "properties": { "description": { "editor_options": { "style_formats": [], "body_class": "s-wysiwyg", "content_css": "../../../../../styles/main.css" } } }, "data": { "type": "my/namespace/text" } }
In that case, the editor options are changed to remove the base style formats, change the body class and add the appropriate css. The important part is to set the data type to the current object. This is used in live edit and delete features.
If you added some extra properties, you can use the alter script to add them into the table.
vendor/bin/charcoal admin/object/table/alter --obj-type=my/namespace/text
Notes
Don't use "attachments" method directly in mustache template. This will return ALL attachments without considering the group.
Custom templates for the attachment preview in the backend widget is on the to-do list.
Other actions such quick view are on the to-do list as well.
For a complete project example using charcoal-attachment
, see the charcoal-project-boilerplate.
Development
To install the development environment:
★ composer install --prefer-source
Run the code checkers and unit tests with:
★ composer test
API documentation
- The auto-generated
phpDocumentor
API documentation is available at https://locomotivemtl.github.io/charcoal-attachment/docs/master/ - The auto-generated
apigen
API documentation is available at https://locomotivemtl.github.io/charcoal-attachment/apigen/master/
Development dependencies
phpunit/phpunit
squizlabs/php_codesniffer
satooshi/php-coveralls
Continuous Integration
Coding Style
The Charcoal-Attachment module follows the Charcoal coding-style:
- PSR-1
- PSR-2
- PSR-4, autoloading is therefore provided by Composer.
- phpDocumentor comments.
- Read the phpcs.xml file for all the details on code style.
Coding style validation / enforcement can be performed with
composer phpcs
. An auto-fixer is also available withcomposer phpcbf
.
Authors
- Mathieu Ducharme mat@locomotive.ca
- Chauncey McAskill chauncey@locomotive.ca
- Benjamin Roch benjamin@locomotive.ca
License
Charcoal is licensed under the MIT license. See LICENSE for details.