How to Speed Up a Website on Drupal? Lazy-load Module and its Possibilities

The website loading speed is a very important aspect in the user’s perception of the portal. Then how can you speed up the loading of a website that has a lot of media or iframes? One of the best solutions is to take advantage of lazy loading. The easiest way to use this method in Drupal is to use the Lazy-load module.

What is the website loading speed?

It’s the time required to display a website to a user, calculated from the moment the link is clicked. It depends on the amount of text, embedded elements (such as iframes), scripts, and media (images, videos), where the size also matters. Often the media and embedded elements take the longest to load. On big websites, many elements are invisible to the users until they scroll the website, yet they are loaded before the part that fits on the display is shown.

Google has introduced SEO guidelines in which loading speed is taken into account when positioning a website. Therefore, it’s worth taking care of the smooth display of web pages. Two significant metrics in terms of the website loading speed are TBT (Total Blocking Time) and LCP (Largest Contentful Paint). TBT indicates the time it takes for long tasks to complete, while LCP determines after how long a website’s content is likely to be usable. Both metrics are largely influenced by the number and size of loaded items.

Loading the website on Drupal – Lazy-load module

Newer versions of Drupal (v9.1.0 and above), along with commonly used browsers (Chrome from v76, Firefox from v75), support lazy-loading right after installation. However, you have to reckon with the fact that many websites use older versions of Drupal. Most often, these are websites that have been developed for years, and therefore often have a lot of data (including media and embedded elements), the long loading of which worsens the perception of the portal. In such cases, it’s worth checking whether lazy loading can be used to reduce the loading time of the website and the transfer needed to load visible elements.

Released on April 10, 2018, the Drupal Lazy-load module allows you to limit the loading of the abovementioned elements to only those required at a given time. This reduces the website loading time and, above all, reduces the consumption of transmission. Due to its usefulness, the module is used by more than 10 thousand websites. It has versions for both Drupal 8+ (the latest version 8.x-3.11 as of January 31, 2022) and Drupal 7 (the latest version 7.x-1.4 as of April 22, 2019).

It’s commendable that Osman Gormus is the sole maintainer of the project, and yet the module hasn’t lost support since its creation.

To illustrate the effectiveness of the Lazy-load module, here are the test results on a website containing 36 iframes (of which 6 are visible in the loaded area) and 116 images that are out of view.

 

In the above example, the user is able to see the website almost fifty percent faster when using the module. Moreover, the link savings is more than 98%. Of course, the results for each website will strongly depend on the size and number of elements outside the loading area. While the example is grotesque (we are unlikely to encounter a website with such a large number of images or embedded elements), it’s meant to illustrate how important the use of a lazy loading strategy can be in the perception of a website.

Installation

The module uses additional libraries, so the installation requires taking them into account. The easiest and fastest way is to use the composer.json file for this. In a few steps, we can perform a full installation of the module, including dependencies.

  1. In the repositories section, we add the following:
    { 
      "type": "composer", "url": "https://asset-packagist.org"
    }
  2. Then we need to run the command (we add the -W option at the end if necessary):
    composer require drupal/lazy:^3.0 bower-asset/lazysizes:^5.1 oomphinc/composer-installers-extender:^2.0 --no-update
  3. We need to edit the extra section in composer.json to include the following:
    "installer-types": ["bower-asset", "npm-asset"],
    "installer-paths": {
      …
      "web/libraries/{$name}": ["type:drupal-library", "type:bower-asset", "type:npm-asset"],
      …
    }
  4. Now we can run the composer update command.

Full instructions can be found in the official documentation.

In case you need a manual installation, download the module files from its website on Drupal.org and the library available on GitHub and extract them one by one to the folders of modules/contrib/lazy and libraries/lazysizes. Full instructions can be found on the module website.

How to use the Lazy-load module?

Important: The module has its own configuration located under the path of admin/config/content/lazy. It’s divided into 3 tabs.

1. General settings

 

  1. Prefer native lazy-loading – checking the option will force the use of lazy loading embedded in the browser.
  2. skipClass – elements that have the class entered won’t use lazy loading.
  3. Placeholder image URL – image inserted in the place of loaded objects.
  4. Enable default CSS effect – enabling default transitions when loading objects, using CSS with appropriate classes.
  5. Use minified versions – checking this option will cause the use of minified versions of scripts.
  6. Lazysizes library path, or URL – path or address pointing to the Lazysizes library (required by the module).

2. Visibility

 

  1. Pages – the paths of websites to use or have disabled lazy loading, dependent on the checkbox from point 2.
  2. Enable lazy-loading ONLY on specified pages – the option determining whether the paths entered in point 1 should have lazy-loading disabled (unchecked option), or whether it should be active only on the indicated websites (checked option).
  3. Disable lazy-loading for administration pages – blocks the execution of the module script on administrative websites.

3. Lazysizes Configuration

 

  1. lazyClass – a class designating the elements that should be considered for lazy loading.
  2. loadedClass – a class assigned when the element is loaded.
  3. loadingClass – a class assigned when the element is being loaded.
  4. preloadClass – a class designating the elements that should be loaded after “onload”.
  5. errorClass – a class assigned to the elements whose loading failed to complete correctly.
  6. autosizesClass – a class designating the elements that will be automatically scaled.
  7. srcAttr – the attribute of src
  8. srcsetAttr – the attribute of srcset
  9. sizesAttr – the attribute of sizes
  10. minSize – for use with data-sizes=”auto”. The minimum image size to calculate the attribute of sizes.
  11. customMedia – an object that is an alias for mapping various media queries. It can be used to separate/centralize the implementation (layout) of multiple specific media queries from the attribute of source[media] (content/structure) through the creation of tagged media queries.
  12. init – determines the initialization of the Lazysizes library. In some cases, it may be required to disable automatic initialization. Manual initialization is then required by using lazySizes.init();.
  13. expFactor – a factor indicating how many assets should be loaded when no valid action is performed.
  14. hFac – a factor analogous to expFactor, but in horizontal orientation.
  15. loadMode – loading mode. 0 – no loading, 1 – loading of visible elements only, 2 – loading of visible and close elements, 3 – loading of visible, close and catching elements within the range of expansion by expFactor. During onload, the option is automatically set to 3.
  16. loadHidden – determines whether hidden elements should also be loaded. LazySizes loads such elements with a delay.
  17. rlcTimeout – delay option for requestIdleCallback.
  18. throttleDelay – delay used for listeners.
  19. Plugins – selection of plugins that should be attached. The full specification and description of plugins can be found on Github.

In order to attach lazy loading, editing the display of the fields for which its use is needed is required. For example, you want to enable the addition of images that support lazy loading on the page type websites. To do this, you need to perform the following steps:

1. Select Structure -> Content Types -> Content Page -> Manage Fields in the admin panel (admin/structure/types/manage/page/fields).

2. Add a new field (e.g. of the Image type).

3. Go to display management. 

4. Expand the field options (click the cog symbol on the right-hand side).

 

5. In the expanded settings, check the box of Enable lazy-loading.

 

From this moment on, all images added in this field will use lazy loading. What’s more, classes will be added, set in the module’s configuration (admin/config/content/lazy) in the Lazysizes configuration tab, discussed earlier in the Lazysizes configuration section.

With the above settings, we can add effects to elements with lazy loading, depending on their status, using styling in CSS files (such as blurring images that are still being loaded or adding a red border to elements that failed to load). Below is an example with two images – one fully loaded (top) and one in the process of loading (bottom):

 

For embedded content, added within the content, be sure to add the attribute of loading=”lazy”, as in case of iframe:

<iframe loading="lazy" src="example-page">

Hook

The module adds the hook of hook_lazy_field_formatters_alter, which allows adding formatters, not yet supported, to image-based fields.

Example:

function hook_lazy_field_formatters_alter(array &$formatters) {
  $formatters[] = 'xyz_module_field_formatter';

  return $formatters;
}

Drupal Lazy-load module – summary

Using the Drupal Lazy-load module significantly reduces the loading time of websites that have multiple media, which are outside the visible area, immediately after they are loaded, and reduces user data transmission. Lazy-load is useful for older versions of Drupal, as newer versions have native lazy-load support embedded. However, even for them, this module is noteworthy for its configurable styling of elements, depending on their current loading status.

Are you wondering if the Lazy-load module is right for your website? We maintain and develop a lot of websites on Drupal, so applying our experience, we’ll be happy to recommend which solution will be best for your website.

How to Schedule a Publication in Drupal? Scheduler Module

When creating content for a website, it is sometimes necessary to plan its publication later down the line. However, taking care of it manually can be both time-consuming and inconvenient. This is when Scheduler comes in handy – a Drupal module that will help you automate this process. Using it will allow us, among other things, to schedule the publication of content for a specific date and time.

Scheduler module – dates

The module was released on 23 July 2006, and its latest update was pushed on 19 July 2021. Scheduler has versions for Drupal 7 and 8. What is more, the latest update is compatible with Drupal 9 as well.

Module popularity

The module is currently used on more than 85 thousand websites. About 44 thousand of them are running Drupal 7, and more than 37 thousand are on Drupal 8.

Source: Drupal.org

Module developers

Scheduler was originally published by Eric Schaefer. However, the list of people working on its development to date is very long and impossible to establish – we don’t know all the users who contributed to its development.

Drupal Scheduler module – what does it do?

As I pointed out in the introduction, the module is used to plan content publication in advance. It also offers you a way to plan unpublishing. If needed – for example, in the case of events, where news will be made obsolete after the end, you can task the module with publishing your content and schedule its removal from your website at a specific day and time.

Scheduler provides three new permissions, allowing only the selected roles to have access to scheduled publishing. The list of possibilities also includes the so-called Lightweight cron, the configuration of which optimizes resource consumption. Lightweight cron is the developers’ solution to make the cron responsible for publishing and removing content available to be run separately, without the need to initiate all other tasks, as is usually the case in Drupal.

Unboxing

Installation is standard. I recommend using Composer.

composer require drupal/scheduler

 

Permissions

Go to

/admin/people/permissions#module-scheduler 

– there, you will find a list of permissions that the module provides:

 

Administer scheduler

This setting enables you to configure the Scheduler module, available at

/admin/config/content/scheduler 

(see the next section for the description of all the features).

Scheduler content publication

Granting this permission allows a role to set scheduled publication, as well as to plan unpublishing.

View scheduled content list

Scheduler provides a view, which is available at

/admin/content/scheduled

Granting this permission allows you to access this view.

Settings

Go to

/admin/config/content/scheduler

to find all the global settings for the module. What is more, Scheduler can be configured per content type. Below, you can find a break down the global options.

 

Allow users to enter only a date and provide a default time

Allows users who have permission to configure scheduled content publishing to specify only the publication date. When this option is selected, the time will be predefined and configurable in the Default time field.

 

Hide the second

Checking this option disables the ability to set seconds when scheduling content publishing.

Lightweight cron

As I pointed out earlier, by default, Drupal runs all cron jobs every once in a while. Checking which content needs to be published and unpublished relies on a cron job, which should be run every 1-5 minutes. Configuring Drupal to run all cron jobs every minute is hardly a very good idea, considering its performance, which is why the developers enabled the users to run a single cron job at a suitable interval. To do this, you need to add a new cron job run at a given time. Here is an example of a cron job that is run every minute: 

* * * * * wget -q -O /dev/null "https://tesd9.lndo.site/scheduler/cron/{access-key}

Go to

/admin/config/content/scheduler/cron 

to find the lightweight cron settings. There, you can enable logging of cron job activation and completion, change access-key and run cron manually.

Content type

I’ll illustrate this option with the default content type – Article – available in Drupal default profile. Go to

/admin/structure/types/manage/{content-type-machine-name} 

There, you will notice a new Scheduler tab. This is where you’ll find all the module’s configuration options, which you can set for each entity.

 

Enable scheduled publishing/unpublishing for this content type

Enables or disables the ability to set scheduled publication and/or unpublishing.

Change content creation time to match the scheduled publish time

Changes the date in the creation time field to the date selected as the planned publication date.

Require scheduled publishing/unpublishing

Checking this option makes setting scheduled publication and/or unpublishing required.

Create a new revision on publishing/unpublishing

Creates a new revision during scheduled publication and/or unpublishing.

Action to be taken for publication dates in the past

This setting enables you to specify what will happen when the editor selects a publication date earlier than the current date. You can choose one of three options here:

  • Display an error message about choosing a date earlier than the current one – in this case, the content won’t be published.
  • Publish content immediately after saving.
  • Schedule your content to be published on the next cron job run.

Display scheduling options as

Changes the way Scheduler module options are displayed when creating and editing content. There are two options to choose from – Vertical tab and Separate fieldset.

Vertical tab

 

Separate fieldset

 

Expand fieldset or vertical tab

Allows you to specify whether the field provided by the Scheduler should be expanded when creating and editing content.

Show message

Checking this option displays information about planned publication and unpublishing after saving the content.

Module usage

Let’s assume that our article needs to go live on 1 September 2021 at 9:30 a.m. and won’t have to be unpublished.

When writing the article, choose Publish on and set it to 01.09.2021 at 9:30 a.m., and then leave Unpublish on empty. In this case, the Require scheduled unpublishing option must be disabled for the Article entity.

Now imagine that our article needs to go live on 1 September 2021 at 9:30 a.m. and has to be unpublished a week later at the same time.

Let’s start with doing the same thing as we did in the previous example, but this time also set Unpublish on to 08.09.2021 at 9:30 a.m.

You may be also interested in: How to Make Content Editing Easier in Drupal – Review of the Simplify Module

Integrations

Scheduler offers integrations with several Drupal modules.

  • If you’re using the Content Moderation module, you must enable the Content Moderation Integration sub-module.
  • Scheduler provides additional conditions, actions, and events for the Rules module.
  • It is also integrated with the automatic generation of test content provided by the Devel Generate module. Scheduler can automatically add the planned publication and unpublishing dates.
  • It also creates new tokens for the Token module, containing the planned publication and unpublishing dates.

The future of the module

The developers responsible for the Scheduler have announced that they are working on releasing version 2.0 of the module, supporting entities other than nodes, for example, Media, Commerce Products, and more. They also announced that events triggered by the Scheduler module and its integration with the Rules module will from now on be triggered after an entity is saved, rather than before, as was the case until now. The development progress can be followed on the module page.

Drupal Scheduler module – summary

Scheduler is a tool that greatly facilitates the scheduling publication of content on your website. Using it allows you to automate the process and makes it possible to do all the steps required to publish content at any time – thus making sure that you won’t have to worry about it when the time comes. At Droptica, we also use Scheduler to schedule publications in advance. This module is extremely popular among Drupal users, and as such, it is constantly developed – with version 2.0 in the works right now. Our team of Drupal developers recommends using the Scheduler module to schedule publications in advance or to publish content for a specific time.

How to read a pool pump motor nameplate

The pool pump motor nameplate – all the information that’s fit to print, on a tiny, metallic label. If you can still read yours, it’s chock full of necessary information when it comes time to replace your pump motor.

The nameplate does have some bits of information that can be less than useable. So, if you call us up with the PART or the SERIAL numbers shown on the left, we may be less than helpful.

The other bits of information are quite useful – Horsepower, Service Factor, Voltage, Frame Type, etc. Let’s take a look at these values, and what they should mean to you.

1. FR – FRAME TYPE. The value listed next to “FR” will refer to the type of Frame, or specifically the Flange Type. The Flange is on the “Wet End” of the motor, or the end that attaches to the pump. Most styles have a circular face, called a “C” Flange, and one very popular frame type, the 56Y/48Y, is known as the “Square” Flange. The Keyed shaft motor is used on older bronze motors, along with a stub shaft to shim the impeller. Aboveground pools use the 48 Frame type almost exclusively, notable by it’s small size and built in “legs”.

2. HP – HORSEPOWER. This value refers to the amount of work capable by the motor. All motors spin at the same speed, 3450 RPM, but the higher the horsepower, the greater the volume of water that will be pumped. In America, we have a V-8 mentality, and many of our customers install a pump that is too large for the pool or the filter. If you do have a valid reason to increase the horsepower, make sure your filter can handle the flow rate. You also will need to change the impeller to one that is rated for the higher horsepower. The horsepower of your pool pump is also dependent on the Service Factor (SF) described below.

3. SF – Service Factor. This is a bit complicated to express eloquently, but let’s give it a try. About 20 years ago, motor manufacturers began producing “Up-Rated Motors”. By increasing the ServIce Factor of a particular motor, they are able to get more work out of a smaller horsepower motor. By multiplying the HP x SF, you will get the true horsepower of a motor. For example, in the motor nameplate on the right, when we multiply .50 horsepower by 1.3 SF, we obtain the what’s called the Total Brake Horsepower of 0.65 HP.

When considering a new motor, definately match the frame type and HP. You will be able to buy an uprated motor (also called Max Rated by Hayward) for a cheaper cost than a full rated motor, and also enjoy some electrical savings. Just be sure that HPxSF of the new motor is equal to or greater than HPxSF of your existing motor.

 4. VOLTS: 115/230 tells us that this motor is “reversible”. It will come wired, from the factory, to accept 230 volts, and if you want to use only 115 volts, you can easily “reverse” the voltage. See the Low Voltage – High Voltage diagram on the upper nameplate, and consult the instructions with a new motor to switch voltages. Some smaller motors are 115 only and some larger motors are 230 only. If you aren’t sure, or the nameplate is no longer readable, you can test the power at the motor, timeclock or breaker with a multi-meter. A 230 volt breaker will also have 2 wires  (legs) from the pump attached to the circuit breaker, whereas a 115 volt install will have one wire going to the breaker and one leg going to the neutral buss bar.

5. AMPS – Indicated by two numbers, i.e. 8.8/4.4, this tells you the amperage draw of the motor connected to 115V (8.8) and 230 Volts (4.4). Amp draw is what you pay for on your electrical bill. The smaller this number the better.

6. HZ – Hertz, is a frequency measurement, in cycles per second. In the US, all pump motors will be 60HZ or 60 cycles per second. Many other parts of the world operate on 50HZ. These two are not compatible. A 50HZ motor will not work with US voltages.

7. PH – Phase. This indicates whether the motor operates on Single Phase current or 3-Phase current. Most residential electrical service is single phase, while many larger commercial pumps (10-15hp) will operate on a 3-Phase current. This allows large motors to have a more evenly distributed alternating current. Without “3 Phases” of power, power hungry commercial pool pumps would draw more power than is available.

8. AMB – Ambient Temperature, or the highest allowable outside temperature that this motor should be operating in. This is usually listed at 50 degrees celcius. (about 122 degrees Fahrenheit). Maybe a concern if your pool is in Death Valley, Ca.

9. ENCL – This refers to the openings or lack of openings in the shell of the motor. Swimming pool motors are classified as “Open” and “Drip-Proof”. It’s important to keep the motor vents free of mulch, leaves and dirt, to allow the internal motor fan to keep things cool.

10. TIME – This indicates the running schedule for a particular motor. Pool motors are listed as “Continuous Duty”, sometimes abbreviated as “CONT” – which means they are built for 24/7 operation. You should be able to operate the pool pump motor only 10-15 hours daily – and still maintain water clarity.


How to Perform a Drupal Integration with Other Enterprise Systems?

Effective integration of different systems in a company today is an elementary factor for success. In a world of dynamic technologies and IT tools, Drupal stands out because it’s a constantly evolving open source software with the support of a large community. With its flexible structure of modules written in PHP and the ability to use tools such as Composer, Drupal becomes an ideal solution for integrating various programs in an organization. 

Why does Drupal work well for integration? 

In favor of Drupal is its flexibility and the rich database of modules available on Drupal.org, which is constantly growing and often includes ready-to-use solutions for integration.

It’s also worth noting that Drupal has its API, which makes it much easier to create custom Drupal integration modules. This popular system is based on Symfony, which allows for writing new integrations even faster and easier, thanks to access to advanced, ready-made solutions. You don’t have to start everything from scratch, which saves time and resources.

In our blog post, we’ll discover how to harness Drupal’s potential to effectively integrate it with other systems in your organization, taking advantage of the powerful tools and instant options available in this powerful open source software.

How is Drupal architecture built?

Architecture plays a crucial role in the context of Drupal integration with other systems. This is especially true in a dynamic business environment, where a company’s systems are often subject to modification and must be easily extensible and ready for change. 

As technologies and business requirements evolve, Drupal’s flexible design enables rapid implementation of changes and the addition of new features and integrations. This is critical to maintaining competitiveness and operational efficiency in the enterprise.  

PHP language

Drupal is written in PHP – a well-known language used worldwide by web developers. How does its popularity affect Drupal integrations with other systems? 

The PHP language is widely used in the development of web applications, resulting in unique toolkits for programmers known as SDKs (Software Development Kits). Examples include the SDK for Google services or the SDK for eBay integration. 

Ready-made libraries, numerous tutorials, and documentation on system connection in PHP are also beneficial. Thus, the process of Drupal integration with other systems becomes much more accessible and efficient. 

Symfony components 

Drupal and Symfony allow you to install off-the-shelf libraries using the Composer tool, which further simplifies the process of integrating with external programs. These libraries are often provided by the systems you want to integrate with, which means that companies can use official or unofficial solutions from manufacturers. 

As a result, the integration process becomes even smoother, and ready-made libraries make it easier to create connections and exchange data between different platforms. This, in turn, speeds up the implementation of integration.

An example is the installation of Google services such as Google Drive or YouTube:

{

    "require": {

        "google/apiclient": "^2.15.0"

    },

    "scripts": {

        "pre-autoload-dump": "google-autoload-dump::cleanup".

    },

    "extra": {

        "google/apiclient-services": [

            "Drive,

            "YouTube"

        ]

    }

}

Also noteworthy is the SDK provided by Amazon:
composer require aws/aws-sdk-php

Twig template system

Drupal uses the Twig template system to render content on websites. While it may seem unrelated to integration, it’s essential for Drupal’s flexibility in this context. With Twig, advanced output content processing is possible, making it easier to communicate between different applications. 

In addition, the Twig template system works with the library system in Drupal. It allows external JavaScript libraries, which expands the possibilities for creating user interfaces and customizing them for a given project. This way, Drupal becomes a more flexible integration tool, allowing us to create advanced web solutions.

For example, we can create custom services for formatting and filtering the displayed content. Here is an example of turning www.xxxx.xxx addresses into clickable links “on the fly”: 

service.yml

  my_module_twig_extension.twig.InlinerTwigExtension:

    class: drupal_module_twig_extensionTwigExtensionTwigExtension

    Tags:      { name: twig.extension }

Class code: 

public function getFilters(): array {

    return [

      new TwigFilter('replaceUrls', [$this, 'replaceUrls']),

    ];

  }

  /**

   * Replace url link to html link in texts.

   */

  public function replaceUrls($text): array|string|null {

    if (empty($text)) {

      return $text;

    }

    $pattern = '/(http:/S+|https:S+|www.S+)/i';

    $replacement = '<a href="$1" target="_blank">$1</a>';

    $text = preg_replace($pattern, $replacement, $text);

    $pattern = '/<a href="www.(.*?)">(.*?)</a>/i';

    $replacement = '<a href="http://www.$1">$2</a>';



    return preg_replace($pattern, $replacement, $text);

  }

And in Twig, we add our custom filter:

  {{text|replaceUrls}}

How to perform Drupal integration with other systems? 

We’ve already reminded you of the basic elements of Drupal’s architecture that can affect the system’s connection with external tools. Below, we present specific approaches to integration. 

Integration using Drupal Rest API

Integration with Drupal Rest API is a relatively simple and effective process. To be able to implement it, we need to enable the Rest module in the Drupal admin panel, configure the appropriate access permissions, and create API endpoints.

We can also use the REST UI add-on, which allows us to add some actions from the UI.

It’s also important to implement authorization and authentication mechanisms to ensure that API access is secure. 

Drupal and Symfony allow the custom creation of REST endpoints. Developers can use tools such as Guzzle and other libraries to create custom API endpoints that meet the project’s exact needs. This means that the structure and behavior of the API can be tailored to specific business requirements. As a result, we manage to build personalized integration solutions and gain accessible data exchange between Drupal or Symfony and other applications and platforms.

Before implementing an integration, it’s a good idea to thoroughly test the API and create documentation to make it easier for other developers to use the resources and operations provided by the API. This way, Drupal can be effectively integrated with other systems, allowing data and processes to flow freely between different applications and tools.

Creating a plugin for Rest 

We need to create a classe with annotation @RestResource along with url_paths and extend RestResource class. Example:

<?php



Namespace Drupal_your_module_plugin_resource;



use Drupal;

use DrupalResourceResponse;

use SymfonyComponentDependencyInjectionContainerInterface;

use SymfonyComponentHttpKernelExceptionAccessDeniedHttpException;



/**

 * Provides a resource to get view modes by entity and bundle.

 *

 * @RestResource(

 * id = "my_custom_resource",

 * label = @Translation("My Custom Resource"),

 * uri_paths = {

 * "canonical" = "/my-custom-endpoint".

 * }

 * )

 */

class MyCustomResource extends ResourceBase {



  /**

   * {@inheritdoc}

   */

  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {

    return new static(

      $configuration,

      $plugin_id,

      $plugin_definition,

      $container->get('entity.manager')

    );

  }



  /**

   * Responds to GET requests.

   *

   * @return @DrupalResourceResponse.

   * The HTTP response object.

   *

   * @throws @SymfonyComponentHttpKernelException.

   * Throws exception expected.

   */

  public function get() {

    // Your custom logic here to handle GET requests.

    // For example, you can fetch data and return it as a JSON response.

    $data = ['message' => 'This is a custom REST resource.'];

    return new ResourceResponse($data);

  }



  /**

   * Responds to POST requests.

   *

   * @param mixed $data

   * The data received in the POST request.

   *

   * @return @DrupalResourceResponse.

   * The HTTP response object.

   *

   * @throws @SymfonyComponentHttpKernelException.

   * Throws exception expected.

   */

  public function post($data) {

    // Your custom logic here to handle POST requests.

    // For example, you can create a new resource based on the received data.

    // Return a response indicating success or failure.

    return new ResourceResponse(['message' => 'POST request handled.']);

  }



}

Another approach is to create routing and controllers to receive our requests:

my_module.resource_list:

  path: '/api/resources'

  defaults:

    _controller: '_controller::getList'.

    _title: 'Get list of resources'.

  methods: [GET].

  requirements:

    _permission: 'access content'

  formats: ['json']


my_module.resource_get:

  path: '/api/resources/{id}'

  defaults:

    _controller: '_controller::getSingle'.

    _title: 'Get a single resource'

  methods: [GET].

  requirements:

    _permission: 'access content'

  options:

    parameters:

      id:

        type: 'integer'

  formats: ['json']



my_module.resource_create:

  path: '/api/resources'

  defaults:

    _controller: '_drupal_module_Controller_ResourceController::create'.

    _title: 'Create a new resource'

  methods: [POST].

  requirements:

    _permission: 'create new resource'

  options:

    parameters:

      date:

        type: 'entity:my_resource'

  formats: ['json']

In addition, we present how to download sample data in our custom module from external systems, such as YouTube, using GuzzleHttpClient:

<?php



Namespace Drupal_module_Controller;



use DrupalCoreControllerBase;

use SymfonyComponentHttpFoundationJsonResponse;

use GuzzleHttpClient;



class GoogleApiIntegrationController extends ControllerBase {



  public function getContent() {

    // Configure the Guzzle client

    $client = new Client([

        'base_uri' => 'https://www.googleapis.com/youtube/v3/', // Google API base URL

    ]);



    // Query parameters, including the API key

    $params = [

        'query' => [

            'part' => 'snippet',

            'q' => 'cats', // Example query - search for cat videos

            'key' => 'YOUR_API_KEY', // Replace 'YOUR_API_KEY' with your own Google API key

        ],

    ];



    // Perform a GET request

    $response = $client->get('search', $params);



    // Decode the response JSON

    $data = json_decode($response->getBody());



    // Process data from the response

    $results = [];

    foreach ($data->items as $item) {

        // You can process video data here, such as displaying titles and descriptions

        $results[] = [

            'title' => $item->snippet->title,

            'description' => $item->snippet->description,

        ];

    }



    // Return the results as a JSON response

    return new JsonResponse($results);

  }

}

Drupal integration through modules 

Connecting Drupal with other systems via modules is a popular approach to extend the website’s functionality. Especially if it’s third-party systems that integrate with our web page.

Examples of popular modules include:

  • RESTful Web Services: the module described above allows us to create REST resources and handle HTTP requests, which works well for communicating with other applications and services.
  • Feeds: the Feeds module enables us to import and export data from different sources, which is helpful for synchronizing content with external systems. For example, with the Feeds module, we can define the data source and field mapping between Drupal and another system.
  • Create Views: the Views module allows us to create custom views that use data from other systems and display them on our Drupal website. Views can also be used to present data from other systems. Particularly useful in integrations is also the option to expose data in XML, CSV, or other formats, which external systems can easily consume. We can use the Views data export module for this purpose. 

Drupal integration by this method is a practical solution for various types of projects. There are dedicated modules for specific systems that are ready to use or significantly speed up integration. A few examples are:

  • Jira – a project management tool,
  • PayPal – an online payment system,
  • HubSpot – a CRM platform,
  • MailChimp – a marketing automation and e-mail marketing platform. 

More such components can be found on Drupal.org in the Third-party Integration
category.

Drupal Salesforce integration

Salesforce is one of the largest and best-known customer relationship management software companies. It offers various CRM (Customer Relationship Management) solutions and tools for automating business processes, marketing, customer service, and data analysis.

Using its example, we’ll show how easy it is to integrate this kind of system with Drupal. 

First, we can use a module available on Drupal.org – Salesforce.

The main component contains a set of modules that support integration with Salesforce by synchronizing various Entities (e.g.,  users, nodes, files) with Salesforce objects (e.g., contacts, leads). It supports uploading data from Drupal to Salesforce, as well as downloading or importing data from Salesforce to Drupal. Changes can be made in real-time or asynchronously in batches when running cron.

If, for some reason, we need more custom solutions, we can extend this with our own module. Salesforce API has classes and a set of hooks for extension, such as:

/**

 * Implement an EventSubscriber on SalesforceEvents::PUSH_PARAMS.

 */

function hook_salesforce_push_params_alter() {

}



/**

 * Implement an EventSubscriber on SalesforceEvents::PUSH_SUCCESS.

 */

function hook_salesforce_push_success() {

}



/**

 * Implement an EventSubscriber on SalesforceEvents::PUSH_FAIL.

 */

function hook_salesforce_push_fail() {

}

We can also use a dedicated SDK for PHP, downloaded with Composer, which allows us to easily receive and send data to Salesforce. 

Drupal integrations through Zapier

System integration through Zapier is the process of connecting different applications, tools, and systems to automate tasks and transfer data between them using the platform above. Zapier enables the creation of rules or “zaps” that determine what will happen when a certain event occurs in one system and what actions will be taken in another.

Why is integration with Zapier useful, and what benefits does it bring?

  • Simple and fast connection: Integration with systems using Zapier is easy to set up and doesn’t require advanced technical knowledge. We can create our own zaps, customizing them to suit our needs in minutes.
  • Task automation: Zapier enables the automation of many tasks and processes, saving time and avoiding human error. This allows us to focus on more strategic aspects of the business.
  • Expanded functionality: With support for hundreds of applications and tools, Zapier allows us to create more advanced and integrated solutions. We can synchronize data, generate notifications, create reports, and more, combining different systems into a cohesive work environment.

An example of a simple Drupal integration with Excel via Zapier:

Source: Zapier

Drupal integrations – summary

Drupal is a highly flexible system in terms of extensibility, offering unlimited integration with other solutions and tools. As an open source software, it has a wide range of integration modules available on Drupal.org, which allow us to connect a website to various applications, including CRM, ecommerce, social media, etc.

With its own API and Symfony components, Drupal enables us to create custom integrations, giving us complete control over the communication process between systems. Protecting the data is a priority, and Drupal maintains the highest security standards during integration. If you need help with this tool for creating personalized and integrated websites, get support from an experienced Drupal agency. 

Keyword: ispo trade show

How Inscopix is Developing a Revolutionary Microscope System

Time to read: 5 min

In this Hardware Spotlight, we’re learning a lot about neurons and photons from Sam Malanowski, Product Engineer at Inscopix. Inscopix makes a miniaturized microscope system that allows for researchers to view large-scale neural circuit dynamics in freely behaving rodents. 

Sam shares with us his experience working as an engineer amongst a majority group of PhD researchers, how Inscopix is aligned with President Obama’s BRAIN initiative, and how developments in the consumer tech industry are helping to advance life sciences.

Can you tell us a bit about what Inscopix does?

As a company, Inscopix is aimed at advancing the entire field of neuroscience by providing end-to-end solutions of hardware, data analysis software, and scientific support to address entirely new scientific questions. The project was originally a PhD thesis by our two founding team members, Drs. Eric Cocker and Kunal Ghosh, in the lab of Professor Mark Schnitzer at Stanford – they graduated and started the company in 2011. It started off with the goal of imaging a large number of neurons concurrently on a freely behaving animal and we’ve since developed a remarkably small imaging system that can be attached to a mouse and allow it to go about its normal behavior. In the past, this type of imaging could only be done with very large benchtop microscope systems.

What is the significance of your microscope system as compared with the larger benchtop systems?

When the rodent is able to behave freely, scientists are able to address entirely new questions about how neural circuit activity patterns are correlated with particular behaviors. Correlating the dynamics of large populations of neurons to natural animal behaviors is a concept neuroscientists have dreamed of for years. By enabling neuroscientists to perform these types of experiments, we can get at the underlying neural circuit patterns that are associated with specific behaviors and neurological diseases.

President Obama recently announced the BRAIN initiative to help map the brain as part of the discovery of neurological disease treatments. How does Inscopix fit into this effort?

There’s still a lot to be done in mapping the brain and when it comes to neuroscience research, theres a huge unmet need for new technologies to help address those questions. We’re providing solutions that allow researchers to gather the data they need to start understanding the activity of the 100 billion neurons that comprise our brains. With the technology we have today, scientists are already making huge advances in understanding how neural circuit patterns go awry in animal models of various neurological disorders. Inscopix’s goal is to stay at the forefront of this rapidly-evolving neuroscience research tool market and continue providing solutions that enable researchers to address entirely new scientific questions.

What is it like to work as an Engineer amongst a large team of PhD researchers?

This is certainly one of the most impressive groups of people I’ve ever had a chance to work with. It feels like we are as much a research lab as we are a hardware startup. It’s really a unique atmosphere and the common goal isn’t just a product but also knowledge.

What is the biggest challenge you’ve faced from the ME side of things?

As a Mechanical Engineer at a startup, you quickly realize you’re not just a Mechanical Engineer anymore. You’re doing it all. For example, last week I had to learn how to use a very expensive oscilloscope to observe high speed data signals and some weeks I do more Python programming than Solidworks.

It’s great that I get to put my hands on all sorts of different things and there’s certainly no shortage of work to be done. When we’re trying to fix issues with our build while simultaneously trying to fix problems with suppliers, add functionality for the customer, tighten up the specs, document everything, and bring on new employees… it’s a whirlwind!

Is your manufacturing outsourced or done in-house?

We outsource the machining and electronics and then do all the final assembly in-house. It takes a lot of care to keep things clean. We’re counting on every photon we can get so we make sure to take care of all the fine detailed work ourselves. Coming from some other products I’ve worked with to here where photons and microns are what matter, it’s thinking on a different scale…literally.

How do you go about prototyping such an intricate and fragile product?

A lot of the work I have Fictiv doing in terms of rapid prototyping is for fixturing and tooling. You guys have made tools, for example, to handle our really tiny lenses and tools to hold our microscope and other components in different ways to speed up manufacturing testing.

Since we do our manufacturing assembly on-site we need very specialized tools and fixtures to test the products at a high standard. 3D printing is really enabling that.

How many iterations have there been to arrive at the current system?

The first iteration was the byproduct of eight years of interdisciplinary research at Stanford, bridging the fields of neuroscience, applied physics, electrical engineering and mechanical engineering. After the initial technology development at Stanford, the process to arrive at the current product was all about turning a lab prototype into a polished, reliable system that neuroscientists around the world can use for their studies. Much of this work was reliant on the available components – getting LED’s and custom optics that were small enough and a camera sensor with a high enough resolution, for example. Not an easy task.

Do you think the consumer tech industry is helping to reduce the cost and size of some of those components?

Definitely. It’s getting to the point where some of the high-volume customers of these components are starting to really push the tech forward and drive the price down. Sometimes the science community pushes the consumer tech industry forward and sometimes it’s the other way around. The power of a popular consumer tech product to drive down the cost of valuable components is incredible.

What’s the most rewarding aspect of your job?

I love that we’re in a space that isn’t really your everyday consumer product – it’s not an iPod and not everyone’s going to have one of these, but it’s going to have a huge impact. The things we and our customers are finding out about the brain is something you and I might not fully understand, but we can still feel the impact.

I’ve realized there’s still so much we don’t know about the brain and, consequently, there’s so much opportunity for discovery. Any small new feature I can make as a humble Mechanical Engineer on this project I know is really going to make an impact.

Keyword: ai retopology

LPJ-60SPI

The LPJ-60SPI,from Bussmann / Eaton,is High speed fuses.what we offer have competitive price in the global market,which are in original and new parts.If you would like to know more about the products or apply a lower price, please contact us through the “online chat” or send a quote to us!

  • Specifications
  • Package
  • Payment
  • Shipping
  • Contact US
Product Category :
High speed fuses
Manufacturer :
Bussmann / Eaton
Body Style :
Cartridge Fuses
Current Rating :
60 A
Fuse Size / Group :
Low-Peak
Fuse Type :
Time Delay / Slow Blow
Indicator Style :
Element Window
Interrupt Rating :
300 kA
Mounting Style :
Holder
Packaging :
Bulk
Product :
Class J Fuse
RoHS :
ROHS compliant
Series :
LPJ-SP
Termination Style :
Clip
Voltage Rating AC :
600 VAC

Sika expands production capacity for concrete admixtures

carbon steel gate valves

Sika continues to invest in its polymer production at the Sealy site in the US state of Texas. The latest expansion is the company’s second polymer investment in the US state of Texas in just five years. The polymers are the chemical building blocks needed to produce a concrete admixture from Sika, which, according to the company, significantly reduces water consumption in concrete production and to reduce the carbon footprint.

Improved strength and durability

Furthermore, it improves the strength and durability of the material through increased structural density and reduced porosity. By increasing production volumes, “Sika will be in the position to meet the rising demand. This investment aligns with the global shift towards more sustainable construction – specifically the requirements for lower embodied carbon concrete”, says Mike Campion, Regional Manager Americas.

Why Is Your Hair Shedding So Much? 8 Possible Explanations

Voluminous hair that catches the light beautifully is often what’s considered healthy. So if you find yourself staring at the shower drain and the number of hair strands clogging it up, it can be distressing.

Thankfully, some hair loss is normal. However, you can experience an increase in hair shedding for various reasons. To understand the science behind hair thinning, VEGAMOUR spoke to an expert. Plus, find out what products you can use to encourage thicker, fuller looking hair.

Why Is My Hair Shedding?

The sight of your hair strands falling out might frighten you, but it’s worth remembering that shedding is a natural part of the hair cycle, just as new hair growth is.

Dermatologist, hair transplant expert, cosmetic surgeon and medical head of ClinicSpots, Dr. HariKiran Cheruki, clarified, “Hair shedding is a natural process that occurs to all mammals, including humans. Every day, strands of hair naturally fall out as part of the growth cycle and will eventually be replaced with new ones. This normal process of shedding helps keep our hair healthy and strong by removing dead, weak or damaged hairs. It typically involves between 50 to 150 strands daily for most people.”

There are up to 100,000 hair follicles on the average person’s head, so losing 100 hair strands a day won’t make a massive difference to how your mane looks. But just because the hair sheds naturally doesn’t mean you should stop paying attention to your strands. Knowing your normal hair-shedding pattern will help you identify excessive hair shedding if it arises. Some other signs of excessive shedding could include:

  • Bald patches and clumps of hair falling out
  • A receding hairline or a wider part
  • Thinning ponytail or noticeable loss of hair volume

    BEST SELLER: GRO HAIR SERUM FOR THICKER LOOKING HAIR

    How to Tell if You’re Losing Too Much Hair

    If you can’t quite tell the difference between a normal amount of hair loss and excessive shedding, you can perform an easy “pull test” at home. Run your fingers through a clean, dry area of the hair and gently tug at it. If more than a couple of hairs are left in your hand after you pull, you might be experiencing some hair loss.

    Alopecia areata is the medical term for hair loss and refers to a complex condition that can trigger slow-progressing hair shedding and patchy hair loss. If your gradual hair thinning is becoming very noticeable, always check in with a doctor to get a second opinion.

    If you’re constantly asking yourself, why is my hair shedding so much? It could be due to one or more of these seven reasons.

    1. Telogen Effluvium

    The hair from our scalp grows in the following cycles:

    • The anagen phase or the hair growth phase. Depending on age and genetics, this stage in the hair growth cycle can last between two to six years. Lifestyle can play a part too. When the hair stops growing, it’s often called anagen effluvium.
    • The catagen phase is when the hair stops growing. This stage can last from 10 days to four months, and only about 1%-2% percent of your hair is in this stage at any one time.
    • The telogen phase is the resting phase of the cycle. The hairs that rest in this phase can also be referred to as club hairs. During the telogen phase, the hair shaft rests as it prepares to detach from your head. Only about 9% of hair strands are in this stage at a time.
    • The exogen phase is a shedding phase. You can lose up to 100 hairs per day during this cycle, which only lasts a few days. At the same time you’re losing hair, the anagen phase is at play pushing new hairs up through the follicles.

      Telogen effluvium occurs when 10% of the hair on your head remains in the telogen phase. Telogen effluvium is temporary, but you’ll likely notice more hairs falling out than usual. Sleep deprivation, stress, a poor diet and more might cause you to lose hair, but it’s most often temporary and will resolve over a period of time.

      Try a Serum for Healthy Looking Hair

      Popular Products

      Save $101

      Hair

      GRO Hair Serum (3 Pack)

      Save $81

      Hair

      GRO Revitalizing Shampoo and Conditioner Kit

      Save $131

      Hair

      GRO Full Routine Kit

      Hair

       

      VEGAMOUR’s best-selling, lightweight, non-greasy GRO Hair Serum uses plant-based ingredients, like red clover, mung bean and curcumin. It can:

      • Reduce signs of shedding by up to 85%*
      • Increase the appearance of hair density by up to 56%*

      *Based on a 120-day independent, third-party clinical study with 40 participants using GRO Hair Serum once daily.

      2. Genetics

      Hereditary hair loss can wreak havoc on your hair growth, and it could be the reason why you lose strands fast. Female pattern baldness can affect women of any age but is more common after menopause. Hereditary hair loss in males is more common and can be very obvious. Men can start to lose their hair at any age, and the amount of strands they lose is determined by the genes they’ve inherited from their parents. “Genetics is also a major factor in determining how much someone may experience shedding — some people are more prone than others due to their family history,” said Cheruki.

      REVIEW: My Experience With GRO+ Advanced Hair Serum

      3. Thyroid Conditions

      The thyroid is a butterfly-shaped gland that’s found at the base of your neck. The thyroid makes hormones that help regulate the body’s metabolism. When the thyroid produces too many or too few hormones, it can cause symptoms such as weight gain, irritability, weight loss, fatigue, extra hair and hair loss. If you’re concerned and noticing a plethora of unusual symptoms alongside your hair loss, check in with a general practitioner for further guidance.

      4. Daily Heat Styling

      If you rely on hot tools for your short or long hair, you might experience breakage, split ends and more damage than most. It’s possible that extreme heat and twisting the hair excessively with heated rollers can lead to thinning and something called traction alopecia.

      5. Tight Hairstyles

      Traction alopecia can also be triggered by constantly wearing your hair in too-tight hairstyles. The pulling and tugging of the strands can impact how much hair falls out and damage hair follicles permanently. Avoid tight hairstyles like the following:

      • Cornrows
      • Dreadlocks
      • Tight braids
      • Buns and tight ponytails
      • Hair extensions and weaves

        6. An Unhealthy Diet

        A balanced diet with plenty of proteins, vegetables and healthy fats will give you the essential nutrients that the hair needs to grow. However, an iron deficiency might be at the root of your hair loss. Schedule bloodwork and consult with your doctor to find out if you are suffering from a deficiency. Your doctor might recommend dietary changes or supplements to help your body get the goodness it needs.

        Related: GRO Biotin Gummies for Healthy Looking Hair

        7. Dandruff

        Dandruff in and of itself won’t cause hair loss, but it can cause distress and embarrassment from the persistent white flakes and itchy scalp that result from the condition. 

        scalp detox serum can soothe and refresh the scalp while reducing the appearance of adherent and non-adherent flakes. However, there are other skin conditions that might trigger hair loss, including the following:

        • Malassezia fungus
        • Lichen planopilaris
        • Tinea capitis, also known as scalp ringworm

          8. Certain Medications

          When the body experiences a sudden change, like a new medication or even giving birth, substantial shedding can occur. Everyone can react differently to different drugs, so it’s hard to define which medicines exactly will cause excessive shedding, however, certain birth control pills can cause hair loss. If you’ve recently started taking a new prescription and have noticed more shedding than usual, talk to your doctor.

          See: Can Birth Control Cause Hair Loss? We Asked Medical Experts

          Stop the Shedding

          Hair grows in cycles, and naturally, your scalp will shed between 50 and 100 hairs a day. But if you notice your normal shedding is getting out of your hand, there might be an underlying issue. Thankfully, in most cases, hair loss is temporary, and by committing to a plant-based hair wellness routine with proven results for decreasing shedding and encouraging thicker, fuller-looking hair, your strands will stay nourished from the inside out. And if you are worried that your hair is shedding excessively, always check in with a dermatologist or medical professional for some expert guidance.

          More From VEGAMOUR

          • Experiencing Itchy Scalp and Hair Loss? Read This
          • 3 Ways a Daily Biotin Supplement Can Benefit Your Hair, Skin and Nails
          • Shop Kathleen Post’s VEGAMOUR Picks

          Photo credit: Polina Tankilevitch/Pexels

          All testimonials are by real people and may not reflect the typical purchaser’s experience and are not intended to represent or guarantee that anyone will achieve the same or similar results.

          Author

          Sophie O’Kelly

          Author

          Sophie O’Kelly

          Sophie O’Kelly is a well-being writer with over a decade of experience working with international beauty and fashion brands. She recently qualified as a mental health therapist, teaches yoga in her spare time and writes about the psychological and physical importance of solid and ongoing self-care. She currently lives in London, England.

          Sophie recommends

          GRO Revitalizing Shampoo and Conditioner Kit

          4.6 Rated 4.6 out of 5 stars1,036 Reviews

          Buy now

          Your Guide to Saturday’s Ligue 1 Action

          Saturday: Lorient vs Rennes (16:00 GMT)

          Lorient have the chance to overtake rivals Rennes in the table this Saturday as the two teams clash at the Stade du Moustoir. The hosts have been in great form lately, winning four of their last six league games, as well as drawing away at Marseille in their most recent outing.

          The same cannot be said about Rennes, though. Since seeing their four match winning streak ended by Lille in mid-September, the visitors have failed to win in their last five, four of which have been losses. That run of results has seen Philippe Montanier’s men drop from second to seventh in the standings and he will be eager to get back to winning ways soon.

          Saturday: Gazelec Ajaccio vs Nice (19:00 GMT)

          The fixture list doesn’t get any easier for bottom-of-the-table Gazelec Ajaccio as high-flying Nice visit the Stade Ange Casanova this Saturday. The hosts are still searching for their first top-flight victory and are now one point adrift at the foot of the table, having lost their last outing 2-0 away at St Etienne.

          Nice, on the other hand, are arguably the hottest team in Europe right now, having won each of their last four league matches in tremendous style, scoring 17 goals in the process. Their form has seen them rocket up to sixth in the standings and they can break into the top four if they claim another victory here this weekend.

          Click Here: collingwood magpies 2019 training guernsey

          Saturday: Angers vs Guingamp (19:00 GMT)

          Surprise package Angers will be aiming to continue their good form as they take on Guingamp at the Stade Jean-Bouin this Saturday. It’s safe to say that the newly-promoted club have adapted to life in the top-flight, as they head into this game second in the table, having lost just once so far this campaign. The hosts have won each of their last three league outings and can move to within two points of leaders PSG ahead of the capital club’s game on Sunday.

          Guingamp, meanwhile, are in decent form themselves, having lost only one of their last seven. After making a dreadful start to the season, Jocelyn Gourvennec’s side have stabilised themselves and could break into the top half with a result here.

          Saturday: Montpellier vs Bastia (19:00 GMT)

          Two of this season’s struggling sides meet at the Stade de la Mosson this Saturday as Montpellier face off against Bastia. Both sides have made slow starts to the campaign, with the hosts having won just once so far, at home against Lorient in Week 8. Since then, they have lost to Lille and, most recently, held Bordeaux to a goalless draw.

          The visitors, meanwhile, have lost six of their last seven league outings, plummeting down the table as a result. A 2-0 defeat against PSG last weekend saw Ghislain Printant’s men hit 15th, although they are still five ahead of this weekend’s opponents.

          R.B.

          Seconds – Thick Wall Glass Candle Jar – White 300mls

          NOTE: This jar has imperfections and is not recommended for retail. The paint on these jars come off when hot wax is poured. These are still suitable to test your fragrance strength or use as a fragranced tester.

          This is a very strong, thick glass jar and complies with ASTM 2179 AND 2147 testing methods. (Ensures glass is able to withstand heat and has no cracks or fractures)

          Measurements: Height 9.2cm, Width 9cm.

          Approximate Volume: 300mls

          Finish: White inner spray*

          We recommend 4mm Cotton Wicks for this jar.

          * As theses candle jars have undergone a water soluble paint finish, (rather than a solvent finish) they are more prone to scratching, so please take care when handling the jars. Washing, soaking and immersing the candle jars in soapy water will soften and deteriorate the finish. Use only a DRY – soft cloth (microfibre is best) to remove dust, prior to filling. The water soluble paint finish performs just like coloured glass during burning.