Planet Drupal

Syndicate content - aggregated feeds in category Planet Drupal
Updated: 3 min 45 sec ago

Amazee Labs: Amazee Labs launches first customer website on Drupal 8

Wed, 01/28/2015 - 16:41
span class=field field-node--title field-name-title field-type-string field-label-hiddenAmazee Labs launches first customer website on Drupal 8/spandiv class=field field-node--field-lead field-name-field-lead field-type-text-long field-label-hidden div class=field-items div class=field-itempWe just completed our third Drupal 8 project: a href= target=_blankSGG - Schweizer Gemeinnützige Gesellschaft/a after a href= a href= a href= a href=, helping out with a href= we are now excited to launch our first client website fully on the upcoming major release of our favorite open source CMS./p pHaving built the community site a href= target=_blankIntergeneration/a and voting platform a href= target=_blankCHymne/a using Drupal 7, we now chose Drupal 8 for the relaunch of the presentation website of SGG. The compact feature of the site allowed us to apply today's strenghts Drupal 8 and so we recreated the associations website relying entirely on Drupal 8 core functionality./p pBuilding the SGG relaunch was a team effort, read on to find about the findings of each of us for building the relaunch on the latest beta release of Drupal 8./p/div /div /div div class=field field-node--field-image field-name-field-image field-type-image field-label-hidden div class=field-items div class=field-itemimg class=image-style-blog-full src= width=556 height=780 alt=Screenshot of the SGG Website Relaunched on Drupal 8 title=Screenshot of the SGG Website Relaunched on Drupal 8 typeof=foaf:Image / /div /div /div div class=field field-node--body field-name-body field-type-text-with-summary field-label-hidden div class=field-items div class=field-itempa href= target=_blankBoris/a was involved with emsite building/em, these are his thoughts:/p blockquote pDrupal 8 in terms of sitebuilding is awesome. After a short time you are able to build almost everything out of the box. Sometimes you have to think around the corner to get your result. And sometimes you get stuck because of some nasty bugs./p pBut with a great Backend-Developer on Hand (a href= target=_blankAlex/a) we could also solve some issues during creation of our project./p ulliBuilding content types is much more powerful with Drupal 8 core: you can define a href= target=_blankview modes/a, a href= target=_blankform modes/a and many field types like a href= target=_blanke-mail/a, a href= target=_blankentity reference/a etc have been integrated/li liFull translation capabilities: thanks to a href= target=_blank#d8mi/a no dozen of i18n modules are required but Drupal 8 core ships with configuration, content amp; interface translation/li lia href= target=_blankWYSIWYG editing/a functionality is part of core and just works/li lia href= target=_blankViews in Core/a: we can create dynamic listings  /li lia href= target=_blankEnhanced block system/a: we can even reference blocks using entity reference now/li /ul/blockquote img alt=Views in core data-editor-file-uuid=42c3efe4-a1d3-4908-9e28-404c9032d232 height=733 src= width=1212 /pa href= target=_blankAlex/a did embackend development/em for the SGG relaunch, his feedback on the project:/p blockquote olliA lot of things in D8 are a href= target=_blankplugins/a and the new plugin system is really cool: to extend a plugin, all you need is to extend its class and place your new class in the proper namespace./li liEven if core still uses some PHP magic, everything is documented well with PHPDoc, and the a href= target=_blankIDEs/a help a lot to write code./li liTip: while Drupal 8 is in the beta stage, use core dev releases only for core development. I tried dev releases two times, in both cases a lot of functionality was broken. If you need D8 in production: use beta releases, they are much more stable./li liEvery piece of PHP code is covered with a href=!modules!system!core.api.php/group/testing/8 target=_blanktests/a. That's super cool: if you want to understand how the thing works or what its purpose: read its tests, you will learn a lot from there./li liSad: there is no core stuff for a href= target=_blanktesting JavaScript code/a. There are some contrib modules for that, but, anyway, it's not in the core, so JavaScript tests are not mandatory./li liSad: a href= target=_blankbeta-to-beta updates/a are not ready. That makes core updates really hard. The good thing is that it's the target number one./li liThe a href= target=_blanktranslation system/a is really good. All translation cases are handled right in the core./li /olpOverall, I have really really good feeling about D8. Previously we said Drupal way about many coding stuff. Now it's the a href= target=_blankright way/a! Drupal core now uses bleeding edge technologies, and that makes work really interesting./p /blockquote img alt=Blocks are plugins in Drupal 8 data-editor-file-uuid=fb9ef8c1-3743-4ab9-a700-ae58082b0453 height=756 src= width=871 /pa href= target=_blankKathryn/a did front-end development, this is what she would like to share:/p blockquote pspanBuilding a custom theme for Drupal 8 is almost an entirely different process than building one for Drupal 7. I think this is especially true for Amazee Labs since historically, we are Panels people. Because the a href= target=_blankPanels/a module isn’t ready for Drupal 8, we're forced to make heavy use of template files. /span/p pspanIn my experience with Drupal 8 (and on this project in particular), working with a href= target=_blankTwig/a templates is much more concise and straightforward to code than a D7 .tpl file. As a developer with only basic PHP skills, the Twig syntax is easier to grasp. /span/p pspanFor the SGG theme, there are over ten custom Twig templates, most of which a href= target=_blankextend/a/spanspan upon another./span/p pspanEven though the design of the SGG theme appears simple, there were many instances where the content display required use of the Twig a href= target=_blank{{ dump() }}/a function to drill into variables. /span/p pOne thing I found frustrating during this process was sifting through the output of the dump’s results. a href= target=_blankKrumo/a formatting in D7 is so nice and tidy, while the D8 output is a jumbled mess, even after wrapping it in a lt;pregt; tag. /p pspanTo work around this, a href= target=_blankKint/a is your new best friend. You’ll need to download the 8.x version of the a href= target=_blankDevel/a module, enable it, along with Devel Kint. Include {{ kint() }} in your template file and voilà - nested arrays that won’t make your head spin around. /span/p pspanI could go on, but the gist of it is: mastering Twig continues to be my number one priority for Drupal 8. The SGG Drupal 8 project was no exception./span/p /blockquote img alt=A sneak peak into Drupal 8 twig templates data-editor-file-uuid=2c68ba75-5df7-417c-8500-d51bd8c45740 height=475 src= width=1088 /pAnd this is the result: a href= target=_blank pCreating web sites with Drupal 8 is possible today. You certainly have to be aware of constraints regarding not-yet-upgraded modules and account for some core bugs along the way. On the other hand, working with Drupal 8 just feels right: best practices from back-end to front-end development have been incorporated and the site building experience is really solid./p pStep by step we will approach bigger client projects with Drupal 8. Interested in a future proof website? - let's a href= target=_blankstart a project together/a./p/div /div /div

Annertech: Check out my website - it's responsive! Yawn!

Wed, 01/28/2015 - 15:00
span class=field field-node--title field-name-title field-type-string field-label-hiddenCheck out my website - it#039;s responsive! Yawn!/span div class=field field-node--body field-name-body field-type-text-with-summary field-label-hidden div class=field-items div class=field-itema href= class=twitter-share-button data-via=annertech data-size=large data-related=annertech data-hashtags=rwdTweet/a script !--//--![CDATA[// !-- !--//--![CDATA[// !-- !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);;js.src=p+'://';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs'); //--!]]]]![CDATA[ //--!]] /scripth3OMG! You've got a responsive website!/h3 pOnce something to brag about, this is now old news./p/div /div /div

ThinkShout: Reimagined Sprints and Introducing RedHen Raiser

Wed, 01/28/2015 - 01:00
pimg src=/assets/images/blog/raiser_0.jpg alt=raiser_0.jpg/p pWe’ve been experimenting with monthly team sprints at ThinkShout over the last year with varied levels of structure and outcomes. This month, we decided to take a step back, reevaluate our goals, and reimagine our sprint process. And, we moved it to a Thursday. a href= bow-tie Thursday/a./p pPreviously, these sprints were loosely structured around a topic or technology, such as a href= in Drupal 8/a. Suffice it to say, they were a lot of fun and very exploratory, but they weren’t the most engaging for everyone on the team. This time around, we decided to collaborate on a single initiative - in this instance, a product - that would benefit from the skills and perspectives of everyone in the company. Consequently, we decided to rally around a href= Raiser/a, our new peer-to-peer fundraising distribution for Drupal. /p h3Introducing RedHen Raiser/h3 pimg src= alt=raiser_1.jpg/p pRedHen Raiser is designed for building peer-to-peer fundraising websites, like the sites you see for marathons and walks, where a fundraising campaign is made up of myriad individual and team pages, and can be customized by the participants for fundraising amongst their respective communities, while remaining connected to the larger campaign./p pAs the name suggests, RedHen Raiser is built on top of a href= CRM/a, including the a href= Donation/a and a href= Campaign/a modules, and it’s chock full of awesome:/p ul lipEasy Campaign creation so site visitors can join right away by creating their own Team or Individual fundraisers./p/li lipA beautiful, consistent fundraising experience that is based on inherited display values from the larger Campaign./p/li lipGoal progress widgets including thermometers, leaderboards, etc./p/li lipMini-blogs for Campaigns and Fundraisers via Update content type./p/li lipAbility to create and maintain different pages for different fundraisers with a single account./p/li lipAutomated start and end dates./p/li lipCommerce-readiness - just add your payment method and go!/p/li lipSingle-page donation forms via RedHen Donation./p/li lipBuilt using established modules with simple UI (Views, RedHen, Context, etc) for easy customization./p/li /ul pIt’s ThinkShout’s latest offering in a suite of nonprofit engagement building blocks that we’ve been developing, and was initially developed for the a href= Area Food Bank of Washington, DC/a. RedHen Raiser competes feature for feature with top emsoftware as a service (SaaS)/em peer-to-peer fundraising platforms, such as TeamRaiser, CauseVox and Razoo. /p pAs a result of our work with this client, we were able to release a very rudimentary version of RedHen Raiser on that would provide a basic starting point to other developers interested in building a peer-to-peer fundraising tool. The product is also a huge win for CAFB of DC, simply because they were able to reap a huge dividend on their initial investment by getting these improvements for free./p h3Involving the Full Team in One Sprint/h3 pimg src= alt=raiser_2.jpg/p pAs an open source emproduct/em, RedHen Raiser presented us with some interesting opportunities to engage more than just our engineers in the sprint process, and it certainly needed a lot of love on a lot of fronts. Leveraging the different interests and expertise of our 18-person company, we split into five teams:/p ul lipstrongDev Ops/strong - this team focused on deployment infrastructure, build processes, and automated testing;/p/li lipstrongBug Fix amp; Feature Dev/strong - team members spent the sprint day working on the development backlog;/p/li lipstrongUX/strong - the User Experience team worked ahead of the feature development team to identify and sketch out new features and enhancements;/p/li lipstrongQA/strong - the Quality Assurance team was made up of our project managers acting as quot;product owners;quot;/p/li lipstrongCommunity Engagemen/strongt - this team, consisting of our sales, marketing, and operations staff, was tasked with documenting the sprint and sharing our contributions with the wider Drupal and nonprofit technology communities./p/li /ul pIt’s worth noting that the quality assurance team and the community engagement team came together for the first half of the sprint for an in-depth training on the Drupal contributed modules and components underlying RedHen Raiser. Ironically, we often get so busy building these sorts of tools for our clients that we don’t stop to educate our own quot;non-developerquot; team members on how stuff works. By taking this time to dive into the nitty gritty with our project managers, marketing and operations folks, we create better advocates for these solutions and help ensure that everyone in the company feels like contributor to our success./p h3Planning for the Sprint/h3 pimg src= alt=raiser_3.jpg/p pAs ThinkShout has grown, the need for sprint planning has grown with it. Back when we first started these sprints, we could fit our entire team around a single table (covered in pizza boxes and beer) and call out with development tickets we each needed help with. /p pNow, with a team of 18 working together from 11am to 5pm, these sprints take a bit more planning - to say nothing of balancing the opportunity cost of investing a collective 108 hours of non-client work into a single week. To keep things running smoothly, we’ve taken a more project-planning-esque approach to our sprint days:/p ul lipstrongScheduling in advance/strong: The date and time of the sprint is scheduled a month in advance. We used to just stick with the last Friday of the month, but found that this sometimes excluded certain team members on deadlines or vacation. Now, we coordinate a bit more tightly to help ensure participation of as many team members as possible./p/li lipstrongLaser focus/strong: the focus of the sprint is announced to the team three weeks in advance. This gives the team time to think about stuff they want to work on, and add to the feature backlog in the weeks coming up to the sprint./p/li lipstrongPre-sprint planning meetings/strong: The department leads meet a week before the sprint to form teams and structure the sprint agenda, and prioritize the development/feature backlog two days in advance of the sprint./p/li lipstrongPre-sprint presentations/strong: The week before the sprint, we do a short, company-wide presentation on the sprint topic at our weekly staff lunch. This helps energize the team and sparks knowledge sharing in the lead up to the sprint day./p/li lipstrongFormally quot;openingquot; and “closing” the sprint day/strong: As our sprint commences, we kick things off with a quick, all-staff scrum. More importantly, we pull the team back together at the end of the day for each sprint team to present (and celebrate!) what they’ve completed./p/li /ul h3Outcomes of Our RedHen Raiser Sprint/h3 pimg src= alt=raiser_4.png/p pSo what does it all mean? This new approach to our team sprints resulted in just shy of 100 commits on RedHen Raiser and the underlying modules that power the distribution. We published a a href= release/a of RedHen Raiser, a href= Donation/a and the a href= Campaign/a modules - as well as a release of our base a href= CRM/aa href= suite/a. /p pOne of the biggest wins to come out of the sprint are a href= tests/a powered by a href= Tests are triggered with every commit to GitHub and run on a href= CI/a. At this point, test coverage is a bit limited, but the foundation has been laid for complete test coverage for RedHen Raiser, a critical factor when organizations are evaluating which software to use./p pTo top it off, we cleaned up a few RedHen project pages on and began working on a RedHen-specfic QA testing plan. We also reached out to the RedHen open source community to let them know what we were up to and how folks can continue to get involved. Most of all, we are proud to say that this effort is a huge contribution to the nonprofit tech community, in that it provides major improvements to a powerful tool that can be leveraged for free - and has the documentation to support it!/p pAll in all, the ThinkShout team came together in a big way, and accomplished much more than we could have if we had remained siloed in our approach. We had a lot of fun, drank some beer, ate some good food, and got to collaborate as a whole team on something really cool. We’re really looking forward to the next one!/p

Code Karate: An introduction to Git (part 2): Your first Git repository

Tue, 01/27/2015 - 21:49
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpIn a href=/blog/introduction-git-part-1An introduction to Git Part 1/a, you learned a littl/p/div/div/div

Drupal Commerce: Shipping the Future

Tue, 01/27/2015 - 19:57
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedh2 id=shipping_requirements_have_changedShipping Requirements Have Changed/h2 pHeretofore, shipping has focused on exposing a simple yet effective API for connecting rating and shipping companies to the checkout process. Many stores eschew real-time rating and instead opt to offer flat-rate shipping or free shipping on orders. This entirely removes the need for rating. For those who do use real-time rating, the existing process offers a simple set of tools that are only adequate for simple shipping needs./p/div/div/div

DrupalCon News: Calling UX Designers

Tue, 01/27/2015 - 19:13
div class=field field--name-body field--type-text-with-summary field--label-hiddendiv class=field__itemsdiv class=field__item evenpWelcome UX Design experts. We want to hear your latest thoughts, ideas, techniques and analysis on the latest state of the web. If you’ve got a burning idea you want to share about how to do things better, a href= want to hear about it/a./p pWe’re looking for talks on:/p/div/div/div

Cheeky Monkey Media: How to automatically send your content to social networks

Tue, 01/27/2015 - 18:00
div class=field field--name-field-article-image field--type-image field--label-hiddendiv class=field__itemsdiv class=field__item evena href=/blog/drupal-planet/how-automatically-send-your-content-social-networksimg src= width=1380 height=444 alt=Send your content to social networks //a/div/div/divdiv class=field field--name-body field--type-text-with-summary field--label-hiddendiv class=field__itemsdiv class=field__item evenpA few months ago I was asked to help manage our company blog. As a busy drupal developer, I had little time to post all of our new blog content on every social media site. So I decided to automate this so I could spend more time on client projects./ppMy first step was to look around and see what was currently available. Although there was some options, I found them to be a bit heavy for my application./ppOne of the things I was looking for was to be able to choose what social networks our content would be posted to. For example, I wanted to be able to choose to post this page to...a href=/blog/drupal-planet/how-automatically-send-your-content-social-networks class=more-linkRead More/a/p/div/div/div

Aten Design Group: Creating Custom Ctools Layout Plugins with Yeoman

Tue, 01/27/2015 - 16:30
img src= width=1000 height=600 alt= /pAs a front-end developer working with Drupal, I often need to create custom Ctools layout plugins. a href= is an essential suite of tools for Drupal developers and the basis of many popular modules, including a href=, a href=, a href= and a href= Suite/a. Its layout plugins provide a flexible alternative to Drupal’s core page region system./p pa href= a custom Ctools layout plugin/a for Drupal is actually quite easy. You define your layout in a .info file, create the html structure in a template (#42;.tpl.php), style it in a stylesheet (#42;.css or *.scss) and provide a thumbnail image so the site administrator has an idea of what it looks like. Each of these files follows similar but slightly different naming conventions. This can be tedious when you need to create a number of custom layouts for a project as we often do at Aten./p pMy previous workflow looked like this./p ol liFind another layout plugin – either an existing custom layout or one from the Panels module./li liCopy that folder into the plugins folder in my module or theme./li liRename the folder to match my plugin./li liRename all the files to match my plugin’s name, using the appropriate naming convention and file extensions./li liEdit the .info file to point to the appropriate files and change the array of regions to match the new layout./li liEdit the template file to match the newly created regions./li liWrite the CSS to style the layout./li liCreate a new thumbnail image./li /ol pA lot of these steps consist of copy, paste, find and replace – the kind of stuff that’s better suited for computers. That's where a href= comes in. Yeoman is a scaffolding tool. It's most often used to quickly create boilerplate code that can be customized to your needs./p pI recently published a a href= generator/a that automatically creates a ctools layout plugin based on a few simple settings. Now my workflow looks like this:/p ol liCreate a directory for my plugin./li liType span class=geshifiltercode class=text geshifilter-textyo ctools-layout/code/span./li liAnswer questions about my layout./li liAdd any extra markup to the template file./li liWrite the CSS to style the layout./li liCreate a new thumbnail image./li /ol pThe new workflow eliminates the tedious tasks and allows me to focus on the code that makes a given layout unique: markup, style and a thumbnail./p pHere’s how to use it./p pa href= Yeoman/a *note: Yeoman is a Node.js tool, so you need to a href= Node.js/a in order to use it./p pTo install Yeoman type the following into your terminal:/p div class=geshifilterpre class=geshifilter-textnpm install yo -g/pre/div pThe span class=geshifiltercode class=text geshifilter-text-g/code/span flag installs this package globally. Doing so allows you to run the span class=geshifiltercode class=text geshifilter-textyo/code/span command outside of an existing node project. A common Yeoman use case is scaffolding out a brand new project, after all./p pemNote: Depending on your environment, you may need to run these commands with span class=geshifiltercode class=text geshifilter-textsudo/code/span./em/p pNow you have the general Yeoman application. But to be useful, you need some a href= div class=geshifilterpre class=geshifilter-textnpm install ctools-layout-generator -g/pre/div pThe ctools layout generator assumes you already have a custom module or theme that you are adding a layout to. For this example we'll assume this custom layout is in our theme. From your theme's root directory create a new directory for your layout plugin, change to your new directory and run the ctools_layout generator command./p prediv class=geshifilterpre class=geshifilter-textmkdir plugins/layout/landing_page cd plugins/layout/landing_page yo ctools_layout/pre/div/pre pYeoman will prompt you with a few questions about your layout, such as the name of your layout, the name of the module or theme it exists in and the regions you want to include. After answering the questions, Yeoman creates all the necessary files needed for a working layout./p pThe ctools layout generator makes no assumptions about what your layout looks like or the actual CSS styles and markup needed to make it functional. That's your world! It's completely up to you. It simply takes your list of regions and adds them to the layout's .inc file and to the template file in which you can add the appropriate markup./p pSimilarly, the generator will add a placeholder .png thumbnail of your layout. The generator has no idea what you have in mind for your layout, so you'll want to create your own thumbnail and save it over the placeholder. The thumbnail is important as it gives the end user a good idea of what the layout looks like. I've shared a a href= template/a that I use for creating layout thumbnails./p pI hope you find this useful. If run into any problems or have feedback, please a href= an issue on github/a./p pP.S. In case yeoman isn’t your thing, there is a a href= plugin/a that has similar functionality and works for more than just layouts./p

Gábor Hojtsy: Drupal 8 multilingual tidbits 17: content translation basics

Tue, 01/27/2015 - 16:27
div class=field field-name-body field-type-text-with-summary field-label-hidden view-mode-rssdiv class=field-itemsdiv class=field-item evenpemI just updated a href= prior 16 posts in this series/a with up to date screenshots and text over the weekend and here is the new post!/em/p pIn the a href= to content and configuration translation/a piece we discussed what is considered emcontent/em in Drupal 8. This is a somewhat misleading term because custom blocks, custom menu items and even user entities (user profiles) are considered content in terms of their implementation. /p pContent is always stored as entities. The main difference between configuration and content entities is configuration is usually created on the backend (think views, vocabularies, etc.) while content is usually created on the frontend (think free tagging taxonomy terms, comments, blog posts). This is not a black and white differentiation but it helps think of the categories. The other key differentiator is content entities emusually/em get to have configurable fields. You can add new fields to user profiles, taxonomy terms or comments. Again there are exceptions, for example custom menu items cannot get configurable fields in core. Finally, there are even content entities that will not be stored, in Drupal 8 contact form submissions are content entities that live only until they are sent via email. For this tidbit we are concerned for content entities that are stored and multilingual./p /div/div/div

Drupal Easy: Creating a Talent Underpinning

Tue, 01/27/2015 - 15:09
pimg src= alt=DrupalEasy hearts AcquiaU //p pHaving just completed presenting the Drupal career training portion of AcquiaU, we are anticipating great experiences for all ten students as they begin their eight weeks of rotations within three different business groups within Acquia. The past two months have been a whirlwind of teaching, learning and team building, which provided great insight into a forward-thinking approach to building Drupal talent, made possible by the commitment of Acquia./p pWe are pleased to have contributed to the new AcquiaU with the customization of our a href= Career Online/a curriculum. I’d like to share some great lessons learned, as well as introduce the ten people who were lucky enough (luck favors the prepared) to be selected for this amazing program./p !-- rdf:RDF xmlns:rdf= xmlns:dc= xmlns:trackback= rdf:Description rdf:about= dc:identifier= dc:title=Creating a Talent Underpinning trackback:ping= / /rdf:RDF -- pa href= target=_blankread more/a/pdiv class=feedflare a href= src= border=0/img/a a href= src= border=0/img/a /divimg src=// height=1 width=1 alt=/

Makina Corpus: Turning hackability into a use case

Tue, 01/27/2015 - 13:45
When a CMS does not allow happy hacking anymore, it loses a very valid use case.

InternetDevels: Drupal module for messages just like in Facebook

Tue, 01/27/2015 - 11:00
div class=field field--name-body field--type-text-with-summary field--label-hiddendiv class=field__itemsdiv class=field__item evenp style=text-align: justify;We worked hard during a few days and developed our own module called a href= target=_blank rel=nofollowPrivate message with node.js/a./p a href= more/a/div/div/div

Drupal @ Penn State: Headless Authoring UX sprint

Tue, 01/27/2015 - 03:30
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedp dir=ltrLet’s face it, we have a problem. It doesn't matter how powerful what you build is if no one wants to use it. How can the modern CMS hope to compete with simple drag and drop, one-click authoring services that can produce the majority of websites people want to build? Do you really think the answer to this can still be found on Drupal’s edit form or with the panels ecosystem? Will open source CMSs fade from popularity because we continue to ask human beings to design content with a WYSIWYG? Well, we aren't waiting to find out.../p/div/div/div

Appnovation Technologies: 5 Cool Drupal Websites

Tue, 01/27/2015 - 00:27
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encoded divIt’s hard enough trying to find cool websites in general, let alone cool websites made using Drupal./div/div/div/divdiv class=field field-name-field-blog-header-image field-type-image field-label-hiddendiv class=field-itemsdiv class=field-item evena href=/blog/5-cool-drupal-websitesimg typeof=foaf:Image src= width=700 height=200 alt= //a/div/div/divdiv class=sharethis-buttonsdiv class=sharethis-wrapperspan st_url= st_title=5 Cool Drupal Websites class=st_facebook/span span st_url= st_title=5 Cool Drupal Websites class=st_twitter/span span st_url= st_title=5 Cool Drupal Websites class=st_sharethis/span script type='text/javascript'var switchTo5x = false;/scriptscript type='text/javascript' src=''/scriptscript type='text/javascript'stLight.options({publisher:dr-75626d0b-d9b4-2fdb-6d29-1a20f61d683});/script/div/div

Phase2: Ultimate Flexibility: Open Atrium’s New Related Content Feature

Mon, 01/26/2015 - 22:00
pa href= class=alignright size-full wp-image-6462 alt=atrium-logo (1) src= width=300 height=82 //aThe constant struggle between content editors and web developers:/p ul liContent editors want to embed rich media, callouts, and references to related content anywhere within their WYSIWYG.  They love the Body field and want more buttons added to the WYSIWYG./li liWeb developers want to add additional fields for media, attachments, related content to support rich content relationships and access control.  Web developers hate the Body field and wish they didn#8217;t need a WYSIWYG./li /ul pspan style=line-height: 1.5em;In the latest 2.30 version of Open Atrium, we attempt to help both content editors and web developers with a new approach to building rich story content using the a href= module/a.  Rather than having a single WYSIWYG body, content editors can build their story using multiple paragraphs of different types and layouts. The order of these paragraphs can be rearranged via drag and drop to create long-form content./span/p pSite builders can add their own custom paragraph types to their sites, but Open Atrium comes with four powerful paragraph types #8220;out of the box#8221;:/p h2(1) Text Paragraphs/h2 p style=text-align: center;a href= class=aligncenter wp-image-9458 alt=OA2_Test_Paragraph src= width=667 height=343 //a/p pThe simplest paragraph type is the #8220;Text#8221; paragraph.  It works just like the normal Body field with it#8217;s own WYSIWYG editor.  But an additional Layout field is added to control how the text is rendered.  There are options for multiple columns of wrapping text within the paragraph (something nearly impossible to do with the normal Body field), as well as options for left or right floating #8220;callouts#8221; of text./p h2(2) Media Gallery/h2 p style=text-align: center;a href= class=aligncenter wp-image-9461 alt=OA_Media_Paragraph src= width=674 height=679 //a/p pThe #8220;Media Gallery#8221; paragraph handles all of the images and videos you want to add to your story.  It can replace the normal Attachments field previously used to add media to a document.  Each Media paragraph can contain one or more images, videos, or files.  The Layout field controls how that media is displayed, providing options for left or right floating regions, or a grid-like gallery of media.  Videos can be embedded as preview images or full video players./p pWhen floating media to the left or right, the text from other paragraphs will flow around it, just as if the media had been embedded into the WYSIWYG.  To move the images to a different part of the story, just drag the media paragraph to a new position in the story./p pIn Open Atrium, images directly embedded into the Body WYSIWYG field becomes Public, bypassing the normal OA access control rules.  However, anything added to a Media paragraph works more like the Attachment field and properly inherits the access permission of the story document being created.  Thus, the Media paragraph provides a way to embed Media within your story while retraining proper privacy permissions./p h2(3) Snippets/h2 p style=text-align: center;a href= class=aligncenter wp-image-9463 alt=OA_Snippet_Demo src= width=662 height=374 //a/p pThe #8220;Snippet#8221; paragraph type allows you to embed text from any other content on your site.  You can specify whether the Summary, Body, or full Node is embedded and also control the Layout the same as with Text paragraphs.  You can also either display the Title of the referenced content or hide the title, or override the title with your own text./p pOne of the best features of Snippets is the ability to lock which revision you want to display.  For example, imagine you want to embed a standard operating procedure (SOP) within your story document.  You create a Snippet paragraph that points to the SOP.  However, if the related SOP node is updated in the future, you don#8217;t want your old document to change.  For compliance purposes it still needs to contain the original SOP text.  By #8220;locking#8221; the snippet to the old revision, the old document will continue to display the original SOP even if the SOP is updated later.  If you #8220;unlock#8221; the snippet, then it will display the latest version of the related SOP./p pOpen Atrium access controls are also respected when displaying snippets.  If you reference content that the user doesn#8217;t have permission to view, that snippet will be removed from the displayed text.  Users still only see the content they are allowed.  This provides a very powerful way to create rich documents that contain different snippets of reusable content for different user roles and permissions.  Similar to adding additional fields with Field Permissions, but much more flexible and easy to use./p h2(4) Related Content/h2 p style=text-align: center;a href= class=aligncenter wp-image-9464 alt=OA_Related_Demo src= width=667 height=628 //a/p pThe #8220;Related Content#8221; paragraph type is similar to Snippets, but displays the Summary or Full rendered node of the related content.  Like the Media paragraph, the Related Content can contain one or more references to other content on the site.  The Layout provides options for displaying the content as a table of files, or a list of node summaries (teasers), or as full node content.  When full node content is used, any paragraphs used in the related content will also being displayed (paragraph #8220;inception#8221;!).  In addition, any special fields from the full related node can be shown.  For example, a Related Event will show the map of the event location.  A Related Discussion will show all of the discussion replies and even provide the Reply Form, allowing you to reply to a related discussion directly from the story document itself!/p pRelated Content is also a bi-directional link.  When you view the related content node, a sidebar widget called #8220;Referenced From#8221; will show all of the stories that reference the node being viewed./p h2A Real World Example/h2 pTo pull all of this together with a real-world example, imagine that you are scheduling a Meeting.  You want to create an Agenda for that meeting and allow your team to discuss and edit the agenda before the meeting.  In Open Atrium you can now do this all from a single document:/p ol liCreate the Event for the Meeting, adding your team to the Notifications/li liAdd a Related Content paragraph for the meeting Agenda document/li liAdd a Related Content paragraph for the agenda Discussion/li /ol pOpen Atrium is smart about where this related content is created.  If you already have a section for documents, the Agenda will be created within that section.  If you already have a section for discussions, the related discussion will be placed there.  You can change these locations if you wish, but the default behavior reflects the most common information architecture./p pWhen your team members receive the email notification about the meeting and click the link, they will be taken to your Event and will see the agenda document and discussion as if they were a normal part of the event body.  They can view the agenda content directly and can post replies directly into the discussion reply field.  They don#8217;t need to go to separate places on the site to see the document or discussion.  If you *do* view the document or discussion nodes directly, such as from a search results page, you#8217;ll see a link back to the meeting event in the References From list in the sidebar./p h2Conclusion/h2 pNot only do the Paragraph features help content editors build rich stories quickly and easily, they allow web developers to create related documents, linked content, better search results, better data structures.  It#8217;s still not a magical unicorn wysiwig of content editor#8217;s dreams, but it#8217;s a significant step for Open Atrium and Drupal. It opens a whole new world of collaboration where all related content can be viewed together./p pLooking for more information about Open Atrium? a href= up to receive Open Atrium newsletters and updates!/a Don#8217;t miss our a href= release webinar/a on Wednesday, January 28th, at 11am EST!a href=;urlhash=-5NXamp;_t=tracking_anet target=blank rel=nofollowbr / /a/p img src= style=float:left; xml:base= width=1 height=1 border=0 align=right/

Chocolate Lily: Drupal 8 and distributions part 2: problems and prospects

Mon, 01/26/2015 - 20:10
div class=field field-name-body field-type-text-with-summary field-label-hidden view-mode-rssdiv class=field-itemsdiv class=field-item even property=content:encodedpemThis is part two of a series on configuration management challenges in Durpal 8. Part 1 looked at a href= for small sites and distriubtions/a./em/p pWhat is the state of support for distributions in Drupal 8?/p pTrying to gauge the state of emanything/em in Drupal 8 has its inherent pitfalls. The software itself is still changing rapidly, and efforts in the contributed extensions space have barely begun./p/div/div/div

Another Drop in the Drupal Sea: Seeking Pilot members for Udemy Drupal Training course

Mon, 01/26/2015 - 19:22
pThe Kickstarter campaign was not funded, but that does not mean that it was not successful! We are still moving ahead. I've just published my first course on Udemy and would like to get pilot members to provide feedback so that I can make sure the course ends up being world class./p pHere is a coupon code to access the course for free: a href= title= pa href= target=_blankread more/a/p

Web Omelette: Creating a custom Views filter in Drupal 8

Mon, 01/26/2015 - 09:05
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpIn the a href= article we've seen how we can interact programatically with Views in Drupal 8 in order to create a custom field in our Views results. Today, we will be looking a bit at how we can create a custom filter you can then add to the View in the UI and influence the results based on that./p pThe code we write here will be available also in a href= repository/a together with the one we explored in the previous tutorial./p pFilters in Views have to do with the query being run by Views on the base table. Every filter plugin is responsible with adding various clauses in this query in an attempt to limit the results. Some (probably most) take on configuration parameters so you can specify in the UI how the filtering should be done./p pIf you remember from the last article, to create our field we extended the codeFieldPluginBase/code class. Similarly, for filters, there is a codeFilterPluginBase/code class that we can extend to create our own custom filter. Luckily though, Views also provides a bunch of plugins that extend the base one and which we can use or extend to make our lives even easier. For example, there is a codeBooleanOperator/code class that provides a lot of the functionality needed for this type of filter. Similarly, there is an codeInOperator/code class, a codeString/code class, etc. You can find them all inside the codeviews/src/Plugin/views/filter/code directory of the Views core module./p pIn this tutorial, we will create 2 custom filters. One will be a very simple one that won't even require creating a new class. The second one will be slightly more complex and for which we will create our own plugin./p pThe code we write will go in the same module we started in the previous article and that can be found in a href= repository/a./p h2Node type filter/h2 pThe first filter we will write is very simple. We want to be able to filter our node results by the machine name of the node type. By default, we can use a filter in which we select which node types to be included. Let's say, for the sake of argument, we want a more complex one, such as the one available for a regular text value like the title. The codeString/code class will be perfect for this and will provide actually 100% of our needs./p pSo let's go to our codehook_views_data_alter()/code implementation and add a new filter:/p precode... $data['node_field_data']['node_type_filter'] = array( 'title' =gt; t('Enhanced node type filter'), 'filter' =gt; array( 'title' =gt; t('Enhanced node type filter'), 'help' =gt; t('Provides a custom filter for nodes by their type.'), 'field' =gt; 'type', 'id' =gt; 'string' ), ); ... /code/pre pSince the table that we are interested in altering the query for is the codenode_field_data/code table, that is what we are extending with our new filter. Under the codefilter/code key we have some basic info + the id of the plugin used to perform this task. Since our needs are very simple, we can directly use the codeString/code plugin without us having to extend it. The most important thing here though is the codefield/code key (under codefilter/code). This is where we specify that our codenode_type_filter/code field (which is obviously a non-existent table column) should be treated as being the codetype/code column on the codenode_field_data/code table. So, by default, the query alter happens on that column. And this way we don't have to worry about anything else, the codeString/code plugin will take care of everything. If we didn't specify that, we would have to extend the plugin and make sure the query happens on the right column./p pAnd that's it. You can clear your cache, create a View with nodes of multiple types and add the codeEnhanced node type filter/code to it. In its configuration you'll have many matching options such as codeequals/code, codecontains/code, codedoes not contain/code etc you can use. For example, you can use codecontains/code and specify the letters codeart/code in order to return results whose node type machine names contain these letters./p h2Node title filter/h2 pThe second custom filter we build will allow Views UI users to filter the node results by their title from a list of possibilities. In other words, they will have a list of checkboxes which will make it possible to include/exclude various node titles from the result set./p pdiv id=block-inject-2 class=block-inject block-inject-2/divdiv class=clearfix/divpLike before, we need to declare our filter inside the codehook_views_data_alter()/code implementation:/p precode... $data['node_field_data']['nodes_titles'] = array( 'title' =gt; t('Node titles'), 'filter' =gt; array( 'title' =gt; t('Node titles'), 'help' =gt; t('Specify a list of titles a node can have.'), 'field' =gt; 'title', 'id' =gt; 'd8views_node_titles' ), ); ... /code/pre pSince we are filtering on the title column, we are extending again on the codenode_field_data/code table but with the codetitle/code column as the real codefield/code to be used. Additionally, this time we are creating a plugin to handle the filtering identified as coded8views_node_titles/code. Now it follows to create this class:/p pstrongsrc/Plugin/views/filter/NodeTitles.php:/strong/p precodelt;?php /** * @file * Definition of Drupal\d8views\Plugin\views\filter\NodeTitles. */ namespace Drupal\d8views\Plugin\views\filter; use Drupal\views\Plugin\views\display\DisplayPluginBase; use Drupal\views\Plugin\views\filter\InOperator; use Drupal\views\ViewExecutable; /** * Filters by given list of node title options. * * @ingroup views_filter_handlers * * @ViewsFilter(d8views_node_titles) */ class NodeTitles extends InOperator { /** * {@inheritdoc} */ public function init(ViewExecutable $view, DisplayPluginBase $display, array amp;$options = NULL) { parent::init($view, $display, $options); $this-gt;valueTitle = t('Allowed node titles'); $this-gt;definition['options callback'] = array($this, 'generateOptions'); } /** * Override the query so that no filtering takes place if the user doesn't * select any options. */ public function query() { if (!empty($this-gt;value)) { parent::query(); } } /** * Skip validation if no options have been chosen so we can use it as a * non-filter. */ public function validate() { if (!empty($this-gt;value)) { parent::validate(); } } /** * Helper function that generates the options. * @return array */ public function generateOptions() { // Array keys are used to compare with the table field values. return array( 'my title' =gt; 'my title', 'another title' =gt; 'another title', ); } } /code/pre pSince we want our filter to be of a type that allows users to select from a list of options to be included in the results, we are extending from the codeInOperator/code plugin. The class is identified with the code@ViewsFilter(d8views_node_titles)/code annotation (the id we specified in the codehook_views_data_alter()/code implementation)./p pInside our plugin, we override three methods:/p pInside codeinit()/code, we specify the title of the set of filter options and the callback that generates the values for options. This callback has to be a callable and in this case we opted for the codegenerateOptions()/code method on this class. The latter just returns an array of options to be presented for the users, the keys of which being used in the query alteration. Alternatively, we could have also directly created the options inside the codeinit()/code method by filling up the code$this-gt;valueOptions/code property with our available titles. Using a callback is cleaner though as you can perform various logic in there responsible for delivering the necessary node titles./p pThe point of overriding the codequery()/code and codevalidate()/code methods was to prevent a query and validation from happening in case the user created the filter without selecting any title. This way the filter has no effect on the results rather than returning 0 results. It's a simple preference meant to illustrate how you can override various functionality to tailor your plugins to fit your needs./p pAnd that's it. You can add the emNode titles/em filter and check the box next to the titles you want to allow in the results./p h2Conclusion/h2 pIn this article we've looked at how we can create custom filters in Drupal 8 Views. We've seen what are the steps to achieve this and looked at a couple of the existing plugins that are used across the framework which you can use as is or extend from./p pThe best way to learn how all these work is by studying the code in those plugin classes. You will see there if they are enough for what you want to build or extending them makes sense. In the next article we are going to look at some other Views plugins, so stay tuned./p /div/div/divdiv class=sharethis-buttonsdiv class=sharethis-wrapperspan st_url= st_title=Creating a custom Views filter in Drupal 8 class=st_facebook/span span st_url= st_title=Creating a custom Views filter in Drupal 8 class=st_twitter st_via=drupalexp/span span st_url= st_title=Creating a custom Views filter in Drupal 8 class=st_googleplus/span script type='text/javascript'var switchTo5x = true;/scriptscript type='text/javascript' src=''/scriptscript type='text/javascript'stLight.options({publisher:dr-8de6c3c4-3462-9715-caaf-ce2c161a50c});/script/div/div

Drupal Association News: team week notes #31: 2014 in review

Sun, 01/25/2015 - 13:24
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpNow that we are few weeks into 2015, we’d like to look back at 2014 and share some interesting numbers about h2Audience/h2 pLast year received almost 48.9 million visits from 21.2 million unique visitors. The spike around September/October is due to spam-related traffic, and, of course, DrupalCon Amsterdam./p pimg class=left width=300 src=/files/site-traffic.png /img width=300 src=/files/unique-visitors.png //p h2Users/h2 p152,200 users logged in to at least once during the year. Out of those, 31,466 users performed at least one activity on the site, such as commented, created a node or committed code./p pMore than 21,500 people left a comment or more in the issue queues. More than 4,000 people commented in the Drupal core issue queue./p pimg width=620px style=clear: both; src=/files/participants-core.png //p h2Commits/h2 pOverall 145,907 commits happened on, with more than 4,000 commits to Drupal core specifically./p pMore than 3,200 people committed code to contributed projects (not counting Drupal core), with an average of 37.43 commits per user./p pMore than 1,400 people got commit mention in Drupal core patches./p pimg width=620px src=/files/core-contributors.png //p h2Comments amp; Issues/h2 pOur users left 569,217 comments, 94% of them were comments in the issue queues. 30% of all comments in the issue queues happened in Drupal core queue./p pOn average there were 22.4 comments per user, with 38.74 comments per user in the Drupal core issue queue./p pOur users created 78,505 issues, with an average of 4.55 issues per user./p p5,192 contributed projects were created on in 2014. 31% of those are sandbox projects./p h2Infrastructure/h2 pOn the infrastructure side our uptime was 99.97% over 12 months, and the average full page load time for the year is 3.64 across It improved throughout the year; we are down to 3.08 as an average for December. Our time to first byte response was 1,374ms in January; we are down to 441ms for December./p pimg width=620px src=/files/testbots.png /br / testbots tested over 33,300 patches. An average test queue and test duration times for Drupal 8 core were about 35 minutes each./p h2Support/h2 pOn support front 82% of issues in issue queues got a response within 48 hours after being created./p pAn average response time (time between an issue was created and first comment not by issue author) across all issue queues on was 82.87 hours. For Drupal core issue queue this number was 60.68 hours. For related queues 34.19 hours./p p* * * /p pFull stats you can find in the a href= stats spreadsheet/a./p pCompared to 2013 some of the user activity numbers go down, which is directly related to the phase of the Drupal release cycle. Right after Drupal 7 release user activity peaked and then was slowly going down as Drupal 7 and contrib ecosystem matured. We are looking forward to Drupal 8 release! In the recent a href= Association community survey/a about 80% of respondents said they have firm plans to adopt Drupal 8, suggesting that release will cause a huge boost in user activity on p2014 was a great year, and thank you for spending some part of it on! We are excited to see what 2015 will bring./p /div/div/div

Wellnet Blog: Building Bridges - Webprofiler meets Drupal Console

Sun, 01/25/2015 - 10:50
div class=field field-name-field-video field-type-file field-label-hidden div class=field-items div class=field-item evena href=/en/blog/building-bridges-webprofiler-meets-drupal-consoleimg src= width=560 height=377 alt=Building Bridges - Webprofiler meets Drupal Console title=Building Bridges - Webprofiler meets Drupal Console //a/div /div /div div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even pThe has the purpose to bring the Symfony Profiler to Drupal 8./p /div/div/div