Drupal

Third & Grove: Drupal GovCon: Day 1 Recap

Planet Drupal - 20 July 2016 - 11:03am
Drupal GovCon: Day 1 Recap abby Wed, 07/20/2016 - 14:03
Categories: Drupal

Into my Galaxy: GSoC’ 16: Port Search Configuration module; coding week #8

Planet Drupal - 20 July 2016 - 10:50am

I have been porting Search Configuration module from Drupal 7 to 8 as part of this year’ s Google Summer of Code (GSoC). This summer program is an opportunity for university students to work on projects connected with open source organisation. I have been really lucky to be a part of this initiative. I could explore deep of more technologies, version control systems as part of my project in Drupal. This gives young students a platform where they are assigned mentors who are experts and experienced in various software.

Last week, I could learn some of the Drupal concepts as part of this module port. So, let me begin with the Drupal 7 property. The t function translates a string to the current language or to a given language. This makes the strings used in Drupal translatable. This generally takes up the format:

t($string, array $args = array(), array $options = array());

Here, $string is the string containing the English text to get translated.

$args: An associative array of replacements to make after translation.

$options: An optional associative array of additional options, with the following elements: lang code and context.

This t function has got some alteration in the Drupal 8. It has been replaced by the $this->t() by making use of \Drupal\Core\StringTranslation\StringTranslationTrait. 

 The translatable markup returns a string as a result of this process.

Another important aspect which I dealt was the roles. This is an important feature  for any module as it  deals with the security constraints of the module. Roles are often manipulated to grant certain permissions. What we have to do is that, initially, load the particular role to be manipulated and then provide the permission which is to be granted.

$role = Role::load('access page.'); $role->grantPermission('access comments'); $role->save();

These role functions help us to load the roles and manipulate the permissions assigned to it quite easily. Thus, turns out to be really helpful in dealing with permissions.

I have been also dealing with writing the simple test for my module. In one of my previous blog posts, I have introduced the PHP unit testing.  The simple test tests the web oriented functionality of the module. It needs a good understanding of the behaviour of the module to write an effective test. Tests are often really important to identify the flaws of a functionality and to correct it accordingly. I will be writing the simple tests for my module in the coming days. I will be sharing you the concept of this mode of testing in my next blog post.

Stay tuned for further developments on this blog post.

 

 

 


Categories: Drupal

Drupal core announcements: Drupal 8.2.0 will be released October 5; beta begins week of August 3

Planet Drupal - 20 July 2016 - 9:23am

Drupal 8.2.0, the next planned minor release of Drupal 8, is scheduled for Wednesday, October 5, 2016. Minor releases include new features, usability improvements, and backwards-compatible API improvements. Here's what this means for core patches.

Drupal 8.2.0-beta1 will be released the week of August 3
  • In preparation for the minor release, Drupal 8.2.x will enter a beta phase the week of August 3.
  • Developers and site owners can begin testing the beta.
  • The 8.3.x branch of core will be created, and future feature and API additions will be targeted against that branch instead of 8.2.x.
  • All outstanding issues filed against 8.2.x will be automatically migrated to 8.3.x once it is opened.
  • During the beta phase, core issues will be committed according to the following policy:
    1. Most issues that are allowed for patch releases will be committed to all supported minor branches (8.1.x, 8.2.x, and 8.3.x) for the duration of the beta. Drupal 8.0.x is not supported anymore and changes are not made to that branch.
    2. Issues specific to added 8.2.x functionality, or disruptive changes that have a positive impact outweighing their disruption, will be committed to both 8.2.x and 8.3.x. (Such issues can be moved back to the 8.2.x branch after the automatic migration.)
    3. Most issues that are only allowed in minor releases will be committed to 8.3.x only.
Drupal 8.2.0-rc1 will be released September 7
  • The release candidate phase for the minor release begins on September 7, and starting on that date, the 8.2.x branch will be subject to release candidate restrictions, with only critical fixes and certain other limited changes allowed.
  • September 7 is also the final scheduled patch release window for 8.1.x, and it will not receive further development or support after that date aside from its final security release window on September 21.
  • All outstanding issues filed against 8.1.x will be automatically migrated to 8.2.x after the final 8.1.x patch release. Bug reports after September 7 should be targeted against the 8.2.x branch.
  • Minor versions may include changes to user interfaces, translatable strings, themes, internal APIs like render arrays and controllers, etc. (See the Drupal 8 backwards compatibility and internal API policy for details.) Developers and site owners should test the release candidate to prepare for these changes.
  • 8.3.x will remain open for new development during the 8.2.x release candidate phase.

See the Drupal core release cycle overview, Allowed changes during the Drupal 8 release cycle, and Drupal 8 backwards compatibility and internal API policy for more information.

As a reminder, we have until the start of the beta to add great new features to Drupal 8.2.x. Stabilizing experimental modules (such as Migrate and BigPipe), new features for workflows, and usability and bugfixes are all priorities for 8.2.0. Help with these feature requests and initiatives now for a great Drupal 8.2.0!

Categories: Drupal

ThinkShout: Drupal 8 Routing Tricks for Better Admin URLs

Planet Drupal - 20 July 2016 - 7:30am

We recently launched a new case tracker for foster ed youth designed to improve their educational outcomes in partnership with The National Center for Youth Law (NCYL). The web application replaces their existing platform, Goal Book, which lacked the flexibility they needed to meet their requirements. A web application differs from a website in that a website primarily provides content where a web application primarily provides tools.

The project presented us with an opportunity to do extensive custom development with our favorite new platform, Drupal 8. D8’s many developer experience improvements, including standardized object-oriented development methods, allowed us to meet NCYL’s requirements efficiently and with a level of quality that would have been more difficult on Drupal 7. In addition, we were able to accelerate the release of RedHen CRM on Drupal 8, which lives at the heart of the application managing all of the contacts, organizations, and relationships.

To enhance the utility of the application, we made an early decision to customize every URL a user would interact with. As most of the functionality would revolve around nodes, we wanted to make sure we avoided URLs like /node/256/edit that don’t give the user any indication of which part of the application they’re using.

Implementation

If you wanted to customize URLs in Drupal 7, you could use the Pathauto module. You can still do that in Drupal 8, but D8’s routing system can be coaxed into doing something similar. It works on admin pages, too, which was perfect for NCYL’s needs.

Overriding Existing Node Paths

As an example, let’s say you have a node type specifically for storing information about schools: a School Node. The standard admin path for adding a School Node would be something like this:

/node/add/school

But, add a custom module with route configuration and you can have this:

/school/add

For simplicity, we’ll call our module school.module. The directory structure looks like this:

modules/ school/ school.module school.routing.yml

The route configuration sits inside school.routing.yml and looks like this:

school.add: path: '/school/add' defaults: _controller: '\Drupal\node\Controller\NodeController::add' _title: 'Add School' node_type: 'school' requirements: _node_add_access: 'node:school'

Line by line:

school.add:

This is the name of the route. Route names should be unique and usually start with the name of your module.

path: '/school/add'

The path the route points to. This is the part that comes after your site’s base URL.

_controller: '\Drupal\node\Controller\NodeController::add'

This tells the route to use the NodeController, provided by the Node module. No need for a custom controller here.

_title: 'Add School'

This sets the page title of the node add form.

_node_add_access: 'node:school'

This is an access handler that ensures the user has permission to add a node of type “school.”

Providing a custom path to edit School Nodes is even easier:

school.edit: path: '/school/{node}/edit' defaults: _entity_form: 'node.edit' requirements: node: \d+ _entity_access: 'node.update'

We no longer need to tell the route which controller to use or what type of node we’re using. Drupal 8’s Entity API figures it out using the node ID passed in the URL.

Line by line again:

path: '/school/{node}/edit'

The path now contains a placeholder, {node}, which represents the node ID in the URL.

_entity_form: 'node.edit'

The form we want to use to edit the node.

node: \d+

Some validation to ensure the URL contains the right data type for a node ID. By specifying the regular expression pattern \d+, we are telling Drupal to only use this route when {node} is one or more digits. The route will match a URL like /school/32/edit, but will not match /school/lincoln-high/edit.

_entity_access: 'node.update'

An access handler, ensuring the user has permission to update this node. No need to specify the node type, as we did when adding a node.

Finally, a route for viewing the node:

school.view: path: '/school/{node}' defaults: _controller: '\Drupal\node\Controller\NodeViewController::view' requirements: node: \d+ _entity_access: 'node.view'

Very similar to the node edit route, just with a different path and controller.

For a more thorough explanation of routes and route options not covered here, check out the official docs.

Custom Controllers

What if you want to provide a custom controller for adding a node and still take advantage of Drupal’s permissions system? Routes can do that, too.

Let’s introduce a Teacher Node and an accompanying module.

modules/ school/ teacher/ src/ Controller/ TeacherController.php teacher.module teacher.routing.yml

teacher.routing.yml looks like this:

teacher.add: path: '/teacher/add' defaults: _controller: '\Drupal\teacher\Controller\TeacherController::addTeacher' _title: 'Add Teacher' node_type: 'teacher' requirements: _node_add_access: 'node:teacher'

Very similar to the route we used to add School Nodes, but with a custom controller.

TeacherController.php looks like this:

<?php namespace Drupal\teacher\Controller; use Drupal\node\NodeTypeInterface; class TeacherController extends ControllerBase { public function addTeacher(NodeTypeInterface $node_type) { } }

The addTeacher function is where you would add your custom code for adding Teacher Nodes.

That’s how you can use core Drupal 8 functionality to make your Drupal admin pages a little more user friendly.

Categories: Drupal

WP-like admin

New Drupal Modules - 20 July 2016 - 6:26am

Make the Drupal admin panel look a little bit like Wordpress.
This is useful for showing the aggregated sidebar menu for content managers and using the admin menu (or smth) for admins.

Categories: Drupal

Commerce Open Payment Platform

New Drupal Modules - 20 July 2016 - 2:24am

This module integrates PAY.ON Open Payment Platform with Drupal Commerce, integrating their COPYandPAY widget in Drupal Commerce checkout flow.

Requirements

Commerce Open Payment Platform depends on Drupal Commerce of course, given a strict dependency on commerce_payment sub module.

This module is only available for the Drupal 8 version of Drupal Commerce!

Categories: Drupal

Localize.drupal.org: Looking for translation teams to test the User Guide translation process

Planet Drupal - 20 July 2016 - 2:02am

There has been some amazing work on a User Guide for Drupal 8 for about a year now, and the English version is in pretty good shape -- it's in the stage now of copy editing and image refinement, and it will find its home under drupal.org/documentation. To start the translation process off, we need to figure out a translation workflow that will make sense for translation teams. It doesn't make sense to use the same workflow as is used on https://localize.drupal.org for the short strings that are part of Drupal and contributed modules, themes, and distributions (see https://www.drupal.org/node/2762261 for details) -- the guide is about 100 pages of formatted text prose, not a bunch of short strings.

We are looking for one or two teams initially to start using a proposed process for translation and provide honest feedback to improve the flow. This will help get the guide translated to as many languages as possible eventually.

More information and contact details at https://groups.drupal.org/node/512691

News tags: D8MI newsDrupal planetSite news
Categories: Drupal

wp like admin

New Drupal Modules - 20 July 2016 - 1:44am

Closed due to copyrights infringement.
——
Make the Drupal admin panel look a little bit like Wordpress.
This is useful for showing the aggregated sidebar menu for content managers and using the admin menu (or smth) for admins.

Categories: Drupal

Don't Panic: A blog about Drupal: Adding language id to the body class in Drupal 8

Planet Drupal - 20 July 2016 - 12:06am

When I started making sites with Drupal 8 I missed a special body class that I sometime need for theming as well as other times, and that's the language body class. When making multilingual sites this comes in handy sometimes. For Drupal 7 this was made possible by the Internationalization (i18n) module, but since that module has been moved into core in Drupal (source) that special body-class-adding-thingamajig seems to have vanished.

After facing the need of language id when making this site I started to search for a solution, but came up with very few answers. When I solved it I thought I could make a short entry to spread the knowledge.

My needs

Basically, I had two needs for the language class to be added to my theme. 

  1. I wanted to hide some of the meny items depending on which language the content was presented in. (I later solved this in another way in my theme, but that was the initial need for a body class representing the current language.)
  2. I have two different RSS-feeds, one for posts in English and one for posts in Swedish. To make it work 100%, the path to the feed needed the language id as well. This was the latter need for me, and also the need that made it to the final site.
The theme

The themes I've used for Drupal 8 haven't had the language flag/path, but some themes may have implemented it, so if you have the path in the body class then you probably don't need to read this.

The example I'm going to show you is from the the Bootstrap Clean Blog, which I use for this site, and I will show you the code for adding the language id to it.

The files

In the theme folder of Bootstrap Clean Blog you need to locate two files:

  • bootstrap_clean_blog.theme, which is in the root of the theme folder called bootstrap_clean_blog and
  • html.html.twig which is located in the templates folder.

In bootstrap_clean_blog.theme (or any other .theme-file you might have in the theme you're using/developing) add the following code snippet to it:

function bootstrap_clean_blog_preprocess_html(&$variables) { $language = \Drupal::languageManager()->getCurrentLanguage()->getId(); $variables['language'] = $language; }

If you're using a different theme than Bootstrap Clean Blog, the name of the theme-file is something like XYZ.theme, where XYZ is the name (lowercase with underscores) of the theme. For example, if you're using the Pixture Reloaded theme, the theme-file is called pixture_reloaded.theme.

The code above calls for the language by getCurrentLanguage() and assigns the value to the variable $language. After that the value of $language is assigned to the global variable array $variables['language'].
You could shorten this down to

function bootstrap_clean_blog_preprocess_html(&$variables) { $variables['language'] = \Drupal::languageManager()->getCurrentLanguage()->getId(); }

but I wrote it on two separate rows to make it more clear. The shorter code snippet is quite allright, though, and you can use that in your .theme-file.

Next up: The TWIG-file

Allright, so far we've collected the language and stored it in a global variable. Now it's time to make it visible on the webpage, to print it. This is done via TWIG, a fast and secure template engine that Drupal 8 started using. To print the $variables['language'] you write the following "twig code" in your template where you want it to be printed.

{{ language }}

So, in my example, if we want to print it in the body class, I open up the template html.html.twig in the templates folder of the theme and search for the line where the body is set. It looks like this:

<body{{ attributes.addClass(body_classes) }}>

It prints the following HTML when rendered in a browser:

<body class="user-logged-in path-frontpage">

Though, we can't just add {{ language }} to the body tag since it won't be a part of the {{ attributes.addClass(body_classes) }}. Those are set a couple of lines up, but it's easy to fix it. They look like this:

{% set body_classes = [ logged_in ? 'user-logged-in', not root_path ? 'path-frontpage' : 'path-' ~ root_path|clean_class, node_type ? 'node--type-' ~ node_type|clean_class, ] %}

In i similar way we add:

language ? 'lang-' ~ language|clean_class,

so the final result looks like this:

{% set body_classes = [ logged_in ? 'user-logged-in', not root_path ? 'path-frontpage' : 'path-' ~ root_path|clean_class, node_type ? 'node--type-' ~ node_type|clean_class, language ? 'lang-' ~ language|clean_class, ] %}

Now comes the thing that's very important. After saving your theme-files, you must clear cache for the changes to appear. Click Configuration > Performance > Clear all cache. Then reload the page and check the source code of it et voilà - it works and the source code looks like this:

<body class="user-logged-in path-frontpage lang-en">

That's that. You can now use the class lang-en to distinguish your English pages and on your pages in another language it might look something like this:

<body class="user-logged-in path-node node--type-article lang-sv">

You can also use {{ language }} anywhere else, for example is you have the same need as I, to make a link language-dependant: 

<a href="/{{ language }}/feed">RSS</a>

which gives you the following complete HTML

<a href="/sv/feed">RSS</a>

or

<a href="/en/feed">RSS</a>

if the visitor is on the English part of the site.

Hope this helped you in some way. Happy drupaling!

Categories: Drupal

Miloš Bovan: GSoC ‘16 - Week #9: Mailhandler report

Planet Drupal - 19 July 2016 - 11:13pm
GSoC ‘16 - Week #9: Mailhandler report

During the 8th week of Google Summer of Code 2016, we have started with adding support for posting comments via email. After getting the feedback from my mentors, there was some space to improve proposed solution. The suggestions were accepted and briefly explained below.

Comments in a submodule

As comments are supported through new handler plugin (MailhandlerComment), we decided to move it into a submodule - mailhandler_d8_comment. Following this approach, we can avoid too many dependencies on the main module. The submodule features: Inmail config entity that represents the handler, the plugin class and the related test coverage.

Configurable referenced entity type

With configurable referenced entity type of processed comments, we can support not only node entities but all the other “commentable” entities. In my opinion, this is a nice feature for site administrators in case they want to allow posting comments (for their articles or custom entities) as easy enough as sending an email.

Strict validation

Validation is the important topic in software development in general. In Drupal 8, there is an API made specifically for entity validation - Entity Validation API. It is recommended to use it before saving an entity. However, entity validation does not work as expected in a case of creating comments via API. The referenced entity ID and its bundle were not validated which required us to find a different approach. To accomplish this, we had to implement custom validation checks. They consist of:

  • Entity type validation - entity type is “commentable”

  • Referenced entity ID validation - referenced entity with provided ID actually exists

  • Bundle validation - identified entity bundle supports comments


Last week, besides the improvements made on the comment feature, I was working on the demo module improvements. The pull request has been submitted on Github and available for review. This module serves as an example module to show features of Mailhandler. It creates a sample “Mailhandler” content type (with a body field) and a new user with permissions to add content for “Mailhandler” content type and post comments. The GPG key field of this user was populated  with a sample key (both public and private GPG keys were added to the module) as well. Since last week, the example messages - sample comment and PGP clear-signed, MIME and MIME HTML emails are part of the demo module too. By enabling mailhandler_d8_demo, exploring Mailhandler features becomes very straightforward.

Drupal 8 module demo: Mailhandler from Milos Bovan on Vimeo.

Also, the demo module adds a sample article attached to the front page. The idea is to have a descriptive article about Mailhandler features. Its content will be extended during the “documentation week”. Next week, I will be working on improving overall user experience and user interface of Mailhandler.

 

 

Milos Wed, 07/20/2016 - 08:13 Tags Open source Google Summer of Code Drupal Drupal Planet Add new comment
Categories: Drupal

DrupalCon News: Six Trainings Announced to Level Up your Drupal Skills

Planet Drupal - 19 July 2016 - 2:58pm

This is the first European DrupalCon since Drupal 8 was launched and we are excited to offer six solid trainings that will really help level up your skills. There is a little something for everyone with trainings that span job functions and skill levels.  Check out the training courses that we will be offer ong 26 September from 9:00-17:00 at DrupalCon Dublin.  

Categories: Drupal

GVSO Blog: [Social API] Creating a Social Auth implementer #2 - Routes and Network Plugin

Planet Drupal - 19 July 2016 - 1:31pm
[Social API] Creating a Social Auth implementer #2 - Routes and Network Plugin

In the last post of this series, we started declaring our module information (social_auth_google.info.yml) and its dependencies through a composer.json file. In this post, we will move on and start working on the routing, settings form, and Settings Manager.

Routes

Now that we have let Drupal about our module and its dependencies, it is time to define our routes. In the case of our Social Auth Google module, we'll need the following social_auth_google.routing.yml file

gvso Tue, 07/19/2016 - 16:31 Tags Drupal Drupal Planet Social API
Categories: Drupal

GVSO Blog: [Social API] Creating a Social Auth implementer #1 - kicking off

Planet Drupal - 19 July 2016 - 1:00pm
[Social API] Creating a Social Auth implementer #1 - kicking off

In the last few months we have been working on the Social API project which tries to harmonize Social Networking functionality in Drupal. This project is divided in four main components which are:

gvso Tue, 07/19/2016 - 16:00 Tags Drupal Drupal Planet Social API
Categories: Drupal

LevelTen Interactive: Get a Free Website Valuation at the ROW Roadshow!

Planet Drupal - 19 July 2016 - 11:55am

By now, you may have heard that we’re putting on a show: the ROW Roadshow, to be exact!

ROW stands for Results Oriented Websites, and it means just what it says. We think that all of our clients – and everyone in the United States! – should have a meaningful web presence, with a website that produces real results and helps them grow their company.

The ROW Roadshow is our way of taking that

...Read more
Categories: Drupal

Cheeky Monkey Media: Behat with Drupal - Tutorial

Planet Drupal - 19 July 2016 - 9:08am
Behat with Drupal - Tutorial Anonymous (not verified) Tue, 07/19/2016 - 16:08

On our first day as interns at Cheeky Monkey, we (Jared and Jordan) were given the task of exploring the somewhat uncharted waters of using Behat, an open source BDD (Behavior-driven development) testing framework, with Drupal 7.

 

Why BDD Testing?

We all know that testing is important, but why do we bother with “BDD” testing?

Behavior-driven development testing is exactly what it sounds like, testing the behavior of the site. This makes the tests very different than say a unit test.

Categories: Drupal

Archival Resource Key Identifier Name Mapping

New Drupal Modules - 19 July 2016 - 8:45am

This module allows your Drupal site to act as a Name Mapping Authority for ARK (Archival Resource Key) Identifiers. It will resolve ARK identifiers to content on your site which you have designated as ARK (which also produces the identifiers and tells you and others what they are).

In development for Drupal 7. Unfortunately no Drupal 8 plans at this time but would be happy to collaborate.

Categories: Drupal

Acquia Developer Center Blog: Drupal 8 Tutorials for Beginners

Planet Drupal - 19 July 2016 - 8:22am

Maybe you are already grokking Drupal 8's new configuration management system; maybe you've already absorbed D8's embrace of object-oriented code.

But that doesn't mean you should scoff at easy on-ramp introductions to Drupal 8. Solid overviews of Drupal 8 can be tremendously valuable when you're working on a team that includes non-technical members. They also come in handy when you are advocating in-house for D8 adoption.

Tags: acquia drupal planet
Categories: Drupal

Zivtech: How to Use SQL-Dump and SCP

Planet Drupal - 19 July 2016 - 6:15am

It’s been almost six months since I started at Zivtech as a Junior Developer, and I could never fit everything I’ve learned into one blog post. That said, one of the best things I’ve learned is how to compress my database and copy it across servers. These two commands are drush sql-dump and scp. If you’re unfamiliar with Drush, you can find some background information here.

I learned how to use drush sql-dump while using Probo.CI, which is our internally-developed continuous integration tool. Since we use Probo.CI on every project, I had to figure out how to set it up. Essentially, you have to upload your database to the Probo.CI app to ensure that your new feature will work on the site when you’re testing your pull request. Here is some helpful documentation. The fourth step in this documentation is:

Step 4: Use Drush to get and compress your database in a sql file.

If you wish to compress your database you’ll need to use gzip. Other zip files won’t work.

$ drush sql-dump | gzip > dev.sql.gz

To a new developer, this might look a little intimidating, but it’s just like it sounds; you’re dumping your database into a gzip file, dev.sql.gz, which will then be uploaded. In this example of using Probo, you’re uploading the gzip file with probo-uploader (a command line client for uploading files). Using Probo was a great entry point into learning drush sql-dump which, as you’ll see below, can be used in other capacities.

I’ve also had to use drush sql-dump alongside scp, which means secure copy. So I’ve dumped my database into a .gz file; great, but now what? Somehow I have to get the database to another environment or server. In the previous example, I didn’t need to copy the database to a server; everything could be done either locally or from my virtual machine. There are times when you need to import a database to a particular environment. If you need to copy the database from a remote host to the local host:

$ scp your_username@remotehost.edu:foobar.txt /some/local/directory

If you need to copy it from the local host to a remote host:

$ scp foobar.txt your_username@remotehost.edu:/some/remote/directory

Credit for the above examples goes to scott@hypexr.org. For more scenarios, go here.

Once you’ve copied the gzip file to the environment it needs to be in, you need to DROP your current database so you can import the new one you just copied. That’s where these commands come in:

$ drush sql-drop $ drush sql-cli < ~/my-sql-dump-file-name.sql

For more information, here’s another great resource.

That’s all there is to it. You dumped the database you wanted into a gzip file, secure copied it to the environment, dropped the old database, and then imported the new one. That’s how it works!

Categories: Drupal

Jim Birch: Holistic SEO and Drupal

Planet Drupal - 19 July 2016 - 2:30am

The Introduction - What is Holistic SEO?

Holistic SEO is a term used to describe development in which content, marketing, technical best practices, performance, security, user experience and user intent come together to create an ideal URL on the internet, about a certain topic.

Why should we advocate taking a Holistic approach to SEO?  As search engine algorithms get more complex and intelligent, we won't be able to control or predict changes, and more importantly, it defines a set of best practices that we can develop upon which helps the content creators ultimately benefit the user.

Today's Google algorithm is putting more value on Topic and User Intent than Keywords.  Content pieces that once ranked well for ultra specific keyword terms, are quickly being, or have been replaced by much longer form content that:

  1. Answers questions the searcher has asked.
  2. Is deeply informational about a topic.
  3. Helps the user complete a transaction.
A Holistic SEO Example

Here is an example, HouseLogic.com's Guide to Hardwood Floor Finishes is listed for the following search terms:

Read more

Categories: Drupal

Blair Wadman: How to wrap a Drupal Views field in any HTML element

Planet Drupal - 19 July 2016 - 1:13am

In Drupal Views, you can wrap a field in a basic element (such as div, span, H1, H2, p, strong). But sometimes you are going to need to wrap a field in an HTML element that is not available in the list. For example, if you have an image field that and need to wrap in a <figure> element (this is the example we will use for this tutorial). This can be pretty confusing at first, but fortunately there are a few methods available to get the job done.

Categories: Drupal

Pages

Subscribe to As If Productions aggregator - Drupal