Galaxy S8 und S8+: Update auf Android 8 steht zum Download bereit – ohne Project Treble

heise online Newsticker - 14. Februar 2018 - 11:30
Samsung hat das Update für Android 8 Oreo für das Galaxy S8 und das S8+ in Deutschland freigegeben. Der Download ist 1,3 GByte groß, Project Treble ist nicht enthalten.

Mail-Verschlüsselung: Enigmail 2.0 steht vor der Tür

heise online Newsticker - 14. Februar 2018 - 11:30
Enigmail, eine beliebte Thunderbird-Erweiterung zum Verschlüsseln und Signieren von E-Mails, wird demnächst in Version 2.0 erscheinen. Eine erste Beta ist bereits zum Download freigegeben worden.

Gesichtserkennung funktioniert am besten bei weißen Männern

heise online Newsticker - 14. Februar 2018 - 11:00
Algorithmen identifizieren das Geschlecht einer abgebildeten Person - arbeiten aber nicht ausgewogen. Männer mit heller Hautfarbe erzielen die besten Ergebnisse, hat eine wissenschaftliche Studie am MIT herausgefunden.

Brite fotografiert einzelnes Atom

heise online Newsticker - 14. Februar 2018 - 10:30
Das Foto eines einzelnen Strontium-Atoms in einem elektrischen Feld zwischen zwei Elektroden ist vom britischen Engineering and Physical Science Research Council (EPSRC) ausgezeichnet worden.

Nur für Rechts: Gaming Maus mit Display und 13 Beleuchtungs-Modi für 35 Euro

heise online Newsticker - 14. Februar 2018 - 10:30
Die Gaming-Maus Cougar Surpassion lässt sich ohne Extra-Software mithilfe eines kleinen LC-Displays einstellen. Die kabelgebundene Maus ist ab 35 Euro erhältlich.

Elektroautos: SPD für höhere Kaufprämie

heise online Newsticker - 14. Februar 2018 - 10:30
Eine höhere Kaufprämie und mehr Ladesäulen – das soll das Interesse der Deutschen an elektrischen Antrieben ankurbeln. Der TÜV nimmt unterdessen den Diesel stärker in den Blick.

Einstweilige Verfügung: Vodafone muss Kinox.to sperren

heise online Newsticker - 14. Februar 2018 - 10:00
Vodafone sperrt seit Freitag die Streaming-Seite Kinox.to. Kunden, die über das TV-Netz mit dem Internet verbunden sind, werden auf eine Infoseite geleitet. Grund für die Sperre ist eine einstweilige Verfügung.

Mac-Apps können heimlich Bildschirminhalt aufzeichnen – trotz Sandbox

heise online Newsticker - 14. Februar 2018 - 10:00
Per Sandbox abgeschottete macOS-Apps sind dazu in der Lage, unbemerkt im Hintergrund Screenshots anzufertigen und so persönliche Informationen wie etwa Zugangsdaten auszulesen, warnt ein Entwickler.

Valuebound: How to generate PDF of HTML code in Drupal 8

Planet Drupal - 14. Februar 2018 - 9:52

Have you ever been in a situation where you were required to generate PDF of HTML code? Recently, I came across a similar situation. In Drupal 8, there are several PHP libraries that allow you to generate PDF. However, out of curiosity, I thought of finding better alternatives. After some research, I found an interesting library, called mPDF, that converts HTML code to PDF without changing the structure.

mPDF is a smart library that considers the CSS attached to the HTML. Not only CSS, it takes care of almost all the HTML tags like form tags, tables, images, lists etc.

Generating PDF of HTML in custom module

Requirements

mPDF 7.0 requires PHP ^5.6 || ~7.0.0 || ~7.1.0 || ~7.2.0.…

Axel Springer investiert in Augmented-Reality-Startup Magic Leap

heise online Newsticker - 14. Februar 2018 - 9:45
Magic Leap liefert seine AR-Brille immer noch nicht aus, hat aber schon Finanzspritzen in Milliardenhöhe eingesammelt. Nun investiert auch Axel Springer. Das Medienunternehmen sieht das Potenzial für neue journalistische Darstellungsformen.

SUSE: Live-Patching für Linux-Kernel auch für POWER-Systeme

heise online Newsticker - 14. Februar 2018 - 9:45
SUSE spendiert seinem Linux Enterprise Server der ein Update: Das bislang nur für Intel-Systeme erhältliche Patching des Kernels im laufenden Betrieb gibt es jetzt auch für IBMs POWER.

AMD Ryzen 3 2200G und Ryzen 5 2400G: Kombiprozessoren mit Vega-Grafik

heise online Newsticker - 14. Februar 2018 - 9:00
AMDs Desktop-Prozessoren der Serie Ryzen 2000G mit Vega-8- und Vega-11-GPU sollen ausreichend 3D-Performance für eSport-Spiele mitbringen und Intels Core-i3-Prozessoren Paroli bieten.

Agiledrop.com Blog: AGILEDROP: Our blog posts from January

Planet Drupal - 14. Februar 2018 - 8:55
You have already seen what Drupal blogs we trending in the previous month, and now it is time to look at all our blog post we wrote. Here are the blog topics we covered in January.   The first blog post in January was 2017 in review. In this blog post, our Commercial director Iztok looked back in the year 2017 and summarized what differences we made as a company, which Drupal events we have visited, how much fun we had and how do we contributed back to the community in 2017.    The second was Who will get the control of personal data after GDPR? by Ales Kohek. He talked about new set of… READ MORE

Weniger Stau dank Quantencomputer

heise online Newsticker - 14. Februar 2018 - 8:30
In Peking herrscht Stau – bei einem Experiment konnte ein Quantencomputer jedoch Taxis so auf unterschiedliche Strecken verteilen, dass sie deutlich schneller ankamen. Ist die Technik reif für die Praxis?

Thailand verbietet Geldhäusern Handel mit Digitalwährungen

heise online Newsticker - 14. Februar 2018 - 8:00
Banken und Finanzinstituten in Thailand ist der Handel mit und das Investieren in Kryptowährungen verboten. Die Zentralbank des Landes untersagte auch die Kundenberatung - aus Sorge wegen Betrugs.

Commerce Guys: We're sponsoring and speaking at Florida DrupalCamp!

Planet Drupal - 14. Februar 2018 - 5:38

Florida DrupalCamp 2018 finally arrives this weekend, February 16-18! Commerce Guys is a Gold sponsor this year, and I will be heading down to the conference to talk about Reporting in Drupal Commerce.

With Drupal Commerce 2.4 out the door (see yesterday's release notes), our focus is shifting back to the contributed module ecosystem. As Bojan highlighted in our year in review blog post, we have now ported many essential modules and pushed for them to achieve stable releases. With 55 payment gateways, shipping support, and work on recurring payments in progress, we've identified reporting as our next major initiative.

Reporting is obviously essential to eCommerce. Merchants need to know which products are selling, if a marketing campaign is producing new sales, how much sales tax to remit, and more. Each new type of report brings unique challenges related to understanding, querying, and visualizing the underlying data.

At Florida DrupalCamp, I will discuss the requirements and challenges we've identified in reporting within Drupal Commerce and the solutions available to our users in the Commerce Reports and Commerce Google Analytics modules. Finally, I will also unveil Commerce Guys’ newest product, Lean Commerce Reports.

Lean Commerce Reports, which we first showed off at DrupalCon Baltimore, is finally production ready. Over 80 stores use Lean Commerce Reports to add a plug and play sales dashboard to the back end of Drupal Commerce. The dashboard gives store owners immediate visibility into their sales trends, traffic by channel, conversion rate, and top selling products over time. Furthermore, each summary report on the dashboard links to a full report you can further explore, refine, export, etc.

Jonathan and I have worked really hard these last few months to get Lean Commerce Reports to where it is now, and I can't wait to show it off in Orlando. If you miss me there, come find us at DrupalCon Nashville or get in touch if you'd like to try it out while it's still in private beta.

Brian Osborne: Importing Images Within an RSS Feed Using the Drupal 7 Feeds Module

Planet Drupal - 14. Februar 2018 - 4:58

Yes, a blog post about Drupal 7!

I recently worked on an enhancement for a large multi-site Drupal 7 platform to allow its users to import news articles from RSS feeds. Pretty simple request, and given the maturity of the Drupal 7 contrib module ecosystem, it wasn't too difficult to implement.

Brian Osborne: Importing Images Within an RSS Feed Using the Drupal 7 Feeds Module

Planet Drupal - 14. Februar 2018 - 4:58

Yes, a blog post about Drupal 7!

I recently worked on an enhancement for a large multi-site Drupal 7 platform to allow its users to import news articles from RSS feeds. Pretty simple request, and given the maturity of the Drupal 7 contrib module ecosystem, it wasn't too difficult to implement.

PreviousNext: Creating a custom LinkIt matcher plugin

Planet Drupal - 14. Februar 2018 - 3:27

In one of our recent projects, our client made a request to use LinkIt module to insert file links to content from the group module.  However, with the added distinction of making sure that only content that is in the same group as the content they are editing is suggested in the matches.

Here’s how we did it.

by Pasan Gamage / 14 February 2018 The LinkIt module

First, let me give you a quick overview of the LinkIt module.

LinkIt is a tool that is commonly used to link internal or external artifacts. One of the main advantages of using it is because LinkIt maintains links by uuid which means no occurrence for broken links. And it can link any type of entity varying from core entities like nodes, users, taxonomy terms, files, comments and to custom entities created by developers.

Once you install the module, you need to set a Linkit profile which consists of information about which plugins to use. To set the profiles use /admin/config/content/linkit path. And the final step will be to enable the Linkit plugin on the text format you want to use. Formats are found at admin/config/content/formats. And you should see the link icon when editing content item.

Once you click on the LinkIt icon it will prompt a modal as shown below.

By default LinkIt ships with a UI to maintain profiles that enables you to manage matchers.

Matchers

Matchers are responsible for managing the autoload suggestion criteria for a particular LinkIt field. It provides bundle restrictions and bundle grouping settings

Proposed resolution

To solve the issue; we started off by creating a matcher for our particular entity type. Linkit has an EntityMatcher plugin that uses Drupal's Plugin Derivatives API to expose one plugin for each entity type. We started by adding the matcher that linkit module exposed for our custom group content entity type.

We left the bundle restrictions and bundle grouping sections un-ticked so that all existing bundles are allowed so the content of those bundles will be displayed.

Now that the content is ready we have to let the matcher know that we only need to load content that belongs to the particular group for which the user is editing or creating the page.

Using the deriver

In order to do that we have to create a new class in /modules/custom/your_plugin_name/src/Plugin/Linkit/Matcher/YourClassNameMatcher.php by extending existing EntityMatcher class which derives at /modules/contrib/linkit/src/Plugin/Linkit/Matcher/EntityMatcher.php.

Because Linkit module's plugin deriver exposes each entity-type plugin with and ID for the form entity:{entity_type_id} we simply need to create a new plugin with an ID that matches our entity type ID. This then takes precedence over the default derivative based plugin provided by Linkit module. We can then modify the logic in either the ::execute() or ::buildEntityQuery method.

Using LinkIt autocomplete request

But here comes the challenge, in that content edit page the LinkIt modal doesn’t know about the group of the content being edited, therefore we cannot easily filter the suggestions based on the content being edited. We need to take some fairly extreme measures to make that group ID available for our new class to filter the content once the modal is loaded and user starts typing in the field.

In this case the group id is available from the page uri.

So in order to pass this along, we can make use of the fact that the linkit autocomplete widget has a data attribute 'data-autocomplete-path' which is used by its JavaScript to perform the autocomplete request. We can add a process callback to the LinkIt element to extract the current page uri and pass it as a query parameter in the autocomplete path.

The code

To do so we need to implement hook_element_info_alter in our custom module. Here we will add a new process callback and in that callback we can add the current browser url as a query parameter to the data-autocomplete-path attribute of the modal.

\Drupal\linkit\Element\Linkit is as follows;

public function getInfo() { $class = get_class($this); return [ '#input' => TRUE, '#size' => 60, '#process' => [ [$class, 'processLinkitAutocomplete'], [$class, 'processGroup'], ], '#pre_render' => [ [$class, 'preRenderLinkitElement'], [$class, 'preRenderGroup'], ], '#theme' => 'input__textfield', '#theme_wrappers' => ['form_element'], ]; }

Below is the code to add the process callback and alter the data-autocomplete-path element. We rely on the HTTP Referer header which Drupal sends in its AJAX request that is used to display the LinkIt modal, which in turn builds the LinkIt element

/** * Implements hook_element_info_alter(). */ function your_module_name_element_info_alter(array &$info) { $info['linkit']['#process'][] = 'your_module_name_linkit_process'; } /** * Process callback. */ function your_module_name_linkit_process($element) { // Get the HTTP referrer (current page URL) $url = \Drupal::request()->server->get('HTTP_REFERER'); // Parse out just the path. $path = parse_url($url, PHP_URL_PATH); // Append it as a query parameter to the autocomplete path. $element['#attributes']['data-autocomplete-path'] .= '?uri=' . urlencode($path); return $element; }

Once this is done we can now proceed to create the new plugin class extending EntityMatcher class. Notice the highlighted areas.

namespace Drupal\your_module\Plugin\Linkit\Matcher; use Drupal\linkit\Plugin\Linkit\Matcher\EntityMatcher; use Drupal\linkit\Suggestion\EntitySuggestion; use Drupal\linkit\Suggestion\SuggestionCollection; /** * Provides specific LinkIt matchers for our custom entity type. * * @Matcher( * id = "entity:your_content_entity_type", * label = @Translation("Your custom content entity"), * target_entity = "your_content_entity_type", * provider = "your_module" * ) */ class YourContentEntityMatcher extends EntityMatcher { /** * {@inheritdoc} */ public function execute($string) { $suggestions = new SuggestionCollection(); $query = $this->buildEntityQuery($string); $query_result = $query->execute(); $url_results = $this->findEntityIdByUrl($string); $result = array_merge($query_result, $url_results); if (empty($result)) { return $suggestions; } $entities = $this->entityTypeManager->getStorage($this->targetType)->loadMultiple($result); $group_id = FALSE; // Extract the Group ID from the uri query parameter. if (\Drupal::request()->query->has('uri')) { $uri = \Drupal::Request()->query->get('uri'); list(, , $group_id) = explode('/', $uri); } foreach ($entities as $entity) { // Check the access against the defined entity access handler. /** @var \Drupal\Core\Access\AccessResultInterface $access */ $access = $entity->access('view', $this->currentUser, TRUE); if (!$access->isAllowed()) { continue; } // Exclude content that is from a different group if ($group_id && $group_id != $entity->getGroup()->id()) { continue; } $entity = $this->entityRepository->getTranslationFromContext($entity); $suggestion = new EntitySuggestion(); $suggestion->setLabel($this->buildLabel($entity)) ->setGroup($this->buildGroup($entity)) ->setDescription($this->buildDescription($entity)) ->setEntityUuid($entity->uuid()) ->setEntityTypeId($entity->getEntityTypeId()) ->setSubstitutionId($this->configuration['substitution_type']) ->setPath($this->buildPath($entity)); $suggestions->addSuggestion($suggestion); } return $suggestions; } } Conclusion

And we are done.

By re-implementing the execute() method of EntityMatcher class we are now able to make the LinkIt field to display only content from the same group as the content the user is editing/creating.

So next challenge here is to create some test coverage for this, as we're relying on a few random pieces of code - a plugin, some JavaScript in the LinkIt module, an element info alter hook and a process callback - any of which could change and render all of this non-functional. But that's a story for another post.

Tagged Drupal 8, Drupal Modules, Custom modules

Acro Media: Drupal Commerce 2: Set up a Product Type with Custom Fields

Planet Drupal - 13. Februar 2018 - 23:27

In part one  and two of this Acro Media Tech Talk video series, we covered how you set up a new product attribute and used rendered fields, in Drupal Commerce 2. In part three we set up a product variation type with custom fields.  

In part four of this series, we'll complete our overall product configuration by setting up a product type. The product type defines the type of product that you're creating (i.e. hat, shirt, shoe). This is what your store administrators will see when they add a new product to their catalog. By default, a product type will consist of a title, body, and variation type. We'll add some additional custom fields for things like taxonomy reference (for categorization), short description, specifications, product review, etc. 

This entire video series, when complete, will show you how to set up a new product in Drupal Commerce 2, from start to finish. The video is captured using our Urban Hipster Commerce 2 demo site.

Next week we'll post part 5: How to Add and Modify Product Content

Its important to note that this video was recorded before the official 2.0 release of Drupal Commerce and so you may see a few small differences between this video and the official release now available.

Urban Hipster Commerce 2 Demo site

This video was created using the Urban Hipster Commerce 2 demo site. We've built this site to show the adaptability of the Drupal 8, Commerce 2 platform. Most of what you see is out-of-the-box functionality combined with expert configuration and theming.

More from Acro Media Drupal modules used in this video