Gravity
Metrik‘s Gravity has a real classic Pendulum feel to it. The first time I heard it (on Hospital Podcast #402) I honestly thought it was sung by Rob Swire.
Metrik‘s Gravity has a real classic Pendulum feel to it. The first time I heard it (on Hospital Podcast #402) I honestly thought it was sung by Rob Swire.
I’m thoroughly enjoying 13 Minutes to the Moon, which is a wonderful podcast series from the BBC World Service. Highly recommended.
(Overcast is my podcatcher of choice.)
Chris Coyier’s Make it hard to screw up driven development struck a chord with me. If there’s ever going to be more than one of you working on a codebase, having a style guide for your CSS or SASS or Javascript or whatever makes sense. Having it automatically applied when you hit save means you rarely have to worry about adhering to the style – it just happens for you. I’ve yet to have one of these tools break my code, either.
One thing Chris didn’t mention though was running a spellchecker over your code. It may sound completely bananas, but hear me out. Firstly, it’s a code-specific spell checker. Secondly, I’ve worked on projects before where we’ve ended up with 3 different spellings of the word “palette”, because 3 different people assumed they had it right. It also means you’re implicitly being encouraged to give your variables and CSS classes meaningful names, so when you revisit the code in the future it’ll make a bit more sense. We used cSpell to do this, but I’m sure other similar products are available.
These tools don’t just exist in the development tools, either. We have them set up in our CI environment, so you can’t merge a code change unless it passes all of the tests – and the tests include both spell checking and matching the style guide. The system won’t let you screw these particular things up – leaving you free to concentrate on not screwing up the actual logic.
I’m a big fan of working this way, in case it wasn’t obvious.
I have a browser extension which shows me a lovely image from Unsplash whenever I open a new tab. Today, this one appeared:
The Arashiyama Bamboo Groves were right near the top of my hit-list when we visited Kyoto. It looks reminiscent of movies where they appear to be stunning, never ending bamboo paradise. Indeed, in this photo they look pretty damn cool. In reality, while stunning, they’re disappointingly small. That path is usually crowded with thousands of people and the groves end not far beyond the end of the photo. There’s a genuine feeling of “Is that it?”
It’s worth the trip though, because at the far end is Okochi Sanso, the former home and garden of Japanese actor Denjiro Okochi. It’s absolutely stunning, and a haven of calm just minutes from the bustling city below. When we visited it was raining, which doesn’t sound ideal. But the rain made the mossy green gardens positively glow with colour and we practically had the place to ourselves.
If you ever find yourself in the Arashiyama area, take the time to visit. It’s a worthy detour.
I nearly opted for e-tickets when I booked the train but had a gut feeling it was a bad idea. It’s one of my last trips to Manchester for work and the last Christmas ‘do’ I’ll be attending at this job.
I’m glad to have real paper tickets because this morning O2’s entire mobile network seems to be borked. Wouldn’t have been able to get my e-tickets at all.
I’m glad I brought a paperback to read, too. It’s This Is Going To Hurt by Adam Kay. The brilliantly written diary of an NHS junior doctor. I’ve spent the first 50 pages stifling laughter and squeamishly cringing, often at the same time.
Sacha Trauwaen’s OpenForm is a module for DNN which is used for adding forms to a page.
It requires that the OpenContent module is installed first. The configuration is based on AlpacaJS.
From here you can add and remove items to the form. The left column shows the form builder, while the right shows a preview (albeit using plain bootstrap styles, so it’s not a true WYSIWYG).
Note: It’s a good idea to press Save often, as it can occasionally get confused when moving new un-named controls up and down.
You can reach the form settings (for email notifications, etc.) by:
You have a WYSIWYG editor to control the content shown after the form is submitted. To include form data in the message, you can use special tokens.
e.g. If your form contains fields named name and email, put this into the WYSIWYG:
Thanks {{ name }}, your email address is {{ email }}.
To make it send an email notification, you need to:
Note: If the emails start failing, you can look at the Admin Logs in the PersonaBar.
The message uses a WYSIWYG to allow you to customise the HTML email you send back. You can use the same tokens as the Message After Submit to customise it, e.g.
Thanks {{ name }}, your email address is {{ email }}.
There is also a special {{{ FormData }}} token, which outputs all of the data submitted. See https://openform.readme.io/docs/getting-started#section-email-messages-and-user-feedback
You can add multiple email notifications. This means you can send a notification back to the person who filled in the form another to the staff members who need to receive the information, and yet another to a CRM system.
You can use Javascript to pre-fill the form with data from the querystring. See https://openform.readme.io/docs/prefill-form-with-query-parameters for an example.
If the current user is logged in, you can pre-fill the form with their profile information. Make sure you use the following field names in your form:
UsernameFirstNameLastNameEmailDisplayNameTelephoneStreetCityCountryAs well as being emailed out, all form submissions are stored in the database. If you have admin or super user access, you can view them by:
From there you can download the data in Excel format.
If you have superuser permissions, you can get to the raw JSON data:
At the time of writing, you cannot delete form submission data. (Jan 2020: I believe a subsequent release has now added this feature.)
Certain features can only be reached by directly editing the config files. For instance, some features (such as multi-page forms) cannot be added using the Form Builder. There is also the ability to use custom CSS and Javascript on the module, and a C#/Razor post-submission message which can do more than the regular submission message (with full access to the DNN API).
If you have Super User access, you can get to these by:
If you’re developing a new form on your development machine, you may find it easier to find the files on the file system. They’re stored in:
[path to site]\Portals\[portal id]\OpenForm\Templates
So on my dev machine, where I’ve used nvQuickSite to install DNN, they’re here:
C:\Websites\sesame\
And on an Azure App Service, they’re likely to be under:
site\wwwroot\
Sometimes, for example when working with a Bootstrap carousel, you need to know when you’re on the first item in the visualizer. Liquid Content apparently can’t do this natively (yet) so you’ll need to do this with Javascript.
To add the active class to the first item in a Bootstrap carousel, I put the following code into the script section of the visualizer. You should be able to adapt it to suit your needs:
var items = document.querySelectorAll(".carousel");
if (items.length) {
items.querySelector(".carousel-item:first-child").classList.add("active");
}
I raised this as an enhancement request with DNN Software, as DNN-26912.
To get a unique id for a content item, you simply use {{id}}, in the template part of the visualizer editor.
For example:
<article class="news-headline" id="{{id}}">
It’ll come out as something like:
<article class="news-headline" id="aa1a93b2-cca4-4a32-bc0a-2c52a1b28019">
If you need to link to it, e.g. for a Bootstrap modal, use something like this:
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#{{id}}">
It comes out like:
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#aa1a93b2-cca4-4a32-bc0a-2c52a1b28019">
The ID is tied to the specific content item, so you can use it across multiple visualizers (e.g. put all the buttons in one visualizer, and all the modals into another one).
This might seem obvious, but I didn’t find it in the documentation.