Extensions differ from Packages in that they are restricted to their namespaced directories, are upgradeable, and must follow a set of guidelines. If you're developing a simple set of modules, templates, or field types to be easily imported into your own projects (but won't be updated), Packages are most likely a better option.


In all the examples below, {id} refers to the ID of your extension (for example, com.fastspot.news would be an ID indicating a News extension programmed by Fastspot).

  • All files for an extension must live in either /extensions/{id}/ or /site/extensions/{id}/
  • Feeds will have their URL changed from /feeds/route/ to /feeds/{id}/route/
  • Settings will have their ID changed internally to {id}*{setting}. Your extension can still get/set them via their regular ID but they will need to be called by their new ID if used outside your extension. Read More
  • Field Types will have their files moved into a different directory format. You will see your included field types laid out in this manner with 3 files per field type:
  • When including CSS or JavaScript in the admin area, extensions must use the $bigtree["css"] and $bigtree["js"] arrays to include the files. Treat the /extensions/{id}/css/ and /extensions/{id}/js/ folders as your roots, respectively. For example:
    $bigtree["js"][] = "news.js";
    $bigtree["css"][] = "news.css";
  • When including CSS or JavaScript from a front end template, code should be stored in /site/extensions/{id}/css/ and /site/extensions/{id}/js/. You should include this manually in link/script tags as there is no direct knowledge of the end user's markup. For example:
    <script src="<?=WWW_ROOT?>extensions/com.fastspot.news/js/news.js"></script>
    <link rel="stylesheet" type="text/css" media="screen"
          href="<?=WWW_ROOT?>extensions/com.fastspot.news/css/news.css" />			
  • When calling AJAX requests from your front end templates or admin side modules you must append /*/{id}/ before the AJAX path. Examples:
    $.ajax("<?=WWW_ROOT?>*/com.fastspot.news/ajax/get-more-news/"); // Front End Templates
    $.ajax("<?=ADMIN_ROOT?>*/com.fastspot.news/ajax/load-news-page/"); // Back End Modules			
  • To use a Layout included in an extension in a Template you must set $bigtree["extension_layout"] = "{id}" in addition to $bigtree["layout"] = "layout_file". For example:
    $bigtree["extension_layout"] = "com.fastspot.news";
    $bigtree["layout"] = "news-layout";				
  • You can not rely on including anything in /custom/inc/required/. Additional files must be manually loaded from your /extensions/{id}/ folder — only module class files will be added to PHP's autoloader.
  • Files stored in /extensions/{id}/public/ will be moved to /site/extensions/{id}/ when an extension is installed / updated. The /public/ directory is used to keep everything under a single /extensions/{id}/ directory for version control. When packaging an extension, files stored in /site/extensions/{id}/ will automatically be copied into /extensions/{id}/public/.

Extension Creation Behavior

  • After creating an extension with BigTree components (modules, templates, field types, etc) they will be automatically moved into your extension directory.
  • Your /site/extensions/{id}/ and /extensions/{id}/ folders will be automatically included when creating your extension.
  • Your included components (modules, templates, field types, callouts) will be automatically moved to your /extensions/{id}/ directory on extension creation. After initial creation they should be maintained there.
  • You will be given the opportunity to include additional files required by your callouts/templates from your /templates/ajax/ and /templates/layouts/ folders during the extension creation process. These files will be moved into your /extensions/{id}/ directory upon creation.
  • Files located in /site/extensions/{id}/ will be copied into /extensions/{id}/public/, overwriting any existing copies located in /extensions/{id}/public/.

Required Files

BigTree 4.3 introduces support for extensions to include their own required files (for use in module-less extensions that only add plugins, for instance). These behave exactly the same as files included in /custom/inc/required/ with the exception that the file list is cached when $bigtree["debug"] is set to false. The most common use case for this is going to be extensions that add a cron plugin but do not have a module class (as cron plugins require a function call to be defined somewhere without the ability to pre-load a class file).

To include files at run-time automatically, place any needed files in /extensions/{id}/required/, where {id} is the ID of your extension.