Jump to content
David Karich

Module: AIOM+ (All In One Minify) for CSS, LESS, JS and HTML

Recommended Posts

                   I have used AIOM on all website which have been developed by us on processwire. Recently one of our site started to throw error and it was working fine tilll few days ago.Error is

                  " Error:     Exception: The combined js file can not be written. Check if the script has sufficient permissions ".

                   We tried allowing the module  permission with 777 and also changed the permission in the config file and have failed.AIOM is able to create file but is not able to write anything in that file.

                   We are using AIOM version 3.2.1 on Processwire 2.5.3.

                  

Thanks

Had a strange and horrific experience on Thursday when a site i was working on suddenly could no longer create the new cache files...;

i made a change to 1 line of a CSS file on the live site, and then that's when things went sideways.

The CSS minify script started to fail and causing PHP timeouts, and then this took the whole site down, every page, and the admin. 

this is the error:

2015-05-09 18:49:28    guest    **site-name**    Error:     Maximum execution time of 60 seconds exceeded (line 87 of /home/public_html/site/modules/AllInOneMinify/lib/cssmin.php)

How I fixed it (for the moment):

1.) uninstall AIOM+

2.) Replace with new copy

3.) Re-install it, and set on dev mode, no HTML minify.

this thankfully fixed the issue, but all in all the site was down for quite a while during this, and it made me realize that this part of the chain in my websites is a weak link, especially if it can fail, in that the site cannot run without the css and js files.

Typically I would always have $minifyCSS and $minifyJS vars in my _init.php which in this case i could have simply set to false and then no problem, i could have gone and fixed the AIOM+ issue while the site ran.

But for this site I hadn't set that up yet and also I am using conditional loading and hadn't worked out the script to load the individual assets if one of those vars is false.

After looking a bit at the module, i came up with this solution for disabling AIOM+ based on a boolean var in your init:

if($minifyJS == true) {
	echo '<script type="text/javascript" src="' . AIOM::JS($jsfiles) . '"></script>';
} else { 	
	listAssets($jsfiles);
} // END IF

this is the function (may not be 100% perfect, still testing, but works ok so far):

// use this to echo the assets in the AOIM+ array
function listAssets($asset_files) {

	$templates		= wire('config')->urls->templates;
        $current_page   = wire('page');
	// testing
	//$current_page	= wire('pages')->get(1023);
	
        foreach ($asset_files as $asset_file) {

            if ( is_array($asset_file) AND isset($asset_file['loadOn']) AND isset($asset_file['files']) ) {

				$selector = $asset_file['loadOn'];
				if(!$current_page->is($selector)) continue;

                if(is_array($asset_file['files'])) {
                    
                    foreach ($asset_file['files'] as $_asset_file) {
                            echo "<script src='{$templates}{$_asset_file}'></script>\n";
                        }

                    } else {
                        echo "<script src='{$templates}{$asset_file}'></script>\n";
                    }

            } else {
                echo "<script src='{$templates}{$asset_file}'></script>\n";
            }
        }

}

In summary, i think that maybe there should be an emergency shut off in AIOM+, because without the method described above, how would you keep a site online say if AIOM+ was just totally failing?

  • Like 2

Share this post


Link to post
Share on other sites
In summary, i think that maybe there should be an emergency shut off in AIOM+, because without the method described above, how would you keep a site online say if AIOM+ was just totally failing?

Yes, I have also experienced a few weeks back exactly the same as you describe here, and resolved it essentially the same way. As with you I had unwanted downtime while I sorted the issue. As a result I've also implemented a system similar to yours, which makes me think others are probably doing the same also. If this is something that is being repeated on multiple sites then ideally it should become part of the AIOM module.

Share this post


Link to post
Share on other sites

yes, it seems undeniable that AIOM+, which is otherwise a godsend plugin, has the possible side effect of tanking an entire website, front and backend, without warning. The cause is probably some change in the permissions, or who knows what; in my case the css minify was timing out in php, but had worked fine for a year before that.

The module would seem to leave no recourse in the event that it fails and the developer has not taken steps as described above and in use by @muzzer and myself to provide an alternate way of outputting the assets.

I think the module should come with instructions and warnings about these possible consequences, and that function i posted or one that does the same thing, should be part of the module so that if the user sets emergency shut off, it just lists the files in the arrays that have been passed into the class as single assets...

it would also make sense for there to be a simple api for the module in the event that a site has tanked, to enable emergency shutoff; the api could also possibly allow for cache clearing, enable/disable dev mode and enable/disable html minify (this could also allow one to minify html or not on a per template basis, per horst's request..)

  • Like 3

Share this post


Link to post
Share on other sites

I think I fixed the Maximum Execution Time Error by fixing an unclosed comment tag within a CSS file.

At least on my local machine it's working, should work live, too but haven't tested it yet..

And I ran into an issue with JS minification "Error JSMin: unterminated byte.."

Fixed it by renaming already minified files to NAME.min.js, seems to work for now :)

Why isn't AIOM clearing cached files when creating new once, like replacing them. I had quite a long expiration time and had sometimes over 80 cached files in cache..?

Maybe my fault^^

  • Like 1

Share this post


Link to post
Share on other sites

I really like the domain sharding option of AIOM. I even grab this setting in my templates to deliver all images from a cookiless domain (usually in combination with minimize.pw). It looks something like this:

// cache cookieless domain for static content as set in AllInOneMinify configuration
$my_static_domain_setting_source = wire('modules')->getModuleConfigData('AllInOneMinify');
$my_static_domain = $my_static_domain_setting_source['domain_sharding'];

// use static domain in the template like this
echo '<img src="' . $my_static_domain . $page->image->minimize()->url . '" />';

While this works, it’s a bit laborious.

Wouldn’t it be a good idea to add an additional checkbox in the module’s settings to set an option “deliver all images from cookiless domain”?

Hooking into the page rendering process and replacing every relative image source (= not starting with "http") or image source starting with “http://” and the site’s default domain as set in config.php should do the trick – if I’m not too naive.

  • Like 1

Share this post


Link to post
Share on other sites

Hi there,

I've just copied a new site from development to a server and when I tried to run from the server, there was no styling or javascript. After doing some digging about, I noticed that the AllInOneMinify .css and .js files were both empty (zero file length).

All is fine on the local machine. Any idea what might be causing this?

The module seems to be running OK because if you delete the files, it recreates them when you try and load the site. It's just that they are empty?

Any suggestions much appreciated! :)

Many thanks.

Edited by LostKobrakai
Moved to AIOM support topic

Share this post


Link to post
Share on other sites

Hy there,

Great Module! I use "AIOM" in conjunction with "Template Engine Factory". The HTML minify function ist not working, if i have both modules installed. Maybe it it because the minify process is hooked to Page::render and not to Templatefile::render?

Share this post


Link to post
Share on other sites

Fantastic module. Huge shame that it removes the space between tags at the moment.

<p><strong>Text</strong> <em>(text)</em></p>

The above would then be right next to each other. Will check out the parser code when I get a mo.

Share this post


Link to post
Share on other sites

Thank you for this module!

I have a string "../modules/FieldtypeLeafletMapMarker/assets/leaflet/leaflet.css" in my styles array.

But AIOM cannot read it. I get

Warning: file_get_contents(): Filename cannot be empty

But it should be the correct relative path to leaflet.css seen from site/templates/_main.php.

I don't understand why it is not working. Passing in "css/styles.css" is working fine.

I read Soma's post and agree that it should be possible to pass in files from outside /templates. I already tried his proposed fix in conjunction with passing in "/site/modules/FieldtypeLeafletMapMarker/assets/leaflet/leaflet.css" but that didn't work either for me.

Share this post


Link to post
Share on other sites

I guess you enabled "directory traversal" in AIOMs module settings?

  • Like 1

Share this post


Link to post
Share on other sites

I guess you enabled "directory traversal" in AIOMs module settings?

Thank you for the hint. I had not enabled that option. After enabling it, all is fine now. Should have looked at the module settings more carefully  :blush:

  • Like 1

Share this post


Link to post
Share on other sites

Hi Tom.,

Could you specify what kind of security issue there is?

Share this post


Link to post
Share on other sites

Hi Tom.,

Could you specify what kind of security issue there is?

Here is the security issue - https://github.com/conclurer/ProcessWire-AIOM-All-In-One-Minify/issues/44

@Tom...404 returned at the link you've provided

How strange, I get a 404 when clicking the link, however if I focus the URL bar and press enter it works. Here is a link to the pull request - https://github.com/conclurer/ProcessWire-AIOM-All-In-One-Minify/pull/53

  • Like 1

Share this post


Link to post
Share on other sites

I couldn't get the AIOM Module running and received error warnings. Now I came across the warning on the Modules page about not using it until the problems are solved.

So I tried to uninstall the module, but with no success. I got this error:

The cache folder (/home/httpd/vhosts/…/dev/site/assets/aiom/) and files could not be removed.

So I cannot uninstall the module.

Is there a way to uninstall it manually?

Share this post


Link to post
Share on other sites

File could not be removed or module could not be removed? If file, then just delete it manually. If module, then you can remove it via phpMyAdmin or similar. Find the table called 'modules' in your ProcessWire database, then find the row with this module's class name, i.e .AllInOneMinify  (check in the column class) and delete that row. You might want to first backup your db just in case :-)

Edited by kongondo
  • Like 2

Share this post


Link to post
Share on other sites

The module could not be removed.

So I deleted the row in the "modules" table, and also the files from the "site->modules" folder and the "aiom" folder from "site->assets".

No I get this error, when I call the frontend:

The server encountered an internal error or misconfiguration and was unable to complete your request.

Error has been logged.

But there is nothing in the pw log, nor in the servers log.

I can login in the backend. When logged in, I can view the site.

Edit:

I just became aware that it could have been because of the site cache. I now safed the home page again and now the frontend works again.

  • Like 2

Share this post


Link to post
Share on other sites
Hi guys,

I have just released an update to version 3.2.2 on Github. It fixes the security issue with the CHMOD, the problem with many files and has a better detection of changes to files.

Sorry that it took so long. But we currently have a lot to do. The module will continue maintained. AIOM4 is on the to-do list.

Best regards,

David

  • Like 5

Share this post


Link to post
Share on other sites

Line 713 typo: $_timespamp

    private static function _getCacheName($files, $prefix = 'css_', $ext = '.css') {
        
        // ------------------------------------------------------------------------
        // Initialize timestamp variable.
        // ------------------------------------------------------------------------
        $_timestamp = '';

        // ------------------------------------------------------------------------
        // Calculate timestamp of all files
        // ------------------------------------------------------------------------
        foreach ($files as $file) {
            $_timestamp = ($_timespamp + $file['last_modified']);
        }

        // ------------------------------------------------------------------------
        // Create a unique MD5 file name with the specified prefix.
        // ------------------------------------------------------------------------
        return (self::$developmentMode !== true) ? $prefix.md5($_timestamp).$ext : $prefix.md5($_timestamp).'_dev'.$ext;
    }

  • Like 4

Share this post


Link to post
Share on other sites

Line 713 typo: $_timespamp

    private static function _getCacheName($files, $prefix = 'css_', $ext = '.css') {
        
        // ------------------------------------------------------------------------
        // Initialize timestamp variable.
        // ------------------------------------------------------------------------
        $_timestamp = '';

        // ------------------------------------------------------------------------
        // Calculate timestamp of all files
        // ------------------------------------------------------------------------
        foreach ($files as $file) {
            $_timestamp = ($_timespamp + $file['last_modified']);
        }

        // ------------------------------------------------------------------------
        // Create a unique MD5 file name with the specified prefix.
        // ------------------------------------------------------------------------
        return (self::$developmentMode !== true) ? $prefix.md5($_timestamp).$ext : $prefix.md5($_timestamp).'_dev'.$ext;
    }

Thanks Steve, I've fixed the problem in version 3.2.3. It was late at night. :-[ The update is available on Github.

  • Like 1

Share this post


Link to post
Share on other sites

After updating to 3.2.3 I get the an error 500 and cannot login to backend. Debugging shows the following error message:

Cannot redeclare class AIOM (line 1021 of /home/.sites/......../web/site/modules/AllInOneMinify/AllInOneMinify.module)

This is the code on line 1021:

class AIOM extends AllInOneMinify {}

???

Edit: Solved! I had 2 instances of AIOM with different file names so the class was 2 times declared. Now it works!!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • 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-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 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 (alpha version only available via GitHub) 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 d'Hinnisdaël
      Happy new year, everybody 🥬
      I've been sitting on this Dashboard module I made for a client and finally came around to cleaning it up and releasing it to the wider public. This is how it looks.
      ProcessWire Dashboard

      If anyone is interested in trying this out, please go ahead! I'd love to get some feedback on it. If this proves useful and survives some real-world testing, I'll add this to the module directory.
      Download
      You can find the latest release on Github.
      Documentation
      Check out the documentation to get started. This is where you'll find information about included panel types and configuration options.
      Custom Panels
      My goal was to make it really simple to create custom panels. The easiest way to do that is to use the panel type template and have it render a file in your templates folder. This might be enough for 80% of all use cases. For anything more complex (FormBuilder submissions? Comments? Live chat?), you can add new panel types by creating modules that extend the DashboardPanel base class. Check out the documentation on custom panels or take a look at the HelloWorld panel to get started. I'm happy to merge any user-created modules into the main repo if they might be useful to more than a few people.
       Disclaimer
      This is a pre-release version. Please treat it as such — don't install it on production sites. Just making sure 🍇
      Roadmap
      These are the things I'm looking to implement myself at some point. The wishlist is a lot longer, but those are the 80/20 items that I probably won't regret spending time on.
      Improve documentation & add examples ⚙️ Panel types Google Analytics ⚙️ Add new page  🔥 Drafts 🔥 At a glance / Page counter 404s  Layout options Render multiple tabs per panel panel groups with heading and spacing between ✅ panel wrappers as grid item (e.g. stacked notices) ✅ Admin themes support AdminThemeReno and AdminThemeDefault ✅ Shortcuts panel add a table layout with icon, title & summary ✅ Chart panel add default styles for common chart types ✅ load chart data from JS file (currently passed as PHP array) Collection panel support image columns ✅ add buttons: view all & add new ✅
    • By Robin S
      This module is inspired by and similar to the Template Stubs module. The author of that module has not been active in the PW community for several years now and parts of the code for that module didn't make sense to me, so I decided to create my own module. Auto Template Stubs has only been tested with PhpStorm because that is the IDE that I use.
      Auto Template Stubs
      Automatically creates stub files for templates when fields or fieldgroups are saved.
      Stub files are useful if you are using an IDE (e.g. PhpStorm) that provides code assistance - the stub files let the IDE know what fields exist in each template and what data type each field returns. Depending on your IDE's features you get benefits such as code completion for field names as you type, type inference, inspection, documentation, etc.
      Installation
      Install the Auto Template Stubs module.
      Configuration
      You can change the class name prefix setting in the module config if you like. It's good to use a class name prefix because it reduces the chance that the class name will clash with an existing class name.
      The directory path used to store the stub files is configurable.
      There is a checkbox to manually trigger the regeneration of all stub files if needed.
      Usage
      Add a line near the top of each of your template files to tell your IDE what stub class name to associate with the $page variable within the template file. For example, with the default class name prefix you would add the following line at the top of the home.php template file:
      /** @var tpl_home $page */ Now enjoy code completion, etc, in your IDE.

      Adding data types for non-core Fieldtype modules
      The module includes the data types returned by all the core Fieldtype modules. If you want to add data types returned by one or more non-core Fieldtype modules then you can hook the AutoTemplateStubs::getReturnTypes() method. For example, in /site/ready.php:
      // Add data types for some non-core Fieldtype modules $wire->addHookAfter('AutoTemplateStubs::getReturnTypes', function(HookEvent $event) { $extra_types = [ 'FieldtypeDecimal' => 'string', 'FieldtypeLeafletMapMarker' => 'LeafletMapMarker', 'FieldtypeRepeaterMatrix' => 'RepeaterMatrixPageArray', 'FieldtypeTable' => 'TableRows', ]; $event->return = $event->return + $extra_types; }); Credits
      Inspired by and much credit to the Template Stubs module by mindplay.dk.
       
      https://github.com/Toutouwai/AutoTemplateStubs
      https://modules.processwire.com/modules/auto-template-stubs/
    • By Mike Rockett
      Jumplinks for ProcessWire
      Release: 1.5.60
      Composer: rockett/jumplinks
      ⚠️ NOTICE: 1.5.60 is an important security patch-release for an XSS vulnerability discovered by @phlp. It's HIGHLY RECOMMENDED that all Jumplinks users update to the latest version as soon as possible.
      Jumplinks is an enhanced version of the original ProcessRedirects by Antti Peisa.
      The Process module manages your permanent and temporary redirects (we'll call these "jumplinks" from now on, unless in reference to redirects from another module), useful for when you're migrating over to ProcessWire from another system/platform. Each jumplink supports wildcards, shortening the time needed to create them.
      Unlike similar modules for other platforms, wildcards in Jumplinks are much easier to work with, as Regular Expressions are not fully exposed. Instead, parameters wrapped in curly braces are used - these are described in the documentation.
      Under Development: 2.0, to be powered by FastRoute
      As of version 1.5.0, Jumplinks requires at least ProcessWire 2.6.1 to run.
      View on GitLab
      Download via the Modules Directory
      Read the docs
      Features
      The most prominent features include:
      Basic jumplinks (from one fixed route to another) Parameter-based wildcards with "Smart" equivalents Mapping Collections (for converting ID-based routes to their named-equivalents without the need to create multiple jumplinks) Destination Selectors (for finding and redirecting to pages containing legacy location information) Timed Activation (activate and/or deactivate jumplinks at specific times) 404-Monitor (for creating jumplinks based on 404 hits) Additionally, the following features may come in handy:
      Stale jumplink management Legacy domain support for slow migrations An importer (from CSV or ProcessRedirects) Feedback & Feature Requests
      I’d love to know what you think of this module. Please provide some feedback on the module as a whole, or even regarding smaller things that make it whole. Also, please feel free to submit feature requests and their use-cases.
      Note: Features requested so far have been added to the to-do list, and will be added to 2.0, and not the current dev/master branches.
      Open Source

      Jumplinks is an open-source project, and is free to use. In fact, Jumplinks will always be open-source, and will always remain free to use. Forever. If you would like to support the development of Jumplinks, please consider making a small donation via PayPal.
      Enjoy! 🙂
    • By Robin S
      Add Image URLs
      Allows images/files to be added to Image/File fields by pasting URLs.

      Usage
      Install the Add Image URLs module.
      A "Paste URLs" button will be added to all image and file fields. Use the button to show a textarea where URLs may be pasted, one per line. Images/files are added when the page is saved.
       
      https://github.com/Toutouwai/AddImageUrls
      https://modules.processwire.com/modules/add-image-urls/
×
×
  • Create New...