Jump to content

Release: Blick - Helpers for your front end

Recommended Posts

Get it from GitHub


Just put the module in you modules directory and install it via admin.


This module might come in handy if you like to keep your templates clean and free of unreadable and unmaintainable string concatenations and even free of any logic. It also comes with some handy features besides just embedding JS, CSS and image assets, see below.


<link href="<?php echo $config->urls->templates . 'styles/foo.css'; ?>">
<link href="<?php echo $config->urls->templates . 'styles/bar.css'; ?>">
<script src="<?php echo $config->urls->templates . 'scripts/foo.js'; ?>"></script>
<script src="<?php echo $config->urls->templates . 'scripts/bar.js'; ?>"></script>
<img src="<?php echo $config->urls->templates . 'images/sky-scraper.jpg'; ?>" alt="Some huge building">
<img src="<?php echo $config->urls->templates . 'images/owzim.jpg'; ?>" alt="Handsome!">

Way cleaner

<?php echo $asset->css('foo'); ?>
<?php echo $asset->js('foo'); ?>
<?php echo $asset->img('sky-scraper.jpg', 'Some huge building'); ?>

or with short syntax

<?= $asset->css('bar') ?>
<?= $asset->js('bar') ?>
<?= $asset->img('owzim.jpg', 'Handsome!') ?>

And prettier if you're using Twig

{{ asset.css('foo') }}
{{ asset.css('bar') }}
{{ asset.js('foo') }}
{{ asset.js('bar') }}
{{ asset.img('sky-scraper.jpg', 'Some huge building') }}
{{ asset.img('owzim.jpg', 'Handsome!') }}


JS example

Let's use the js method an its configuration as an example, and assume we have the following files located in /site/templates/scripts

- index.js
- index.min.js
- main.js
$config->blick = array(
    'jsPath'             => $config->paths->templates . 'scripts',
    'jsUrl'              => $config->urls->templates . 'scripts',
    'jsMarkup'           => '<script src="{url}"></script>',
    'jsDefault'          => 'markup',
    'jsVersioning'       => true,
    'jsVersioningFormat' => '?v={version}',
    'jsMin'              => true,
    'jsMinFormat'        => "{file}.min.{ext}",
$asset = $modules->get('Blick');

// returns /site/templates/scripts/index.min.js?v=1426170460935
// 'min' and version parameter added, which was fetched from the file modified date

// returns /site/templates/scripts/main.js?v=1426170460935
// without 'min', because there is no main.min.js

// returns <script src="/site/templates/scripts/main.js"></script>
// because 'jsDefault' is set to 'markup'
// you can also access it explicitly via $asset->js('main')->markup

// returns <script src="http://code.jquery.com/jquery-2.1.3.js"></script>
// nothing is modified here, because it's a remote url
  • You can use the file name with or without extension.
  • Adding a version parameter only takes place, if jsVersioning is set to true, it's a local file and it exists.
  • Modifying the file name to include min only takes place, if jsMin is set to true, it's a local file and it exists.

The same applies for the $asset->css('file') method:

$config->blick = array(
    'cssPath' => $config->paths->templates . 'styles',
    'cssUrl'  => $config->urls->templates . 'styles',
    // and so on ...

IMG example

the img method lets you include images, crop and resize them, without them having to be a page image.

$config->blick = array(
    'imgPath'             => $config->paths->templates . 'images',
    'imgUrl'              => $config->urls->templates . 'images',
    'imgMarkup'           => '<img {attrs} src="{url}" alt="{0}">',
    'imgDefault'          => 'markup',
    'imgVariationSubDir'  => 'variations',
$asset = $modules->get('Blick');

// returns /site/templates/images/sky-scraper.jpg

$asset->img('sky-scraper.jpg', 'Some huge building');
// returns <img src="/site/templates/images/sky-scraper.jpg" alt="Some huge building">
// any arguments following the filename are passed as an array
// in this case the alt value is the 0th argument, so {0} get's replaced
// you can set as many arguments as you want in 'imgMarkup'

$asset->img('sky-scraper.jpg')->size(100, 100)->url;
// returns /site/templates/images/variations/sky-scraper.100x100.jpg
// the resized image is put into a subdir 'variations' as configured in 'imgVariationSubDir'
// if 'imgVariationSubDir' is left empty, the variation will be put in the same directory

$asset->img('sky-scraper.jpg', 'Some huge building')->attr('title', 'Some huge building');
// returns <img title="Some huge building" src="/site/templates/images/sky-scraper.jpg" alt="Some huge building">
// the resized image is put into a subdir 'variations' as configured in 'imgVariationSubDir'
// if 'imgVariationSubDir' is left empty, the variation will be put in the same directory

You can also setup predefined variation settings in imgVariations

$config->blick = array(
    'imgVariations'  => array(
        'header' => array(
             'width' => 960,
             'height' => 360,
             'options' => array(
                 'suffix' => 'header',
        'person' => array(
             // and so on ...

And call it like so:

// returns /site/templates/images/variations/sky-scraper.960x360-header.jpg

$asset->img('sky-scraper.jpg')->variant('header', 50)->url;
// returns /site/templates/images/variations/sky-scraper.480x180-header.jpg

Attributes example

Since version 0.4.0 you don't need to create arbitrary variable placeholders, if you want to use attributes only. Now you can use the {attrs} placeholder and set the attributes via $asset->attr('name', 'value'). The name argument can also be multiple names, split by a pipe |.

$config->blick = array(
    // ...
    'imgMarkup' => '<img {attrs} src="{url}">',
    // ...

$asset->img('sky-scraper.jpg')->attr('alt|title', 'Some huge building');
// returns <img alt="Some huge building" title="Some huge building" src="/site/templates/images/sky-scraper.jpg" >

Using files that are not in the configured directory

If you want to include files, that are neither in the configured directory nor in one of its sub directores, just use an absolute path (actually, relative to your /site directory.

$asset->js($config->urls->SomeModule . 'scripts/file-in-root');

Autoload the module

If you don't want to include the module manually via

$assets = $modules->get('Blick');

you can set it to be autoloaded under a custom name:

$config->blick['autoloadAs'] = 'fiddle';

Now it becomes automatically available in your templates under the name fiddle

$fiddle->img('baz.png', 'qux');

Please note, that, if you're using the TemplateTwigReplace.module you will have to add your chosen autoload name to the Auto-import fuel list on the module's config page.

See config-example.php for all configurable settings.

Change Log

  • 0.5.0 add optional scale argument to variant-method: $asset->img('foo.jpg')->variant('header', 50)
  • 0.4.0 add possibility to get/set and render attributes (see section Attributes example)
  • 0.3.0 add $asset->variant('name') alias for $asset->getVariation('name')
  • 0.2.0 fixes and internal refactorings
  • 0.1.0 initial version
Edited by owzim
  • Like 28

Share this post

Link to post
Share on other sites

Wow, brilliant idea, that definitely makes the templates cleaner!

Share this post

Link to post
Share on other sites

Just picked up that you need to specify the variable you're using in the TemplateTwigReplace configuration (Auto-import fuel), otherwise this won't work.

Share this post

Link to post
Share on other sites

Sweet! I have a super limited version of something like this locally, but just for paths to css/js/images. 

This module offers a lot of additional power! Love it!

Thanks owzim!

  • Like 1

Share this post

Link to post
Share on other sites

@Mike Anthony I assume that people who use TemplateTwigReplace are already aware of that, but I probably should add that to the readme. Thanks.

@renobird the version 2 days before the release was super simple too, I used it for months as it was. but then I thought: "If you're gonna release it, you should pimp it up a notch!" :)

  • Like 2

Share this post

Link to post
Share on other sites

I pushed some updates, see the change log in the original post.

Share this post

Link to post
Share on other sites

When will appendNewLine be implemented? I'm assuming this will simply add a new line after the markup?

I've just used this little patch in the meantime:

 * asset
 * @param  string  $name
 * @param  string  $type
 * @param  array   $args
 * @return ozwim\Blick\Asset|ozwim\Blick\Image
 * @see js
 * @see css
 * @see img
public function asset($name, $type, $args)
    $result = AssetFactory::get($name, $type, $this->conf, $args);
    if ($this->conf->appendNewLine)
        return "$result\n";
    return $result;

Share this post

Link to post
Share on other sites

@Mike Anthony,

thanks for pointing that out. It was implemented but got lost in refactoring. I fixed that in the latest commit. You now can set it on the asset type level:

'jsAppendNewLine'  => true,
'cssAppendNewLine' => true,
'imgAppendNewLine' => true,
  • Like 2

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Macrura
      PrevNextTabs Module
      Github: https://github.com/outflux3/PrevNextTabs
      Processwire helper modules for adding page navigation within the editor.
      This is a very simple module that adds Previous and Next links inline with the tabs on the page editor. Hovering over the tab shows the title of the previous or next page (using the admin's built in jqueryUI tooltips.)
      This module is typically used during development where you or your editors need to traverse through pages for the purpose of proofing, flagging and/or commenting. Rather than returning to the page tree or lister, they can navigate with these links.
      If you are using PW version 2.6.1 or later, the system will prevent you from leaving the page if you have unsaved edits.
      For earlier versions, to avoid accidentally losing changes made to a page that might occur if a user accidentally clicks on one of these, make sure to have the Form Save Reminder module installed.
    • By Gadgetto
      SnipWire - Snipcart integration for ProcessWire
      Snipcart is a powerful 3rd party, developer-first HTML/JavaScript shopping cart platform. SnipWire is the missing link between Snipcart and the content management framework ProcessWire.
      With SnipWire, you can quickly turn any ProcessWire site into a Snipcart online shop. The SnipWire plugin helps you to get your store up and running in no time. Detailed knowledge of the Snipcart system is not required.
      SnipWire is free and open source licensed under Mozilla Public License 2.0! A lot of work and effort has gone into development. It would be nice if you could donate an amount to support further development:

      Status update links (inside this thread) for SnipWire development
      2020-03-21 -- SnipWire 0.8.5 (beta) released! Improves SnipWires webhooks interface and provides some other fixes and additions 2020-03-03 -- SnipWire 0.8.4 (beta) released! Improves compatibility for Windows based Systems. 2020-03-01 -- SnipWire 0.8.3 (beta) released! The installation and uninstallation process has been heavily revised. 2020-02-08 -- SnipWire 0.8.2 (beta) released! Added a feature to change the cart and catalogue currency by GET, POST or SESSION param 2020-02-03 -- SnipWire 0.8.1 (beta) released! All custom classes moved into their own namespaces. 2020-02-01 -- SnipWire is now available via ProcessWire's module directory! 2020-01-30 -- SnipWire 0.8.0 (beta) first public release! (module just submitted to the PW modules directory) 2020-01-28 -- added Custom Order Fields feature (first SnipWire release version is near!) 2020-01-21 -- Snipcart v3 - when will the new cart system be implemented? 2020-01-19 -- integrated taxes provider finished (+ very flexible shipping taxes handling) 2020-01-14 -- new date range picker, discount editor, order notifiactions, order statuses, and more ... 2019-11-15 -- orders filter, order details, download + resend invoices, refunds 2019-10-18 -- list filters, REST API improvements, new docs platform, and more ... 2019-08-08 -- dashboard interface, currency selector, managing Orders, Customers and Products, Added a WireTabs, refinded caching behavior 2019-06-15 -- taxes provider, shop templates update, multiCURL implementation, and more ... 2019-06-02 -- FieldtypeSnipWireTaxSelector 2019-05-25 -- SnipWire will be free and open source Plugin Key Features
      Fast and simple store setup Full integration of the Snipcart dashboard into the ProcessWire backend (no need to leave the ProcessWire admin area) Browse and manage orders, customers, discounts, abandoned carts, and more Multi currency support Custom order and cart fields Process refunds and send customer notifications from within the ProcessWire backend Process Abandoned Carts + sending messages to customers from within the ProcessWire backend Complete Snipcart webhooks integration (all events are hookable via ProcessWire hooks) Integrated taxes provider (which is more flexible then Snipcart own provider) Useful Links
      SnipWire in PW modules directory SnipWire Docs (please note that the documentation is a work in progress) SnipWire @GitHub (feature requests and suggestions for improvement are welcome - I also accept pull requests) Snipcart Website  
      ---- INITIAL POST FROM 2019-05-25 ----
    • By horst
      Croppable Image 3
      for PW 3.0.20+
      Module Version 1.2.0
      Sponsored by http://dreikon.de/, many thanks Timo & Niko!
      You can get it in the modules directory!
      Please refer to the readme on github for instructions.
      - + - + - + - + - + - + - + - + - + - NEWS - 2020/03/19 - + - + - + - + - + - + - + - + - + - 
      There is a new Version in the pipe, that supports WebP too: 
      - + - + - + - + - + - + - + - + - + - NEWS - 2020/03/19 - + - + - + - + - + - + - + - + - + - 
      Updating from prior versions:
      Updating from Croppable Image 3 with versions prior to 1.1.7, please do this as a one time step:
      In the PW Admin, go to side -> modules -> new, use "install via ClassName" and use CroppableImage3 for the Module Class Name. This will update your existing CroppableImage3 module sub directory, even if it is called a new install. After that, the module will be recogniced by the PW updater module, what makes it a lot easier on further updates.
      For updating from the legacy Thumbnail / CropImage to CroppableImage3 read on here.
    • By Robin S
      Inspired by a recent question.
      Image Crop Ratios
      Allows preset aspect ratios to be defined per image field for the ProcessWire image crop tool.
      The module adds a select dropdown to the crop tool. Choose an aspect ratio and the crop area will be fixed to that ratio.

      Install the Image Crop Ratios module.
      Default aspect ratios for all image fields can be defined in the module config. Aspect ratios for specific image fields can be defined on the Input tab of the field settings. You can override the ratio settings in template context if needed. Insert a hyphen as the first item in the ratio settings unless you want to force a ratio to be applied to the crop tool. The hyphen represents a blank option that allows a free crop area to be drawn. Usage
      Click the "Crop" link on the details view of an image thumbnail. Click the "Crop" icon at the top of the editor window. Choose an option from the "Ratio" select dropdown.  
  • Create New...