Drupal

Kalamuna Blog: Help! Why does Composer keep installing Drupal 8.5 "BETA" instead of the stable version?

Planet Drupal - 8 March 2018 - 9:09pm
Help! Why does Composer keep installing Drupal 8.5 "BETA" instead of the stable version? Hawkeye Tenderwolf Thu, 03/08/2018 - 21:09

Drupal core 8.5.0-stable was released just a few days ago, and I imagine other folks may run into the same installation problem as I did when attempting to upgrade. If you think this might be you, then read on...

Problem: When trying to upgrade from any previous version of Drupal core to ~8.5, Composer delivers 8.5.0-beta1 instead of the latest stable version.

Categories Articles Drupal
Categories: Drupal

Roman Agabekov: Mysql Master-Slave Replication

Planet Drupal - 8 March 2018 - 8:31pm
Mysql Master-Slave Replication Submitted by admin on Fri, 03/09/2018 - 04:31

Hey all! Today, we shall show you some examples of master-slave replication setups.

A bit of theory first

Why do you need replication in the first place? There are at least two reasons to set it up. First off, it is your insurance that helps avoid downtime when/if your master MySQL server goes down: with replication, slave server picks up and fills for the master. Secondly, replication allows decreasing load suffered by the master server: you use it for writing only and pass read queries to slave.

Tags
Categories: Drupal

Hook 42: Drupal 8 Interviews: Spotlight on Adam Bergstein

Planet Drupal - 8 March 2018 - 5:05pm

Adam Bergstein is the VP of Engineering at Hook 42. Previously he was Associate Director of Engineering at Civic Actions and worked at Acquia as a Technical Architect. Adam is an active member of the Drupal Community. He recently took over the simplytest.me project, ported many modules to Drupal 8, is involved in Google Summer of Code, serves on the Drupal Governance Committee, and provides mentorship.
He has given multiple talks. Most of his talks focus on Drupal security, working with teams, or technical enablement.

Categories: Drupal

Hook 42: Drupal 8 Interviews: Spotlight on Adam Bergstein

Planet Drupal - 8 March 2018 - 5:05pm

Adam Bergstein is the VP of Engineering at Hook 42. Previously he was Associate Director of Engineering at Civic Actions and worked at Acquia as a Technical Architect. Adam is an active member of the Drupal Community. He recently took over the simplytest.me project, ported many modules to Drupal 8, is involved in Google Summer of Code, serves on the Drupal Governance Committee, and provides mentorship.
He has given multiple talks. Most of his talks focus on Drupal security, working with teams, or technical enablement.

Categories: Drupal

agoradesign: Asset Packagist as State of the Art in 3rd part library integration

Planet Drupal - 8 March 2018 - 2:47pm
The introduction of Composer in Drupal 8 was a great improvement over managing packages via Drush Make, but however did leave some questions about properly load 3rd party Javascirpt libraries - here's an advice how you should do it.
Categories: Drupal

CU Boulder - Webcentral: Drupal Deep Dives: Ignoring Your Slaves

Planet Drupal - 8 March 2018 - 2:40pm

If you’re like me, you don’t know much about Drupal 7’s database layer besides a few functions you need to use daily. After scanning the comments for those API pages, I can usually get done what I need to, and I’ve never really have any weird database errors or issues that made me look more closely into the database APIs.

db_insert(); db_query(); db_merge(); // etc...

I work at an organization now that runs a service for 800+ sites with thousands of content editors. On any given day, the service performs more reads and writes than any application I’ve ever worked on before. Even with that caveat, our service doesn’t make all that many writes to the databases each day. However, our database infrastructure is set up (poorly) by another IT group (whose name shall not be mentioned), and because of that, we had to recently program defensively while performing database transactions.

Drupal Database API

Drupal has a nice overview page of documentation about how a developer ought to use the database APIs. Included in that section are topics I’ve never really explored.

For example, I’ve felt the pain of using Views as a query builder only to find out how slow and inefficient the default queries tend to be. Granted it is meant as a visual tool for site builders who can’t or don’t know how to use the database API functions, but it makes me sad sometimes.

Could I potentially use SQL Views to create some virtual tables and simplify my queries partially avoiding Drupal’s “join all the field tables together” issue? Probably, now that I know about SQL Views.

I won’t go over a lot of the functionality covered in the docs, but it’s not a bad idea to read through all of that API documentation if you never have before. That’s what Friday afternoons are for, right? Your Drupal application performs a lot of queries every request/response cycle, and by finding optimizations in these docs, you may drastically increase your app’s performance with only a few lines of code.

Master/Slave? Sounds Kinky

In the title of this post, I mentioned “slaves” mainly for the clickbait factor, but what I meant was in the context of a “master/slave” database relationship. Now people, put down the stones you are about to throw at me for my use of the word “slave” in 2018. In Drupal 7, that is the terminology used in the codebase, although in Drupal 8, it has been updated to “primary/replica” which is more semantic and descriptive. You can read a detailed discussion on the topic within the Drupal community, but I will still use “master/slave” at points in this post since Drupal 7 makes me use it.

Your site might only have one database, and for local development, my sites generally only have one database. The default.settings.php file shipped in Drupal 7 has a lengthy section on database configurations and what options are available to you.

For each database, you may optionally specify multiple "target" databases. A target database allows Drupal to try to send certain queries to a different database if it can but fall back to the default connection if not. That is useful for master/slave replication, as Drupal may try to connect to a slave server when appropriate and if one is not available will simply fall back to the single master server. The general format for the $databases array is as follows: @code $databases['default']['default'] = $info_array; $databases['default']['slave'][] = $info_array; $databases['default']['slave'][] = $info_array; $databases['extra']['default'] = $info_array; @endcode In the above example, $info_array is an array of settings described above. The first line sets a "default" database that has one master database (the second level default). The second and third lines create an array of potential slave databases. Drupal will select one at random for a given request as needed. The fourth line creates a new database with a name of "extra".

That segment of comments might be the only place you’ve seen “slave” mentioned in Drupal before. Normally, you’ve probably only used the “default” database info $databases['default']['default'] = $info_array; to set up a site. That’s all I was accustomed to using.

The “slave” database acts as a “replica” of the “master” or “default” or better yet “primary” database…you might be noticing why using “master/slave” was a bad idea regardless of the generally negative connotation of the word “slave”. It’s just not all that semantic when describing the responsibilities for each type of connection.

The “replica” database’s job is to sync with the default “primary” database so that there is only one canonical source of information. Replicas allow for failovers during times of high database load. Generally, reads are more important for the functionality of your application. Writes, on say saving a form, can always roll back transactions or provide feedback to a user on why the data can’t be saved. If an anonymous user goes to a page on your site and Drupal can’t read anything then everyone gets a fatal error.

If we go back to the comments above, you can see a “default” connection with one master and two slave databases. Drupal has some documentation on how that type of a database configuration works.

"This definition provides a single "default" server and two "slave" servers. Note that the "slave" key is an array. If any target is defined as an array of connection information, one of the defined servers will be selected at random for that target for each page request. That is, on one-page request, all slave queries will be sent to dbserver2 while on the next they may all be sent to dbserver3. This means that during any request one of the three default connections in that example might be used. On a site with high traffic, you can probably see how this database setup would come in handy for times of high load."

You can even tell Drupal to target one of the connections during a query.

$query = db_select('node', 'n', array('target' => 'slave')); Original DB Error

My initial foray into looking at master/slave replication in Drupal 7 came with a bug report.

PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '60-36' for key 'PRIMARY': INSERT INTO {linkchecker_bean} (bid, lid) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1); Array ( [:db_insert_placeholder_0] => 60 [:db_insert_placeholder_1] => 36 ) in _linkchecker_bean_add_bean_links() (line 196 of /data/code/profiles/express/express-2.8.3/modules/contrib/linkchecker/modules/linkchecker_bean/linkchecker_bean.module)

After some investigation, we thought that the slave database was being read before the sync from the master happened. When queried there was no entry in the slave database; however, the master database already had an entry. The master database always makes the writes and so a duplication error occurred during the next attempted insertion.

// Remove all links from the links array already in the database and only // add missing links to database. $missing_links = _linkchecker_bean_links_missing($bean->bid, $links); // Ignore slave database briefly. variable_set('maximum_replication_lag', 300); db_ignore_slave(); // Only add unique links to database that do not exist. $i = 0; foreach ($missing_links as $url) { $urlhash = drupal_hash_base64($url); $link = db_query('SELECT lid FROM {linkchecker_link} WHERE urlhash = :urlhash', array(':urlhash' => $urlhash))->fetchObject(); if (!$link) { $link = new stdClass(); $link->urlhash = $urlhash; $link->url = $url; $link->status = _linkchecker_link_check_status_filter($url); drupal_write_record('linkchecker_link', $link); } db_insert('linkchecker_bean') ->fields(array( 'bid' => $bean->bid, 'lid' => $link->lid, )) ->execute(); // ...

The original code makes a db query for $missing_links that must have gone to a replica database that hadn’t yet synced with the primary database. That is why later in the code when the db_insert() happens, the insert fails.

db_merge()?

My first thought when I looked at the code was to use db_merge() instead of db_insert(). By using a merge query you either make an update or insertion query to the database table. By providing the same primary keys as the ones you are inserting, you can ensure that the database query never fatal errors due to duplicate content existing in the table.

db_merge('linkchecker_bean') ->key(array( 'bid' => $bean->bid, 'lid' => $link->lid, )) ->fields(array( 'bid' => $bean->bid, 'lid' => $link->lid, )) ->execute();

However, this “solution” doesn’t really address the issue. The code isn’t supposed to update a value that could already exist in the table. In this case, the correct thing is happening by giving me a fatal error. The problem is that the error isn’t caught.

Proper Exception Handling

You should always wrap any function call that might fail terribly in a try/catch statement. The try block of code acts just as it would without try {} wrapped around it. The catch block allows any potential error in the try block to be caught and dealt with without breaking execution of the PHP script.

$txn = db_transaction(); try { db_insert('linkchecker_bean') ->fields(array( 'bid' => $bean->bid, 'lid' => $link->lid, )) ->execute(); } catch (Exception $e) { $txn->rollback(); watchdog_exception('linkchecker_bean', $e); }

Now we have preserved the original db_insert()while catching the original fatal error. You’ll also notice that adb_transaction() object is used to rollback any transaction if the insert fails.

I never knew about that functionality in Drupal 7, but I have grown accustomed to being able to rollback database transactions in other PHP frameworks. Too bad most module developers don’t integrate a rollback on erroneous database transactions. Drupal core could be taking care of this under-the-hood, but I’d rather see it explicitly defined in contributed code. From now on, I’ll probably be using those functions in my hook_update() code. You can read more about database error handling in the Drupal database documentation.

I was pretty satisfied with submitting a patch the Linkchecker project based on the code above, except that it didn’t fix our issue. Since our theory revolved around database replication being slow, we had to go one step further and explicitly define the relationship between primary and replica database connections at the time of the missing link's query.

Finally, Ignore The Slaves

We finally get to do it, folks. Ignore those stupid slaves…and Twitter has gone wild again with hateful tweets directed at me…okay, okay, back to calling them replicas. You can tell Drupal to ignore the replica databases and only interact with the primary connection if you need to.

// Ignore slave database briefly. variable_set('maximum_replication_lag', 300); db_ignore_slave(); // Remove all links from the links array already in the database and only // add missing links to database. $missing_links = _linkchecker_bean_links_missing($bean->bid, $links); // Only add unique links to database that do not exist. $i = 0; foreach ($missing_links as $url) { $urlhash = drupal_hash_base64($url); $link = db_query('SELECT lid FROM {linkchecker_link} WHERE urlhash = :urlhash', array(':urlhash' => $urlhash))->fetchObject(); if (!$link) { $link = new stdClass(); $link->urlhash = $urlhash; $link->url = $url; $link->status = _linkchecker_link_check_status_filter($url); drupal_write_record('linkchecker_link', $link); } $txn = db_transaction(); try { db_insert('linkchecker_bean') ->fields(array( 'bid' => $bean->bid, 'lid' => $link->lid, )) ->execute(); } catch (Exception $e) { $txn->rollback(); watchdog_exception('linkchecker_bean', $e); } // Go back to using the slave database. // db_ignore_slave() sets this session variable that another function uses to see if the slave should be ignored. unset($_SESSION['ignore_slave_server']); // ...

Our final code ignores the replicas for a brief time using db_slave_ignore() and then returns querying back to normal by unsetting $_SESSION['ignore_slave_server'] after all of the database queries have run.

Internally, Drupal uses the session variable, which is a timestamp, to check whether the slave server should be ignored. This is done via hook_init() in the System module usingDatabase:ignoreTarget('default', 'slave'). There is also a nice note in the comments about how the ignoring works.

function system_init() { $path = drupal_get_path('module', 'system'); // Add the CSS for this module. These aren't in system.info, because they // need to be in the CSS_SYSTEM group rather than the CSS_DEFAULT group. drupal_add_css($path . '/system.base.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE)); if (path_is_admin(current_path())) { drupal_add_css($path . '/system.admin.css', array('group' => CSS_SYSTEM)); } drupal_add_css($path . '/system.menus.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE)); drupal_add_css($path . '/system.messages.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE)); drupal_add_css($path . '/system.theme.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE)); // Ignore slave database servers for this request. // // In Drupal's distributed database structure, new data is written to the // master and then propagated to the slave servers. This means there is a // lag between when data is written to the master and when it is available on // the slave. At these times, we will want to avoid using a slave server // temporarily. For example, if a user posts a new node then we want to // disable the slave server for that user temporarily to allow the slave // server to catch up. That way, that user will see their changes immediately // while for other users we still get the benefits of having a slave server, // just with slightly stale data. Code that wants to disable the slave // server should use the db_ignore_slave() function to set // $_SESSION['ignore_slave_server'] to the timestamp after which the slave // can be re-enabled. if (isset($_SESSION['ignore_slave_server'])) { if ($_SESSION['ignore_slave_server'] >= REQUEST_TIME) { Database::ignoreTarget('default', 'slave'); } else { unset($_SESSION['ignore_slave_server']); } } // Add CSS/JS files from module .info files. system_add_module_assets(); } Wait, We’ve Already Executed hook_init()?

Since it happens in a hook_init(), then pray-tell how is the database ignored later in my Linkchecker code? I’m not sure either. Subsequent requests will ignore the replica for as long as the timeout is active, but the queries in my code could possibly still hit the slave database. Wait, so I haven’t fixed my issue. And you certainly don’t want to place db_ignore_slave() before the hook_init() is called, essentially always setting a timeout to ignore the replica.

In the comment above the session variable check, it explains that some users will see stale data. This is okay for the scenario where I save content via a node edit screen and expect it to show up on the next node view request. But what happens when there is no “user” saving content and the queries happen within a request cycle, not write on one request and then read on another.

I am one of the “users” who can’t get stale data because we are relying on it to make a subsequent database insert in the same request. What we really need to do is “target” the default connection when we make a query.

db_query('SELECT lid FROM {linkchecker_link} WHERE urlhash = :urlhash', array(':urlhash' => $urlhash), array('target' => 'default'))->fetchObject();

Up until this point, I had only used the $args array to pass in dynamic variables to database queries and avoid SQL injection, but there is another $options parameter you can use to identify the database target among other things. While the allowed values for $options can be hard to know from the db_query() API documentation, you can at least find the default values created when that parameter isn’t passed into db_query(). Based on the docs for the “target” key, you can have two values for the target: “slave” or< “default”.

"The database "target" against which to execute a query. Valid values are "default" or "slave". The system will first try to open a connection to a database specified with the user-supplied key. If one is not available, it will silently fall back to the "default" target. If multiple databases connections are specified with the same target, one will be selected at random for the duration of the request. So when you don’t explicitly specify a target and have more than one connection, e.g. adding a replica, the query will pick a target at random which might be a slave with stale data."

After adding a target in another Linckchecker query, my job was done…and I didn’t even have to ignore the slaves after all. Hopefully, you now know something about database replication in Drupal 7, how to use db_ignore_slave() properly, and how to explicitly target databases per query as well.

Developer Blog
Categories: Drupal

Redirect 403 To Login Page

New Drupal Modules - 8 March 2018 - 12:40pm
Description

This module redirects users encounter 403 ( Access Denied ) pages to the login page and after successful login it returns them back.

Sponsored by DrupalSchool.ir

Categories: Drupal

Dries Buytaert: Thank you, Tiffany

Planet Drupal - 8 March 2018 - 12:17pm

I recently had the opportunity to read Tiffany Farriss' Drupal Association Retrospective. In addition to being the CEO of Palantir.net, Tiffany also served on the Drupal Association Board of Directors for nine years. In her retrospective post, Tiffany shares what the Drupal Association looked like when she joined the board in 2009, and how the Drupal Association continues to grow today.

What I really appreciate about Tiffany's retrospective is that it captures the evolution of the Drupal Association. It's easy to forget how far we've come. What started as a scrappy advisory board, with little to no funding, has matured into a nonprofit that can support and promote the mission of the Drupal project. While there is always work to be done, Tiffany's retrospective is a great testament of our community's progress.

I feel very lucky that the Drupal Association was able to benefit from Tiffany's leadership for nine years; she truly helped shape every aspect of the Drupal Association. I'm proud to have worked with Tiffany; she has been one of the most influential, talented members of our Board, and has been very generous by contributing both time and resources to the project.

Categories: Drupal

Thank you, Tiffany

Dries Buytaert - 8 March 2018 - 12:17pm

I recently had the opportunity to read Tiffany Farriss' Drupal Association Retrospective. In addition to being the CEO of Palantir.net, Tiffany also served on the Drupal Association Board of Directors for nine years. In her retrospective post, Tiffany shares what the Drupal Association looked like when she joined the board in 2009, and how the Drupal Association continues to grow today.

What I really appreciate about Tiffany's retrospective is that it captures the evolution of the Drupal Association. It's easy to forget how far we've come. What started as a scrappy advisory board, with little to no funding, has matured into a nonprofit that can support and promote the mission of the Drupal project. While there is always work to be done, Tiffany's retrospective is a great testament of our community's progress.

I feel very lucky that the Drupal Association was able to benefit from Tiffany's leadership for nine years; she truly helped shape every aspect of the Drupal Association. I'm proud to have worked with Tiffany; she has been one of the most influential, talented members of our Board, and has been very generous by contributing both time and resources to the project.

Categories: Drupal

Acro Media: Urban Hipster: Updates & What's New

Planet Drupal - 8 March 2018 - 11:44am

The Urban Hipster (UH) Drupal 8 Commerce 2 demo site has been gaining a lot of traction lately due to some fanfare and sweet promo videos. An increasing number of people are trying it out and viewing the code (which is publicly available on GitHub). It was time for a bit of a content overhaul. Here's what's changed.

Public Domain Images

All of the imagery and icons used in the site are now created by Acro Media or taken from Unsplash.com. If you're not aware of Unsplash, they provide high quality images that are freely available to use in any way, shape or form. It's a pretty awesome service and supports the open source philosophy we in the Drupal community share.

Product Page Galleries

The biggest feature we added in this release has to do with the product pages. Products can now display a gallery of images on the product page instead of just showing the current variation. I won't get into the details here, but you can watch the video for more information. Here's an example.

More "Full" Product Examples

The UH demo was originally intended to be a sales tool for our staff. Because of this, we added a bunch of products, but only a handful were fully filled out with attributes, sample reviews, related products, etc. The rest were just placeholders to fill out the store. Now that more people are looking at it, we felt we needed more (if not all) of the products to be more robust so that it didn't matter which product you happen to look at. This was something we did in this content overhaul. Almost every product now includes multiple images, related products, variation options, etc. Here's an example.

Configuration Cleanup

Since we were adding all new content anyway, it was a good opportunity to clean up some of the attributes, product types and product variation types that weren't really needed or not well represented. A lot of people are looking to this demo for examples of configuration, so it's important that we try to keep it as clean as possible.

And that's about it! Enjoy the video and the site updates.

Related Links
Categories: Drupal

Twig Addons

New Drupal Modules - 8 March 2018 - 11:35am

Add Twig Extensions and Twig Namespaces with ease.

Categories: Drupal

Transaction Workflow

New Drupal Modules - 8 March 2018 - 10:19am

Light weight multipurpose workflow manager for any entity type. Based on standard fields, state is stored in generic string-list field. Transitions are fieldable content entities and no extra fields are required in the target entity.

Categories: Drupal

Ben Marshall: Load JS & CSS Conditionally in Drupal 7

Planet Drupal - 8 March 2018 - 9:00am

This post was originally published on May 22, 2013 and last updated March 8, 2018 thanks to some helpful input by Steve Elkins.

Drupal 7 is a haus at combining CSS & JS files. This can help boost page performance & optimization easily, but if not used right, can do the complete opposite. In this post, we’ll go over how to load JS & CSS files based on conditionals like URL, module, node, views and more.

Before we dive in, get somewhat familiar with the drupal_add_js and drupal_add_css functions. We’ll use these to load the actual JS and CSS files.

hook_init – runs on every page /** * Implements hook_init() * * @link https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_init/7.x */ function HOOK_init() { // Using the equivalent of Apache's $_SERVER['REQUEST_URI'] variable to load based on URL // @link https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/request_uri/7 if (request_url() === 'your-url-path') { drupal_add_js( /* parameters */ ); drupal_add_css( /* parameters */ ); } }

Using hook_init is one of the simplest methods to load specific JS and CSS files (don’t forget to replace HOOK with the theme or module machine name).

Be careful, this method get’s ran on every page, so it’s best to use this method only when you actually need to check every page for your conditional. A good example, loading module CSS and JS files. A bad example, loading node-specific CSS and JS files. We’ll go over that next.

There’s also a similar preprocess function, template_preprocess_page you could use, but it too get’s ran on every page and is essentially the same as hook_init.

template_preprocess_node – runs on node pages /** * Implements template_preprocess_node() * * @link https://api.drupal.org/api/drupal/modules%21node%21node.module/function/template_preprocess_node/7.x */ function TEMPLATE_preprocess_node(&$vars) { // Add JS & CSS by node type if( $vars['type'] == 'your-node-type') { drupal_add_js( /* parameters */ ); drupal_add_css( /* parameters */ ); } // Add JS & CSS to the front page if ($vars['is_front']) { drupal_add_js( /* parameters */ ); drupal_add_css( /* parameters */ ); } // Given an internal Drupal path, load based on node alias. if (drupal_get_path_alias("node/{$vars['#node']->nid}") == 'your-node-id') { drupal_add_js( /* parameters */ ); drupal_add_css( /* parameters */ ); } }

Using template_preprocess_node is perfect when loading JS and CSS files based on nodes (don’t forget to replace TEMPLATE with the theme machine name). Since it only get’s run on nodes, it’s great to use when you want to load CSS and JS files on specific node types, front pages, node URLs, etc.

template_preprocess_views_view – runs every view load /** * Implements template_preprocess_views_view() * * @link https://api.drupal.org/api/views/theme%21theme.inc/function/template_preprocess_views_view/7.x-3.x */ function TEMPLATE_preprocess_views_view(&$vars) { // Get the current view info $view = $vars['view']; // Add JS/CSS based on view name if ($view->name == 'view_name') { drupal_add_js( /* parameters */ ); drupal_add_css( /* parameters */ ); } // Add JS/CSS based on current view display if ($view->current_display == 'current_display_name') { drupal_add_js( /* parameters */ ); drupal_add_css( /* parameters */ ); } }

Using template_preprocess_node is useful when loading JS and CSS files when a particular view is being used (don’t forget to replace TEMPLATE with the theme machine name).

Helpful Methods for Conditionals

Here’s a few helpful Drupal methods you can use for your conditionals. Have one you use often? Let me know in the comments below.

  • request_uri – Returns the equivalent of Apache’s $_SERVER[‘REQUEST_URI’] variable.
  • drupal_get_path_alias – Given an internal Drupal path, return the alias set by the administrator.
Looking like a foreign language to you?

Not a developer or just lost looking at the code snipplets above? Shoot me a question in the comments below, or give these ‘plug-and-play’ modules a try for a GUI alternative:

The post Load JS & CSS Conditionally in Drupal 7 appeared first on Ben Marshall.

Categories: Drupal

RSS embed field

New Drupal Modules - 8 March 2018 - 8:28am
Overview & Features

RSS-Field is a lightweight module that allow you to integrate and setup a field (link) within a Contenttype, that offers you the possibility to display the latest Posts from a specific RSS-Feed within a node. You can handle this field like all other Drupal-Fields f.e. with Views etc.

You can define how many entries from the Feed should be displayed and and whether the title of the feed should be displayed or not.

Categories: Drupal

Webform Storage Toggle

New Drupal Modules - 8 March 2018 - 6:57am
Description
Categories: Drupal

Slack RTM

New Drupal Modules - 8 March 2018 - 6:03am

Place holder for module under current dev. It will utilize Slack RTM and obtain messages from Slack to list in Drupal for display purposes.

Categories: Drupal

Twitter embed field

New Drupal Modules - 8 March 2018 - 5:59am
Overview & Features

Twitter Field is a lightweight module that allow you to integrate and setup a field (plain Text) within a Contenttype, that offers you the possibility to display the latest Twitter-Posts from a specific Twitter-Account within a node. You can handle this field like all other Drupal-Fields f.e. with Views etc. The Twitter-Feed appears as a block via Twitter-API.

You can define the Width and Height, the Theme (dark or light) and Link Color (Hex Color) of the Twitter-Feed-Block/-Posts.

Categories: Drupal

View Password

New Drupal Modules - 8 March 2018 - 2:32am
Categories: Drupal

Flocon de toile | Freelance Drupal: Send transactional emails related to user account in HTML format with Drupal 8

Planet Drupal - 8 March 2018 - 2:00am
We have several solutions to automatically send emails emitted by a Drupal 8 project in HTML format. Without being able to quote them all, we can use SwiftMailer, MimeMail to send mails from the server itself, or Mailjet API, MailGun, etc. to send emails from a third-party platform. In a few clicks, we can then emit different emails, whether they are transactional (account creation, order creation, subscription, etc.) or business (Newsletters, Activity Log, What you missed, etc. .), in HTML format. It will then remain to implement one (or more) responsive email template that will be correctly read and interpreted on most mail software. And it's probably the most important part. There remains a special case: that of all the emails emitted according to the different events related to the life of a user account (Creation, Waiting for approval, Deletion, Welcome Mail, etc.). Let's see how to simply send this emails in a HTML format too.
Categories: Drupal

Amazee Labs: DrupalCamp London 2018 - Keeping it Cool

Planet Drupal - 8 March 2018 - 1:41am
DrupalCamp London 2018 - Keeping it Cool

I attended DrupalCamp London this past weekend. This was the 6th consecutive year the event has been hosted, which is remarkable. My mission getting to the event turned out to be just as remarkable! Keep reading to find out more about both.

Fran Garcia Thu, 03/08/2018 - 10:41

Something that the organisers couldn’t control was the fact that the whole of the UK was facing the biggest freeze in recent years. This meant that trains and buses were canceled. Schools, shops, and roads were also closed. As you can imagine, getting from Birmingham to London wasn’t an easy task, but I was on a mission and decided to venture into the elements (as I wasn’t able to either teleport nor fly there - see below!)

 

To make a long story short, plan A and B failed due to multiple cancellations so I opted for no-plan at all - just do and keep doing until I got there. What would usually be a two-hour relaxing journey became a nearly six-hour bumpy, cold, and wet quest through the elements... but guess what? I made it to London!

 


But why did I want to get there so badly? Going to the DrupalCamp was reason enough but additionally, I was selected to do three different talks at the camp. I was really excited about the opportunity and wouldn't miss it for the world!

My three talks were completely different:

The slides are linked above and the videos will soon be available on the Camp YouTube channel.

I am happy with how the talks went. People were engaged and participative - I even missed lunch one day as I was answering questions for more than 40 minutes after the talk. But most importantly I think they made a difference to the people who attended. I’m glad that one way or another I could give something back to the Drupal community. A special thanks goes out to Joe Shindelar for his little push in Vienna :-)

The rest of the sessions were great too. We had amazing speakers, inspiring talks, live demos, in-depth discussions and a unique atmosphere over the whole weekend. I met people from France, Italy, Iceland, Finland, Spain and many other parts of the UK, which was great. I loved listening to their stories and knowing how people work and use Drupal too. I also realised how proud and happy I am to be an Amazee.

The keynotes were especially inspiring, stating once and again Drupal's core values and mission, talking about the community behind Drupal, its importance and the ways in which we can all help improve it. Thanks to Ryan Szrama (Commerce Guys), Chris Teitzel (Lockr) and Baddý Sonja Breidert (1xINTERNET) for sharing your experiences, visions, opinions and for being so close and approachable during the weekend.

And of course thanks, DrupalCamp London (@DrupalCampLDN #dclondon) for organising such a great event. Huge kudos to organizers and volunteers, who were all over the place ensuring that the event was successful and flawless. See you next year!

Categories: Drupal

Pages

Subscribe to As If Productions aggregator - Drupal