One of the problems with Drupal distributions is that they, by nature, contain an installation profile — and Drupal sites can only have one profile. That means that consumers of a distribution give up the ability to easily customize the out of the box experience.
This was fine when profiles were first conceived. The original goal was to provide “ready-made downloadable packages with their own focus and vision”. The out of the box experience was customized by the profile, and then the app was built on top of that starting point. But customizing the out of the box experience is no longer reserved for those of us that create distributions for others to use as a starting point. It’s become a critical part of testing and continuous integration. Everyone involved in a project, including the CI server, needs a way to reliably and quickly build the application from a single command. Predictably, developers have looked to the installation profile to handle this.
This practice has become so ubiquitous, that I recently saw a senior architect refer to it as “the normal Drupal paradigm of each project having their own install profile”. Clearly, if distributions want to be a part of the modern Drupal landscape, they need to solve the problem of profiles.Old Approach
In July 2016, Lightning introduced lightning.extend.yml which enabled site builders to:
- Install additional modules after Lightning had finished its installation
- Exclude certain Lightning components
- Redirect users to a custom URL upon completion
This worked quite well. It gave site builders the ability to fully customize the out of the box experience via contrib modules, custom code, and configuration. It even allowed them to present users with a custom “Installation Done” page if they chose — giving the illusion of a custom install profile.
But it didn’t allow developers to take full control over the install process and screens. It didn’t allow them to organize their code they way they would like. And it didn’t follow the “normal Drupal paradigm” of having an installation profile for each project.New Approach
After much debate, the Lightning team has decided to embrace the concept of “inheriting” profiles. AKA sub-profiles. (/throws confetti)
This is not a new idea and we owe a huge thanks to those that have contributed to the current patch and kept the issue alive for over five years. Nor is it a done deal. It still needs to get committed which, at this point, means Drupal 8.4.x.
On a technical level, this means that — similar to sub-themes — you can place the following in your own installation profile’s *.info.yml file and immediately start building a distribution (or simply a profile) on top of Lightning:base profile: name: lightning
To encourage developers to use this method, we will also be including a DrupalConsole command that interactively helps you construct a sub-profile and a script which will convert your old lightning.extend.yml file to the equivalent sub-profile.
This change will require some rearchitecting of Lightning itself. Mainly to remove the custom extension selection logic we had implements and replace it with standard dependencies.
This is all currently planned for the 2.0.5 release of lightning which is due out in mid March. Stay tuned for updates.
Another day, another Acquia Developer Certification exam review (see the previous one: Certified Back end Specialist - Drupal 8, I recently took the Front End Specialist – Drupal 8 Exam, so I'll post some brief thoughts on the exam below.
Drupal core announcements: 8.3.0 release candidate phase begins week of February 27; no Drupal 8.2.x or 7.x patch release planned
The release candidate phase for the 8.3.0 minor release begins the week of February 27. Starting that week, the 8.3.x branch will be subject to release candidate restrictions, with only critical fixes and certain other limited changes allowed.
8.3.x includes new experimental modules for workflows, layout discovery and field layouts; raises stability of the BigPipe module to stable and the Migrate module to beta; and includes several REST, content moderation, authoring experience, performance, and testing improvements among other things. You can read a detailed list of improvements in the announcements of alpha1 and beta1.
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.4.x will remain open for new development during the 8.3.x release candidate phase.
Drupal 8.3.0 will be released on April 5th, 2017.No Drupal 8.2.x or 7.x releases planned
March 1 is also a monthly core patch (bug fix) release window for Drupal 8 and 7, but no patch release is planned. This is also the final bug fix release window for 8.2.x (meaning 8.2.x will not receive further development or support aside from its final security release window on March 15). Sites should plan to update to Drupal 8.3.0 on April 5.
Sports League module is an out of the box solution to manage sports league functionality in Drupal. It relies on popular modules in drupal to help manage content typically used in websites for sports clubs. Main example is derived from football clubs, but can be easily extended.
- Manage competitions, multi competition editions and its standings.
- Manage clubs and teams.
- Manage matches, rosters and match moments.
- Manage players.
- Manage automatic statistics on players and teams.
- Manage club titles.
In this blog I want to explain the round up we have done around the refactoring of the acl_contact_cache. In the previous sprints we discovered that a lot of the performance was slowed down by the way the acl_contact_cache was used (or rather not used at all). See also the previous blog post: https://civicrm.org/blog/jaapjansma/the-quest-for-performance-improvements-5th-sprint
At the socialist party they have 350.000 contacts and around 300 users who can access civicrm. Most of the users are only allowed to see only the members in their local chapter.
In the previous blog we explained the proof of concept. We now have implemented this proof of concept and the average performance increase was 60%.
We created a table which holds which user has access to which contacts. We then fill this table once in a few hours. See also issue CRM-19934 for the technical implementation of this proof of concept.Performance increase in the search query
In the next examples we are logged in as a local member who can only see members in the chapter Amersfoort. We then search for persons with the name 'Jan'. And we measure how long the query for searching takes.
The query for presenting the list with letters in the search result looks likeSELECT count(DISTINCT contact_a.id) as rowCount FROM civicrm_contact contact_a LEFT JOIN civicrm_value_geostelsel geostelsel ON contact_a.id = geostelsel.entity_id LEFT JOIN civicrm_membership membership_access ON contact_a.id = membership_access.contact_id WHERE ((((contact_a.sort_name LIKE '%jan%')))) AND (contact_a.id = 803832 OR (((( ( geostelsel.`afdeling` = 806816 OR geostelsel.`regio` = 806816 OR geostelsel.`provincie` = 806816 ) AND ( membership_access.membership_type_id IN (1, 2, 3) AND ( membership_access.status_id IN (1, 2, 3) OR (membership_access.status_id = '7' AND (membership_access.end_date >= NOW() - INTERVAL 3 MONTH)) ) ) ) OR contact_a.id = 806816 )) AND (contact_a.is_deleted = 0) )) ORDER BY UPPER(LEFT(contact_a.sort_name, 1)) asc;
As you can see that is quite a complicated query and includes details about which members the user is allowed to see. Only executing this query takes around 0.435 seconds and the reason is that mysql has to check each record in civicrm_contact (which in this case is around 350.000 and growing)
After refactoring the acl cache functionality in CiviCRM Core the query looks different:SELECT DISTINCT UPPER(LEFT(contact_a.sort_name, 1)) as sort_name FROM civicrm_contact contact_a INNER JOIN `civicrm_acl_contacts` `civicrm_acl_contacts` ON `civicrm_acl_contacts`.`contact_id` = `contact_a`.`id` WHERE (((( contact_a.sort_name LIKE '%jan%' )))) AND `civicrm_acl_contacts`.`operation_type` = '2' AND `civicrm_acl_contacts`.`user_id` = '803832' AND `civicrm_acl_contacts`.`domain_id` = '1' AND (contact_a.is_deleted = 0) ORDER BY UPPER(LEFT(contact_a.sort_name, 1)) asc
The query now takes around 0,022 seconds to run (20 times faster).Explanation
How does this new functionality works:
1. Every time an ACL restriction is needed in a query civicrm core only does an inner join on the civicrm_acl_contacts table and that is all
2. The inner join is generated in the service 'acl_contact_cache' that service also checks whether the the civicrm_acl_contacts table need to be updated or not.
3. When an update of civicrm_acl_contacts table is needed depends on the settings under administer --> System Settings --> Misc --> ACL Contact Cache Validity (in minutes)
So how does this look like in code?
Below an example of how you could use the acl_contact_cache service to inject acl logic into your query:// First get the service from the Civi Container $aclContactCache = \Civi::service('acl_contact_cache'); // The $aclContactCache is a class based on \Civi\ACL\ContactCacheInterface // Now get the aclWhere and aclFrom part for our query $aclWhere = $aclContactCache->getAclWhereClause(CRM_Core_Permission::VIEW, 'contact_a'); $aclFrom = $aclContactCache->getAclJoin(CRM_Core_Permission::VIEW, 'contact_a'); // Now build our query $sql = "SELECT contact_a.* FROM civicrm_contact contact_a ".$aclFrom." WHERE 1 AND ".$aclWhere; // That is it now execute our query and handle the output...
The reason we use a service in the Civi Container class is that it is now also quite easy to override this part of core in your own extension.
The \Civi\ACL\ContactCache class has all the logic to for building the ACL queries. Meaning that this class contains the logic to interact with the ACL settings in CiviCRM, with the permissioned relationship etc.. All those settings are taken into account when filling civicrm_acl_contacts table which is per user and per operation once in the three hours.
This Drupal 8 module is meant for the fairly common use case of displaying the current page's submenu items as rendered content entities (typically in the 'teaser' or similar view mode).
You can add Entity Submenu Blocks from the Block layout page and configure the view modes that should be used for different content entity types. By default only menu items for content entities are rendered, but there is an option to render other menu items as simple links too.
An Endzeitgeist.com review
This module clocks in at 40 pages, 1 page SRD, 1 page blank, 1 page blank, leaving us with 37 pages of content. Not included in this page-count would be the two full-color maps on the inside of front and back cover and the front/back cover.
This review was moved up in my review-queue due to me receiving the print copy of this module in exchange for a fair and unbiased review. Additionally, it should be noted that my review is based on the print copy exclusively.
This being an adventure-review, the following contains SPOILERS. Potential players should jump to the conclusion.
All right, still here? Great! This module takes place in the town of Ockney's Hold. The place's moderate wealth derives from the export of azurite over the meandering Oriana River. The local baron, one Oliver Reinson, has recently, quite weirdly, changed his behavior. His interests are changed, the chamberlain has taken a more proactive role and the former captain of the town's guard has been replaced by a half-orc with a nasty temper, one Drast Grimbank. This has significantly changed the atmosphere of the town...and High Steward Braxton Tavaras has determined that something is SERIOUSLY going wrong in town...which is why he meets the PCs in a dingy tavern...though it should be noted that town and tavern-establishing shots/background information are provided with extensive read-aloud text for your convenience...and briefing itself has a lot of interesting components in details - perceptive PCs may, for example, note a pin on Tavaras' sleeves that denotes him as a member of a cadre of beings devoted to the ideals of good government - a kind of benevolent kingmakers/maesters, if you will. The whole module has these small tidbits that make the scenes feel more alive, those little informational nuggets that make it feel pretty organic.
Anyway, Tavaras' task is that the PCs are NOT to engage the baron, but should definitely find out what is amiss. We begin thus with an interesting premise: Thanks to Tavaras' connections and recommendations, the PCs enter the service of the Baron. It is here I can comment on the cartography of the module; apart from the aforementioned full-color maps in the front/back-cover, the internal maps are b/w pencil-drawings and there are a lot o them. The tavern? Mapped. Mansions? Mapped. In the latter case, the map is very detailed and actually makes for a nice handout, in spite of being keyed. In the former, a secret door's included, which means that you'll have to draw a player-friendly iteration. So no, alas, no player-friendly iterations.
Where was I? Oh yes, the PCs are by now in the service of the baron, giving them an inside look of the baroness Helda not being too excited about the change of personality the baron has been exhibiting. The keep is not mapped, but that is due to the relatively brief stay here - you see, the PCs will pretty soon have a chance to save the baroness in the middle of the night from a mimic, of all creatures, that has made its way somehow into the keep. Perceptive PCs receive a direct hint regarding means of egress to the baroness' chambers that may put them on track for the next sequence of the investigation, but smart players are not necessarily reliant on this - the similarly changed Chamberlain Brice would be the next suspect - brusque and uncooperative, shadowing the chamberlain may put them, after some legwork, on trail towards a refinery aptly named the Brick, where the PCs can listen in on both chamberlain and owner of the refinery - and it seems like they have a conspiracy afoot, as a nebulous mastermind is mentioned...of course, they may well be caught and have a fight up their hands, having to deal with the unpleasant master of the refinery...who btw. has his own unique ability to set him apart.
It should definitely be clear after that, that investigating the Brice Manor would be the next step - and btw., the garden is anything but safe, containing several carnivorous plants from 5th Edition Foes, reprinted herein for your convenience. The inside of the manor has btw. a response team of capable individuals, one led by Thaldar, a VERY powerful adversary...and the chamberlain does react with appropriate indignation to the invasion of his home. Here's the thing, though: Smart PCs will want to interrogate the folks...and thus deduce that the captured chamberlain has been replaced by a doppelganger...who, true to convention, when caught, can spill some serious beans.
It seems like a nasty syndicate known as the Ceaseless has driven its claws into the town - you see, the aforementioned primary export of the region, azurite, actually acts like a drug to creatures of certain...anatomies. Namely brain-gorgers, which are basically illithids stripped of closed IP. Yeah. OUCH. Now the ceaseless may have underestimated the impact of addiction to azurite by putting just such an individual in charge of the operation, which is directly a reason the otherwise pretty subtle operation became noticeable, thus drawing in the PCs. In order to save the baron and the town and break the brain-gorger's hold on the baron, the PCs will have to make their way towards the copper mines, provided they manage to survive the response-team sent to deal with them...
The 3-day journey through the wilderness has, just fyi, keyed encounters for each day and interesting things that happen, so yeah - more than a sequence of simple encounters....and then, the PCs will have to navigate the mines and finally deal with the brain-gorger. Wait. At what level? 1 -3? Well, yeah, but guess what - thanks to the addition of said villain, the PCs actually have a fighting chance.
Beyond stats for all monsters employed, the module closes with a nice 2-page gazetteer of the town.
Editing and formatting are very good. I noticed no grievous glitches in formal or rules-language departments. Layout adheres to a crisp two-column b/w-standard and the pdf's b/w-art is nice, as is the cartography. The cartography may not provide player-friendly iterations, but generally is high-quality. The printed softcover comes with glossy cover, thick, nice paper and is generally well-made and doesn't feel cheap - so yeah, if in doubt, I'd recommend print.
This is, to my knowledge the freshman offering of Gamehole Publishing and author Alex Kammer and it hits all my sweet spots. Its descriptive text if evocative. It assumes competent and smart players. It has pointers for GMs for the dialogues; it sports a variety of thematically diverse creatures...and it's not a module that hands you victory on a silver platter. In fact, I consider this to be delightfully old-school. If your players don't act smart, they'll DIE. Horribly. The bosses herein are BRUTAL. The module offers investigation, combat, dungeon- and wilderness-exploration and a captivating, fast-paced plot/unearthing of a conspiracy. In short: This very much reads how I tend to design adventures for my own campaign. Including the challenge it poses. If you're a pampered player who is not used to modules being actually hard to succeed, then this may come as a shock...but victory is EXTREMELY gratifying. You can pretty much play this as dark fantasy, as high fantasy or anything in between - whether it's Oerth, the Forgotten Realms, Golarion or another world, the module will fit in.
Theme-wise, it makes a perfect fit for the Borderlands Region of Frog God Games Lost Lands or, with an emphasis on more horror and a slight reskin of some humanoids, a great fit for Ravenloft. Why? Because its design-aesthetic is so damn beautiful. I know, I know. Call me hypocrite, but most commercial modules for the big systems (exceptions do exist by the spades, mind you) feel a bit too easy for me. I've always been a GM and player who WANTS challenge. I want my choices to matter and make a difference and I want character death to be a possible component of the game. It is here. Now, at the same time, we actually did not lose a character playing this one. By a hair's breadth. But no, this is not, I repeat, this is NOT a meat-grinder. It is not a nega-dungeon either. It is just a thoroughly well-crafted little gem that pits the PCs against brutal odds and a powerful opposition, but has ample in-game rationale why they can triumph.
My one relevant point of criticism pertains the lack of player-friendly versions of the maps, you know, sans key and secret doors etc. That being said, this is one of the most impressive first books I've seen a publisher and author produce in quite some time, and I do have a policy of cutting such first offerings at least a bit of slack. So, while usually the lack of player-maps would cost this my seal of approval, for once, I will retain it here. My final verdict will clock in at 5 stars + seal of approval and as far as I'm concerned, I'm stoked to see the sequel module hinted in the aftermath of this one.
Provides protecting some entities from deletion if they are used in other entities.
If you want to create a web resource, or to implement certain improvements on an existing one, then you must find specialists who will make your ideas come true. It’s quite a challenging task. We offered our 10 tips for hiring a top web developer by mentioning qualities that must be possessed. However, in addition, there are different types of web developers, with different skills, duties and types of work. The objectives and the scale of your project require appropriate experts.Read more
There sure are a lot of orphans in roleplaying games.
From the brooding warrior with no ties to hold her back to the super skilled agent with a family lost to tragedy, it’s very common to find a table full of characters that have no family ties. Sometimes you’re lucky if any of them have any connection at all to anyone outside of the scope of the game. It’s a trope that many players fall into and if you’re not careful, your game’s PCs could represent a vast wasteland of loneliness and isolation.
When I started thinking about writing this article, I considered the six PCs in my Eberron (Pathfinder) game. They each have a pretty rich history, but four of them are still orphans. The Gunslinger was an abandoned infant taken in by a Lyrandar family in Stormhome. The Oracle’s family was slaughtered in the Demon Wastes by cultists that sought to enslave his powers. The Fighter’s merchant parents were casualties of the Last War leaving her to grow up on the streets of Sharn. The Wizard does have a brother, but their parents were also killed during the Last War. The only two characters with any significant family still around are the Witch and the Cavalier. All of these backgrounds make sense for the characters and the world they’re playing in, but it’s still a significant number of orphans.
Family is complicated and messy and can make the game world so much more real and interesting for your character.It really is an easy trope for players to latch onto when creating their characters, and I am certainly not innocent of doing this for my characters. My Jedi in our FFG Star Wars game was a young Padawan on her way to Coruscant when she barely escaped Order 66, forcing her to live as a street urchin. The loss of family or loved ones can be a good catalyst to explain why a character started adventuring or fighting whatever evil lies at the heart of the game being played. At the very least, it can help explain why a character would be willing to give up the creature comforts of home and go on an adventure. If you’ve got nothing you care about at home, or even no home, there’s nothing left to lose.
It’s a reasonable choice, but it skips the rich opportunities having a family can present for your character. While it can provide some simple motivations behind a character, there is a lot to be said for having someone or something to fight for. Rather than doing it because you’ve got nothing left to lose, you could be doing it to ensure the safety of a parent, a sibling, a lover, a child. Family doesn’t have to be limited to blood relations either. Many of us can name friends that might as well be family, people that we would do anything for. Consider creating the same for your character. Family is complicated and messy and can make the game world so much more real and interesting for your character.Players
- When you start going down the well tread orphan route, take a moment and reconsider. It’s too easy a choice. Consider giving your character a big family with plenty of ties all over the place. Or maybe a small, intimate group of friends that they had to leave behind. How about a lover where things got a little complicated and you haven’t had a chance to say you’re sorry yet. Dig a little deeper for some connections and it will help ground your character in the reality of the game.
- Don’t feel you need to map out a full family tree at character creation. Family stuff probably won’t come up in the first session, but don’t shy away from those connections if the opportunity presents itself later. If the characters are heading into a town where your character has history, consider who they know there and mention it to the GM. Recently in the Eberron game, we learned the Gunslinger had a fling with the Witch’s kid sister before they knew each other. That made for some fun scenes all predicated on their ties to the world around them.
- Sure, it can suck to have loved ones in danger, but that’s what drives so many great characters. Katniss Everdeen sacrifices so much to try and protect her little sister. Peter Parker keeps his identity a secret to keep Aunt May safe. John McClane may be going through a rough patch with his wife, but he’ll still take on a bunch of terrorists to save her. Would any of these stories be quite so engaging if it weren’t for the relationships driving these characters? Probably not.
Don’t let your players’ characters exist in a vacuum. Ask questions about their friends and family. They came from somewhere and didn’t raise themselves, so they have people in their lives somewhere. Find out who they care about, who they never want to see again, who they miss. Everyone they ever loved being dead is a pretty extreme place to be and shouldn’t be allowed lightly.
- USE the connections the players give you. Asking questions helps build the world, but if the ties they create never show up in the game, what’s the point? When it makes sense, weave the family and friends of your players’ characters into the game as NPCs. Bringing pieces of their background into play helps reward them for helping add to the world around the characters and they’re great ways to get the players invested in what’s happening in the game.
- Finally and very importantly, don’t be a dick. Never fridge their loved ones just for the sake of messing with the players. Absolutely make the lives of the characters and those around them dangerous and challenging, but doing horrible things just for the sake of getting a rise out of your players is a cheap move and takes away their agency. This is also one of the reasons why some old school players will shy away from creating ties for their character. I’ve heard players state, “I don’t want to give the GM that kind of leverage.” Well, that’s either a player who doesn’t quite get it yet or someone who had a bad experience with an awful GM.
How have your players handled creating family ties in your games? Or, if you’re a player, when have you had family used well? I’d love to hear your stories on how your games made use of extended relationships like these.
Drupal 8 integrating with Traditional ECMs to enhance Enterprise Content Management Capabilities. Drupal 8 is a strong platform with it’s Strong Web Content Management System, has a role to Play in integrating with the existing Challengers/Traditional ECMs to enhance their Enterprise Content Management Capabilities.
A numerical field with enormous range, high precision, efficient storage and computational properties, and associated units property