Download the PHP package restruct/silverstripe-shortcodable without Composer
On this page you can find all versions of the php package restruct/silverstripe-shortcodable. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download restruct/silverstripe-shortcodable
More information about restruct/silverstripe-shortcodable
Files in restruct/silverstripe-shortcodable
Package silverstripe-shortcodable
Short Description A shortcode button and dialog for the Silverstripe WYSIWYG editor: CMS editors pick, fill in and edit shortcodes, shown as placeholder images, and developers make any class or DataObject shortcodable.
License MIT
Informations about the package silverstripe-shortcodable
Silverstripe shortcode module
Maintained by Restruct. If this module saves you time, you can support ongoing maintenance.
Adds a button to HTMLEditorField for CMS users to insert Shortcodes in page content.
Shortcodes can optionally be represented in TinyMCE with a placeholder image.
This module is a partial-to-largely rewrite of sheadawson/silverstripe-shortcodable.
It depends on Silverstripe Simpler for some non-react UI functionalities (mainly the modal dialog).
Requirements
- Silverstripe 5 or 6 (
silverstripe/framework ^5 || ^6) - PHP 8.1 or newer (Silverstripe 6 itself needs 8.3)
- restruct/silverstripe-simpler, installed automatically:
its
0.xline (~0.2) on Silverstripe 5; on Silverstripe 6 it requires restruct/silverstripe-simpler 1.0.0 or later - Silverstripe 6 only:
silverstripe/htmleditor-tinymce. TinyMCE is a separate module on Silverstripe 6 andsilverstripe/recipe-cmsdoes not include it. Without it the site still boots, but there is no TinyMCE editor to add the shortcode button to.
Installation
Version Compatibility
| Branch | Module Version | Silverstripe | PHP |
|---|---|---|---|
main |
5.x (from 5.1.0) |
^5 \|\| ^6 |
^8.1 |
v4 |
4.x |
^4 \|\| ^5 |
^7.4 \|\| ^8.0 |
main is the maintained line and supports every Silverstripe version this module still targets.
Silverstripe 4 reached end of life in April 2025 and is no longer supported or tested here; projects
still on it can stay on the 4.x tags, which remain available. The 5.0.x tags declared Silverstripe 6
only, and could not be installed from Packagist (see CHANGELOG.md); use ^5.1.
Note: composer.json is the source of truth for exact version constraints.
Configuration
Register DataObjects or classes as shortcodable via Yaml config:
Configuration options
| Option | Default | What it does |
|---|---|---|
Shortcodable\Shortcodable.shortcodable_classes |
[] |
Classes to register with the shortcode parser and offer in the dialog. |
Shortcodable\Shortcodable.htmleditor_names |
[cms] |
HTMLEditor configs that get the shortcode button. Only TinyMCE configs are changed; others are skipped. |
Shortcodable\Controllers\ShortcodableAdminController.default_placeholder |
see class | Size, font and colours of the default SVG placeholder (width, height, full_width, full_height, font, fontsize, fg, bg). |
Per shortcodable class (as private static or YAML on that class):
| Option | Default | What it does |
|---|---|---|
shortcode |
short class name | The shortcode tag, eg currentyear for [currentyear]. |
shortcode_callback |
parse_shortcode |
Name of the parser method. |
shortcode_close_parent |
false |
Block-level output: close the wrapping element before the shortcode and reopen it after (see below). Also gives the default placeholder the full size. |
placeholder_settings |
none | width/height overriding the default placeholder size for this shortcode. |
Required methods on shortcodable objects/classes
Implement these methods on your shortcodable classes (may also be added via an Extension):
(Required) shortcode parser callback:
public static function parse_shortcode(...)
OR:
public function MyCustomParser(...) combined with:
private static $shortcode_callback = 'MyCustomParser'
Parser method arguments: (see shortcode documentation)
($attrs, $content=null, $parser=null, $shortcode, $info)
NOTE: the parser method gets called on a singleton object instance.
(So there's no $this->ID or $this->owner->ID etc.)
Optional:
private static $shortcode(optional, else short ClassName will be used as [ClassName])getShortcodeLabel()(optional nice description for in dropdown,singular_name()or elseClassName.Shortnamewill be used as fallback)getShortcodeFields()(optional, attribute-formfields for popup)getShortcodableRecords()(optional, if applied to DataObject)getShortcodePlaceholder($attributes)(optional)
Wrapping (optional):
In this module, $shortcodable_is_block and $disable_wrapper have been replaced with $shortcode_close_parent:
private static $shortcode_close_parent(optional, set to true if your shortcode output is a block-type html element)
If you set $shortcode_close_parent to true, the parent node will be closed before your shortcode output and reopened after.
Eg <p>Some [shortcode] content</p> would become <p>Some </p>[shortcode]<p> content</p>;
If the shortcode sits inside inline elements (eg <p><strong>Some [shortcode]</strong></p>), those are closed
as well, up to the block element holding them, and reopened after the shortcode. A bare element (no attributes)
that would be left empty on either side is dropped instead.
Only elements that cannot hold block content are closed: <p>, <h1>-<h6>, <pre> and <summary> (plus
inline elements). Containers that can already hold block content, such as <div>, <li>, <td>, <dt>, <dd>,
<address>, <blockquote> and <section>, are left whole: <li>[shortcode]</li> stays a list item with the shortcode
output inside it. Inline elements inside such a container are still closed and reopened around the shortcode.
A shortcode nested inside more than 10 inline elements, or inside inline elements whose opening tags add up to more
than 8 KB, is left untouched (a guard against pathological markup).
Up to 5.1.0 a container on the same line was closed too, so <div>[shortcode]</div> lost its <div>; since 5.2.0
it is kept.
Shortcode placeholder images
To display a nice image instead of the raw shortcode in the CMS editor, implement a getShortcodePlaceHolder method on your shortcodable object:
Default placeholder image
Without getShortcodePlaceHolder(), the editor shows an SVG generated by admin/shortcodable/placehold.img
(CMS access required). It takes w and h (a positive number of pixels, or 100%), bg and fg
(3 or 6 hex digits, no #), ff (font family), txtsize and txt. Invalid values fall back to the
default_placeholder config.
Running the tests
The module cannot be tested on its own: it needs a host Silverstripe project. Require it there
through a Composer path repository with symlink: true - /tests is export-ignore, so a dist
or mirrored install contains no tests - add "Shortcodable\\Tests\\": "vendor/restruct/silverstripe-shortcodable/tests/"
to the host's autoload-dev, then:
On Silverstripe 6 the host also needs silverstripe/htmleditor-tinymce, or the TinyMCE button test is
skipped. CI runs the suite against Silverstripe 5 and 6 on every push; see .github/workflows/ci.yml.
Status
- [x] TinyMCE button/plugin
- [x] Shortcode form in popup dialog
- [x] Custom/configurable shortcode independent of class name
- [x] Custom/configurable shortcode parser callback methods
- [x] Inserting new & editing existing shortcode (+undo)
- [x] Re-implement DataObjects as shortcodable (incl. getShortcodableRecords etc)
- [x] Re-implement placeholders
- [x] Check/re-implement(?) BOM fix and in ShortcodeController
- [x] Check/re-implement(?) P/DIV wrapper fix
- [ ] Check/restore functionality for Uploadfields to load existing value
- [ ] Check/implement(?) wrapping shortcodes
Refs:
All versions of silverstripe-shortcodable with dependencies
silverstripe/vendor-plugin Version ^2 || ^3
silverstripe/framework Version ^5 || ^6
silverstripe/admin Version ^2 || ^3
restruct/silverstripe-simpler Version ~0.2 || ^1