Have you noticed that the Screenshots button has been removed in 9.3?
I guess it's not that surprising since I don't remember any point in time where it actually functioned.
It's always gone something like this;
Click the Screenshots button:
The Screenshots button. So familiar yet so foreign to me |
Get a message stating you need to purchase the "relevant service".
Click Open
I never pass up a chance to open the Sitecore App Center |
Great. |
You may be asking, why don't the content authors just use an extension or some other tool?
Or, you know, the built-in capabilities of any Chromium-based browser. |
🤷♂️
The request called for consistent, full-page screenshot capabilities in Sitecore.
I thought that seemed pretty do-able.
Ever hear of ScreenshotLayer?
What's ScreenshotLayer?
It's a highly reliable REST API service that produces screenshots.Screenshotlayer is a lightweight REST API built to deliver high quality PNG, JPEG & GIF website screenshots at unparalleled speeds and through a simple interface.While I was researching and proving this out, I found that using open source libraries like Freezer often returned inconsistent results. I landed on ScreenshotsLayer given the ease of integration. Basically; feed it a URL and some parameters, and you get a high-quality screenshot back.
The service is free up to 100 screenshots per month, with a reasonably priced subscription model otherwise. https://screenshotlayer.com/product
Limitations
- CM needs to be accessible on the web without IP restrictions for API to consume. This won't work locally.- Added cost: Depending on the number of screenshots taken per month, you'll hit the free 100 screenshots quick. A Basic Plan subscription - which accounts for 10,000 screenshots per month should suffice in most cases. This doesn't seem out of the ordinary considering there used to be a service you'd have to sign-up for any way.
Goal
Our goal is to add a new Content Editor Ribbon button called 'Screenshots' in the same location that the old button once sat. If you're running Sitecore 9.2 or below, you'll want to manually remove or deny read access to the existing Screenshots button in the Core database.
The Script
The script should initially get the selected item, assert that the item has a layout, and get the item's URL. (The Get-ItemUrl function may need to be customized further for your own needs)
User Input
Let's assume a content author should make a simple selection for their screenshot; Mobile or Desktop. We can show a simple dialog with two buttons; Mobile or Desktop.
Upon selecting Mobile, we'll simply set a variable. If we have a Page URL, we'll call our Get-Screenshot function and pass in the URL and screenshot size as parameters:
Simple, yet effective. |
Upon selecting Mobile, we'll simply set a variable. If we have a Page URL, we'll call our Get-Screenshot function and pass in the URL and screenshot size as parameters:
Preparing the API Query
The API expects some common parameters defined in the URL query parameters, specifically, the API key, page URL, and viewport. We can concatenate all of our options and append it to the API URL endpoint.Consuming the API
We can now execute a WebRequest to the API and cast our result to an image stream.
Saving and Downloading the Image
With an image in the memory stream, we'll need to temporarily store the image as a physical file on the file system. In our approach, we'll utilize the $SitecoreDataFolder variable and create a 'screenshots' folder within it. We'll build some conditions to check for the presence of this location. Once the image has been saved, we'll invoke the Download-File function
Putting it All Together
SPE Integration
Creating a New Module
Right-click on the Script Library folder and select Module WizardWe'll name our module Screenshots and select Content Editor - Ribbon as our integration point:
You'll end up with a new module folder and several items:
First thing's first....set an icon in the appearance section (you know about sitecoreicons.com, right? 😉)
Now, let's make sure from an integration standpoint, the Screenshots button is only displayed for items with a Layout present. We can easily accommodate this by editing the Show Rule in the Interactive section:
The Rules Engine makes this a no-brainer |
Finally, we can add our script to the Script body field of our item. Now would be a good time to make sure the $apiKey variable has been customized before saving.
Activating the New Module
In order for the system to pick up our new module and its corresponding integration points, we need to Sync the library. This can be achieved by opening a new ISE session and selecting the Sync Library Content Editor Ribbon sub-option of the Rebuild All button under the Settings tab:
We should now have a Screenshots button that displays in the Presentation > Preview chunk of the ribbon whenever an item with a layout is activated.
wo0t! |
Final Result
Starter Package
If you're looking to use or expand this functionality to fit your own requirements, you can feel free to download and install the Sitecore package from: https://github.com/strezag/Sitecore.SPE.Screenshots
Happy capturing! 📸