Planet Drupal

Syndicate content
Drupal.org - aggregated feeds in category Planet Drupal
Updated: 3 min 18 sec ago

KnackForge: How to update Drupal 8 core?

Sat, 03/24/2018 - 07:01
span data-quickedit-field-id=node/328/title/en/rss class=field field--name-title field--type-string field--label-hiddenHow to update Drupal 8 core?/span div data-quickedit-field-id=node/328/body/en/rss class=clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__itemp dir=ltrLet's see how to update your Drupal site between 8.x.x minor and patch versions. For example, from 8.1.2 to 8.1.3, or from 8.3.5 to 8.4.0. I hope this will help you./p ulli dir=ltr p dir=ltrIf you are upgrading to Drupal version x.y.z/p /li /ulp dir=ltr           x -gt; is known as the major version number/p p dir=ltr           y -gt; is known as the minor version number/p p dir=ltr           z -gt; is known as the patch version number./p/div span data-quickedit-field-id=node/328/uid/en/rss class=field field--name-uid field--type-entity-reference field--label-hiddena title=View blogs by rajamohamed. href=/blog/rajamohamed lang= about=/rajamohamed typeof=schema:Person property=schema:name datatype= itemprop=url rel=author class=usernamerajamohamed/a/span span data-quickedit-field-id=node/328/created/en/rss class=field field--name-created field--type-created field--label-hiddenSat, 03/24/2018 - 10:31/span span class=a2a_kit a2a_kit_size_32 addtoany_list data-a2a-url=http://knackforge.com/blog/rajamohamed/how-update-drupal-8-core data-a2a-title=How to update Drupal 8 core?a class=a2a_dd addtoany_share_save href=https://www.addtoany.com/share#url=http%3A%2F%2Fknackforge.com%2Fblog%2Frajamohamed%2Fhow-update-drupal-8-coreamp;title=How%20to%20update%20Drupal%208%20core%3F/aa class=a2a_button_facebook/a a class=a2a_button_twitter /a a class=a2a_button_google_plus/a a class=a2a_button_linkedin /a a class=a2a_button_pinterest /a/span

LevelTen Interactive: Travel Websites Built with Drupal

Thu, 06/22/2017 - 22:46
img typeof=foaf:Image src=http://getlevelten.com/sites/default/files/styles/600x300/public/content/blog/images/travel_websites_3.png?itok=hziw1dSP width=600 height=300 alt=built with drupal / pThis summer, LevelTen brought back the Web amp; Drupal Developer Internship program and we've brought on 3 up and coming developer interns! In today's post, Anima Bajracharya, and her research assignment with of Drupal Travel websites:/p pAfter researching some of the case studies of Travel sites created in Drupal, I found out that Drupal can help businesses across any industry to create rich digital experiences. It is no surprise that more than one million sites trust Drupal today. With benefits such as scalability, free modules, responsive design, flexible APIs and one of the...a href=/blog/anima-bajracharya/travel-websites-built-drupal class=more-linkRead more/a/p

Drupal Association blog: Announcement: Board Meeting and Executive Session - June 28, 2017

Thu, 06/22/2017 - 14:53
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpOn June 28, 2017 at 12:00 PDT/20:00 BST, The Drupal Association will host a one-hour virtual board meeting for the public to attend. It will be followed by an executive session, which is a private session for the board members.  We invite the public to join our board meeting a href=https://zoom.us/j/241666153 rel=nofollowvia zoom/a or you can dial in with the following information:/p ulli pDial: +1 646 558 8656 (US Toll) or +1 408 638 0968 (US Toll)/p /li li pWebinar ID: 241 666 153/p /li li pInternational numbers available: a href=https://zoom.us/zoomconference?m=6UU1gXwCf8wl6dMEj0NDyRITbupMmKBH rel=nofollowhttps://zoom.us/zoomconference?m=6UU1gXwCf8wl6dMEj0NDyRITbupMmKBH/a/p /li /ulh3Board Meeting Agenda/h3 pThe Board Meeting Agenda includes:/p ulli pAn Executive Update covering the following topics and speakers/p ulli pCommunity Discussions update from Whitney Hess/p /li li pDrupalCon Baltimore Wrap/p /li li pDrupalCon RFP update/p /li li pMarketing Initiative / Review of Drupal.org privacy policy/p /li li pDrupal.org Infrastructure RFP Update/p /li /ul/li li pFinancial Update from Summit CPA/p /li li pQamp;A with the Drupal Association board/p /li li pQamp;A with the community attendees/p /li li pThe Board votes to approve Jan - April 2017 financial statements/p /li /ulpAfter the meeting, we will post a blog that shares more details about the meeting and we wil post the board materials and meeting minutes a href=https://www.drupal.org/association/board/minutes rel=nofollowhere/a./p h3Executive Session Agenda/h3 pWhile the The Executive Session is a private meeting amongst board members, we want to provide insight into what the agenda topics will be./p ulli pThe Finance Committee will provide an overview of the 2016 financial audit and answer questions./p /li li pDiscuss Drupal Association Board Executive Committee composition for 2017-2018 term./p /li /ululli pThe Governance Committee will provide an update and recommendation on how the Drupal Association can continue to support the community as they determine how to evolve community governance./p /li li pThe Nominating Committee will provide an update on the progress with identifying new board member candidates for the three seats that expire in November 2017. Learn more about the a href=https://www.drupal.org/association/board rel=nofollowDrupal Association board/a here./p /li /ulpWe hope you can join us to learn more about Drupal Association operations and to have your questions answered by the Drupal Association Board and staff./p/div/div/div

Amazee Labs: Lead Developer UK Conference 2017, Day 2

Thu, 06/22/2017 - 14:34
spanLead Developer UK Conference 2017, Day 2/span div class=field field-node--field-lead field-name-field-lead field-type-text-long field-label-hidden div class=field-items div class=field-itemp dir=ltrThis is part 2 of my summary from the a href=http://2017.theleaddeveloper.com/Lead Developer UK conference/a. If you want to refresh your memory about what happened on Day 1 you can a href=https://www.amazeelabs.com/en/blog/lead-developer-uk-conference-2017-day1skip back for part 1/a, or alternatively continue reading about my highlights from the second day of this outstanding conference./p/div /div /div spana href=/en/user/1 title=View user profile. lang= about=/en/user/1 typeof=schema:Person property=schema:name datatype= class=usernameadmin/a/span spanThu, 06/22/2017 - 14:34/span 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=https://www.amazeelabs.com/sites/default/files/styles/blog_full/public/20170609_095242.jpg?itok=zHgWm4Id width=580 height=326 alt=Lead Developer UK 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-itemp dir=ltra href=http://twitter.com/kevingoldsmithKevin Goldsmith/a – a href=http://2017.theleaddeveloper.com/talks#kevin-goldsmithFail Fast, Fail Smart, Succeed/a started day two with the recommendation that we shouldn’t punish failure but we should make sure that we learn from our mistakes. Nothing can be more harmful than a culture that prevents talking about failure. Instead, when we learn to talk about our mistakes, others and ourselves will be able to get better much faster. I liked Kevin’s recommendation about creating a shared repository for the team to collect learnings they have made along the way./p piframe allowfullscreen= frameborder=0 height=485 marginheight=0 marginwidth=0 scrolling=no src=//www.slideshare.net/slideshow/embed_code/key/Hy9hLn7DeOPgMg style=border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%; width=595/iframe/p div style=margin-bottom:5pxstronga href=//www.slideshare.net/kevingoldsmith/fail-safe-fail-smart-succeed target=_blank title=Fail Safe, Fail Smart, SucceedFail Safe, Fail Smart, Succeed/a /strong from stronga href=https://www.slideshare.net/kevingoldsmith target=_blankKevin Goldsmith/a/strong/div p dir=ltra href=http://twitter.com/roidrageMathias Meyer/a – a href=http://2017.theleaddeveloper.com/talks#mathias-meyerBuilding and Scaling a Distributed and Inclusive Team/a gave some valuable insights into his experience at Travis CI. Having the team distributed across continents creates challenges such as when cultural mentalities differ, i.e. some would expect more direct communication while others are used to talk less directly about issues (a href=https://www.amazeelabs.com/en/blog/lead-developer-uk-conference-2017-day1remember ask vs. guess cultures from part 1/a?)./p p dir=ltrI liked the idea of setting up a lot of decision making processes asynchronously via github pull requests, so that team members can contribute at their individual pace. Also, Travis is using special incident response channels for teams on Slack where they collaborate on important tasks in a timely manner./p script async= class=speakerdeck-embed data-id=d6970e93287d4d1a852c7d37f0fe6d48 data-ratio=1.77777777777778 src=//speakerdeck.com/assets/embed.js/scriptp dir=ltra href=http://twitter.com/rkoutnikRandall Koutnik/a – a href=http://2017.theleaddeveloper.com/talks#randall-koutnikImplementers, Solvers, and Finders: Rethinking the Developer Career Path/a encouraged the audience to think beyond the classical categories of Junior, Regular and Senior developers. At a first stage, an implementer would give a solution specification and make it happen./p p dir=ltrTo level up, developers would become solvers that come up with their own solutions to given problems and in the latest stage, they would find their own problems. Think about providing context like a problem space or a given product and you delegate more responsibility to that person so she will need to find possible problems herself. /p script async= class=speakerdeck-embed data-id=2e18c7164c134166b7461b660c905d1c data-ratio=1.77777777777778 src=//speakerdeck.com/assets/embed.js/scriptp dir=ltra href=http://twitter.com/carlyhasredhairCarly Robinson/a – a href=http://2017.theleaddeveloper.com/talks#carly-robinsonMentoring Junior Engineers @ Slack HQ/a shared her personal career path and how she was mentored as a junior. Small startups often struggle with the task of providing the necessary mentorship for their juniors, so it was great to see such a success story. Carly mentioned that for her mentorship is a relationship and you need to establish a good foundation upfront between the mentor and the mentee. Setting goals, tracking progress and acknowledging success are important tools for successful mentorship./p p dir=ltrSimilarly, being aware of your own emotions is important when reviewing another person’s work. Your initial reaction might be “This is dumb, I know how to fix this.” Instead, by being able to step back when having that reaction and reframing it into something like “Why did that person do that thing?” may allow you to reflect and discover the underlying issues and help come to a solution more collaboratively. /p script async= class=speakerdeck-embed data-id=93ce18ad0a5442248b7e036de1868054 data-ratio=1.77777777777778 src=//speakerdeck.com/assets/embed.js/scriptp dir=ltrOverall, I got back from the Lead Developer conference with a lot of inspiration. It’s great to see that so many successful leaders talk about the same topics and mention that it’s worthwhile focusing on problems I face and try to tackle them everyday. For me, growing leadership skills is a continuous effort that takes a lot of self reflection and discipline. It might be easy to agree that points like “giving positive feedback” is the right thing to do, but implementing it into one self’s daily practice takes effort and practice./p p dir=ltrSlides of all talks mentioned above and more a href=http://2017.theleaddeveloper.com/blog/2017-06-12-slides-from-the-lead-developer-uk-2017can be found on the conference website/a. I’d like to thank the whole organizing team for setting-up an incredible line-up and making sure the code of conduct doesn’t feel like something added as a afterthought, but ensuring diversity amp; inclusion was something that was really to the core of the Lead Developer conference. Next year’s a href=http://upcoming.theleaddeveloper.com/events will happen in Austin, New York and London/a./p /div /div /div

Drupal Association blog: Drupal Association Q4 2016 Financial Update

Thu, 06/22/2017 - 14:24
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpAs part of the Drupal Association Board's duty, board members met in April and approved the Q4 2016 financial statements. Now, we are able to share them with the community to provide transparency and clarity. You can find the a href=https://www.drupal.org/files/Drupal%20Association%20-%20Q4%202016%20Financial%20Statements%20%281%29.pdf rel=nofollowfinancial statements here/a, which include the Income Statement and Balance Sheet for each month. Our cash balances are located on the balance sheet, located in the Asset section (first part of the balance sheet) called cash and cash equivalents./p pIn this blog post, we will answer the following questions:/p olli pHow did we perform financially this quarter?/p /li li pHow did we perform financially through the end of 2016?/p /li li pHow can we perform better in 2017?/p /li /olh3Setting Performance Metrics/h3 pTo answer #1 and #2, we need to know what success looks like. As they say, if you can’t measure it, you can’t manage it. The Drupal Association works with a virtual CFO firm called Summit CPA, who creates our monthly financial reports as well as sets our financial KPIs, making sure we are working towards goals that ensure the a href=https://assoc.drupal.org/blog/megansanicki/reorganizing-for-drupal rel=nofollowDrupal Association’s sustainability/a./p pSince the Drupal Association’s cash reserves were depleted due to investments in Drupal.org improvements especially to support Drupal 8’s release, Summit recommends that we rebuild our cash reserves and achieve a cash reserve KPI of 15%-30% of estimated twelve-month revenue. Since Drupal’s revenue and expenditures drastically fluctuate from month to month due to DrupalCon’s large cash outlay, a cash reserve goal closer to 30% is the ideal goal./p pTo rebuild our cash reserves, we need to create an operating profit to fill the reserve. To do this, Summit recommends that our second KPI is to achieve a Net Income Margin of 10%./p h3Q4 2016 Performance/h3 pSince Q4 2016 is near the beginning of our financial turnaround, we will see improvements with both KPIs over time. It is also important to note that Q4 is historically when our cash is lowest. It is the period of time that is between DrupalCon Europe, which operated at a loss, and DrupalCon North America, which rebuilds our cash since it is a profitable event./p pBelow is our KPI progress in Q4 2016./p tabletbodytrtd pKPI/p /td td pGOAL/p /td td pOCTOBER/p /td td pNOVEMBER/p /td td pDECEMBER/p /td /trtrtd pCASH RESERVE/p /td td p15-30%/p /td td p11%/p /td td p9%/p /td td p8%/p /td /trtrtd pNET INCOME MARGIN %/p /td td p10%/p /td td p1%/p /td td p1%/p /td td p0%/p /td /tr/tbody/tableh3/h3 h32016 End of Year Performance/h3 p2016 was a challenging year financially as we drastically reduced costs by laying off 40% of our staff and eliminating our Portland office. While these corrections were difficult, they set the organization on a sustainable path./p pWhile we continued to remain cash positive by the end of 2016 (see Cash Flow chart below), we operated at a loss, which was anticipated. In positive news, we reduced the losses by about $145,000 (see Forecast vs Actual table below)./p pChart: Cash Flow/p p(*This chart shows the Drupal Association’s cash flow. It uses actual data from January 2015 to December 2016 and uses forecasted data from January 2017 to April 2017. )/p pTable: 2016 Actual vs Forecast/p pimg alt=2016 Actuals vs forecast src=/files/image1_9.png //p h3Areas of focus in 2017/h3 pWith these 2016 improvements in place, 2017 is positioned to be a healthier year financially for the Drupal Association. To ensure a stronger year, we conducted a margin analysis of our programs to see where we need to focus./p pFrom this study, we found several areas to focus in 2017 that create value for the community while also improving our financial health. Areas of focus include:/p ulli pMake DrupalCon Europe a financially sustainable event that continues to provide value/p /li li pGrow DrupalCon North America attendance through improved marketing and attracting more end users with customer content such as industry summits and case studies./p /li li pCreate more value for Supporting Partners to grow participation and create a program for End Users to join./p /li li pImprove the Drupal adoption journey off of the Drupal.org front page by including content from Drupal businesses that provide value for the visitors and branding or leads for the Drupal businesses who provide the content./p /li li pIdentify ways to reduce costs associated with Drupal.org by studying the sites and services the Drupal Association provides to see if we can reduce associated costs./p /li /ulpWe are hard at work making the above improvements and starting to see encouraging results. Starting with our 2017 quarterly updates, we will provide more clarity into our financial portfolio and how each program performed./p/div/div/divdiv class=field field-name-upload field-type-file field-label-abovediv class=field-labelFile attachments:nbsp;/divdiv class=field-itemsdiv class=field-item evenspan class=file a href=https://www.drupal.org/files/image1_9.png type=image/png; length=9756image1.png/a/span/divdiv class=field-item oddspan class=file a href=https://www.drupal.org/files/image2_5.png type=image/png; length=217400image2.png/a/span/divdiv class=field-item evenspan class=file a href=https://www.drupal.org/files/Drupal%20Association%20-%20Q4%202016%20Financial%20Statements%20%281%29.pdf type=application/pdf; length=997838Drupal Association - Q4 2016 Financial Statements (1).pdf/a/span/div/div/div

Agiledrop.com Blog: AGILEDROP: DrupalCon sessions about PHP

Thu, 06/22/2017 - 09:57
a href=http://www.agiledrop.com/blog/drupalcon-sessions-about-phpimg src=https://www.agiledrop.com/sites/default/files/2017-06/programming-1873854_640.png //a Last time, we gathered together DrupalCon Baltimore sessions about DevOps. Before that, we explored the area of Front End, Site Building, Drupal Showcase, Coding and Development, Project Management and Case Studies. And that was not our last stop. This time, we looked at sessions that were presented in the area of PHP. Advanced debugging techniques from Patrick Allaert This session was not about Xdebug. It was about tools that let you know what’s really happening in your PHP code. Tools like the phpdbg debugger, process tracing tools like strace, ltrace, the Linux inotify mechanism,… a href=http://www.agiledrop.com/blog/drupalcon-sessions-about-phpREAD MORE/a

myDropWizard.com: Drupal 6 not affected by SA-CORE-2017-003!

Thu, 06/22/2017 - 00:50
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpToday, there were Critical security releases for Drupal 7 amp; 8:/ppa href=https://www.drupal.org/SA-CORE-2017-003https://www.drupal.org/SA-CORE-2017-003/a/ppWe received a couple e-mails asking if it affected Drupal 6, so I decided to post this short article to say:/ppstrongHappily, Drupal 6 is not affected! :-)/strong/ppOf the 3 vulnerabilities in that SA, the two Drupal 8 ones don't apply to Drupal 6: it doesn't have REST or YAML support./ppWe did extensive testing to see if the Drupal 7 one applied to Drupal 6, including, testing the 'upload' module (in Drupal 6 core) and with the contrib 'filefield' and 'webform' modules and couldn't reproduce the vulnerability./ppem(FYI, since we have access to the private Drupal security queue, we did our testing several months ago :-))/em/ppstrongSo, if you still use Drupal 6, you don't need to worry about a core update today!/strong/ppbr/div/div/div

myDropWizard.com: Drupal 6 security update for Search 404

Wed, 06/21/2017 - 22:35
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpemAs you may know, a href=https://www.mydropwizard.com/blog/weve-reached-drupal-6-end-life-date-what-does-meanDrupal 6 has reached End-of-Life (EOL)/a which means the Drupal Security Team is no longer doing Security Advisories or working on security patches for Drupal 6 core or contrib modules - but the a href=https://www.mydropwizard.com/blog/how-official-drupal-6-long-term-support-will-workDrupal 6 LTS vendors/a are and we're one of them!/em/ppstrongToday, there is a Moderately Critical security release for the a href=https://www.drupal.org/project/search404Search 404/a module to fix an Cross Site Scripting (XSS) vulnerability./strong/ppFrom the a href=https://www.drupal.org/node/2888094security advisory for Drupal 7/a:/pblockquotepThe Search 404 module enables you to redirect 404 pages to a search page on the site for the keywords in the url that was not found./ppThe module did not filter administrator-provided text before displaying it to the user on the 404 page creating a Cross Site Scripting (XSS) vulnerability./ppThis vulnerability is mitigated by the fact that an attacker must have a role with the permission administer search./p/blockquotepHere you can download a href=http://cgit.drupalcode.org/d6lts/plain/common/contrib/search404/SA-CONTRIB-2017-053.patchthe Drupal 6 patch/a./ppstrong/strongIf you have a Drupal 6 site using the Site Verify module, we recommend you update immediately./ppstrongIf you'd like all your Drupal 6 modules to receive security updates and have the fixes deployed the same day they're released, please a href=https://www.mydropwizard.com/drupal-6-ltscheck out our D6LTS plans/a./strong/ppemNote: if you use the a href=https://www.drupal.org/project/mydropwizardmyDropWizard/a module (totally free!), you'll be alerted to these and any future security updates, and will be able to use drush to install them (even though they won't necessarily have a release on Drupal.org)./em/pp/div/div/div

Lullabot: How to Embed Just About Anything in Drupal 8 WYSIWYG with Entity Embed and URL Embed

Wed, 06/21/2017 - 16:31
div class=rich-textdiv class=rich-text__contentpbr/ Embedding media assets (images, videos, related content, etc) in a WYSIWYG text area is a long-standing need that has been challenging in Drupal sites for a while. In Drupal 7, numerous solutions addressed the problem with different (and sometimes competing) approaches.#xA0;/p pbr/ Drupal 8 core comes with basic support for embedding images out-of-the-box, but we all know that #x201C;ambitious digital experiences#x201D; nowadays need to go far beyond that and provide editors with a powerful tool capable of handling any type of media asset, including remote ones such as a relevant Tweet or Facebook post.br/ #xA0;/p pThis is where the powerful combination of a href=http://dgo.to/entity_embedEntity Embed/a + a href=http://dgo.to/url_embedURL Embed/a comes into play. Predicated on, and extending the foundation established by Drupal core, these two modules were designed to be a standardized solution for embedding any entity or remote URL content in a WYSIWYG editor in Drupal 8./p h3In this article, you will find:/h3 ulliWhat Drupal 8 core offers out-of-the-box for embedding images inside rich text/li liHow to create a WYSIWYG embed button with the Entity Embed module (with some common pitfalls you may encounter along the way)/li liHow to embed remote media assets with the URL Embed module (again, with some common pitfalls!)/li liAdditional resources on how to extend and integrate your embedding solutions with other tools from the Media ecosystem./li /ul h2Drupal 8 core embedding/h2 pDrupal 8 has made a big step from Drupal 7 and included the a href=http://ckeditor.comCKEditor/a WYSIWYG library in core. It also comes with an easy-to-use tool to embed local images in your text./p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content pBut what if the content you want to embed is not an image?/p pI am sure you have come across something like this before:/p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content por this:/p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content pThese are all examples of non-image media assets that needed to be embedded as well. So how can we extend Drupal 8 core#x2019;s ability to embed these pieces of content in a rich-text area?#xA0;/p h2Enter the Entity Embed module./h2 div class=quote quote--highlightblockquote class=quote__quotediv class=quote__content The Entity Embed module allows any Drupal entity to be embedded within a text area using a WYSIWYG editor. /div/blockquote/div p#xA0;The module doesnapos;t care what you embed, as long as that piece of content is stored in Drupal as a standard entity. In other words, you can embed nodes, taxonomy terms, comments, users, profiles, forms, media entities, etc. all in the same way and using a standard workflow./p pIn order to limit the length of this article, we will be working only with entities provided by Drupal core, but you should definitely try the a href=http://dgo.to/media_entityMedia Entity/a module, which can take your embedding capabilities to a whole new level (more on this at the end of this article)./p h3Basic installation and configuration/h3 pstrongCreate an embed button/strong/p pAfter a href=https://www.drupal.org/node/895232downloading and installing/a the a href=http://dgo.to/entity_embedEntity Embed/a module and its dependencies, navigate to#xA0;/p pciteConfiguration -gt; Content Authoring -gt; Text editor embed buttons/cite/p por go directly to code/admin/config/content/embed/code and click strong#x201C;Add embed button#x201D;/strong/p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content pYou will see that there is already a button on this page called #x201C;Node,#x201D; which was automatically created upon installation. For the purposes of the example, we will create another button to embed nodes, but you can obviously use and modify the provided one on your site if you wish./p pAs an example, we#x2019;ll create a button to embed a node into another node, simulating a #x201C;Related article#x201D; scenario in a news article./p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content pThe config options you will find on this page are:/p ullistrongLabel/strong: Give your button a human-readable name and adjust its machine name if needed/li listrongEmbed type/strong: If you only have the Entity Embed module enabled, #x201C;Entity#x201D; is your only option here. When you install other modules that also extend the a href=http://dgo.to/embedEmbed/a framework, other options will be available./li listrongEntity type/strong: Choose here the type of the entity you will be embedding with this button. In our case, we choose #x201C;strongContent/strong#x201D; in order to be able to embed nodes./li listrongContent type/strong: We can optionally filter the entity bundles (aka #x201C;Content types#x201D; for nodes) that the user will be allowed to choose from. In our case we only want #x201C;Articles#x201D;./li listrongAllowed Entity Embed Display plugins/strong: Choose here the display plugins that will be available when embedding the entity. This means that when an editor chooses an entity to embed, they will be asked how this entity should be displayed, and the options the user sees will be restricted to the selections you make here. In our case, we only want the editor to be able to choose between a simple #x201C;Label#x201D; pointing to the content, or a #x201C;Teaser#x201D; visualization of the node (which uses the codeteaser/code a href=https://www.drupal.org/docs/8/api/entity-api/display-modes-view-modes-and-form-modesviewmode/a). More on this later./li listrongEntity browser/strong: In our example, we won#x2019;t be using any, but you should definitely try the integration of Entity Embed with Entity Browser, making the selection of the embedded entities much easier!/li listrongButton icon/strong: You can optionally upload a custom icon to be shown on the button. If left empty, the letter #x201C;E#x201D; will be used./li /ul pOnce we#x2019;ve created our button, it#x2019;s time to add it to the WYSIWYG toolbar./p h2Entity Embed: WYSIWYG configuration/h2 pNavigate to:/p pciteConfiguration -gt; Content authoring -gt; Text formats and editors/cite/p por go directly to code/admin/config/content/formats/code and click #x201C;strongconfigure/strong#x201D; on the format you want to add the button to. In our example, we are going to add it to the #x201C;strongBasic HTML/strong#x201D; text format./p pstrongStep 1: Place the button in the active toolbar/strong/p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content pstrongStep 2: Mark the checkbox #x201C;Display embedded entities#x201D;/strong/p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content pstrongStep 3: Make sure the special tags are whitelisted/strong/p pIf you are also using the filter #x201C;emLimit allowed HTML tags and correct faulty HTML/em#x201D; (which you should), it#x2019;s important to make sure that the tags used by this module are allowed by this filter. Scroll down a little bit and verify that the tags:/p div class=codepre codespan class=code__taglt;span class=code__titledrupal-entity/span span class=code__attributedata-entity-type/span span class=code__attributedata-entity-uuid/span span class=code__attributedata-entity-embed-display/span span class=code__attributedata-entity-embed-display-settings/span span class=code__attributedata-align/span span class=code__attributedata-caption/span span class=code__attributedata-embed-button/spangt;/span/code/pre/div pare listed in the #x201C;Allowed HTML tags#x201D; text area./p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content pIf you are using a recent version of the module, this should be automatically populated as soon as you click on #x201C;Display embedded entities#x201D;, but it doesn#x2019;t hurt to verify it was done correctly./p tabletbodytrtd pemstrongCommon pitfall/strong/em/p pemIf you are embedding images and you want to use #x201C;strongAlt/strong#x201D; and #x201C;strongTitle/strong#x201D; attributes, you probably want to fine-tune the allowed tags to be something like:/embr/codelt;drupal-entity data-entity-type data-entity-uuid data-entity-embed-display data-entity-embed-display-settings data-align data-caption data-embed-button alt titlegt;/code/p pemInstead of the default value provided./em/p /td /tr/tbody/table tabletbodytrtd pemstrongCommon pitfall/strong/em/p pemIf you have the filter #x201C;strongRestrict images#xA0;to this site/strong#x201D; active (which comes activated by default in Drupal core), you will probably want to reorder the filters so that #x201C;strongDisplay embedded entities/strong#x201D; comes after the filter #x201C;strongRestrict images to this site/strong#x201D;. If you don#x2019;t do this, when you embed some image entities you may end up with something like:/em/p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content /td /tr/tbody/table h3All set, ready to embed some entities!#xA0;/h3 pYour editors can now navigate to any content form that uses the #x201C;strongBasic HTML/strong#x201D; text format and start using the button!/p /divdiv class=rich-text__embeddiv class=videoiframe allowfullscreen frameborder=0 src=https://www.youtube.com/embed/jk9jHTSv5GsVideos require iframe browser support./iframe/div/divdiv class=rich-text__content tabletbodytrtd pemstrongCommon pitfall/strong/em/p pemAfter#xA0;a href=https://www.drupal.org/node/2736741this issue/a#xA0;got in, the module slightly changed the way it manages the display plugins for viewing the embedded entity. As a result, the entity_reference formatter (#x201C;strongRendered entity/strong#x201D;) that many people are used to from other contexts is not available right away, and instead#xA0;strongall non-default#xA0;viewmodes#xA0;of the entity type are shown directly as display options/strong.#xA0;/em/p pem/divdiv class=rich-text__embedundefined/divdiv class=rich-text__content/em/p pemHowever, for an entity without custom#xA0;viewmodes, you won#x2019;t have the #x201C;Full#x201D; (or #x201C;default#x201D;)#xA0;viewmode#xA0;available anymore. There is still some discussion happening about how to ensure the best user experience for this issue, if you want to know more about it or jump in and help, you can find more information#xA0;a href=https://www.drupal.org/node/2818075here/a,#xA0;a href=https://www.drupal.org/node/2871882here/a#xA0;and#xA0;a href=https://www.drupal.org/node/2828608here/a./em/p /td /tr/tbody/table h2Quick and easy solution for remote embedding with URL Embed/h2 pbr/ A sister-module of a href=http://dgo.to/url_embedEntity Embed/a, the URL Embed module allows content editors to quickly embed any piece of remote content that implements the a href=http://oembed.com/oEmbed/a protocol.#xA0;/p pbr/ Nice tech terms, but in practice what does that mean? It means that any content from one of the sites below (but not limited to these) can be embedded:/p ulliDeviantart/li liFacebook/li liFlickr/li liHulu/li liIFTTT/li liInstagram/li liNational Film Board of Canada/li liNoembed/li liPodbean/li liRevision3/li liScribd/li liSlideShare/li liSmugMug/li liSoundCloud/li liSpotify/li liTED/li liTwitter/li liUstream/li liViddler/li liVimeo/li liYouTube/li /ul pUnder the hood, the module leverages the awesome a href=https://github.com/oscarotero/EmbedEmbed/a open-source library to fetch the content from the remote sites, and uses the same a href=http://dgo.to/embedbase framework/a as Entity Embed to create embed buttons for this type of content. As a result, the site builder has a very similar workflow when configuring the WYSIWYG tools, which can then be used by the content editor in a very intuitive way. Let#x2019;s see how all that works./p h3Install the module and create a URL Embed button/h3 pAs usual, the first step is to enable the module itself, along with all its dependencies./p tabletbodytrtd pstrongemCommon pitfall/em/strong/p pemThis module depends on the external#xA0;a href=https://github.com/oscarotero/EmbedEmbed library/a. If you are using Composer to download the Drupal module (which you should), Composer will do all the necessary work to fetch the dependencies for you. You can also install only the library itself using Composer if you want. To do that just run quot;/emcodecomposer require embed/embed/codeemquot;.#xA0;Failing to correctly install the library will prevent#xA0;the module from being enabled, with an error message such as:/em/p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content /td /tr/tbody/table pOnce successfully enabled, the #x201C;strongEmbed button/strong#x201D; concept here is exactly the same as in the previous example, so all we need is to go back to code/admin/config/content/embed/code ./p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content pThe module already creates a new button for us, intended for embedding remote content. URL buttons have no specific configuration except for name, type and icon, so we#x2019;ll skip the button configuration part./p h3URL Embed: WYSIWYG Configuration/h3 pSimilarly to what we did with the Entity button, we need to follow the same steps here to enable the URL Embed button on a given text format:/p ullistrongStep 1/strong: Place the button in the active toolbar/li listrongStep 2/strong: Mark the checkbox #x201C;strongDisplay embedded URLs/strong#x201D;/li listrongStep 3/strong: Make sure the special tags are whitelisted. (Note that here the tags won#x2019;t be automatically populated, you need to manually introduce codelt;drupal-url data-*gt;/code to the #x201C;Allowed HTML tags#x201D; text area.)/li listrongStep 4/strong: (Optional) If you want, you can also mark the checkbox #x201C;strongConvert URLs to URL embeds/strong#x201D;, which will automatically convert URLs from the text into embedded objects. If you do this though, make sure you reorder the filters so that #x201C;strongDisplay embedded URLs/strong#x201D; is placed after the filter #x201C;strongConvert URLs to URL embeds/strong#x201D;/li /ul h3#xA0;All done, go embed some remote content!/h3 /divdiv class=rich-text__embeddiv class=videoiframe allowfullscreen frameborder=0 src=https://www.youtube.com/embed/Ehjk9WGJJuQVideos require iframe browser support./iframe/div/divdiv class=rich-text__content tabletbodytrtd pstrongemCommon pitfall/em/strong/p pemPlease bear in mind that while the Embed library can deal with many remote websites, it won#x2019;t do magic with providers that don#x2019;t implement the#xA0;oEmbed#xA0;protocol in a consistent way! Currently the module will only render the content of providers that return something inside the code property. If you are trying to embed some remote content that is not appearing correctly on your site, you can troubleshoot it by going to the URL:#xA0;a href=https://oscarotero.com/embed3/demohttps://oscarotero.com/embed3/demo/a#xA0;and trying the same URL there. If there is no content inside the#xA0;code#xA0;property, this URL unfortunately can#x2019;t be embedded in Drupal using URL Embed. Once#xA0;a href=https://www.drupal.org/node/2864302this issue/a#xA0;is complete, this will be less of an issue because the validation will prevent the user from entering an invalid URL./em/p /td /tr/tbody/table h2Get even more by integrating with other Media solutions/h2 pThere are at least two important ways you can extend the solutions indicated here, to achieve an even more powerful or easy-to-use editorial experience. Those approaches will be discussed in detail in upcoming articles, but you can have a brief idea about them below, in case you want to start learning about them right away./p h3Allow content to be selected through Entity Browsers/h3 pbr/ In the previous example, the content being embedded (in this case a referenced node) was selected by the editor using an autocomplete field. This is a very basic solution, available out-of-the-box for any referenced entity in Drupal core, but it does not provide the ultimate user experience we would expect from a modern CMS. The good news: it#x2019;s an easy fix. Plug any a href=http://dgo.to/entity_browserEntity Browser/a you may have on your site to any embed button you have created.#xA0;/p pGoing over the configuration of Entity Browsers is beyond the scope of this article, but you can read more at the a href=https://drupal-media.gitbooks.io/drupal8-guide/content/modules/entity_browser/intro.htmlofficial documentation/a, or directly by giving it a try, using one of the pre-packaged modules like a href=http://dgo.to/file_browserFile Entity Browser/a, a href=http://dgo.to/content_browserContent Browser/a or a href=http://dgo.to/media_entity_browserMedia Entity Browser/a./p tabletbodytrtd pstrongemCommon pitfall/em/strong/p pemIf you are using an Entity Browser to select the content to be embedded, make sure your browser is configured to have a display plugin of type #x201C;strongiFrame/strong.#x201D; The Embed options already appear in a modal window, so selecting an Entity Browser that is configured to be shown in a modal window won#x2019;t work./em/p /td /tr/tbody/table h3Use the Media Entity module to deal (also) with remote media assets/h3 pThe URL Embed module is a handy solution to allow your site editors to embed remote media assets in a quick-and-easy way, but what if:/p ulliyou want to standardize your workflow for managing local and remote media assets?/li liyou want to have a way to re-use content that was already embedded in other pieces of content?/li lietc./li /ul pA possible alternative that would solve all those needs is to standardize how Drupal sees all your media assets. The a href=http://dgo.to/media_entityMedia Entity/a approach means that you can #x201C;wrap#x201D; both local and remote media assets in a special #x201C;codemedia/codequot; entity type, and as a result, the Entity Embed could be used with any type of asset, once all of them are Drupal entities regardless of their real storage./p h2In Conclusion/h2 pHopefully, you find this a useful tutorial. I can strongly recommend this #x201C;Media Entity#x201D; approach, because it a href=https://www.drupal.org/node/2786785is being partly moved into Drupal core/a, which will result in an even stronger foundation for how Drupal sites will handle media assets in the near future./p h2Acknowledgements/h2 pThanks to a href=/about/seth-brownSeth Brown/a, a href=/about/david-burnsDavid#xA0;Burns/a#xA0;and a href=/about/dave-reidDave Reid/a for their help with this article./p h2Other articles in this series/h2 ullia href=/articles/ways-to-help-the-d8-media-initiativeWays to Help the D8 Media Initiative/a/li /ul pemImage credit: a href=https://www.pexels.com/u/daiangan/Daian Gan/a/em/p /div/div

Tameesh Biswas | Blog: GSoC17 : Client Side File Crypto : Week 3

Wed, 06/21/2017 - 12:38
span property=schema:nameGSoC17 : Client Side File Crypto : Week 3/span div property=schema:text class=field field--name-body field--type-text-with-summary field--label-hidden field--itemp dir=ltrThis post summarises my third week of coding with Drupal for Google Summer of Code 2017./p pstrongReshaping the REST API/strong/p/div span rel=schema:authorspan lang= about=https://blog.tameesh.in/user/1 typeof=schema:Person property=schema:name datatype= xml:lang=tameeshb/span/span span property=schema:dateCreated content=2017-06-21T10:38:36+00:00Wed, 06/21/2017 - 16:08/span div class=field field--name-field-tags field--type-entity-reference field--label-above div class=field--labelTags/div div class=field__items div class=field--itema href=https://blog.tameesh.in/2017/gsoc property=schema:about hreflang=enGSoC/a/div div class=field--itema href=https://blog.tameesh.in/2017/google-summer-of-code-2017 property=schema:about hreflang=enGoogle Summer of Code 2017/a/div div class=field--itema href=https://blog.tameesh.in/2017/drupal property=schema:about hreflang=enDrupal/a/div div class=field--itema href=https://blog.tameesh.in/2017/drupal-blog property=schema:about hreflang=enDrupal Blog/a/div /div /div ul class=links inline list-inlineli class=node-readmorea href=https://blog.tameesh.in/2017/gsoc/client-side-file-crypto-week-3 rel=tag title=GSoC17 : Client Side File Crypto : Week 3 hreflang=enRead morespan class=visually-hidden about GSoC17 : Client Side File Crypto : Week 3/span/a/lili class=comment-forbidden/li/ul

Flocon de toile | Freelance Drupal: Do I have to wait for Drupal 9 for my web project?

Wed, 06/21/2017 - 12:00
div class=field field--name-body field--type-text-with-summary field--label-hidden field--itempIn a previous post, we saw the Drupal 8's new policies for versioning, support and maintenance for its minor and major versions. This policy has evolved somewhat since the last DrupalCon Baltimore conference in April 2017. And this evolution of Drupal's strategy deserves a little attention because it can bring new light to those who hesitate to migrate their site on Drupal 8. Or those who are wondering about the relevance of launching their web project on Drupal 8./p/div

Dropsolid: Drupal 8 and React Native

Wed, 06/21/2017 - 11:57
div data-history-node-id=534 class=node node--type-blog node--view-mode-rss ds-1col clearfix div class=blog-top div class=field field--name-node-post-date field--type-ds field--label-hidden field__item21 Jun/div div class=tussengroep div class=field field--name-field-detail-title field--type-string field--label-hidden field__itemh1Drupal 8 and React Native/h1/div div class=blog-bottom div class=field field--name-node-author field--type-ds field--label-hidden field__itemspan lang= about=http://dropsolid.com/en/user/2653 typeof=schema:Person property=schema:name datatype= xml:lang=Niels A/span/div div class=field field--name-field-tags field--type-entity-reference field--label-hidden field__items div class=field__itemDrupal 8/div div class=field__itemTech/div div class=field__itemDrupal/div /div /div /div /div div class=clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__itemp dir=ltrOne day you might wake up with the next big idea that will shake the world in the most ungentle way. You decide to build an app, because you’ll have full access to all features of the device that you want your solution to work on. But then it dawns on you: you will actually need to build multiple apps in completely different languages while finding a way for them to serve the same content.../p p dir=ltrThen you start to realise that you won’t be able to step into the shoes of the greats, because web technology is holding you back. Fortunately, strongDrupal 8/strong and strongReact Native/strong are here to save your day - and your dream!/p p dir=ltrIn this blog post you'll read how you can leverage Drupal 8 to serve as the back-end for your React Native app. /p p dir=ltrFirst, however, a quick definition of what these technologies are:/p ul dir=ltrliDrupal is an open source content management system based on PHP./li liReact Native is a framework to build native apps using JavaScript and React./li /ulp dir=ltrIf you want to read more about Drupal 8 or React Native, you're invited to check the sources at the bottom of this article.br /  /p h2 dir=ltrWhy React Native?/h2 p dir=ltrThere are a myriad of front-end technologies available to you these days. The most popular ones are Angular and React. Both technologies allow you to build apps, but there is a big difference in how the apps will be built./p p dir=ltrThe advantage of employing React Native is that it lets you build an app using JavaScript, while converting the JavaScript into native code. In contrast, Angular or Ionic allow you to create a hybrid app, which basically is a website that gets embedded in a web view. Although the benefit here is that you're able to access the native features of a device./p p dir=ltrIn this case, we prefer React Native, because we strongwant to build iOS and Android applications that run natively/strong.br /  /p h2 dir=ltrHeadless Drupal/h2 p dir=ltrOne of the big buzzwords that's been doing the rounds in the Drupal community lately is 'Headless'. A headless Drupal is actually a Drupal application where the front-end is not served by Drupal, but by a different technology./p p dir=ltrYou still get the benefits of a top notch and extremely flexible content management system, but you also get the benefits of your chosen front-end technology./p p dir=ltrIn this example, you'll discover how to set up a native iOS and Android application that gets its data from a Drupal website. To access the information, users will have to log in to the app, which allows the app to serve content tailored to the preferences of the user. Crucial in the current individualized digital world./p p dir=ltr /p p dir=ltrimg alt=Drupal 8 - React Native Android iOS data-entity-type=file data-entity-uuid=84e9dc6c-34fd-4872-8aa9-482a735a6b74 src=http://dropsolid.com/sites/default/files/inline-images/drupal%208%20-%20react%20native.jpg //p p dir=ltrSo this already brings us to our first hurdle. Because we are using a native application, authenticating users through cookies or sessions is not possible. So we are going to show you how to prepare your React Native application and your Drupal site to accept authenticated requests.br /  /p h2 dir=ltrThe architecture/h2 p dir=ltrThe architecture consists of a vanilla Drupal 8 version and a React Native project with Redux./p p dir=ltrThe implemented flow is as following:/p ol dir=ltrliA user gets the login screen presented on the app./li liThe user fills in his credentials in the form/li liThe app posts the credentials to the endpoint in Drupal/li liDrupal validates the credentials and logs the user in/li liDrupal responds with a token based on the current user/li liThe app stores the token for future use/li liThe app now uses the token for all other requests the app makes to the Drupal REST API.br /  /li /olh2 dir=ltrCreating an endpoint in Drupal/h2 p dir=ltrFirst we had to choose our authentication method. In this example, we opted to authenticate using a JWT or JSON web token, because there already is a great contributed module available for it on Drupal.org (a href=https://www.drupal.org/project/jwt target=_blankhttps://www.drupal.org/project/jwt/a)./p p dir=ltrThis module provides an authentication service that you can use with the REST module that is now in Drupal 8 core. This authentication service will read the token that is passed in the headers of the request and will determine the current user from it. All subsequent functionality in Drupal will then use that user to determine if it has permission to access the requested resources. This authentication service works for all subsequent requests, but not for the original request to get the JWT./p p dir=ltrThe original endpoint the JWT module provides, already expects the user to be logged in before it can serve the token. You could use the ready available basic authentication service, but we preferred to build our own as an example.br /  /p h2 dir=ltrAuthentication with JSON post/h2 p dir=ltrInstead of passing along the username and password in the headers of the request like the basic authentication service expects, we will send the username and password in the body of our request formatted as JSON./p p dir=ltrOur authentication class implements the emAuthenticationProviderInterface/em and is announced in emjson_web_token.services.yml/em as follows:/p pre code class=language-yamlservices: authentication.json_web_token: class: Drupal\json_web_token\Authentication\Provider\JsonAuthenticationProvider arguments: ['@config.factory', '@user.auth', '@flood', '@entity.manager'] tags: - { name: authentication_provider, provider_id: 'json_authentication_provider', priority: 100 }/code/pre pThe interface states that we have to implement two methods, applies and authenticate:/p pre code class=language-yamlpublic function applies(Request $request) { $content = json_decode($request-getContent()); return isset($content-username, $content-password) !empty($content-username) !empty($content-password); }/code/pre pHere we define when the authenticator should be applied. So our requirement is that the JSON that is posted contains a username and password. In all other cases this authenticator can be skipped. Every authenticator service you define will always be called by Drupal. Therefore, it is very important that you define your conditions for applying the authentication service./p pre code class=language-yamlpublic function authenticate(Request $request) { $flood_config = $this-configFactory-get('user.flood'); $content = json_decode($request-getContent()); $username = $content-username; $password = $content-password; // Flood protection: this is very similar to the user login form code. // @see \Drupal\user\Form\UserLoginForm::validateAuthentication() // Do not allow any login from the current user's IP if the limit has been // reached. Default is 50 failed attempts allowed in one hour. This is // independent of the per-user limit to catch attempts from one IP to log // in to many different user accounts. We have a reasonably high limit // since there may be only one apparent IP for all users at an institution. if ($this-flood-isAllowed(json_authentication_provider.failed_login_ip', $flood_config-get('ip_limit'), $flood_config-get('ip_window'))) { $accounts = $this-entityManager-getStorage('user') -loadByProperties(array('name' = $username, 'status' = 1)); $account = reset($accounts); if ($account) { if ($flood_config-get('uid_only')) { // Register flood events based on the uid only, so they apply for any // IP address. This is the most secure option. $identifier = $account-id(); } else { // The default identifier is a combination of uid and IP address. This // is less secure but more resistant to denial-of-service attacks that // could lock out all users with public user names. $identifier = $account-id() . '-' . $request-getClientIP(); } // Don't allow login if the limit for this user has been reached. // Default is to allow 5 failed attempts every 6 hours. if ($this-flood-isAllowed('json_authentication_provider.failed_login_user', $flood_config-get('user_limit'), $flood_config-get('user_window'), $identifier)) { $uid = $this-userAuth-authenticate($username, $password); if ($uid) { $this-flood-clear('json_authentication_provider.failed_login_user', $identifier); return $this-entityManager-getStorage('user')-load($uid); } else { // Register a per-user failed login event. $this-flood-register('json_authentication_provider.failed_login_user', $flood_config-get('user_window'), $identifier); } } } } // Always register an IP-based failed login event. $this-flood-register('json_authentication_provider.failed_login_ip', $flood_config-get('ip_window')); return []; }/code/pre pHere we mostly reimplemented the authentication functionality of the basic authorization service, with the difference that we read the data from a JSON format. This code logs the user into the Drupal application. All the extra code is flood protection./p h2Getting the JWT token/h2 pTo get the JWT token we leveraged the REST module, and created a new rest resource plugin. We could have used the endpoint the module already provides, but we prefer to create all our endpoints with a version in it. We defined the plugin with the following annotation:/p pre code class=language-json/** * Provides a resource to get a JWT token. * * @RestResource( * id = token_rest_resource, * label = @Translation(Token rest resource), * uri_paths = { * canonical = /api/v1/token, * https://www.drupal.org/link-relations/create = /api/v1/token * } * ) *//code/pre pThe emuri_paths/em are the most important part of this annotation. By setting both the canonical and the weird looking Drupal.org keys, we are able to set a fully custom path for our endpoint. That allows us to set the version of our API in the URI like this: em/api/v1/token/em. This way we can easily roll out new versions of our API and clearly communicate about deprecating older versions./p pOur class extends the emResourceBase /emclass provided by the REST module. We only implemented a post method in our class, as we only want this endpoint to handle posts./p pre code class=language-yamlpublic function post() { if($this-currentUser-isAnonymous()){ $data['message'] = $this-t(Login failed. If you don't have an account register. If you forgot your credentials please reset your password.); }else{ $data['message'] = $this-t('Login succeeded'); $data['token'] = $this-generateToken(); } return new ResourceResponse($data); } /** * Generates a new JWT. */ protected function generateToken() { $token = new JsonWebToken(); $event = new JwtAuthIssuerEvent($token); $this-eventDispatcher-dispatch(JwtAuthIssuerEvents::GENERATE, $event); $jwt = $event-getToken(); return $this-transcoder-encode($jwt, array()); }/code/pre pThe emgenerateToken /emmethod is a custom method where we leverage the JWT module to get us a token that we can return. br /  br / We do not return a JSON object directly. We return a response in the form of an array. This is a very handy feature of the REST module, because you can choose the formats of your endpoint using the interface in Drupal. So you could easily return any other supported format like xml, JSON or hal_json. For this example, we chose hal_json. /p pDrupal has some built-in security measures for non-safe methods. The only safe methods are HEAD, GET, OPTIONS and TRACE. We are implementing a non-safe method, so we have to take into account the following things:/p ulliWhen the app does a post it also needs to send a X-CSRF-Token in the header to avoid cross site request forgery. This token can be gotten from /session/token endpoint./li liIn case of a POST we also need to set the Content-type request header to “application/hal+json” on top of the query parameter “_format=hal_json”./li /ulh2Putting things together/h2 pThe only thing left is to enable our endpoint through the interface that the rest modules provides on /admin/config/services/rest./p pimg alt=Drupal 8 React Native - REST resources - Drupal blog data-entity-type=file data-entity-uuid=1b2225c6-1971-47ba-8923-94e4ec385934 src=http://dropsolid.com/sites/default/files/inline-images/Drupal%208%20%26%20React%20Native%20-%20REST%20resources%20-%20Drupal%20blog.jpg //p pAs you can see, we’ve configured our token endpoint with our custom json_authentication_provider service and it is available in hal_json and json formats./p h2Calling the endpoint in our React Native application/h2 h3The login component/h3 pOur login component contain two input fields and a button./p pre code class=language-yamlItem rounded style={styles.inputGrp} Icon name=person/ Input placeholder=Username onChangeText={username = this.setState({username})} placeholderTextColor=#FFF style={styles.input} / /Item Item rounded style={styles.inputGrp} Icon name=unlock/ Input placeholder=Password secureTextEntry placeholderTextColor=#FFF onChangeText={password = this.setState({password})} style={styles.input} / /Item Button rounded primary block large style={styles.loginBtn} onPress={() = this.login({ username: this.state.username, password: this.state.password })} Text style={Platform.OS === 'android' ? { fontSize: 16, textAlign: 'center', top: -5 } : {fontSize: 16, fontWeight: '900'}}Get Started/Text /Button/code/pre pWhen we click the login button we trigger the login action that is defined in our bindActions function./p pre code class=language-yamlfunction bindActions(dispatch) { return { login: (username, password) = dispatch(login(username, password)), }; }/code/pre pThe login action is defined in our auth.js:/p pre code class=language-yamlimport type { Action } from './types'; import axios from 'react-native-axios'; export const LOGIN = 'LOGIN'; export function login(username, password):Action { var jwt = ''; var endpoint = https://example.com/api/v1/token?_format=hal_json; return { type: LOGIN, payload: axios({ method: 'post', url: endpoint, data: { username: username, password: password, jwt: jwt, }, headers: { 'Content-Type':'application/hal+json', 'X-CSRF-Token':'V5GBdzli7IvPCuRjMqvlEC4CeSeXgufl4Jx3hngZYRw' } }) } }/code/pre pIn this example, we set the X-CSRF-token fixed to keep it simple. Normally you would get this first. We’ve also used the react-native-axios package to handle our post. This action will return a promise. If you use the promise and thunk middleware in your Redux Store you can set up your reducer in the following way./p pre code class=language-yamlimport type { Action } from '../actions/types'; import { LOGIN_PENDING, LOGOUT} from '../actions/auth'; import { REHYDRATE } from 'redux-persist/constants'; export type State = { fetching: boolean, isLoggedIn: boolean, username:string, password:string, jwt: string, error: boolean, } const initialState = { fetching: false, username: '', password: '', error: null, } export default function (state:State = initialState, action:Action): State { switch (action.type) { case LOGIN_PENDING: return {...state, fetching: true} case LOGIN_REJECTED: return {...state, fetching: false, error: action.payload} case LOGIN_FULFILLED: return {...state, fetching: false, isLoggedIn: true, jwt:action.payload.data.token} case REHYDRATE: var incoming = action.payload.myReducer if (incoming) return {...state, ...incoming, specialKey: processSpecial(incoming.specialKey)} return state default: return state; } }/code/pre pThe reducer will be able to act on the different action types of the promise:/p ulliLOGIN_PENDING: Allows you to change the state of your component so you could implement a loader while it is trying to get the token./li liLOGIN_REJECTED: When the attempt fails you could give a notification why it failed./li liLOGIN_FULFILLED: When the attempt succeeds you have the token and set the state to logged in./li /ulpSo once we had implemented all of this, we had an iOS and Android app that actually used a Drupal 8 site as it main content store./p pFollowing this example, you should be all set up to deliver tailored content to your users on whichever platform they may be./p pThe purpose of this article was to demonstrate how effective Drupal 8 can be as a source for your upcoming iOS or Android application.br /  /p h4Useful resources:/h4 ulliDrupal 8: a href=https://www.drupal.org/8 target=_blankhttps://www.drupal.org/8/a/li liReact Native: a href=https://facebook.github.io/react-native/ target=_blankhttps://facebook.github.io/react-native//a/li liREST fundamentals: a href=https://www.drupal.org/docs/8/core/modules/rest/1-getting-started-rest-configuration-rest-request-fundamentals target=_blankhttps://www.drupal.org/docs/8/core/modules/rest/1-getting-started-rest-configuration-rest-request-fundamentals/a/li /ulp /p pemMore articles by our Dropsolid Technical Leads, strategist and marketeers? Check them out a href=https://dropsolid.com/en/blog target=_blankhere/a./em/p /div /div

Drupal.org blog: What’s new on Drupal.org? - May 2017

Tue, 06/20/2017 - 21:37
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpRead our a href=https://www.drupal.org/drupalorg/roadmap rel=nofollowRoadmap/a to understand how this work falls into priorities set by the Drupal Association with direction and collaboration from the Board and community./p pAfter returning from DrupalCon Baltimore at the end of April, we spent May regrouping and focusing on spring cleaning tasks. It's important for any technical team to spend time on stability and maintenance, and we used May to find improvements in these areas and look for some other efficiencies./p h2Drupal.org updates/h2 h3

Elevated Third: Recorded Webinar: A Decoupled Drupal Story

Tue, 06/20/2017 - 21:30
span class=field field--name-title field--type-string field--label-hiddenRecorded Webinar: A Decoupled Drupal Story/span Recorded Webinar: A Decoupled emDrupal Story/em span class=field field--name-uid field--type-entity-reference field--label-hidden/span span class=field field--name-created field--type-created field--label-hiddenTue, 06/20/2017 - 13:30/span div class=field field--name-field-image field--type-entity-reference field--label-hidden field__itemarticle class=media media-image view-mode-bannerdiv class=field field--name-field-image field--type-image field--label-hidden field__item img src=https://www.elevatedthird.com/sites/default/files/styles/hero_banner/public/image/2017-03/POW%20Banner_%201338x542.jpg?itok=zKfG4q23 width=1340 height=540 alt=Mountain typeof=foaf:Image class=image-style-hero-banner //div /article/div div class=field field--name-body field--type-text-with-summary field--label-hidden div class=body-content p dir=ltrWe teamed up with a href=https://www.acquia.com/ rel=nofollow target=_blankAcquia/a to present “A Decoupled Drupal Story: Powdr Gives Developers Ultimate Flexibility To Build Best CX Possible.” The webinar aired in June but you can view the recording here anytime./p piframe allowfullscreen= frameborder=0 height=315 src=https://www.youtube.com/embed/VKR19UE4Bf4?rel=0 width=560/iframe/p p dir=ltrAs the internet and web-connected devices continue to evolve, so do the needs to develop and render content. Given today’s rate of change, organizations are using a href=https://www.elevatedthird.com/news-insights/what-headless-drupal target=_blankdecoupled architecture/a to build applications - giving them flexibility to accommodate any device or experience./p p dir=ltrIn this session, we’ll cover a href=https://www.elevatedthird.com/work/boreal-mountain-resort target=_blankPowdr/a, a ski resort holding company. To give its developers the freedom to use the right front-end tools needed for any given use case, Powdr built its 17 ski resort websites on one decoupled Drupal platform. Join Elevated Third, Hoorooh Digital and Acquia to learn:/p ulli dir=ltr p dir=ltrHow a custom Drupal 8 solution cut implementation time in half vs Drupal 7/p /li li dir=ltr p dir=ltrThe ease in which Drupal 8’s internal REST API can be extended to fit a client's needs/p /li li dir=ltr p dir=ltrThe details of handling non-Drupal application routing on Acquia's servers/p /li /ulp dir=ltr /p p dir=ltrIf you are considering a decoupled Drupal implementation, a href=https://www.elevatedthird.com/contact-us target=_blanklet’s talk/a./p /div /div

David Lohmeyer's Blog: Clean up database pollution from the migrate Drupal module

Tue, 06/20/2017 - 21:29
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpI'm working on a large, complex migration from Drupal 7 to Drupal 8 right now. One thing I noticed is that the migrate modules pollute the database with an unreal number of tables which allow migrations to be re-run, etc. Well if you don't need that, here's how to remove these tables. Currently the migrate modules don't clean up after themselves. Put this in a custom module or PHP script that has bootstrapped Drupal. Note this code only works in Drupal 8. Shown is a .install file for a custom module. If you uninstall the custom module, it will run the cleanup:/p/div/div/div

Elevated Third: Elevated Third Ranks No. 1 Among Denver’s Best Places to Work

Tue, 06/20/2017 - 18:20
span class=field field--name-title field--type-string field--label-hiddenElevated Third Ranks No. 1 Among Denver’s Best Places to Work/span Elevated Third emRanks No. 1/em Among Denver’s Best Places to Work span class=field field--name-uid field--type-entity-reference field--label-hidden a title=View user profile. href=https://www.elevatedthird.com/about/team/nate-gengler lang= about=https://www.elevatedthird.com/about/team/nate-gengler typeof=schema:Person property=schema:name datatype= class=username xml:lang=Nate Gengler/a/span span class=field field--name-created field--type-created field--label-hiddenTue, 06/20/2017 - 10:20/span div class=field field--name-field-image field--type-entity-reference field--label-hidden field__itemarticle class=media media-image view-mode-bannerdiv class=field field--name-field-image field--type-image field--label-hidden field__item img src=https://www.elevatedthird.com/sites/default/files/styles/hero_banner/public/image/2017-06/image.jpg?itok=WqJBVA-G width=1340 height=540 alt=Elevated Third No 1 Best Place to Work typeof=foaf:Image class=image-style-hero-banner //div /article/div div class=field field--name-body field--type-text-with-summary field--label-hidden div class=body-content p dir=ltrThe Denver Business Journal’s annual “Best Places to Work” awards wrapped up with a href=http://www.bizjournals.com/denver/news/2017/06/16/elevated-third-makes-balance-the-core-of-its.html rel=nofollow target=_blankElevated Third landing the top spot in the “Workplace Wellness” category/a for small companies. The category recognizes Denver employers with an outstanding commitment to employee well-being./p p dir=ltr As a business practice, committing to employee wellness means that everyone is operating at their highest capacity. When our minds are fresh to focus on the task at hand, we can crank out the best work possible./p p dir=ltr Striking the ideal work-life balance is central to our culture. Where some agencies expect employees to work nights and weekends at the drop of a hat, we are committed to respecting employees’ time beyond the office and staying true to a 40 hour work week./p p dir=ltr We believe that when employees feel valued beyond the output of their work, the workplace is a more positive and productive environment./p p dir=ltrOutside of the office, the Elevated Third team is covered with 3 weeks of Paid Time Off, a subsidized gym membership, a $1,500 Health Reimbursement Account (HRA), and an RTD ecopass. /p p dir=ltrIn the office, we are surrounded by a work environment that stimulates creativity and keeps spirits high. Office dogs can be found roaming the hallways, the kitchen is stocked with goodies of a (mostly) healthy variety, and our location on the top floor of the Denver Masonic Building provides plenty of sunlight and the occasional summer breeze./p p dir=ltrWe are incredibly proud to be recognized among Denver’s best places to work. Joining our fellow recipients, we believe this commitment to workplace wellness makes Denver a better place to live, work, and do business./p p dir=ltr /p p dir=ltrInterested in joining the team? Have a look at our a href=https://www.elevatedthird.com/careers-drupal-developer-job target=_blankopen positions/a/p /div /div

Valuebound: How to hide Order ID from commerce checkout process in Drupal 8

Tue, 06/20/2017 - 17:51
pIn Drupal, many a time we come across a situation where we want to hide certain URL part from end users./p pTo achieve this we often use Drupal modules like Pathauto to hide node IDs, taxonomy IDs from URL and replacing them with some patterns (eg. Titles)./p pThe above scenario can not be achieved for a href=http://valuebound.com/resources/blog/getting-started-drupal-commerce-2-x-part-1Drupal commerce/a checkout flow(URLs) as the Drupal modules like PathAuto do not support this. To achieve this in Drupal 7 we often used one of the following ways mentioned below:/p ulli pCommerce Checkout Paths Module./p /li li pCombination of…/p/li/ul

I Fix Drupal: After Reverting a Feature Module Profile2 Field Values Are Deleted

Tue, 06/20/2017 - 17:12
I recently gave an outline of this problem over in the Drupal community here:https://www.drupal.org/node/1316874#comment-12136170 But I thought it would be interesting to make a more technical post on the subject, so here it is.

DataSmith: Setting up BLT with Reservoir

Tue, 06/20/2017 - 17:09
span class=field field--name-title field--type-string field--label-hiddenSetting up BLT with Reservoir/span div class=clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__itempYesterday, a href=https://dev.acquia.com/blog/introducing-reservoir-a-distribution-for-decoupling-drupal/19/06/2017/18296Acquia open sourced Reservoir/a, a new distribution designed for building headless Drupal instances.  The Reservoir team provided a composer project command for setting up a Reservoir instance easily, but it doesn't bundle a VM.  Fortunately, making a href=https://github.com/acquia/bltBLT/a work with a href=https://github.com/acquia/reservoirReservoir/a isn't difficult.  There are, though, a few steps to be aware of./p pTo get started, run the composer project to a href=https://github.com/acquia/blt/blob/8.x/readme/creating-new-project.mdbuild a new BLT instance/a./p pcodecomposer create-project --no-interaction acquia/blt-project MY_PROJECT/code/p pOnce that completes, you need to add reservoir and (optionally) remove the lightning distro/p pcodecomposer require acquia/reservoir/code/p pcodecomposer remove acquia/lightning/code/p pNext, update the blt/project.yml file.  The key changes you'll want to make here (beyond setting a new project prefix, etc) are a) changing the distro from ligthning to reservoir and b) removing views_ui from the modules:enable list for local environments.*  An excerpt of my git diff for this file looks like.../p pcodeprofile:br / -    name: lightningbr / +    name: reservoirbr / local:br / -    enable: [dblog, devel, seckit, views_ui]br / +    enable: [dblog, devel, seckit]/code/p pOnce that's done, continue with the a href=https://github.com/acquia/blt/blob/8.x/readme/creating-new-project.mdBLT setup process/a from Step 4 (assuming you want to use Drupal VM. Step 5 otherwise)./p p /p p* If you don't remove views_ui, the world won't explode or anything, but when you run blt setup you'll get errors reported like the ones below:/p pblt setup:toggle-modules:br /     [drush] dblog is already enabled.                                                   [ok]br /     [drush] The following extensions will be enabled: devel, seckit, views_ui, viewsbr /     [drush] Do you really want to continue? (y/n): ybr /     [drush] Argument 1 passed to                                                     [error]br /     [drush] Drupal\Core\Config\Entity\ConfigEntityBase::calculatePluginDependencies()br /     [drush] must implement interfacebr /     [drush] Drupal\Component\Plugin\PluginInspectionInterface, null given, calledbr /     [drush] in /var/www/mrpink/docroot/core/modules/views/src/Entity/View.php onbr /     [drush] line 281 and defined PluginDependencyTrait.php:29br /     [drush] E_RECOVERABLE_ERROR encountered; aborting. To ignore recoverable         [error]br /     [drush] errors, run again with --no-halt-on-errorbr /     [drush] Drush command terminated abnormally due to an unrecoverable error.       [error]br / [phingcall] /Users/barrett.smith/Desktop/mrpink/./vendor/acquia/blt/phing/tasks/setup.xml:370:8: /Users/barrett.smith/Desktop/mrpink/./vendor/acquia/blt/phing/tasks/setup.xml:374:12: /Users/barrett.smith/Desktop/mrpink/./vendor/acquia/blt/phing/tasks/setup.xml:377:69: Drush exited with code 255br / [phingcall] /Users/barrett.smith/Desktop/mrpink/./vendor/acquia/blt/phing/tasks/setup.xml:350:45: Execution of the target buildfile failed. Aborting./p pBUILD FAILED/Users/barrett.smith/Desktop/mrpink/./vendor/acquia/blt/phing/tasks/local-sync.xml:12:30: Execution of the target buildfile failed. Aborting.br / ; 2 minutes  37.24 seconds/p p /p /div span class=field field--name-uid field--type-entity-reference field--label-hiddenspan lang= about=https://www.datasmith.net/user/1 typeof=schema:Person property=schema:name datatype= xml:lang=Barrett/span/span span class=field field--name-created field--type-created field--label-hiddenTue, 06/20/2017 - 10:09/span div class=field field--name-field-tags field--type-entity-reference field--label-above clearfix h3 class=field__labelTags/h3 ul class=links field__itemslia href=https://www.datasmith.net/tag/drupal-8 hreflang=enDrupal 8/a/li lia href=https://www.datasmith.net/tag/planet-drupal hreflang=enPlanet Drupal/a/li /ul/div section class=field field--name-field-comments field--type-comment field--label-above comment-wrapperh2 class=title comment-form__titleAdd new comment/h2 drupal-render-placeholder callback=comment.lazy_builders:renderForm arguments=0=node1=862=field_comments3=geeral_comment token=b7ab19d0/drupal-render-placeholder/section

Drupal Association blog: Growing community in Moldova

Tue, 06/20/2017 - 17:03
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenp id=docs-internal-guid-4bc652c3-c132-e582-58f4-9eceb9426482emThis guest blog post is from Drupal Moldova's Association (not affiliated with Drupal Association). Get a glimpse of what is happening in Moldova's community and how you can get involved./em/p pa href=https://www.facebook.com/DrupalMoldova/ rel=nofollowstrongDrupal Moldova Association/strong/a’s mission is to promote Drupal CMS and Open Source technologies in Moldova, and to grow and sustain the local community by organising Events, Camps, Schools, Drupal meetups and various Drupal and Open Source related trainings, and by establishing partnerships with Companies, the Government, and NGO’s./p pCome and share your expertise in Moldova at our events! We're looking for international speakers to speak about Drupal and open source./p pAmong DMA’s (emshort for Drupal Moldova Association/em) numerous commitments, the following are of special importance:/p ulli pto gather the community around Drupal and Open Source technologies;/p /li li pto train students and professionals who want to learn and work with Drupal;/p /li li pto organise events to keep the community engaged and motivated to improve, learn, and share experience;/p /li li pto make sure Drupal is accessible to everyone by offering scholarships to those who can't afford our programs;/p /li li pto elaborate a well defined program that helps students learn Drupal, acquire enough knowledge to get accepted for internships by IT companies, and be able to build Drupal powered websites;  /p /li li pto assist new IT companies in establishing a local office, promote themselves, collaborate with other companies, and connect with the local Drupal community by giving them the opportunity to support our projects./p /li /ulpOver the last 5 years, we have been dedicated to achieving our goals! DMA have organized over 20 projects and events, including Drupal Global Training Days, Drupal Schools, and the regional DrupalCamp -- Moldcamp. Our projects have gathered over 700 local and international participants and speakers, and more than 15 International Companies that have supported us during these years (FFW, Adyax, IP Group, Intellix, Endava and many others)./p pMoldova is rich in great developers and people driven to take initiative and to grow and place the country on the world map. We are aiming to go beyond our limits and have a bigger impact in the year (‘17-’18), therefore we have created a yearly plan that contains projects similar to those we have done in the past years, as well as new and exciting ones:/p ulli pstrongDrupal School /strong(3 step program), starting with a href=http://school.drupalmoldova.org/ rel=nofollowDrupal School 8 plus PHP/a (step 1):  Drupal School is an educational program - split into 2 months, 25 courses of different levels (Beginner, Intermediate, Advanced).Drupal School aims to introduce people to Drupal 8 and PHP, and help them become Drupal professionals;/p /li /ulpa href=https://www.facebook.com/DrupalMoldova/photos/a.333068920154824.1073741829.332763026852080/1179322042196170/?type=3amp;theater rel=nofollowstrongimg alt=School of Drupal 8 group photo from Facebook height=294 src=/files/moldova_association_1.jpeg width=500 //strong/a/p ulli pa href=https://www.youtube.com/watch?v=0s8kBCF4Gm4amp;t=2s rel=nofollowstrongMoldcamp/strong/astrong /strong2017: Sep - Oct 2017. A regional DrupalCamp that gathers around 150 Drupal professionals, enthusiasts, beginners and any-Drupal-related-folk in one place for knowledge-sharing, presentations, networking, etc. We will announce the event soon and allow speaker registration. Please follow us and don’t miss out on the opportunity;/p /li /ulpa href=https://www.facebook.com/DrupalMoldova/photos/a.551565904971790.1073741841.332763026852080/551565941638453/?type=3amp;theater rel=nofollowimg alt=Mold Camp speaker at blackboard height=336 src=/files/moldova_association_2.jpeg width=500 //a/p pa href=https://www.facebook.com/DrupalMoldova/photos/a.560160530778994.1073741842.332763026852080/560217497439964/?type=3amp;theater rel=nofollowimg alt=Mold Camp attendees at table height=333 src=/files/moldova_association_3.jpeg width=500 //a/p ulli pa href=https://www.youtube.com/watch?v=K5OQVuNgyJI rel=nofollowstrongDrupal Global Training Day:/strong/astrong /strongDec 1-2.strong /strongAstrong /strongone-day workshop thatstrong /stronghas the purpose of introducing people to Drupal, both code and community./p /li /ulpstronga href=https://www.facebook.com/DrupalMoldova/photos/a.417719348356447.1073741836.332763026852080/417725341689181/?type=3amp;theater rel=nofollowimg alt=Global Training Day presenter height=333 src=/files/moldova_association_4.jpeg width=500 //a/strong/p ulli pstrongDrupal Meetups/strong: These are organized each month and they allow our community to be active and share knowledge./p /li li pstrongTech Pizza/strong: - Jun, Aug, Oct, Dec. A bi-monthly event, where the ICT community can gather in a casual and an informal environment around a pizza and  soda and discuss the latest IT trends and news. The core of this event is a speaker / invitee from abroad with a domain of expertise;/p /li li pstrongMoldova Open Source Conference/strong: March 2018. It is a regional conference for over 200 participants that aims to gather all the Open Source Communities (Wordpress, Laravel, Ruby on Rails, JavaScript, etc.) under one roof, where they will attend sessions that enhance the expertise of existing experts in various Open Source technologies and allow them to mix their technologies into new ideas./p /li /ulpThe proposed program “Drupal and Open Source in Moldova 2017 - 2018” is made possible through the support of USAID and the Swedish Government. Thanks to these organizations we can focus on the quality of our projects make sure they happen as planned. Also, we have a very important partnership with Tekwill / Tekwill Academy, which helps us even more in our quests./p pa href=https://www.facebook.com/DrupalMoldova/photos/gm.1874911349441485/1198828146912226/?type=3amp;theater rel=nofollowimg alt=School of Drupal 8 + PHP promotional page height=225 src=/files/moldova_association_5.jpeg width=400 //a/p pWe start with a href=https://www.facebook.com/events/1866406370291983/?acontext=%7B%22source%22%3A5%2C%22page_id_source%22%3A332763026852080%2C%22action_history%22%3A[%7B%22surface%22%3A%22page%22%2C%22mechanism%22%3A%22main_list%22%2C%22extra_data%22%3A%22%7B%5C%22page_id%5C%22%3A332763026852080%2C%5C%22tour_id%5C%22%3Anull%7D%22%7D]%2C%22has_source%22%3Atrue%7D rel=nofollowSchool of Drupal 8 plus PHP program/a, which will be held on 19th of June 2017. So far we have 3 sponsors--IPGroup, Adyax and Intellix--and two trainers./p pWe, The DMA, believe in pushing the limits! Our long term goal is to build and maintain big an active Open Source community by attracting more local and International participants to our Projects and Events, and continuously improve our sessions. This will make our presence felt in the global Drupal and Open Source communities and markets. Find us on Twitter a href=https://twitter.com/drupalmoldova rel=nofollow@drupalmoldova/a, or on our a href=https://www.facebook.com/DrupalMoldova/ rel=nofollowFacebook page/a. If you are interested in speaking in Moldova, contact us at a href=mailto:info@drupalmoldova.org rel=nofollowinfo@drupalmoldova.org/a./p/div/div/div