Planet Drupal

Syndicate content
Drupal.org - aggregated feeds in category Planet Drupal
Updated: 19 hours 59 min ago

Lullabot: An Accessibility Checklist for Your Website: Part 2

Tue, 10/27/2020 - 16:12

This article is part 2 of a series that outlines key points to consider when designing and building more accessible websites.

It takes a coordinated team effort in making sure a site is accessible. Whether it's reviewing your design for color contrast, conducting usability testing to assure you address any usability issues, or developing for readability and proper text spacing, great teamwork makes for great accessibility.

Specbee: What To Expect From Drupal 9.1

Tue, 10/27/2020 - 13:00
What To Expect From Drupal 9.1 Malabya Tiwari 27 Oct, 2020 Top 10 best practices for designing a perfect UX for your mobile app

Drupal 9.1 is set to release in December 2020 but will enter the alpha phase this month, Oct 2020 and will have a beta release in November 2020. The minor version update of Drupal will see more deprecations and updating third party packages. However, there are 2 notable changes which will be happening in the Drupal 9.1 release.


 

A New Default Drupal Theme

Olivero is the new Drupal theme which is in the experimental state. The default theme Bartik has been around since 2011 and has served well over the years. After the Drupal 8 release, a new version of Bartik was released which was responsive out of the box. However, with the change in web design trends, the Bartik theme seems outdated compared to the prowess of Drupal 9 which needed a new modern & clean theme. This is also necessary for evaluators of Drupal to have a good first impression then they assess Drupal for their next big project.

The Olivero theme is added to the Drupal core and will be shipped with Drupal 9.1.0 as an experimental theme. The maintainers are planning to have a stable release and make it the default theme swapping out Bartik in the next minor release - Drupal 9.2

Native Image Lazy Load

One of the biggest factors for a successful website is how performant the site is. Lazy-loading of page elements, especially images, is a powerful way to increase perceived performance, reduce time-to-first-render, and reduce user friction on the web.

Images are the most requested assets during a page load and takes up more bandwidth than other resources. Lazy loading images can be done using JavaScript plugins or using Intersection Observers. In Drupal there are contributed modules available which does the job. However, these solutions are not native and often requires some complex setup and configurations to achieve a proper lazy loading of images.

The html 'loading' attribute used by Chrome platform which implies to simple add a loading="lazy" to the images to defer loading of the resource until it reaches a calculated distance from the viewport.

This is now added to all images out of the box and will be available in the Drupal 9.1.0 release. Supports any Chromium based browser like Chrome, Edge, Opera, and Firefox (with support for Safari still in progress). This will highly impact the perceived performance of Drupal sites and combined with other mechanisms like Big Pipe, it will greatly improve the performance.

Updated to PHPUnit 9

Another update which Drupal 9.1.0 will receive is for developers. The third-party dependency, PHPUnit which powers solid the testing framework used in Drupal will be updated to the latest version while keeping the support of 8.4 for backward compatibility. This update was added to make Drupal 9 ready for PHP 8 which will be releasing on November 26th, 2020. 

Other changes which are included are mostly deprecation of methods and introducing overridable services. A full list of change records can be found here.

Although the Drupal 9 release was huge, there were no significant changes made other than cleaning up of deprecated code. Drupal 9.1 is the first release with new and exciting features to look forward to. 
Want to create your next website on Drupal 9? Contact our Drupal experts today
 

Drupal Planet Shefali ShettyApr 05, 2017 Subscribe For Our Newsletter And Stay Updated Subscribe

Leave us a Comment

  Shefali ShettyApr 05, 2017 Recent Posts Image What To Expect From Drupal 9.1 Image All about Progressive Web Apps and Implementing it in Drupal 9 Image Business Process Automation with Drupal – Top Drupal 8 (and 9) modules and distributions Want to extract the maximum out of Drupal? TALK TO US Featured Success Stories

Know more about our technology driven approach to recreate the content management workflow for [24]7.ai

link

Find out how we transformed the digital image of world’s largest healthcare provider, an attribute that defined their global presence in the medical world.

link

Discover how a Drupal powered internal portal encouraged the sellers at Flipkart to obtain the latest insights with respect to a particular domain.

link

Joachim's blog: Different ways to make entity bundles

Tue, 10/27/2020 - 12:52

A lot of the time, a custom content entity type only needs a single bundle: all the entities of this type have the same structure. But there are times where they need to vary, typically to have different fields, while still being the same type. This is where entity bundles come in.

Bundles are to a custom entity type what node types are to the node entity type. They could be called sub-types instead (and there is a long-running core issue to rename them to this; I'd say go help but I'm not sure what can be done to move it forward), but the name 'bundle' has stuck because initially the concept was just about different 'bundles of fields', and then the name ended up being applied across the whole entity system.

History lesson over; how do you define bundles on your entity type? Well there are several ways, and of course they each have their use cases.

And of course, Module Builder can help generate your code, whichever of these methods you use.

Quick and simple: hardcode

The simplest way to do anything is to hardcode it. If you have a fixed number of bundles that aren't going to change over time, or at least so rarely that requiring a code deployment to change them is acceptable, then you can simply define the bundles in code. The way to do this is with a hook (though there's a core issue -- which I filed -- to allow these to be defined in a method on the entity class).

Here's how you'd define your hardcoded bundles:

/** * Implements hook_entity_bundle_info(). */ function mymodule_entity_bundle_info() { $bundles['my_entity_type'] = [ 'bundle_alpha_' => [ 'label' => t('Alpha'), 'description' => t('Represents an alpha entity.') ], 'bundle_beta_' => [ 'label' => t('Beta'), 'description' => t('Represents a beta entity.') ], ]; return $bundles; }

The machine names of the bundles (which are used as the bundle field values, and in field names, admin paths, and so on) are the keys of the array. The labels are used in UI messages and page titles. The descriptions are used on the 'Add entity' page's list of bundles.

Classic: bundle entity type

The way Drupal core does bundles is with a bundle entity type. In addition to the content entity type you want to have bundles, there is also a config entity type, called the 'bundle entity type'. Each single entity of the bundle entity type defines a bundle of the content entity type. So for example, a single node type entity called 'page' defines the 'page' node type; a single taxonomy vocabulary entity called 'tags' defines the 'tags' taxonomy term type.

This is great if you want extensibility, and you want the bundles to be configurable by site admins in the UI rather than developers. The downside is that it's a lot of extra code, as there's a whole second entity type to define.

Very little glue is required between the two entity types, though. They basically each need to reference the other in their entity type annotations:

The content entity type needs:

* bundle_entity_type = "my_entity_type_bundle",

and the bundle entity needs:

* bundle_of = "my_entity_type",

and the bundle entity class should inherit from \Drupal\Core\Config\Entity\ConfigEntityBundleBase.

Per-bundle functionality: plugins as bundles

This third method needs more than just Drupal core: it's a technique provided by Entity module.

Here, you define a plugin type (an annotation plugin type, rather than YAML), and each plugin of that type corresponds to a bundle. This means you need a whole class for each bundle, which seems like a lot of code compared to the hook technique, but there are cases where that's what you want.

First, because Entity module's framework for this allows each plugin class to define different fields for each bundle. These so-called bundle fields are installed in the same way as entity base fields, but are only on one bundle. This gives you the diversification of per-bundle fields that you get with config fields, but with the definition of the fields in your code where it's easier to maintain.

Second, because in your plugin class you can code different behaviours for different bundles of your entity type. Suppose you want the entity label to be slightly different. No problem, in your entity class simply hand over to the bundle:

class PluginAlpha { public function label() { $bundle_plugin = \Drupal::service('plugin.manager.my_plugin_type') return $bundle_plugin->label($this); } }

Add a label() method to the plugin classes, and you can specialise the behaviour for each bundle. If you want to have behaviour that's grouped across more than one plugin, one way to do it is to add properties to your plugin type's annotation, and then implement the functionality in the plugin base class with a conditional on the value in the plugin's definition.

/** * @MyPluginType( * id = "plugin_alpha", * label = @Translation("Alpha"), * label_handling = "combolulate" class MyPluginBase { public function label() { switch ($this->getPluginDefinition()['floopiness']) { case 'combolulate': // Return the combolulated label. } } }

For a plugin type to be used as entity bundles, the plugins need to implement \Drupal\entity\BundlePlugin\BundlePluginInterface, and your entity type needs to declare the plugin:

* bundle_plugin_type = "my_plugin_type",

Here, the string 'my_plugin_type' is the part of the plugin manager's service name that comes after the 'plugin.manager' prefix. (The plugin system unfortunately doesn't have a standard concept of a plugin type's name, but this is informally what is used in various places such as Entity module and Commerce.)

The bundle plugin technique is well-suited to entities that are used as 'machinery' in some way, rather than content. For example, in Commerce License, each bundle of the license entity is a plugin which provides the behaviour that's specific to that type of license.

One thing to note on this technique: if you're writing kernel tests, you'll need to manually install the bundle plugins for them to exist in the test. See the tests in Entity module for an example.

These three techniques for bundles each have their advantages, so it's not unusual to find all three in use in a single project codebase. It's a question of which is best for a particular entity type.

ComputerMinds.co.uk: Reflecting on Drupal Slack

Tue, 10/27/2020 - 11:09

Over the last year or so, I've got quite engaged with Drupal slack. I've loitered in channels like #d9readiness and #config, discussed issues with members of the security team, and asked questions to module maintainers (and received answers!). But most of all, I've helped people out in the #support channel. This has been an interesting experience in many ways, so I thought I'd share my reflections. The Drupal slack workspace is intended for the community, so if you're reading this - it's probably for you too. Hopefully my thoughts might help prepare you to use it as an effective tool.

Ultimately, I've got stuck in as a way to contribute to the Drupal community in a new way as part of our CM contribution challenge. That has given me motivation to give more than I get, but I've been pleasantly surprised how much I - and ComputerMinds - have benefitted from being part of Drupal slack. When we've been unsure about the status of a module or the way forward with an issue, it's been great to be able to reach out to exactly the right people. Especially in the current climate that limits our ability to meet people in-person (e.g. at Drupalcon). So, thank you to those people that have helped me :-) We've even received sponsorship to work on some module issues after discussion on slack - we ended up becoming responsible for releasing security fixes for the Commerce Ingenico project after it had been shut down due to vulnerabilities. That's a win for us, and it's a win for the community, who can use that module once again.

Slack has benefits, but also drawbacks, as it is yet another system clamouring for attention in a crowded digital world. So it's important to use it appropriately for the good of the community, but also wisely for your own sanity. Drupal's challenging learning curve means that there are a lot of people out there wanting help, and the #support channel is full of them. (I've spotted some of the most experienced drupallers asking for help there too; so it's not just for newbies.)

Source: Learning Curve for Popular CMS

Sustaining a good level of support is a challenge, especially doing so with a friendly manner. My approach has been to answer questions I know I can help with and avoid those that I know other people would be better placed to answer. Some questions can suggest a shaky foundation of understanding, so unless I'm sure I can help fix that, I tend to stay away from those too. Often a question is a symptom of a deeper issue - either with someone's website, or their understanding of Drupal components. On the whole, I believe I have helped a lot of people - and not just with their immediate questions. Some people come back to me with direct messages weeks or months later, knowing that I might be able to help.

Unfortunately my mental health has suffered a bit since the coronavirus pandemic began, so I've had to keep an eye out for things that may be contributing to that. Slack offers connection to people 24/7 - which can be good, but it's not a truly deep connection, and can be relentless. While my motivation for interacting with Drupal slack was to try and contribute to the community, that's not entirely for it's own sake. ComputerMinds want to help Drupal and its community flourish - but that's partly because we want that for our own benefit! So I decided to focus on supporting people that might be within closer reach, by skipping over most posts from outside UK business hours. (I'll happily reply to DMs/threads asynchronously though if necessary.)

In conclusion, I think Drupal slack is a really handy tool for connecting with the Drupal community. I'm very glad to help people through it, even if that means only making a difference slowly, to one person at a time. There are some incredibly helpful people on there who I see answering questions again and again. I tried to be one of those for a while, though I learnt to take care to make my offering sustainable. If you need help, try out Drupal slack. If you don't .... then you can probably be a help to someone there! Most of us are a mix of those extremes anyway. Try to be kind on slack - to yourself and others. I figure if we all help each other, we might make climbing that Drupal learning cliff a bit more personal, and a bit more pleasant. Win-win!

 

Photo by Paul Gilmore on Unsplash

Dries Buytaert: Acquia Engage Keynote 2020

Tue, 10/27/2020 - 09:06

Acquia Engage took place last week. For the first time in seven years, it was an all-virtual event.

The virtual conference lobby of Acquia Engage, modeled after our Boston office's lobby.

The best way to learn about what Acquia has been up to, is to watch the recording of my opening keynote. In 30 minutes, I cover 10 major updates to Acquia's Digital Experience Platform. We packed the presentation with short product demos. You can also download a copy of my slides (65 MB), but you won't get the see the demos.

Acquia Drupal Cloud updates

First, I talked about new features for Acqiua's Drupal Cloud. All features are focused on helping developers migrate, develop, design and launch Drupal sites faster.

I covered the following new features for Acquia's Drupal Cloud:

  • Acquia Migrate: A family of products that help you migrate to Drupal 9 five times faster and easier.
  • Acquia Cloud IDE: A cloud-based development environment optimized for Drupal and Acquia.
  • Acquia CMS: An easy, out-of-the-box distribution of Drupal 9. It comes pre-integrated with Acquia's products.
  • Acquia Site Studio Page Builder: A new page builder for Acquia's low-code/no-code website building tool. It's optimized for marketers and content creators.
  • Acquia Cloud Next: A container-based cloud hosting environment optimized for speed, scale and security.
Acquia Marketing Cloud updates

Next, I covered new Marketing Cloud features. Marketers today are using more and more tools to get their jobs done. Unfortunately, many of these tools are not well-integrated. This lack of integration results in siloed customer information and inefficient marketing. Ultimately these silos lead to poor customer experiences. Acquia Marketing Cloud solves these problems by eliminating these silos. We combine or unify customer data profiles, segments, analytics, and machine learning capabilities into a single, easy-to-use platform.

New announcements for Acquia's Marketing Cloud include:

  • Unified real-time user profiles: Aggregates customer actions across platforms into profiles in real-time. Use them instantly in marketing campaigns.
  • Universal segments: Use consistent segments across every tool within Acquia Marketing Cloud. A segment created in our Customer Data Platform (CDP) automatically becomes available in our website personalization product and multi-channel marketing automation solution.
  • 360º marketing analytics: Measures marketing campaign effectiveness across the Acquia Marketing Cloud.
  • "Predictive sends" machine learning model: Uses machine learning to predict the best time to send campaign emails.
  • COVID-19 dashboard: Helps you understand your customers' shift from offline to online, as well as changes in channel preferences, product preferences and opportunities for growth.
Closing words

I'm proud that Acquia is innovating faster than ever before. I want to thank our product and engineering teams for working incredibly hard in the midst of a pandemic.

Aram Boyajyan: Drupal 8 JS event after opening AJAX modal

Tue, 10/27/2020 - 08:04
Drupal 8 JS event after opening AJAX modal

Drupal provides a few custom events for AJAX modals. Even though the modal itself is provided by jQuery UI library, these events are custom and are provided by Drupal itself.

There are a few events you can use here:

superuser Tue, 27/10/2020 - 08:04

Josef Kruckenberg / dasjo: Participate in the COVID-19 Client Relationships Retrospective Survey

Tue, 10/27/2020 - 01:00

How did the COVID-19 crisis affect client relationships and what can we take out of it? Take our global survey to help collect insights about how client relationships developed through the last year, what were our high and low lights and what can we take out of it?

The survey is open until November 8, 2020.

An anonymised summary of the survey results will be published in a blog post on Drupal Planet in November 2020.

You can then also participate in our online retrospective session at DrupalCon Europe, Wednesday 9th December - 15:15 to 17:15 UTC

Thank you for sharing your insights to help everyone grow. The data collected in this survey will be processed respecting everyone’s privacy. Link to the survey.

Photo by Julia M Cameron from Pexels

1xINTERNET blog: Three nomination for the German and Austrian Splash Awards

Mon, 10/26/2020 - 13:00
This year 1xINTERNET has three nominations for the German and Austria Splash awards taking place next Thursday 29th of October. The event will be virtual this year and is free for everyone.

PreviousNext: Join us at the DrupalGov 2020 Code Sprint

Mon, 10/26/2020 - 05:28

This year DrupalGov is virtual. The PreviousNext team is sponsoring and helping to run the DrupalGov 2020 Sprint Day on Wednesday 4 November, and there are a few things you can do now to hit the ground running on the day.

by kim.pepper / 26 October 2020 This year the DrupalGov sprint will be virtual

We’ll start the day with a brief Zoom meeting to introduce the organisers, and outline how the day will run.

We’ll use #australia-nz Drupal Slack as the main communication channel, with ad hoc Zoom or Meet video calls for those who want to dive deeper into a topic.

For the majority of the day, we’ll be using Slack threads to keep track of sprint topics and reduce the noise in the main channel.

Join us on Slack

If you haven’t already done so, now is a great time to sign up and join the Australian / New Zealand Drupal community in Slack. Instructions for how to join are here: https://www.drupal.org/slack

Let us know about your experience

Please fill in the following survey to let us know about your experience with Drupal, and the areas you’re interested in Sprinting on. This will help us better prepare for the day.

https://www.surveymonkey.com/r/2DPWDPL

How to contribute

Sprint day is not just for developers! Contribution comes in many forms. If you’re interested in the different ways you can contribute to this amazing project, see the list of contributor tasks: https://www.drupal.org/contributor-tasks

Tagging issues to work on

If you want to see what might be an interesting issue to work on, head over to the Drupal.org Issue Queue and look for issues tagged with 'DrupalGov 2020'. These are issues that others have tagged.

You can also tag an issue yourself to be added to the list.

Set Up a Development Environment

There is more than one way to shear a sheep, and there is also more than one way to set up a local development environment for working on Drupal.

If you don't already have a local development environment setup, we recommend using Docker Compose for local development - follow the instructions for installing Docker Compose on OSX, Windows and Linux.

Once you've setup Docker compose, you need to setup a folder containing your docker-compose.yml and a clone of Drupal core. The instructions for that vary depending on your operating system, we have instructions below for OSX, Windows and Linux, although please note the Windows version is untested.

Mac OSX mkdir -p ~/dev/drupal cd ~/dev/drupal wget https://gist.githubusercontent.com/larowlan/9ba2c569fd52e8ac12aee962cc9319c9/raw/e69795e7219c9c73eb8d8d171c31277eeb5bcbaa/docker-compose.yml git clone --branch 8.9.x https://git.drupalcode.org/project/drupal.git app docker-compose up -d docker-compose run -w /data/app app composer install Windows git clone --branch 8.9.x https://git.drupalcode.org/project/drupal.git app docker-compose up -d docker-compose run -w /data/app app composer install Linux mkdir -p ~/dev/drupal # or wherever you want to put the folder cd ~/dev/drupal wget https://gist.githubusercontent.com/larowlan/63a0f6efacee71b483af3a2184178dd0/raw/248dff13557efa533c0ca297d39c87cd3eb348fe/docker-compose.ymlgit clone --branch 8.9.x https://git.drupalcode.org/project/drupal.git app docker-compose up -d docker-compose exec app /bin/bash -c "cd /data/app && composer install"

If you have any issues, join us on Drupal slack in the #australia-nz channel beforehand and we'll be happy to answer any questions you might have.

Install dreditor browser extension

Dreditor is a browser extension that makes it easier to review patches on Drupal.org. Its a must for anyone contributing to Drupal.

There are versions for Firefox and Chrome.

Find Issues to Work On

If you want to see what might be an interesting issue to work on, head over to the Drupal.org Issue Queue and look for issues tagged with 'DrupalGov 2020'. These are issues that others have tagged.

You can also tag an issue yourself to be added to the list.

Being face-to-face with fellow contributors is a great opportunity to have discussions and put forward ideas. Don't feel like you need to come away from the day having completed lines and lines of code.

Code of conduct

To provide a safe and inclusive environment, the sprint day will abide by the DrupalSouth Code of Conduct: https://drupalsouth.org/code-of-conduct

We look forward to seeing you all there!

Tagged Code Sprint, DrupalSouth, DrupalGov 2020

Spinning Code: SC DUG October 2020: Getting Started in Consulting

Sat, 10/24/2020 - 19:03

This month’s SC DUG featured Mauricio Orozco posing questions about getting started as a consultant to long-time members who have all done some work with Drupal as a consultant.

https://www.youtube.com/watch?v=4NG5lgDOFzs

If you would like to join us please check out our upcoming events on Meetup for meeting times, locations, and remote connection information.

We frequently use these presentations to practice new presentations, try out heavily revised versions, and test out new ideas with a friendly audience. So if some of the content of these videos seems a bit rough please understand we are all learning all the time and we are open to constructive feedback. If you want to see a polished version checkout our group members’ talks at camps and cons.

If you are interested in giving a practice talk, leave me a comment here, contact me through Drupal.org, or find me on Drupal Slack. We’re excited to hear new voices and ideas. We want to support the community, and that means you.

Drupixels: Export and import Drupal database with drush command

Fri, 10/23/2020 - 05:34
Drush is the ultimate tool and companion for Drupal and it does a great job in situations where we want to import or export our Drupal database.

Amazee Labs: Why enterprises trust the Amazee Labs Open Source Tech Stack over Adobe Experience Manager

Thu, 10/22/2020 - 09:37
<img src="https://www.amazeelabs.com/sites/default/files/styles/leading_image/public/images/current-affairs/Amazee-Labs-Tech-Stack_1.jpg?h=994a2424&amp;itok=nM74aYm4" width="1120" height="630" alt="Graphic of blog title, Why enterprises trust the Amazee Labs Open Source Tech Stack over Adobe Experience Manager" title="Why enterprises trust the Amazee Labs Open Source Tech Stack over Adobe Experience Manager" class="image-style-leading-image" /> Amazee Labs has been contributing to Drupal since the very early days of the project. Our contributions range from writing patches and maintaining modules, through to contributing to new releases and we’re proud to be one of the most experienced Drupal agencies in the world. In recent years, we have moulded our technology stack from several key components, some of which go beyond Drupal. 

Third & Grove: Acquia Engage 2020 Winner: CloudHealth by VMware

Thu, 10/22/2020 - 04:12

Third and Grove was recognized in the 2020 Acquia Engage Award program, winning an award for Leader of the Pack - Technology, for work with CloudHealth by VMware.

Third & Grove: Acquia Engage 2020 Winner: The Carlyle Group

Thu, 10/22/2020 - 04:09

Third and Grove was recognized in the 2020 Acquia Engage Award program, receiving an award for Leader of the Pack - Financial Services, for work with The Carlyle Group.

Promet Source: Pandemic Sparks Web Accessibility Breakthroughs

Thu, 10/22/2020 - 03:29
The impact of this years’ shelter-in-place orders and social distancing guidelines, along with every aspect of how we have coped -- or not coped -- with Covid-19 will be analyzed for years to come. Big changes have emerged in the ways that we interact with the world, and the next normal will likely bring with it many differences in the ways that we live, work, and play.  

Lullabot: Web Development Strategy in a Drupal 9 World

Wed, 10/21/2020 - 15:21

The Drupal 8 to Drupal 9 upgrade path represents a big change for the Drupal world. The big change is that…your organization’s website won’t require a big change. The first iteration of Drupal 9 is just Drupal 8 with all of the deprecated code removed, mimicking Symfony’s model of major release upgrades.

This is good news. Keeping your platform up-to-date with the next version is no longer an “all hands on deck” situation.

Drudesk: Add Image Effects on the Drupal 8 website — A Guide to Image Effects module for Drupal 8

Wed, 10/21/2020 - 14:49

Drupal 8 has already proven its versatility. Its core already has modules for working with images, but installing additional modules will not hurt (for example, the Image effects module).

If you stop using just your Drupal site's standard features, there is no question that your site will increase in convenience, attractiveness, and victory over your competitors!

Our web development agency has created today's blog to expand your site's horizons and introduce you to the main features of the Image effects module. Enjoy your reading!

Centarro: Commerce Paypal release adds Credit Messaging integration

Wed, 10/21/2020 - 05:14

Have you noticed when you’re happily browsing your favorite online store that you can choose to spread payments over several monthly installments with PayPal? This is a feature of PayPal Credit, a revolving line of credit that gives customers the flexibility to buy now and pay over time.

PayPal Credit has been around for some time, but Credit Messaging is now available for merchants in the United States who wish to promote the availability of special financing offers throughout the entire shopping experience.

Commerce PayPal 8.x-1.0-beta11 now features the basics you need to integrate Credit Messaging into your store. There is eligibility involved, so please check you’re able to use this service.

What does it look like?

We have created a Drupal block you can use anywhere to display the Credit Messaging. It is also fully customizable; you can choose to have Lightweight Text Based Messages, or Flexible Display Banners:

Read more