Add-on, ExpressionEngine

Live URL

Get the current entry’s URL in your channel entry form! Great for clicking to view without live preview

Buy Now

INSTALLATION

  1. Copy entire live_url folder to your system/user/addons folder.
  2. On your EE backend, navigate to Developer > Addons (yoursite.com/admin.php?/cp/addons).
  3. Scroll to Third Party Add-Ons.
  4. Find Live URL and click Install.
  5. Add your settings, and enjoy!

SET UP

  1. Create a field with the Live URL fieldtype.
  2. Add to your channel!

Live URL grabs the URL as best as it can following this prioritization:

  • If Structure is installed, we check there first.
  • Then we check Pages to see if the entry exists
  • We then check the Channel URL and assume the URL title is the final segment.
  • Finally, we take our best guess at the associated template structure.

In order to make sure you get the most accurate results, we highly recommend settings up your Channel URL in your Channel settings. This will ensure we can get as close as possible. Structure and Pages are easy, but if you are using standard EE set up, this will help get you a more accurate URL.

USAGE

Channel Form

Once you add your Live URL field to your channel, the URL will display. Click it!

Template Tag

You can use this in your regular templates like a text field. This will create a text version of the URL without the a tags

SUPPORT

We want to make sure you have what you need on this. Email [email protected] for help.

Add-on, ExpressionEngine, SEO

Lazy Sitemap Generator

Just crawl your site and get an automatic sitemap. Ain’t no one got time to code it.

Buy Now

INSTALLATION

  1. Copy entire lazy_sitemap_generator folder to your system/user/addons folder.
  2. On your EE backend, navigate to Developer > Addons (yoursite.com/admin.php?/cp/addons).
  3. Scroll to Third Party Add-Ons.
  4. Find Lazy Signup Generator and click Install.
  5. Add your settings, and enjoy!

USAGE

Generate Sitemap

There are two ways to generate a sitemap, as this can be a very time-intensive item.

Action URLS

Navigate to yoursite.com/?ACT=123, replacing 123 with the action ID of the generate function. Sit back, and it will crawl your site.

You can also specify a URL, if you do not have one in your config, or want to specify a subdomain. yoursite.com/?ACT=123&url=https://yoursite.com

There is also a generate_fresh action, which will clear all existing sitemap URLs and start fresh.

Technically, you can use these methods inside an EE template, as {exp:lazy_sitemap_generator:generate} and {exp:lazy_sitemap_generator:generate_fresh}, but it is not recommended.

CLI Command

Using eecli.php, you can run the following command:

php eecli.php lazy_sitemap_generator:generate:sitemap

In order to generate the sitemap from the CLI. This is great for larger sites that will require a long running crawl process or you want to automate this with cron.

Params

--fresh: Use this to run the command with deleting all old records --url: Use this to specify the URL you want to crawl. DEFAULT: your site's base_url --force: Both fresh and url will check to verify these actions. Use the force option to skip checking. Useful for crons

View Sitemap

Create a template of XML type, such as sitemap.group/index.xml.

Add the following template tag to your code:

{exp:lazy_sitemap_generator:view}

Then generate your sitemap (see above), navigate to yoursite.com/sitemap and enjoy!

Add-on, ExpressionEngine

Informer

Audit everything happening in your EE site. Includes 20 Pro Dashboard Widgets!

Buy Now

Audit what happens in your ExpressionEngine site.

What It Does

Informer provides a simple, table based view, of events that occur throughout your EE site. It provides you an in the moment list of entry updates, member creation and deletion, even log ins and log outs!

Installation

  1. Copy the informer directory into your system/user/addons folder.
  2. Navigate to your add-on dashboard in the CMS.
  3. Click install.

If you are using the EE5 version, copy the informer-ee5 directory into your system/user/addons folder, and rename it to informer. Follow the remaining installation steps

Settings

Active

Toggle off if you want Informer to skip all auditing.

Active Hooks to Audit

This is a list of active extension hooks to monitor and audit.

  • email_send: Log when an email is sent
  • cp_member_login: Log when a user logs in
  • cp_member_logout: Log when a user logs out
  • cp_members_member_create: Log when a member is created in the CP
  • cp_members_member_delete_end: Log when a member is deleted in the CP
  • after_category_insert: Log when a category is created.
  • after_category_delete: Log when a category is deleted.
  • after_category_bulk_delete: Log when multiple categories are deleted
  • after_channel_insert: Log when a channel is created.
  • after_channel_update: Log when a channel is updated.
  • after_channel_delete: Log when a channel is deleted.
  • after_channel_entry_insert: Log when a channel entry is created.
  • after_channel_entry_update: Log when a channel entry is updated.
  • after_channel_entry_delete: Log when a channel entry is deleted.
  • after_channel_entry_bulk_delete: Log when multiple channel entries are deleted
  • after_member_insert: Log when a member is created. This includes front end registration.
  • after_member_update: Log when a member is updated.
  • after_member_delete: Log when a member is deleted. This includes front end deactivation.
  • after_member_bulk_delete: Log when multiple members are deleted.

Usage

Dashboard

This is the primary view, which will display the last 25 audits.

You can click on the manage icon to see a particular audit, with all of its associated details.

View

View a particular audit, and all of its associated details.

Support

For support, contact mailto:[email protected]

Add-on, ExpressionEngine, Categories

Catman

Robust category display with entry counts and easy to create navs, for use with EE’s native categories

Buy Now

Installation

Move the appropriate catman folder to your system/user/addons folder. And install as a normal EE addon.

If you are using the EE5 version, rename catman-ee5 to catman.

** NOTE: With the release of EE7, the EE5 version of Catman will no longer receive updates past version 1.0.3 **

Usage

Catman acts as a tag pair in your EE templates.

{exp:catman:get}
    {if catman:no_results}
        No results
    {/if}
    Count: {catman:count}
    {catman:categories}
        {category_name}
    {/catman:categories}
{/exp:catman:get}

Catman Params

show

show="4|7"

With this parameter, you can specify which categories will be included in the list. For instance, if you wanted to keep a particular category from being listed you could specify only those you wanted displayed to be included. Category IDs are separated by the pipe character to specify more than one category. If you specify a child category be shown, you must also include its parent category to be shown.

You may alternatively specify which categories to not show

show="not 3|6|8"

If you specify that a parent category is not shown, then any children of that parent category are then unable to be shown by the tag. The parent category is required for any and all children categories.

channel

channel="channel_name"

The name (short name) of the channel that the categories are assigned to. This variable is required unless you only have a single channel. Multiple channels may also be specified.

parent_only

parent_only="y"

Display parent categories only

show_empty

show_empty="y"

This parameter determines whether or not categories that contain no entries for the specific channel are displayed. If you set the parameter to “no” then categories which do not contain entries will not be included in the list.

By default, categories with no entries are included.

depth

depth="2"

Gets nested children of parent categories to the maximum depth set. Defaults to showing all children, regardless of depth.

entry_count

entry_count="y"

Include entry count in parameters.

entry_id

entry_id="123"

Display categories related to the specified entry.

group_id

Alias for category_group

category_group

category_group="2"

Category Groups are specified by ID number (the ID number of each category group is displayed in the Control Panel). The reason we use the ID is because category groups can be called anything (with spaces, quotes, etc.), and also renamed. It would be much more difficult to have to update the tag parameters every time you updated a category name.

And as with many other parameters, you can stack category groups

category_group="1|2|4"

Or use “not” to exclude categories

category_group="not 2"

limit

limit="3"

Limits number of returned categories

orderby / sort

orderby="category_id" sort="asc"

The orderby parameter sets the display order of the entries. Sort sets the direction.

backspace

backspace="7"

The backspace= parameter will remove characters, including spaces and line breaks, from the last iteration of the tag pair:

For example, if you use a
element after each entry, Catman will output this markup:

Category 1

Category 2

Category 3

However, you may not want the
element after the last entry. Count the number of characters, including spaces and line breaks and use the result as the value for the parameter. The example
element includes 6 characters and a line break, for a total of 7:

{exp:catman:get backspace="7"}
    {catman:categories}
        {category_name}

    {/catman:categories}
{/exp:catman:get}

Using backspace=, Catman will output this markup:

Category 1

Category 2

Category 3

cache_ttl

cache_ttl="3600"

By default, Catman will cache calls made, organized by the set params on the tag. Use cache_ttl to set the amount of seconds to keep this cache. Default is 86400 (1 day).

cache

cache="y"

Set to y to cache calls. Defaults to no, so calls are not cached (new in version 1.1.0)

Additional Params

These params can be params or included in query strings

  • as_json
  • no_cache

Entry Count

In order to initialize the Entry Count, there are two crucial steps.

  1. Run the Action URL associated with the Count All action (i.e. https://example.com/admin.php?/cp/addons/settings/catman). This may take a bit depending on the number of categories, but is not a destructive action, so can be run any number of times.

  2. Catman assumes that your get tags will include all of the channel information you want to get. If you are using a category in multiple channels, ensure that you include the channel= parameter on your tag with the channel name or names, separated by pipes (|), i.e. {exp:catman:get category_group="3" channel="blog"}

Ongoing Counts

There are two important ongoing entry counting elements that can be done here.

Action URLs

Catman comes with a number of action URLs to process entry counts on your timing.

Extension Hooks

Catman, by default

This call can be expensive when your CMS has a ton of entries. If you would like to turn this off, include the following in your EE config.php file:

$config['catman_ignore_count_hooks'] = true;

Data Shapes

Category

{
    "catman:count": 12,
    "catman:no_results": false,
    "catman:categories": [
        {
            "category_id": 1,
            "parent_id": 0,
            "group_id": 1,
            "category_name": "News",
            "category_description": null,
            "category_image": "",
            "category_url_title": "news",
            "category_order": 1,
            "test_text": "",
            "count":
            {
                "count": 1,
                "parent_count": 0,
                "child_count": 0
            },
            "total_results": 11,
            "group":
            {
                "group_name": "Blog",
                "sort_order": "c"
            },
            "parent":
            [],
            "children":
            [],
            "path":
            [
                {
                    "category_id": 1,
                    "parent_id": 0,
                    "group_id": 1,
                    "category_name": "News",
                    "category_description": null,
                    "category_image": "",
                    "category_url_title": "news",
                    "category_order": 1,
                    "test_text": "",
                    "count":
                    {
                        "count": 1,
                        "parent_count": 0,
                        "child_count": 0
                    },
                    "total_results": 11,
                    "group":
                    {
                        "group_name": "Blog",
                        "sort_order": "c"
                    },
                    "parent":
                    [],
                    "children":
                    []
                }
            ]
        },
    ]
}

Example Template

{exp:catman:get category_group="3" channel="blog"}
    {if catman:no_results}
        <h1>NO RESULTS</h1>
    {if:else}
        <h1>FOUND {catman:count} RESULTS!</h1>
        {catman:categories}
            <h2>category_name: {category_name}</h2>
            <p>category_id: {category_id}</p>
            <p>parent_id: {parent_id}</p>
            <p>group_id: {group_id}</p>
            <p>category_description: {category_description}</p>
            <p>category_image: {category_image}</p>
            <p>category_url_title: {category_url_title}</p>
            <p>category_order: {category_order}</p>
            <p>Custom Field: {test_text}</p>
            <h3>Simple Path:</h3>
            {simple_path}/{simple_path:uri}{/simple_path}
            <h3>Counts:</h3>
            <p>child_count: {child_count}</p>
            {entry_count}
                <p>entry_count:count: {entry_count:count}</p>
                <p>entry_count:parent_count: {entry_count:parent_count}</p>
                <p>entry_count:child_count: {entry_count:child_count}</p>
                <p>entry_count:count_with_parent: {entry_count:count_with_parent}</p>
                <p>entry_count:count_with_children: {entry_count:count_with_children}</p>
            {/entry_count}
            <h3>Parent:</h3>
            {parent}
                <p>category_name: {parent:category_name}</p>
                <p>category_id: {parent:category_id}</p>
                <p>parent_id: {parent:parent_id}</p>
                <p>group_id: {parent:group_id}</p>
                <p>category_description: {parent:category_description}</p>
                <p>category_image: {parent:category_image}</p>
                <p>category_url_title: {parent:category_url_title}</p>
                <p>category_order: {parent:category_order}</p>
            {/parent}
            {children}
                <h3>CHILD: {child:category_name}</h3>
                <p>category_id: {child:category_id}</p>
                <p>parent_id: {child:parent_id}</p>
                <p>group_id: {child:group_id}</p>
                <p>category_description: {child:category_description}</p>
                <p>category_image: {child:category_image}</p>
                <p>category_url_title: {child:category_url_title}</p>
                <p>category_order: {child:category_order}</p>
            {/children}
        {/catman:categories}
    {/if}
{/exp:catman:get}

Categories from Segments

Catman also allows you to get category information, parsed early, to help you get access to category information from URL segment information.

catman_segment_n_category_id

{catman_segment_n_category_id}

Get category ID of segment N (representing the segment of the URL you would like to get). Returns the data shape above, or null if not found.

catman_segment_n_category_name

{catman_segment_n_category_name}

Get category Name of segment N (representing the segment of the URL you would like to get). Returns the data shape above, or null if not found.

catman_segment_n_category_description

{catman_segment_n_category_description}

Get category description of segment N (representing the segment of the URL you would like to get). Returns the data shape above, or null if not found.

catman_segment_n_category_image

{catman_segment_n_category_image}

Get category image of segment N (representing the segment of the URL you would like to get). Returns the data shape above, or null if not found.

catman_segment_n_category_parent_id

{catman_segment_n_category_parent_id}

Get parent ID of segment N (representing the segment of the URL you would like to get). Returns the data shape above, or null if not found.

catman_segment_n_category_group_id

{catman_segment_n_category_group_id}

Get category group ID of segment N (representing the segment of the URL you would like to get). Returns the data shape above, or null if not found.

catman_last_segment_category_id

{catman_last_segment_category_id}

Get category ID of the last segment of the URL. Returns the data shape above, or null if not found.

catman_last_segment_category_name

{catman_last_segment_category_name}

Get category name of the last segment of the URL. Returns the data shape above, or null if not found.

catman_last_segment_category_description

{catman_last_segment_category_description}

Get category description of the last segment of the URL. Returns the data shape above, or null if not found.

catman_last_segment_category_image

{catman_last_segment_category_image}

Get category image of the last segment of the URL. Returns the data shape above, or null if not found.

catman_last_segment_category_parent_id

{catman_last_segment_category_parent_id}

Get category parent ID of the last segment of the URL. Returns the data shape above, or null if not found.

catman_last_segment_category_group_id

{catman_last_segment_category_group_id}

Get category group ID of the last segment of the URL. Returns the data shape above, or null if not found.

catman_segment_category_ids

{catman_segment_category_ids}

Create inclusive stack of all category ids present in segments, separated by &

catman_segment_category_ids_piped

{catman_segment_category_ids_piped}

Create inclusive stack of all category ids present in segments, separated by |

Credits

Logo by Emilee Black!

Add-on, ExpressionEngine

Coming Soon

Display your site when you’re good and ready! And put up a coming soon of any content you want until that time.

Buy Now

Your site is in process, but you don’t want people to see it. What do you do?

Put up a coming soon page! Whether you want to just display a message, or collect a user sign ups, or redirect somewhere, Coming Soon will help you make it happen, and utilize any of EE’s functionality to make it happen. You can either set it as active and force all traffic that way, or set up a time period when you want your page displayed. Set up any template to be displayed, and allow Super Admins to still view the entire site!

Add-on, SaaS, ExpressionEngine, PDF, WordPress

pdfl.io

Realtime PDFs Of Your Webpages! Sick of designing special PDFs for pages of your website or app? Let pdfl.io do it!

Buy Now

Introduction

Welcome to the pdfl.io! This documentation contains all the details you need to convert documents from HTML to PDF.

API Keys

Authenticate your account by including your API key in requests. You receive an initial API key when you register your account, and can manage your API keys in the Dashboard.

Authentication to the API is added as a variable called key in your query string. For example:

https://pdfl.io/convert/pdf?url=https://example.com&key=my-api-key

It is the best practice to obscure your API key, so do not use this in a way that allows web users to see this. If you are using this on your website or app interface, it is best to use one of our plugins.

Basic Usage

In order to get your PDF, all you have to include is the url and the API key as query parameters, as such:

https://pdfl.io/convert/pdf?url=https://example.com&key=my-api-key

NOTE: both URL and KEY are required keys. Your request will return 400 (Bad Request) or 401 (Unauthenticated) if either of these are missing.

This will return the PDF directly to your browser of the rendered HTML.

Parameters

pdfl.io also has a number of parameters you can use to format your PDF!

filename

A url encoded string that will be set as the filename of the PDF. The .pdf extension is not required. Default: the slugified URL sent in with the request

https://pdfl.io/convert/pdf?url=https://example.com&filename=my-awesome-pdf.pdf&key=my-api-key

download

A value to return the PDF as a download, instead of viewing in the browser. Default: false

https://pdfl.io/convert/pdf?url=https://example.com&download=1&key=my-api-key

no-background

Will not render the background images for the page. Default: false

https://pdfl.io/convert/pdf?url=https://example.com&no-background=1&key=my-api-key

greyscale

Will render the PDF in greyscale. Default: false

https://pdfl.io/convert/pdf?url=https://example.com&greyscale=1&key=my-api-key

format

Set the paper format for the PDF. Default: Letter

Options:

  • Letter: 8.5in x 11in
  • Legal: 8.5in x 14in
  • Tabloid: 11in x 17in
  • Ledger: 17in x 11in
  • A0: 33.1in x 46.8in
  • A1: 23.4in x 33.1in
  • A2: 16.54in x 23.4in
  • A3: 11.7in x 16.54in
  • A4: 8.27in x 11.7in
  • A5: 5.83in x 8.27in
  • A6: 4.13in x 5.83in

https://pdfl.io/convert/pdf?url=https://example.com&format=A4&key=my-api-key

top-view-only

By default, pdfl.io will load the entire web page. If you only want what is in the specific screen view, set this option. Default: false

https://pdfl.io/convert/pdf?url=https://example.com&top-view-only=1&key=my-api-key

disable-javascript

By default, pdfl.io will load all javascript on the page, and dismiss all alerts. Set this option to disable all javascript on a page. Default: false

https://pdfl.io/convert/pdf?url=https://example.com&disable-javascript=1&key=my-api-key

disable-images

Set this option to disable all images on the page. Default: false

https://pdfl.io/convert/pdf?url=https://example.com&disable-images=1&key=my-api-key

just-wait

Set this option to wait until all network activity on the page has ended. NOTE: If the page has long running scripts, there is a chance this will cause a timeout, or stop your PDF from rendering.

https://pdfl.io/convert/pdf?url=https://example.com&just-wait=1&key=my-api-key

delay

Set this option to delay X seconds before rendering the PDF. Especially useful if you have a page preloader on the page. Default: unset

https://pdfl.io/convert/pdf?url=https://example.com&delay=3&key=my-api-key (This will delay for 3 seconds)

Plugins

ExpressionEngine: https://expressionengine.com/add-ons/pdfl.io

WordPress: https://wordpress.org/plugins/pdfl-io/

Add-on, ExpressionEngine, Headless, API

Bones

Headless ExpressionEngine With One Line of Template Code.

Buy Now

INSTALLATION

  1. Copy entire bones folder to your system/user/addons folder.
  2. On your EE backend, navigate to Developer > Addons (yoursite.com/admin.php?/cp/addons).
  3. Scroll to Third Party Add-Ons.
  4. Find Bones and click Install.
  5. Add your settings, and enjoy!

SETTINGS

  • Active: If turned on, will return data. When turned off, will return an error.

  • Use API Key: If turned on, each API call will require your API key to be attached to the request.

  • API Key: Add in an API key of your choosing.

USAGE

Reading Entries Via Template Code

Bones is meant to be used within a template all it's own, and is flexible enough to accept all of ExpressionEngine's channel entries tag parameters, either within the template tag itself, or as parameters in your API call.

Create a template group with an index file. For our example, we created api.group with index.html.

If you wanted to retrieve all entries without any filtering, or including filtering within your API call, then you would simply add this to your template:

{exp:bones:entries}

You would then be able to view this in browser (for testing) at your URL and template group, i.e. https://example.com/api

Channel Entry Parameters

Bones automatically accepts all Channel Entries tags parameters as well. So, if you wanted to view only the blog channel with a status of draft, your template code will look like:

{exp:bones:entries channel="blog" status="draft"}

Skipping Standard Object Keys

For entries that are sent back, each one includes a number of standard fields included with each EE entry (see #responses for more information). You can use the following parameters in your call in order to skip those fields:

  • skip_view_count: skip view count data
  • skip_signature: skip signature data
  • skip_avatar: skip avatar data
  • skip_member_data: skip member data

For example:

https://example.com/api?channel=blog&status=draft&skip_view_count=y&skip_member_data=y

Reading Entries Via API Call

You can now use your API by making a GET call to your site as such https://example.com/api

All available channel entries tag parameters are also available via the API as GET or POST variables. So, if you wanted to view only the blog channel with a status of draft, your API Call will look like:

https://example.com/api?channel=blog&status=draft

All query parameters must be properly URL encoded when submitting.

Reading Categories

Categories can be read similarly to entries:

{exp:bones:categories channel="blog"}

Category Parameters

Since EE Category data is only available via a string in the template code, we adjusted this method to get just the categories. Therefore, all of the category parameters in the Channel Categories tag are available except the following:

  • backspace
  • class
  • disable
  • id
  • style

Reading Entries Via API Call

You can now use your API by making a GET call to your site as such https://example.com/api

All available channel categories tag parameters, minus those mentioned above, are also available via the API as GET or POST variables. So, if you wanted to view only the blog channel with a status of draft, your API Call will look like:

https://example.com/api?channel=blog

All query parameters must be properly URL encoded when submitting.

Reading Entries Via Action URL

You can now use your API by making a GET call to your site as such https://example.com/api

Your action IDs are listed in the settings panel of Bones.

https://example.com/ACT=123?channel=blog&status=draft

All query parameters must be properly URL encoded when submitting.

API Key

If you are using an API key to get your data, including the api_key parameter in your calls.

https://example.com/api?api_key=123456789

Since EE search works a bit different in channel parameters, Bones handles this with GET or POST parameters structured as such:

https://example.com/api?search[title]=my+awesome+title

This would be the equivalent of:

{exp:channel:entries search:title="my awesome title"}

All search parameters work the same as the Channel Entries tag, and should be properly url encoded when submitted.

Custom Fields

Out of the box, Bones handles all native EE fields, including Grids, Relationships, and Fluid Fields. It also handles Bloqs, and any custom fields that output text (i.e. WYGWAM).

For other custom fields, you can add your own custom Field Parsers into the FieldFormatters folder. (COMING SOON, let us know what you need)

Response String Only

If you are just looking for quick JSON of your data to use in a template, you can use the response_string=y in the API call in order to get the JSON encoded string for use in your templates.

Security Concerns

Secure API Key

If you are looking for a secure implementation of Bones to a third party app, it is recommended utilizing the API key set up through a backend connector. This allows you to use your API key in other applications without exposing another site and its credentials.

Frontend API Calls

Frontend API calls are a great way to get your data to be slurped on in your frontend javascript. As you do this, ensure you are taking standard API security precautions to protect sensitive data.

It is highly recommend that you should avoid calling data from a secondary domain via the frontend, which may reveal unintended routes from the child site or API credentials, or set up proper CORS for any third party site you would want to call.

RESPONSES

All responses, whether success or error, have 4 incoming parameters:

  • success: Boolean value to indicate whether API call was successful or not
  • message: Any incoming message that would attached to the call. Primarily used for error indication
  • count: Count of incoming data objects. 0 if success is false
  • data: Array of items coming in. Array will be empty if success if false.

Success

ENTRIES: GET https://example.com/api?api_key=123&entry_id=12

{
    "success": true,
    "message": "success",
    "count": 1,
    "data":
    [
        {
            "entry_id": 12,
            "forum_topic_id": null,
            "title": "Entry with vimeo or some junk!!!",
            "url_title": "action-comedy-how-to",
            "status": "open",
            "view_count_one": 0,
            "view_count_two": 0,
            "view_count_three": 0,
            "view_count_four": 0,
            "sticky": "n",
            "entry_date":
            {
                "pretty_date": "Thu, 25 Feb 2021 11:00:00 -0500",
                "seconds_from_epoch": "1614268800",
                "iso8601": "2021-02-25T11:00:00-05:00",
                "raw": 1614268800
            },
            "year": "2021",
            "month": "02",
            "day": "25",
            "edit_date":
            {
                "pretty_date": "Fri, 12 Nov 2021 11:25:23 -0500",
                "seconds_from_epoch": "1636734323",
                "iso8601": "2021-11-12T11:25:23-05:00",
                "raw": 1636734323
            },
            "expiration_date": 0,
            "recent_comment_date": 1614268852,
            "comment_total": 11,
            "channel_title": "Blog",
            "channel_name": "blog",
            "username": "doug",
            "email": "[email protected]",
            "screen_name": "doug",
            "signature": null,
            "sig_img_filename": null,
            "sig_img_width": null,
            "sig_img_height": null,
            "avatar_filename": null,
            "avatar_width": null,
            "avatar_height": null,
            "photo_filename": null,
            "photo_width": null,
            "photo_height": null,
            "site_id": 1,
            "test_fluid_field":
            {
                "about_image":
                [
                    {
                        "image": "https://ee-pro-ee.test/themes/user/site/default/asset/img/common/8yf91jhf3ef71.jpg",
                        "caption": "adadsasd",
                        "align": "right"
                    }
                ],
                "order_billing_address": " 123 Fake St"
            },
            "seo_title": "Action Comedy",
            "seo_desc": "This is how it's done, the incomparable Jackie Chan shows us the way.",
            "related_entries":
            [
                {
                    "entry_id": 7,
                    "title": "Super old entry BUT asdasdaMATION POINTS!!!",
                    "url_title": "super-old-entry",
                    "status": "open",
                    "sticky": false,
                    "entry_date": 1614268800,
                    "edit_date":
                    {
                        "date": "2021-07-27 20:33:11.000000",
                        "timezone_type": 1,
                        "timezone": "+00:00"
                    },
                    "channel_name": null,
                    "username": null,
                    "email": null,
                    "screen_name": null
                },
                {
                    "entry_id": 10,
                    "title": "Entry with SoundCloud audio!!! WHENENNSHSHSHSSHSAOSDJOSDAASDOSDAOSDAJOSJIOSIO",
                    "url_title": "the-one-where-we-shake-it-ff",
                    "status": "open",
                    "sticky": false,
                    "entry_date": 1614268800,
                    "edit_date":
                    {
                        "date": "2021-08-06 13:48:28.000000",
                        "timezone_type": 1,
                        "timezone": "+00:00"
                    },
                    "channel_name": null,
                    "username": null,
                    "email": null,
                    "screen_name": null
                },
                {
                    "entry_id": 13,
                    "title": "Test Page With Everything!!!!",
                    "url_title": "test-page-with-everything",
                    "status": "open",
                    "sticky": false,
                    "entry_date": 1628156040,
                    "edit_date":
                    {
                        "date": "2021-10-04 12:16:14.000000",
                        "timezone_type": 1,
                        "timezone": "+00:00"
                    },
                    "channel_name": null,
                    "username": null,
                    "email": null,
                    "screen_name": null
                }
            ],
            "blog_video":
            [
                {
                    "id": "113439313",
                    "type": "vimeo"
                }
            ],
            "blog_image":
            [],
            "blog_audio":
            [],
            "blog_content": "Lorem ipsum dolor sit amet, <b>this is bold text</b> consectetur <strong>this text is strongly emphasized</strong> adipisicing elit, sed do eiusmod tempor incididunt <i>this is italic text</i> ut labore <em>this text is emphasized</em> et dolore magna aliqua. Ut enim ad minim veniam, <a href=\"\">this is a link</a> quis nostrud <a href=\"\" rel=\"external\">this is an external link</a> laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse <del>This text is deleted</del> <ins>this text is inserted</ins> cillum <code>this is a code sample</code> dolore eu <mark>this text is highlighted</mark> fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\nIOJIJOASDOIJDASJOIASDJOIASDOJASD",
            "rando_date":
            {
                "pretty_date": "Sat, 20 Nov 2021 09:43:56 -0500",
                "seconds_from_epoch": "1637419436",
                "iso8601": "2021-11-20T09:43:56-05:00",
                "raw": null
            },
            "slider_field": {
                "value":49,
                "field_min_value": "0",
                "field_max_value": "100",
                "field_step": "1"
            },
            "duration_field": {
                "value":"984",
                "units":"minutes"
            }
        }
    ]
}

Every entry at a root level will contain the following standard EE fields:

  • entry_id
  • forum_topic_id
  • title
  • url_title
  • status
  • view_count_one
  • view_count_two
  • view_count_three
  • view_count_four
  • sticky
  • entry_date
  • year
  • month
  • day
  • edit_date
  • expiration_date
  • recent_comment_date
  • comment_total
  • channel_title
  • channel_name
  • username
  • email
  • screen_name
  • signature
  • sig_img_filename
  • sig_img_width
  • sig_img_height
  • avatar_filename
  • avatar_width
  • avatar_height
  • photo_filename
  • photo_width
  • photo_height

Entries at any nested level will display:

  • entry_id
  • title
  • url_title
  • status
  • sticky
  • entry_date
  • edit_date
  • channel_name
  • username
  • email
  • screen_name

CATEGORIES: GET https://example.com/api?api_key=123

{
    "success": true,
    "message": "success",
    "count": 5,
    "data":
    [
        {
            "category_name": "News",
            "category_url_title": "news",
            "category_description": null,
            "category_image": "",
            "category_id": 1,
            "parent_id": 0,
            "active": false,
            "count": 1,
            "total_results": 5
        },
        {
            "category_name": "Personal",
            "category_url_title": "personal",
            "category_description": null,
            "category_image": "",
            "category_id": 2,
            "parent_id": 0,
            "active": false,
            "count": 2,
            "total_results": 5
        },
        {
            "category_name": "Photos",
            "category_url_title": "photos",
            "category_description": null,
            "category_image": "",
            "category_id": 3,
            "parent_id": 0,
            "active": false,
            "count": 3,
            "total_results": 5
        },
        {
            "category_name": "Videos",
            "category_url_title": "videos",
            "category_description": null,
            "category_image": "",
            "category_id": 4,
            "parent_id": 0,
            "active": false,
            "count": 4,
            "total_results": 5
        },
        {
            "category_name": "Music",
            "category_url_title": "music",
            "category_description": null,
            "category_image": "",
            "category_id": 5,
            "parent_id": 0,
            "active": false,
            "count": 5,
            "total_results": 5
        }
    ]
}

Errors

Authorization Error

{"success":false,"message":"Not authorized","count":0,"data":[]}

SAMPLES

In the samples folder attached here, you will see a couple of EE templates that will demonstrate usage of Bones:

  • basic-usage: The absolute minimum needed in a template
  • blog-channel-only: Get all entries from a Blog channel

Sample Javascript Implementation

  • Bones Test: In the samples/test.group folder is a template that will fully connect to your API route.
  • bones-hello-world: A simple Vue implementation of the API

TERMS OF SERVICE

Utilizing any API-based service means that your data can be called via a network call. It is of great importance that you use the best API security practices with your implementation of Bones. The creator of this addon and its subsidiaries can not be held responsible for data that is available via API calls through this addon. For more information, or assistance setting up your Bones implementation, please see Support information below.

SUPPORT

We want to make sure you have what you need on this. Email [email protected] for help.

Add-on, ExpressionEngine, PDF

PDF Press Next

Generate accurate looking PDFs from your template code

Buy Now

WHY PDF PRESS NEXT

Better Looking PDFs

Revolutionize the way you present your content with PDF Press Next! Say goodbye to bland and uninspiring PDFs. Our cutting-edge add-on harnesses the power of headless Chrome to create PDFs that are not only functional but stunningly beautiful. Whether you're sharing reports, portfolios, or presentations, PDF Press Next ensures that your documents leave a lasting impression. Elevate your professional image and captivate your audience with PDFs that are as visually striking as they are informative.

More Modern Technology

Embrace the future of document generation with PDF Press Next! We're leaving outdated methods behind and embracing the latest in technology to streamline your PDF creation process. By leveraging headless Chrome, PDF Press Next offers unparalleled efficiency and reliability, ensuring that your PDFs are generated swiftly and accurately every time. Join the ranks of forward-thinking professionals who are embracing modern solutions to enhance their workflow. With PDF Press Next, you're not just keeping up with the times – you're staying ahead of them.

Works with JavaScript

Unlock limitless possibilities for your PDFs with PDF Press Next! Unlike traditional PDF generators, PDF Press Next fully supports JavaScript, empowering you to create dynamic and interactive documents like never before. Whether you're embedding charts, forms, or multimedia elements, PDF Press Next ensures that your JavaScript-powered content shines through seamlessly in your PDFs. Don't let limitations hold back your creativity – with PDF Press Next, the only boundary is your imagination. Experience the freedom to craft engaging and interactive PDFs that truly stand out from the crowd.

PREREQUISITES

PHP 7.3+ ExpressionEngine 6.0+ Node v16+ Opcache and IMagick or GMagick (recommended)

INSTALLATION

  1. Copy entire pdf_press_next folder to your system/user/addons folder.
  2. On your EE backend, navigate to Developer > Addons (yoursite.com/admin.php?/cp/addons).
  3. Scroll to Third Party Add-Ons.
  4. Find PDF Press NEXT and click Install.
  5. Add your settings, and enjoy!

CONFIGURATION

PPN needs little configuration. If you'd like to change your Node path, you can use the EE config variable: pdf_press_next_node_path

EXAMPLE:

$config['pdf_press_next_node_path'] = '/weird/path/to/node/node';

USAGE

PDF Press NEXT has one tag, which generates a link to your PDF.

save_to_pdf: Generate PDF

The save_to_pdf tag generates a link to download the template as a PDF, it must contain the following parameters:

  • url: Should be the ENTIRE URL that you want rendered to the PDF.
  • filename: Sets the filename for the downloaded PDF. Default: filename.pdf

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf"}

Additional Parameters

cookies

JSON, Cookie objects to set.

display-header-footer

<[boolean]> Display header and footer. Defaults to false.

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf" display-header-footer="y"}

footer-template

<[string]> HTML template for the print footer. Should be valid HTML markup with following classes used to inject printing values into them.

  • date: formatted print date
  • title: document title
  • url: document location
  • pageNumber: current page number
  • totalPages: total pages in the document

footer-template-url

<[string]> URL for desired HTML template. See footer-template for additional options.

format

Paper format. If set, takes priority over width or height options. Defaults to 'Letter'.

header-template

<[string]> HTML template for the print header. Should be valid HTML markup with following classes used to inject printing values into them.

  • date: formatted print date
  • title: document title
  • url: document location
  • pageNumber: current page number
  • totalPages: total pages in the document

header-template-url

<[string]> URL for desired HTML template. See header-template for additional options.

height

<[string]> Paper height, accepts values labeled with units.

landscape

<[boolean]> Paper orientation. Defaults to false (portrait).

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf" landscape="y"}

margin

JSON, Paper margins, defaults to none.

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf" margin="{'top': '2rem', 'bottom': '1rem', 'left': '2px', 'right': '1cm'}"}

media-type

<[string]> Changes the CSS media type of the page. The only allowed values are 'screen', 'print' and null. Passing null disables media emulation.

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf" media-type="screen"}

omit-background

<[boolean]> Hides default white background and allows capturing screenshots with transparency. Defaults to false.

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf" omit-background="y"}

page-ranges

Paper ranges to print, e.g., '1-5, 8, 11-13'. Defaults to the empty string, which means print all pages.

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf" page-ranges="1,3-4"}

page-wait-for

<[integer]> Timeout in milliseconds to wait for.

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf" page-wait-for="5000"}

prefer-css-page-size

<[boolean]> Give any CSS @page size declared in the page priority over what is declared in width and height or format options. Defaults to false, which will scale the content to fit the paper size.

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf" prefer-css-page-size="y"}

print-background

<[boolean]> Print background graphics. Defaults to false.

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf" print-background="y"}

scale

<[number]> Scale of the webpage rendering. Defaults to 1

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf" scale="2"}

timeout

<[number]> Maximum time in milliseconds, defaults to 30 seconds, pass 0 to disable timeout.

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="download.pdf" timeout="2"}

viewport

JSON, sets viewport for document reading. Items should include:

  • width: <[number]> page width in pixels.
  • height: <[number]> page height in pixels.
  • deviceScaleFactor: <[number]> Specify device scale factor (can be thought of as dpr). Defaults to 1.
  • isMobile: <[boolean]> Whether the meta viewport tag is taken into account. Defaults to false.
  • hasTouch: <[boolean]> Specifies if viewport supports touch events. Defaults to false
  • isLandscape: <[boolean]> Specifies if viewport is in landscape mode. Defaults to false.

width

<[string]> Paper width, accepts values labeled with units.

EXAMPLE

{exp:pdf_press_next:save_to_pdf url="{site_url}/path/to/my/pdf" filename="projects.pdf" scale="1" landscape="y" print-background="y"}

This will create a link to open a PDF titled "projects.pdf" in the browser using the web path to /path/to/my/pdf. This will render all EE code with CSS and JS in place, print in landscape, and print the background.

TROUBLESHOOTING

Puppeeter will throw various issues based on what you have sent through. This may be a non-matching type of data (i.e. number vs string), or missing data (i.e. empty scale parameter). Please read these errors carefully.

Please visit The Puppeeteer docs for some related issues. Please refer to support below for assistance.

SUPPORT

For any issues, please reach out to mailto:[email protected].

Support is limited to licensed PDF Press Next users, and is focused on technical issues with the add-on. Though we're happy to help with styling issues to some extent, this is only available via paid support.

Add-on, ExpressionEngine, PDF

PDF Press

Generate PDFs directly from your EE templates! Powered by mPDF.

Buy Now

PREREQUISITES

PHP 7.3+ DOMDocument extension MBString extension XML extension GD ExpressionEngine 6.0+ Opcache and IMagick or GMagick (recommended)

INSTALLATION

  1. Copy entire pdf_press folder to your system/user/addons folder.
  2. Copy entire themes/pdf_press folder to your themes folder, so that you have /themes/users/pdf_press
  3. On your EE backend, navigate to Developer > Addons (yoursite.com/admin.php?/cp/addons).
  4. Scroll to Third Party Add-Ons.
  5. Find PDF Press and click Install.
  6. Add your settings, and enjoy!

Upgrading From Previous Versions

PDF Press V5 now requires a themes folder. If you are upgrading, ensure you follow step 2 in the installation instructions.

USAGE

PDF Press has two tags, each will generate a PDF from an ExpressionEngine template.

save_to_pdf: Generate PDF

{exp:pdf_press:save_to_pdf}

The save_to_pdf tag generates a link to download the template as a PDF, it contains the following parameters:

  • path: Accepts an ExpressionEngine template path in the form template_group/template (ex. site/pdf), if no path is given then the current page will be used.

  • filename: Sets the filename for the downloaded PDF. Default: filename.pdf

  • size: sets the paper size for the PDF (ex. letter, legal, a5, etc). Paper sizes are listed below.

  • orientation: sets the orientation of the page, either portrait (default) or landscape. Default: portrait.

  • attachment: Automatically downloads the generated PDF. If the attachment parameter is set to 0 the PDF will be opened in the browser. Default: 1

  • key: Optional setting preset shortcode. See Settings Presets for more information.

  • default_font: Default font family to use in your PDF. This must match your font name inside of your add-on settings.

Example:

<a href="{exp:pdf_press:save_to_pdf path='site/projects' attachment='0' filename='projects.pdf'}">Download Project Case Studies</a>

This will create a link to open a PDF titled "projects.pdf" in the browser using the site/projects template

parse_pdf: Parse Inline Template to PDF

{exp:pdf_press:parse_pdf}

Sometimes you'll want to create a PDF with a member only or logged in page. For this you want to use parse_pdf:

{exp:pdf_press:parse_pdf}
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>Parse Test</title>
    </head>
    <body>
        {if logged_in}
            {exp:channel:entries channel="Projects"}
                <p><strong>{title}</strong></p>
            {/exp:channel:entries}
        {if:else}
            <p>Not logged in</p>
        {/if}
    </body>
    </html>
{/exp:pdf_press:parse_pdf}

As you can guess, this tag, instead of creating a link to download/open a PDF, will create a PDF using whatever HTML & EE tags that are inside the parse_pdf tag-pair. It has all of the same parameters as save_to_pdf (except for path)

Note: Remember to put the parse_pdf tag before and after the HTML tag (and DOCTYPE) otherwise PDF Press won't render your complete page)

SETTINGS

Presets are a great way to save time, they allow you to set all of the options passed as parameters in the save_to_pdf & parse_pdf tags in the Control Panel. You can then re-use those settings in your template by just passing the short code into the "key" parameter.

{exp:save_to_pdf key="product_settings"}

Presets also let you securely set a variety of security settings for your PDFs. You can enable encryption, set a owner password, user password and then control if users can save, print, or modify PDFs.

You can access the Setting Presets by going to Add-Ons > Modules > PDF Press > Setting Presets

FONT SUPPORT

Custom fonts are supported inside of PDF press. Fonts must be of the TrueType format (ttf), and must be placed in themes/user/pdf_press/fonts.

Adding a Font

Add the font in your settings. Include a name for that font that will refer to your font when you use it in your CSS. Please note, this name should be lowercase and include only dashes (no spaces or punctuation); the settings manager will do this for you if you forget.

Include the names of a regular, bold, and italic font TTF file that is included in your themes/users/pdf_press/fonts folder.

Using a Font

Fonts are applied to your text in a few different ways:

CSS

All CSS in PDF Press is inlined as its read, so you can apply a font as you would on HTML. Ensure the font-family on your element is applied with the same name that appears in the fonts settings.

Default Font

If you are applying the font across the entirety of your document, you can use the default_font parameter as indicated above. Ensure the font-family on your element is applied with the same name that appears in the fonts settings.

PARAMETERS

PDF Press uses mPDF as it's engine, and accepts all parameters. See [https://mpdf.github.io/reference/mpdf-variables/overview.html](the mPDF documentation) for more info. All additional mpdf parameters can be added to your EE tag as such:

Pagination

Page Numbering

Fonts, Languages and Character sets

Configuration

Debugging

PDF/A1-b, PDF/X-1a Colorspaces

Annotations

Bookmarks (Outlines)

CSS & Styles

Page Headers & Footers

Tables

Images

Text Spacing & Justification

Hyphenation

Columns

Lists

Watermarks

Bookmarks

SUPPORT

For any issues, please reach out to mailto:[email protected]

Add-on, ExpressionEngine, Email

Mail After Edit

This EE3/4/5/6/7 addon sends an email to an individual or member group after a channel entry is created or updated.

Buy Now

PURPOSE

This EE3/4/5/6 addon sends an email to an individual or member group after a channel entry is created or updated.

REQUIREMENTS

This add-on requires ExpressionEngine 6 and PHP 7.1.

An older version of Mail After Edit is included that will work with EE3-6 and will work with PHP5.6. This version will not receive any updates and is included as-is, with no warranty.

INSTALLATION

  1. Copy mail_after_edit folder to your system/user/addons folder.
  2. On your EE backend, navigate to Developer > Addons (yoursite.com/admin.php?/cp/addons).
  3. Scroll to Third Party Add-Ons.
  4. Find Mail After Edit and click Install.
  5. Add your settings, and enjoy!

NOTE: To get the most use out of Mail After Edit, turn on Entry Revisions for any channel you are looking to use MAE on.

UPGRADING

If you are upgrading from version 1, the most important thing is to leave your config.php in the addon directory. We have moved from using a file to database-driven settings, in order to make upgrading and changes simpler.

After upgrading the addon files, move your config.php file back in to the mail\_after\_edit. When you click Upgrade to 2.0, your config settings will automatically be added to the addon, and you can safely delete the file from there.

If you are upgrading to MAE v3, everything will be moved into the new channel settings set up.

SETTINGS

EMAIL

Mail After Edit utilizes EE's native emailing by default. If you are updating and were using MAE v1's Mailgun set up, you can simply move your Mailgun info into EE's email settings (/admin.php?/cp/settings/email or Settings > Outgoing Email).

MESSAGE_INFO

This Contains some basic your message information

  • Start: The starting line of the email message. Defaults to An entry has been updated! See below for information.

  • End: The ending line of the email message. Defaults to Sent by Mail After Edit.

  • Domain: The full domain name that you are using, without a trailing slash. Defaults to http://example.com, so definitely change this.

  • From: This is the email your email notifications will come from. This is applied to all channels unless you override in that particular channel's config. Defaults to [email protected], so definitely change this.

  • Force BCC: This will force all emails to be sent as BCCed emails, instead of exposing emails in the To line of the email.

  • Send Individually: This will force all emails to be sent as individually. Though this does provide somme extra control, it also sends a number more emails. Use sparingly.

CHANNEL_CONFIG

This contains your channel information.

  • Channel ID: The ID of the channel you would like to set MAE up (you can )

  • Type: This can be set to email or member_group. Email is for individual email addresses that will be notified for a channel. Member Group will notify everyone who is a member of the assigned group.

  • Email: If the type is set to email, this is the email addresses you will send notifications to. Email addresses should be separated by pipes (|), i.e. [email protected]|[email protected]|[email protected]

  • Mail On: Choose the type of update to run. Can be create or edit or both. If set to create, this will send an email when an entry is created in a channel. If set to edit, it will send when an entry is updated.

  • Groups: If the type is set to member_group, this is the groups that will receive notifications re: this channel.

  • From: This is the email your email notifications will come from. This will override the MESSAGE_INFO setting

SKIP_FIELDS

These fields will be skipped in emails, as they are not used that much and will email you way too much. Defaults to entry_date and submit. Add whatever fields you like by their field name (not field label). Fields should be separated by pipes (|), i.e. entry_date|submit|super_secret_field_that_shouldnt_be_emailed|password

LOGGING

By default, Mail After Edit will add data to your Developer logs, so you can track your emails. If, for whatever reason, it is unable to access the developer logging, MAE will create a small file in your MAE directory. You can access this file via the MAE settingsdashboard.

TROUBLESHOOTING

  1. Check your EE Mail settings and send a test email.
  2. Check the developer logs/MAE logs. Check to see if any EE mailer errors had occurred in there.
  3. Contact support for any additional assistance.

USE

Set it and forget it! Once you have all the information in your settings, it will automatically send the email anytime an entry in that particular channel is created or updated.

SUPPORT

We want to make sure you have what you need on this. Email [email protected] for help.

ATTRIBUTIONS

ICON: The Mail After Edit icon is too awesome to be my own work. Icons made by surang from https://www.flaticon.com/