This document discusses maintaining a Drupal module called Real-Time SEO. It provides background on the module, how it was originally built and maintained, and improvements made in recent versions. The key points are:
- Real-Time SEO analyzes content to provide SEO feedback and was originally built in collaboration with Yoast, but is now maintained by GoalGorilla.
- Version 1 only supported node content and a few fields. Recent updates added support for things like paragraphs and embedded media.
- The updates involved rendering content on the server and passing it to the Yoast analysis library, rather than just analyzing individual fields.
- A better approach is to use standard Drupal form and
A resource oriented framework using the DI/AOP/REST triangleAkihito Koriyama
This document discusses a resource-oriented framework that uses dependency injection (DI), aspect-oriented programming (AOP), and representational state transfer (REST) principles. It introduces the authors and their backgrounds. It then explains that the framework called BEAR.Sunday offers three object frameworks: 1) a DI framework that uses annotations for dependency injection, 2) an AOP framework that allows separating cross-cutting concerns using aspects, and 3) a hypermedia framework that treats objects as resources and allows them to have RESTful web service capabilities through URIs, links, and representations.
Meet Magento Sweden - Magento 2 Layout and Code Compilation for PerformanceIvan Chepurnyi
It is a pity, but I have to admit, that Magento 2 has issues in layout generation process. You'll learn during the talk about the benefits of compiling XML structures into PHP code, and even use the compilation of PHP code into PHP code to speed up your modules complex logic.
A presentation on how to semi-automatically build CRUD application prototypes using PHP and some PEAR libraries. This was way before Rails became popular and automatic form generation for web applications was not as common as it is now.
Also, it was the first public presentation I ever held. Ah, those were the times ;-)
Originally held at the International PHP Conference 2004 in Amsterdam, although these slides have been updated by project contributors to reflect feature additions that were implemented later.
Entities in Drupal 8 are classes that can represent content or configuration. The Entity API in Drupal 8 provides standardized methods for core entities and custom entities to perform CRUD operations like create, read, update, and delete. This allows entities to be managed consistently through an entity storage class and removes the need for proprietary entity functions. The Entity API also includes methods for querying entities and accessing entity properties through getters and setters.
The document discusses dependency injection and inversion of control principles in PHP applications. It provides examples of using global variables, Zend Registry, and Zend Application to manage dependencies. It also summarizes various PHP dependency injection containers and how they can be used to configure services and their dependencies. The document advocates designing applications with loose coupling, separation of concerns, and configuring via configuration files rather than code for improved maintainability.
What's New in Drupal 8: Entity Field APIDrupalize.Me
In this presentation we take a high-level look at the new Drupal 8 Entity Field API. To view this presentation as a video, go to https://drupalize.me/videos/whats-new-drupal-8-entity-field-api?p=2075. This video is part of a series examining What's New in Drupal 8 and is produced by Drupalize.Me.
Caching is one of the most popular ways to optimize the performance of web applications. Magento is not far from this trend and the primary approach to speed up slow code from the core team is to cache it. This approach works well for small projects where the rate of inventory changes is shallow. But as soon as you enter sales season or receive regular product updates from the external system, your cache hit ratio plummets. In this talk, you will learn how to ensure that your system’s uncached response times are as light as possible when you get a cache miss by minimizing the I/O of your application with intelligent batch data preloading.
Con la versione 7 di Drupal è stato introdotto il concetto di Entity, poi evoluto con la versione 8, utilizzato come base di buona parte degli elementi core (nodi, tassonomie, utenti, ...), ma - soprattutto - è stata data la possibilità di costruire entity custom. L'utilizzo di queste apre le possibilità di personalizzazione dello strumento ad un livello superiore velocizzando notevolmente lo sviluppo.
Verranno mostrate le potenzialità nell'uso delle Entity custom e le integrazioni possibili.
A resource oriented framework using the DI/AOP/REST triangleAkihito Koriyama
This document discusses a resource-oriented framework that uses dependency injection (DI), aspect-oriented programming (AOP), and representational state transfer (REST) principles. It introduces the authors and their backgrounds. It then explains that the framework called BEAR.Sunday offers three object frameworks: 1) a DI framework that uses annotations for dependency injection, 2) an AOP framework that allows separating cross-cutting concerns using aspects, and 3) a hypermedia framework that treats objects as resources and allows them to have RESTful web service capabilities through URIs, links, and representations.
Meet Magento Sweden - Magento 2 Layout and Code Compilation for PerformanceIvan Chepurnyi
It is a pity, but I have to admit, that Magento 2 has issues in layout generation process. You'll learn during the talk about the benefits of compiling XML structures into PHP code, and even use the compilation of PHP code into PHP code to speed up your modules complex logic.
A presentation on how to semi-automatically build CRUD application prototypes using PHP and some PEAR libraries. This was way before Rails became popular and automatic form generation for web applications was not as common as it is now.
Also, it was the first public presentation I ever held. Ah, those were the times ;-)
Originally held at the International PHP Conference 2004 in Amsterdam, although these slides have been updated by project contributors to reflect feature additions that were implemented later.
Entities in Drupal 8 are classes that can represent content or configuration. The Entity API in Drupal 8 provides standardized methods for core entities and custom entities to perform CRUD operations like create, read, update, and delete. This allows entities to be managed consistently through an entity storage class and removes the need for proprietary entity functions. The Entity API also includes methods for querying entities and accessing entity properties through getters and setters.
The document discusses dependency injection and inversion of control principles in PHP applications. It provides examples of using global variables, Zend Registry, and Zend Application to manage dependencies. It also summarizes various PHP dependency injection containers and how they can be used to configure services and their dependencies. The document advocates designing applications with loose coupling, separation of concerns, and configuring via configuration files rather than code for improved maintainability.
What's New in Drupal 8: Entity Field APIDrupalize.Me
In this presentation we take a high-level look at the new Drupal 8 Entity Field API. To view this presentation as a video, go to https://drupalize.me/videos/whats-new-drupal-8-entity-field-api?p=2075. This video is part of a series examining What's New in Drupal 8 and is produced by Drupalize.Me.
Caching is one of the most popular ways to optimize the performance of web applications. Magento is not far from this trend and the primary approach to speed up slow code from the core team is to cache it. This approach works well for small projects where the rate of inventory changes is shallow. But as soon as you enter sales season or receive regular product updates from the external system, your cache hit ratio plummets. In this talk, you will learn how to ensure that your system’s uncached response times are as light as possible when you get a cache miss by minimizing the I/O of your application with intelligent batch data preloading.
Con la versione 7 di Drupal è stato introdotto il concetto di Entity, poi evoluto con la versione 8, utilizzato come base di buona parte degli elementi core (nodi, tassonomie, utenti, ...), ma - soprattutto - è stata data la possibilità di costruire entity custom. L'utilizzo di queste apre le possibilità di personalizzazione dello strumento ad un livello superiore velocizzando notevolmente lo sviluppo.
Verranno mostrate le potenzialità nell'uso delle Entity custom e le integrazioni possibili.
The document discusses Oracle Application Development Framework (ADF) bindings. It provides an overview of ADF model layers and artifacts like the page definition file. It describes how bindings are used in the ADF lifecycle during processes like restoring the view and rendering the response. It also discusses accessing and executing bindings programmatically.
AngularJs $provide API internals & circular dependency problem.Yan Yankowski
The document provides an overview of AngularJS dependency injection and the $provide service. It explains the differences between providers, factories, services, values, constants, and decorators. It describes how $provide registers these items in the providerCache and instanceCache and instantiates them lazily through the $injector. Circular dependencies can cause errors since items point to each other before being fully instantiated.
This document discusses filtering data in Direct to Web (D2W) by limiting the visibility of data based on the current user or company. It presents two solutions:
1. Modifying fetch specifications at the editing context level to add relationship qualifiers restricting results to the current company. This works but is low-level.
2. Using query and relationship components in D2W that call business logic to generate the appropriate qualifiers and restricted data sources. This provides a cleaner, more reusable approach compared to the first solution.
The document also discusses enhancing relationship components to support restricting fetch specifications to simplify generating qualifiers across different entities and relationships. In summary, it focuses on programmatically filtering data in D2
The document discusses the MVC pattern and its components - Model, View, Controller. It then provides more details on concepts related to the model component, including entities, data access objects (DAOs), mappers, services, and interfaces. It shows examples of how these concepts can be implemented, such as defining interfaces, entity and DAO classes, and using mappers and services to work with data from different sources.
The document provides an overview of the Symfony Form component, including basic usage, validation, custom form types, events, data transformers, form type extensions, and rendering. It demonstrates how to create and handle forms, add validation, dynamically modify forms using events, transform data between representations, extend existing form types, and customize form rendering.
All projects start with a lot of enthusiasm. As many projects grow the technical debt gets bigger and the enthusiasm gets less. Almost any developer can develop a great project, but the key is maintaining an ever evolving application with minimal technical debt without loosing enthusiasm.
During this talk you will be taken on the journey of application design. The starting point is an application that looks fine but contains lots of potential pitfalls. We will address the problems and solve them with beautiful design. We end up with testable, nicely separated software with a clear intention.
We, as developers, often think that we don’t have to or don’t need to know what are what they call design patterns. We think that we already know how to build a software and don’t need all this theory. Years after years, by having to deal with the low maintainability of my own codebases, I explored a lot of ways of decoupling applications, in order to have enterprise-grade software that last for years. With concrete examples, I want to share with you some design patterns and how they can help you to grow well structured and decoupled applications.
This document discusses principles for improving modularity and maintainability through a layered data model approach. It recommends removing hard-coded dependencies and using a service manager to dynamically resolve components. Entities should represent data and focus only on their own tasks while abstracting away data storage details. A layered approach separates concerns with entities at the top holding information, tables handling storage operations, table gateways acting as the database interface, and hydrators mapping between objects and data. Together this improves reusability, flexibility and maintainability of the system.
This document provides a summary of the AngularJS framework. It discusses the following key points in 3 sentences:
1. AngularJS aims to make HTML better suited for building applications by teaching the browser new syntax like directives. This allows more of the application logic to be handled in the declarative HTML instead of JavaScript code.
2. Angular follows an MVC pattern where the controller contains the business logic and data, the view displays the data through bindings, and the scope acts as a synchronization mechanism between the model and view.
3. Features like data binding, directives, dependency injection and routing allow building dynamic and interactive single-page applications by synchronizing the model and view through declarative templates and separating concerns
This document discusses advanced JavaScript techniques. It covers object-oriented JavaScript concepts like references, function overloading, type checking, scopes, closures, object creation, and inheritance. It also discusses performance improvements like scope management, object caching, and optimizing DOM selection. Finally, it discusses debugging and testing JavaScript code as well as distributing JavaScript applications.
This document contains code snippets that demonstrate different Angular data binding syntax and features, including property, event, two-way, attribute, class, and style bindings. It also shows structural directives like *ngIf, *ngFor, and ngSwitch, as well as template references and local variables.
In this meetup Eyal Vardi will talk about Angular 2.0 architecture. The session will focus on the main parts of Angular 2.0:
Application Bootstrap
Angular Compiler
Hierarchical Injector
Component Lifecycle Hooks
Change Detector
Renderer
Angular 2.0 & jQuery
Dynamic component creation
Tips & Tricks
Each part will be explained and analyzed. In some cases we will dive into Angular 2.0 source code. Our purpose is to list the Do's & Don’ts of Angular.
The session is mostly targeted for developers which already have some experience with Angular 2.0.
Adding Dependency Injection to Legacy ApplicationsSam Hennessy
Dependency Injection (DI) is a fantastic technique, but what if you what to use dependency injection in your legacy application. Fear not! As someone who as done this very thing, I will show how you can successful and incrementally add DI to any application. I will present a number of recipes and solutions to common problems and give a tour of the various PHP DI projects and how they can help.
This document provides an overview of creating navigation-based iOS applications using UITableViewController, NSMutableArray, and plist files to store and display data. It discusses initializing a navigation controller and table view controller, implementing table view data source and delegate methods, and linking the table view to a detail view controller. It also covers using dictionaries and plist files to store more complex data, and customizing table view cells. Later sections discuss additional user interface techniques like grouped tables, image cells, and accessory indicators. The document concludes with adding iAds banners using ADBannerView.
Doctrine with Symfony - SymfonyCon 2019julien pauli
This document provides an overview of the Doctrine project, including its ORM and DBAL components. It discusses the architecture of Doctrine, including entities, the entity manager, unit of work, repositories, and metadata. It explains how Doctrine maps objects to the database using its ORM. Key concepts covered include the entity manager methods like find(), persist(), and flush(), managing entity state and changes. The document also discusses Doctrine's DBAL for database abstraction and query building.
"Dependency injection" (DI) seems like one of those hot buzzwords that will solve all your problems. But what is DI really? How does it help keep code clean and maintainable? And how do you take a legacy codebase and rewrite it to take advantage of DI? This talk takes an application written without DI and walks through the steps for "injecting" DI into the code. Learn the difference between "dependency injection" and "dependency injection containers". See how DI makes things like event-driven architectures simple to implement. And learn how DI leads to code that is easier to debug and test.
This document summarizes an presentation about dependency injection in Symfony 3.3 or greater. It discusses the service container and how it is used to instantiate services and inject their dependencies. It covers how to configure services and their dependencies, including using autowiring to simplify configuration. It also discusses autoconfiguring services as forms or commands. Finally, it presents options like _defaults and grouped declarations that can reduce configuration size.
Owl JS is a small JavaScript framework for building user interfaces based on XML templates. Some key points about Owl:
1. It uses XML (QWeb) templates that are compiled just-in-time for efficiency.
2. Components are defined as classes that extend a base Component class. The UI is a tree of nested components.
3. It supports modern features like hooks, slots, and stores to manage state and reactivity.
4. The document provides an example of building a to-do list app in Owl to demonstrate how to define components, handle events between them, and manage state. Key aspects covered include extracting sub-components, dependency injection via the "env"
The document provides an agenda and overview of Hibernate, an object-relational mapping tool. It discusses problems with traditional programming to relational databases and EJB2 persistence. Hibernate is presented as a solution that allows working with objects instead of tables and provides object querying, associations, inheritance mapping, and transactions. The document outlines Hibernate's mapping strategies, basic operations, querying methods like HQL and criteria, and alternatives like TopLink and iBatis.
Magento Live Australia 2016: Request FlowVrann Tulika
As a web application, Magento 2’s web request processing flow is similar to all other web framework flows, but offers more extension points to third-party developers. In this session, we will walk through a web request path in the Magento 2 application, from index.php to browser JS application, and will look at extension points available on that path.
The document discusses Oracle Application Development Framework (ADF) bindings. It provides an overview of ADF model layers and artifacts like the page definition file. It describes how bindings are used in the ADF lifecycle during processes like restoring the view and rendering the response. It also discusses accessing and executing bindings programmatically.
AngularJs $provide API internals & circular dependency problem.Yan Yankowski
The document provides an overview of AngularJS dependency injection and the $provide service. It explains the differences between providers, factories, services, values, constants, and decorators. It describes how $provide registers these items in the providerCache and instanceCache and instantiates them lazily through the $injector. Circular dependencies can cause errors since items point to each other before being fully instantiated.
This document discusses filtering data in Direct to Web (D2W) by limiting the visibility of data based on the current user or company. It presents two solutions:
1. Modifying fetch specifications at the editing context level to add relationship qualifiers restricting results to the current company. This works but is low-level.
2. Using query and relationship components in D2W that call business logic to generate the appropriate qualifiers and restricted data sources. This provides a cleaner, more reusable approach compared to the first solution.
The document also discusses enhancing relationship components to support restricting fetch specifications to simplify generating qualifiers across different entities and relationships. In summary, it focuses on programmatically filtering data in D2
The document discusses the MVC pattern and its components - Model, View, Controller. It then provides more details on concepts related to the model component, including entities, data access objects (DAOs), mappers, services, and interfaces. It shows examples of how these concepts can be implemented, such as defining interfaces, entity and DAO classes, and using mappers and services to work with data from different sources.
The document provides an overview of the Symfony Form component, including basic usage, validation, custom form types, events, data transformers, form type extensions, and rendering. It demonstrates how to create and handle forms, add validation, dynamically modify forms using events, transform data between representations, extend existing form types, and customize form rendering.
All projects start with a lot of enthusiasm. As many projects grow the technical debt gets bigger and the enthusiasm gets less. Almost any developer can develop a great project, but the key is maintaining an ever evolving application with minimal technical debt without loosing enthusiasm.
During this talk you will be taken on the journey of application design. The starting point is an application that looks fine but contains lots of potential pitfalls. We will address the problems and solve them with beautiful design. We end up with testable, nicely separated software with a clear intention.
We, as developers, often think that we don’t have to or don’t need to know what are what they call design patterns. We think that we already know how to build a software and don’t need all this theory. Years after years, by having to deal with the low maintainability of my own codebases, I explored a lot of ways of decoupling applications, in order to have enterprise-grade software that last for years. With concrete examples, I want to share with you some design patterns and how they can help you to grow well structured and decoupled applications.
This document discusses principles for improving modularity and maintainability through a layered data model approach. It recommends removing hard-coded dependencies and using a service manager to dynamically resolve components. Entities should represent data and focus only on their own tasks while abstracting away data storage details. A layered approach separates concerns with entities at the top holding information, tables handling storage operations, table gateways acting as the database interface, and hydrators mapping between objects and data. Together this improves reusability, flexibility and maintainability of the system.
This document provides a summary of the AngularJS framework. It discusses the following key points in 3 sentences:
1. AngularJS aims to make HTML better suited for building applications by teaching the browser new syntax like directives. This allows more of the application logic to be handled in the declarative HTML instead of JavaScript code.
2. Angular follows an MVC pattern where the controller contains the business logic and data, the view displays the data through bindings, and the scope acts as a synchronization mechanism between the model and view.
3. Features like data binding, directives, dependency injection and routing allow building dynamic and interactive single-page applications by synchronizing the model and view through declarative templates and separating concerns
This document discusses advanced JavaScript techniques. It covers object-oriented JavaScript concepts like references, function overloading, type checking, scopes, closures, object creation, and inheritance. It also discusses performance improvements like scope management, object caching, and optimizing DOM selection. Finally, it discusses debugging and testing JavaScript code as well as distributing JavaScript applications.
This document contains code snippets that demonstrate different Angular data binding syntax and features, including property, event, two-way, attribute, class, and style bindings. It also shows structural directives like *ngIf, *ngFor, and ngSwitch, as well as template references and local variables.
In this meetup Eyal Vardi will talk about Angular 2.0 architecture. The session will focus on the main parts of Angular 2.0:
Application Bootstrap
Angular Compiler
Hierarchical Injector
Component Lifecycle Hooks
Change Detector
Renderer
Angular 2.0 & jQuery
Dynamic component creation
Tips & Tricks
Each part will be explained and analyzed. In some cases we will dive into Angular 2.0 source code. Our purpose is to list the Do's & Don’ts of Angular.
The session is mostly targeted for developers which already have some experience with Angular 2.0.
Adding Dependency Injection to Legacy ApplicationsSam Hennessy
Dependency Injection (DI) is a fantastic technique, but what if you what to use dependency injection in your legacy application. Fear not! As someone who as done this very thing, I will show how you can successful and incrementally add DI to any application. I will present a number of recipes and solutions to common problems and give a tour of the various PHP DI projects and how they can help.
This document provides an overview of creating navigation-based iOS applications using UITableViewController, NSMutableArray, and plist files to store and display data. It discusses initializing a navigation controller and table view controller, implementing table view data source and delegate methods, and linking the table view to a detail view controller. It also covers using dictionaries and plist files to store more complex data, and customizing table view cells. Later sections discuss additional user interface techniques like grouped tables, image cells, and accessory indicators. The document concludes with adding iAds banners using ADBannerView.
Doctrine with Symfony - SymfonyCon 2019julien pauli
This document provides an overview of the Doctrine project, including its ORM and DBAL components. It discusses the architecture of Doctrine, including entities, the entity manager, unit of work, repositories, and metadata. It explains how Doctrine maps objects to the database using its ORM. Key concepts covered include the entity manager methods like find(), persist(), and flush(), managing entity state and changes. The document also discusses Doctrine's DBAL for database abstraction and query building.
"Dependency injection" (DI) seems like one of those hot buzzwords that will solve all your problems. But what is DI really? How does it help keep code clean and maintainable? And how do you take a legacy codebase and rewrite it to take advantage of DI? This talk takes an application written without DI and walks through the steps for "injecting" DI into the code. Learn the difference between "dependency injection" and "dependency injection containers". See how DI makes things like event-driven architectures simple to implement. And learn how DI leads to code that is easier to debug and test.
This document summarizes an presentation about dependency injection in Symfony 3.3 or greater. It discusses the service container and how it is used to instantiate services and inject their dependencies. It covers how to configure services and their dependencies, including using autowiring to simplify configuration. It also discusses autoconfiguring services as forms or commands. Finally, it presents options like _defaults and grouped declarations that can reduce configuration size.
Owl JS is a small JavaScript framework for building user interfaces based on XML templates. Some key points about Owl:
1. It uses XML (QWeb) templates that are compiled just-in-time for efficiency.
2. Components are defined as classes that extend a base Component class. The UI is a tree of nested components.
3. It supports modern features like hooks, slots, and stores to manage state and reactivity.
4. The document provides an example of building a to-do list app in Owl to demonstrate how to define components, handle events between them, and manage state. Key aspects covered include extracting sub-components, dependency injection via the "env"
The document provides an agenda and overview of Hibernate, an object-relational mapping tool. It discusses problems with traditional programming to relational databases and EJB2 persistence. Hibernate is presented as a solution that allows working with objects instead of tables and provides object querying, associations, inheritance mapping, and transactions. The document outlines Hibernate's mapping strategies, basic operations, querying methods like HQL and criteria, and alternatives like TopLink and iBatis.
Magento Live Australia 2016: Request FlowVrann Tulika
As a web application, Magento 2’s web request processing flow is similar to all other web framework flows, but offers more extension points to third-party developers. In this session, we will walk through a web request path in the Magento 2 application, from index.php to browser JS application, and will look at extension points available on that path.
Drupal 8 Every Day: An Intro to Developing With Drupal 8Acquia
Drupal 8 is coming, everyone is excited, and your developers can’t wait to use all the shiny new features. There’s just one problem: you still need to get your daily work done. Every day Drupal development requires the execution of many common patterns and scenarios.
How well do these common scenarios translate to Drupal 8? We polled Drupal developers to find what tasks we do the most and built a practical guide to using Drupal 8 in every day development.
In this presentation we’ll cover the following real world scenarios, while sprinkling in Drupal 8 best practices along the way:
- Configuration Management
- Creating and altering pages and forms
- Menu callback patterns
- Managing dependencies
The document discusses the Form API in Drupal 8. It notes that Drupal 8 is object-oriented and so the Form API is now object-oriented as well. It provides an example of a simple form class that implements the FormInterface and includes methods for building, validating, and submitting the form. It also discusses extending the SystemConfigFormBase class to create configuration forms and calling the parent buildForm method.
Обзор Form API для Drupal 8.
Что нового? Что изменилось? А что осталось по-прежнему?
Множество вопросов интересует разработчиков в связи с приближением Drupal 8.
Il arrive parfois que nous, développeurs, pensions qu’il n’est pas nécessaire de connaître ce qu’ils appellent les « design patterns » ou « patrons de conception ». Nous pensons parfois que nous n’avons pas besoin de cette théorie. Après des années d’expériences avec la faible maintenabilité de mon propre code et de celui de mes clients, j’ai exploré de nombreuses façons de découpler nos applications afin de créer des applications « enterprise ready » qui peuvent vivre pendant de nombreuses années. Via des exemples concrets, je vais vous présenter quelques design patterns qui peuvent vous aider à travailler sur une codebase propre, structurée et bien découplée.
The document discusses how Symfony 1.2 supports RESTful routes out of the box. It provides examples of how to configure routes to support different HTTP methods like GET, POST, PUT, DELETE. It also describes how to create custom route classes to support additional route matching and generation behaviors, like domain routing based on subdomains. Overall, the document shows how Symfony 1.2 allows developers to easily create RESTful applications by mapping URLs to controller actions and resources in a RESTful way.
This document provides an overview of using the Backbone.js framework for client-side MVC applications. It discusses why Backbone is useful for structuring JavaScript applications, its core architecture including models, collections, views and routers. It also provides examples of how to convert jQuery code to use a Backbone-based approach and lists some real-world applications that use Backbone.
Come to this talk prepared to learn about the Doctrine PHP open source project. The Doctrine project has been around for over a decade and has evolved from database abstraction software that dates back to the PEAR days. The packages provided by the Doctrine project have been downloaded almost 500 million times from packagist. In this talk we will take you through how to get started with Doctrine and how to take advantage of some of the more advanced features.
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rulesSrijan Technologies
Speaker: Josef Dabernig a.k.a Dasjo
This webinar takes a look at how to automate some powerful backend capabilities for your Drupal site, using the Drupal 8 Rules. Take a look at how D8 Rules can change the way we build sites. Also, learn how you can contribute to getting Rules closer to a stable release.
Key Insights into Development Design Patterns for Magento 2 - Magento Live UKMax Pronko
I have had a chance to speak at Magento Live UK 2016 with topic "Key Insights into Development Design Patterns for Magento 2". Feel free to share, comment, provide feedback.
In the deck i highlight Development Design Patterns used in Magento 2. I also speak about Aspect Oriented Programming and how it affected Magento 2 implementation.
More about Magento 2 read at my blog: https://www.maxpronko.com/
The document summarizes tips and tricks discussed at a meetup for PHP developers in Poznan, Poland. It covers accessing request parameters in Symfony controllers, naming strategies in Doctrine, using the app.user variable and Twig, configuring Swiftmailer for email delivery, automatically testing services, ParamConverters, DI/IoC bundles like JMSDiExtraBundle, JavaScript translation bundles, and AngularJS integration.
This document describes implementing a two-step view concept in CodeIgniter by using output buffering. It involves three main components: 1) an initialization hook to start output buffering, 2) a helper to generate the two-step view content and load it into a layout view, and 3) a layout view to echo the content. The helper gets the buffered content, loads a view to generate the content string, loads the layout view and passes the content, and the layout view echoes the content within the HTML structure. This allows separating view generation and rendering for a cleaner separation of logic and presentation.
The document discusses best practices for building robust jQuery plugins, including testing plugins with QUnit, implementing plugins by extending jQuery's prototype, releasing plugins with documentation and examples, and maintaining plugins over time by tracking issues and communicating with users.
Refactoring, Agile Entwicklung, Continuous Integration – all diese für nachhaltigen Erfolg wichtigen Vorgehensweisen setzen Erfahrung mit Unit Testing voraus. Abseits von den üblichen "Bowling"-Beispielen möchten wir gerne einen Crashkurs inkl. Best Practices für das erfolgreiche Unit Testing durchführen. Anhand eines Beispielprojekts auf Basis des Zend Frameworks werden wir nach der Installation von PHPUnit auf allen Notebooks gemeinsam eine kleine Applikation aufbauen, die durchgehend Test-driven entwickelt wird.
The document discusses Magento's Performance Toolkit which is available on GitHub. It provides features for generating sample data, imitating user activity, and comparing performance before and after changes. The toolkit uses fixtures to define sample data, profiles to set fixture parameters, and scenarios to imitate user activity. It also discusses how to customize the toolkit by creating custom fixtures, profiles, and scenarios.
Web automation with #d8rules (European Drupal Days 2015)Eugenio Minardi
This document contains information about a Rules presentation at DrupalDaysEU, including:
- Details about the Rules module and how it enables flexible workflows in Drupal 8.
- An overview of the goals of the #d8rules campaign to ensure Rules is ready for Drupal 8 and to make Drupal contributions more sustainable.
- A brief status update on the development of Rules for Drupal 8, including milestones for core API fundamentals, completion, and release.
- An invitation for developers to sprint with the Rules team and contribute to porting actions, conditions and other components to Drupal 8.
This document provides an overview of how checkout works in Spryker through the use of a step engine. It discusses key concepts like steps, step interfaces, preconditions, requirements, execution, conditions. It also covers related components like step collections, forms, data providers and containers. The step engine handles progressing through the checkout steps by ensuring preconditions are met before executing each step and persisting data in a transfer object.
This document discusses migrating from Symfony 1 to Symfony 2. It covers key differences like Symfony 2's use of the Dependency Injection Container and lack of sfContext. It provides examples of implementing models, controllers and views in Symfony 2. Recommended bundles for common Symfony 1 features are also mentioned, along with caching and the HTTP layer.
Similar to DrupalJam 2018 - Maintaining a Drupal Module: Keep It Small and Simple (20)
8 Best Automated Android App Testing Tool and Framework in 2024.pdfkalichargn70th171
Regarding mobile operating systems, two major players dominate our thoughts: Android and iPhone. With Android leading the market, software development companies are focused on delivering apps compatible with this OS. Ensuring an app's functionality across various Android devices, OS versions, and hardware specifications is critical, making Android app testing essential.
What is Master Data Management by PiLog Groupaymanquadri279
PiLog Group's Master Data Record Manager (MDRM) is a sophisticated enterprise solution designed to ensure data accuracy, consistency, and governance across various business functions. MDRM integrates advanced data management technologies to cleanse, classify, and standardize master data, thereby enhancing data quality and operational efficiency.
E-commerce Development Services- Hornet DynamicsHornet Dynamics
For any business hoping to succeed in the digital age, having a strong online presence is crucial. We offer Ecommerce Development Services that are customized according to your business requirements and client preferences, enabling you to create a dynamic, safe, and user-friendly online store.
Software Engineering, Software Consulting, Tech Lead, Spring Boot, Spring Cloud, Spring Core, Spring JDBC, Spring Transaction, Spring MVC, OpenShift Cloud Platform, Kafka, REST, SOAP, LLD & HLD.
DDS Security Version 1.2 was adopted in 2024. This revision strengthens support for long runnings systems adding new cryptographic algorithms, certificate revocation, and hardness against DoS attacks.
Transform Your Communication with Cloud-Based IVR SolutionsTheSMSPoint
Discover the power of Cloud-Based IVR Solutions to streamline communication processes. Embrace scalability and cost-efficiency while enhancing customer experiences with features like automated call routing and voice recognition. Accessible from anywhere, these solutions integrate seamlessly with existing systems, providing real-time analytics for continuous improvement. Revolutionize your communication strategy today with Cloud-Based IVR Solutions. Learn more at: https://thesmspoint.com/channel/cloud-telephony
Takashi Kobayashi and Hironori Washizaki, "SWEBOK Guide and Future of SE Education," First International Symposium on the Future of Software Engineering (FUSE), June 3-6, 2024, Okinawa, Japan
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Crescat
Crescat is industry-trusted event management software, built by event professionals for event professionals. Founded in 2017, we have three key products tailored for the live event industry.
Crescat Event for concert promoters and event agencies. Crescat Venue for music venues, conference centers, wedding venues, concert halls and more. And Crescat Festival for festivals, conferences and complex events.
With a wide range of popular features such as event scheduling, shift management, volunteer and crew coordination, artist booking and much more, Crescat is designed for customisation and ease-of-use.
Over 125,000 events have been planned in Crescat and with hundreds of customers of all shapes and sizes, from boutique event agencies through to international concert promoters, Crescat is rigged for success. What's more, we highly value feedback from our users and we are constantly improving our software with updates, new features and improvements.
If you plan events, run a venue or produce festivals and you're looking for ways to make your life easier, then we have a solution for you. Try our software for free or schedule a no-obligation demo with one of our product specialists today at crescat.io
GraphSummit Paris - The art of the possible with Graph TechnologyNeo4j
Sudhir Hasbe, Chief Product Officer, Neo4j
Join us as we explore breakthrough innovations enabled by interconnected data and AI. Discover firsthand how organizations use relationships in data to uncover contextual insights and solve our most pressing challenges – from optimizing supply chains, detecting fraud, and improving customer experiences to accelerating drug discoveries.
Artificia Intellicence and XPath Extension FunctionsOctavian Nadolu
The purpose of this presentation is to provide an overview of how you can use AI from XSLT, XQuery, Schematron, or XML Refactoring operations, the potential benefits of using AI, and some of the challenges we face.
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Łukasz Chruściel
No one wants their application to drag like a car stuck in the slow lane! Yet it’s all too common to encounter bumpy, pothole-filled solutions that slow the speed of any application. Symfony apps are not an exception.
In this talk, I will take you for a spin around the performance racetrack. We’ll explore common pitfalls - those hidden potholes on your application that can cause unexpected slowdowns. Learn how to spot these performance bumps early, and more importantly, how to navigate around them to keep your application running at top speed.
We will focus in particular on tuning your engine at the application level, making the right adjustments to ensure that your system responds like a well-oiled, high-performance race car.
Odoo ERP software
Odoo ERP software, a leading open-source software for Enterprise Resource Planning (ERP) and business management, has recently launched its latest version, Odoo 17 Community Edition. This update introduces a range of new features and enhancements designed to streamline business operations and support growth.
The Odoo Community serves as a cost-free edition within the Odoo suite of ERP systems. Tailored to accommodate the standard needs of business operations, it provides a robust platform suitable for organisations of different sizes and business sectors. Within the Odoo Community Edition, users can access a variety of essential features and services essential for managing day-to-day tasks efficiently.
This blog presents a detailed overview of the features available within the Odoo 17 Community edition, and the differences between Odoo 17 community and enterprise editions, aiming to equip you with the necessary information to make an informed decision about its suitability for your business.
Atelier - Innover avec l’IA Générative et les graphes de connaissancesNeo4j
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Allez au-delà du battage médiatique autour de l’IA et découvrez des techniques pratiques pour utiliser l’IA de manière responsable à travers les données de votre organisation. Explorez comment utiliser les graphes de connaissances pour augmenter la précision, la transparence et la capacité d’explication dans les systèmes d’IA générative. Vous partirez avec une expérience pratique combinant les relations entre les données et les LLM pour apporter du contexte spécifique à votre domaine et améliorer votre raisonnement.
Amenez votre ordinateur portable et nous vous guiderons sur la mise en place de votre propre pile d’IA générative, en vous fournissant des exemples pratiques et codés pour démarrer en quelques minutes.
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesQuickdice ERP
Explore the seamless transition to e-invoicing with this comprehensive guide tailored for Saudi Arabian businesses. Navigate the process effortlessly with step-by-step instructions designed to streamline implementation and enhance efficiency.
Unveiling the Advantages of Agile Software Development.pdfbrainerhub1
Learn about Agile Software Development's advantages. Simplify your workflow to spur quicker innovation. Jump right in! We have also discussed the advantages.
2. Who am I?
drupal.org/user/1868952
● Alexander Varwijk
● Developer at GoalGorilla for Open Social
● On Drupal.org for 6 years 17 days
● @Kingdutch on Twitter
● Site building since shortly after the Drupal 7 release
● Author of the IMCE Plupload module (integrating
Plupload with IMCE)
● Maintainer of the Real-Time SEO module
3. Real-Time SEO for Drupal
What is it? Where did it come from?
drupal.org/project/yoast_seo
Originally built in a collaboration with Yoast.
Maintained by GoalGorilla
Analyses your content to provide feedback about
common issues affecting search ranking (SEO)
Initial module release in September 2015
I took on maintenance in April 2017
4. Real-Time SEO for Drupal
How does it work?
YoastSEO.js analysis library
Pass field data to analysis
library using javascript
Fetches data from the fields
directly on the form
5. Version 1.x
● Nodes only
● Needed a text field as body
● No support for popular modules such as Paragraphs
● No support for images embedded with Media (e.g.
through CKEditor)
● No support for images outside of the main content field
● Worked only with the Path and Metatag field visible on
the Node create/edit form
● Enabled by default (for all content types)
● Enabled/disabled with a settings page
Plenty of work to be done
6. Support for the Paragraphs module
Analyse rendered content, not fields
YoastSEO.js (the underlying library) is pretty great
It can handle an HTML snippet with some metadata
Node Form $.ajaxSubmit Drupal Controller Analysis
Change
event
Serialized
form data
Renderd
HTML and
metadata
7. yoast_seo.entity_preview:
path: '/yoast_seo/preview'
defaults:
_title: 'Entity Preview'
_controller: 'Drupalyoast_seoControllerEntityPreviewController::json'
methods: ['POST']
yoast_seo.routing.yml
EntityPreviewController
How not to use the Drupal 8 Form API
commit: c2c8e2b
public function json(Request $request) {
$entity = $this->getEntityForRequest($request);
$preview_data = $this->entityPreviewer->createEntityPreview($entity);
// ... snip alias override ...
return new JsonResponse($preview_data);
}
EntityPreviewController
/**
* Returns an instantiated preview entity for the request.
*
* @param SymfonyComponentHttpFoundationRequest $request
* The request that contains the POST body for this preview.
*
* @throws SymfonyComponentHttpKernelExceptionBadRequestHttpException
* Too many reasons for this slide.
*
* @return DrupalCoreEntityEntity
* The instantiated entity.
*/
protected function getEntityForRequest(Request $request) {
// Fetch all our post data.
$content = $request->request->all();
// … snip lots of array existence checking ...
$preview_context = $content['yoast_seo_preview'];
unset($content['yoast_seo_preview']);
$form_data = $content;
return $this->entityPreviewer->entityFromFormSubmission(
$preview_context['action'], $preview_context['method'], $form_data
);
}
EntityPreviewController
8. Intermezzo - Form API
What does it do?
Request
-> HtmlEntityFormController::getContentResult
-> construct form object and form state
-> FormBuilder::buildForm
-> Prepare user input
-> Handle caching depending on request type
-> FormBuilder::retrieveForm - get’s the form array from the form callback
-> FormBuilder::prepareForm - Adds required elements, executes any hook_form_alter functions,
and optionally inserts a validation token to prevent tampering.
-> FormBuilder::processForm
-> FormBuilder::doBuildForm - finishes building the form by calling element #process
functions and mapping user input properties and $form_state->getValues()
-> Complex recursive input handling
-> Only if isProcessingInput()
-> validateForm and if validation is correct then submit
-> Return Drupal Render array
9. Intermezzo - EntityForm
From form to entity
/**
* Copies top-level form values to entity properties
*
* This should not change existing entity properties that are not being edited
* by this form.
*
* @param DrupalCoreEntityEntityInterface $entity
* The entity the current form should operate upon.
* @param array $form
* A nested array of form elements comprising the form.
* @param DrupalCoreFormFormStateInterface $form_state
* The current state of the form.
*/
protected function copyFormValuesToEntity(EntityInterface $entity, array $form,
FormStateInterface $form_state) {
$values = $form_state->getValues();
if ($this->entity instanceof EntityWithPluginCollectionInterface) {
// Do not manually update values represented by plugin collections.
$values = array_diff_key($values, $this->entity->getPluginCollections());
}
// @todo: This relies on a method that only exists for config and content
// entities, in a different way. Consider moving this logic to a config
// entity specific implementation.
foreach ($values as $key => $value) {
$entity->set($key, $value);
}
}
/**
* {@inheritdoc}
*/
public function buildEntity(array $form, FormStateInterface $form_state) {
$entity = clone $this->entity;
$this->copyFormValuesToEntity($entity, $form, $form_state);
// Invoke all specified builders for copying form values to entity
// properties.
if (isset($form['#entity_builders'])) {
foreach ($form['#entity_builders'] as $function) {
call_user_func_array($form_state->prepareCallback($function),
[$entity->getEntityTypeId(), $entity, &$form, &$form_state]);
}
}
return $entity;
}
EntityForm
EntityForm
10. /**
* Construct an entity from a virtual form submission.
*
* Takes the action and method of a form with a form_data array to simulate
* the form submission and returns the entity constructed from the form
data.
*/
public function entityFromFormSubmission($action, $method, array
$form_data) {
$form_request = Request::create($action, $method, $form_data);
// Push our form request on the stack so it's used by the form builder.
Drupal::requestStack()->push($form_request);
try {
$match = $this->router->matchRequest($form_request);
}
catch (Exception $e) {
throw new NotFoundHttpException('Could not find the entity route.');
}
$operation = NULL;
EntityPreviewController
EntityPreviewController
How not to use the Drupal 8 Form API
commit: c2c8e2b
// Find the first loaded entity.
foreach ($match as $val) {
// Existing entities will provide is with an entity of ContentEntityBase.
if ($val instanceof ContentEntityBase) {
$temp_entity = $val;
$operation = explode('.', $match['_entity_form'])[1];
break;
}
// Entity creation pages provide us a parent ConfigEntityBase inheritor to
// help us determine the entity type and bundle.
elseif ($val instanceof ConfigEntityBase) {
$type = $val->getEntityType()->getBundleOf();
$operation = explode('.', $match['_route'])[1];
$storage = $this->entityTypeManager->getStorage($type);
// Set the bundle name where needed.
$type_key = $storage->getEntityType()->get('entity_keys')['bundle'];
// Create a temporary entity so we can load the form.
$temp_entity = $storage->create([$type_key => $val->id()]);
break;
}
}
if (!empty($temp_entity)) {
return $this->getUpdatedEntity($temp_entity, $operation);
}
}
contd.
11. /**
* Create an up to date entity from submitted form data for any entity type.
*
* Uses a temporary entity and a desired operation to retrieve form values
* from the request currently on top of the requestStack and returns an
* entity with those updated values.
*
* @param DrupalCoreEntityEntityInterface $temp_entity
* A temporary entity that is used to gather information
* like entity type and bundle.
* @param string|null $operation
* The operation that the submitted form performs on the entity.
*
* @return DrupalCoreEntityEntity
* An entity that contains the values from the submitted form.
*/
protected function getUpdatedEntity(EntityInterface $temp_entity,
$operation = NULL) {
$form_handlers = $temp_entity->getEntityType()->get('handlers')['form'];
if (empty($operation) || !isset($form_handlers[$operation])) {
$operation = 'default';
}
EntityPreviewController
EntityPreviewController
How not to use the Drupal 8 Form API
commit: c2c8e2b
$form_state = new FormState();
$form_object = $this->entityTypeManager->getFormObject(
$temp_entity->getEntityTypeId(),
$operation
);
$form_object->setEntity($temp_entity);
/** @var DrupalCoreFormFormBuilder $form_builder */
$form_builder = Drupal::service('form_builder');
$form = $form_builder->buildForm($form_object, $form_state);
if (!empty($form_state->getErrors())) {
sleep(1); // TODO: Handle errors!
}
// Build our entity from the form state.
/** @var DrupalCoreEntityEntity $entity */
$entity = $form_object->buildEntity($form, $form_state);
// Support ownable entities that might not yet have an owner.
if ($entity instanceof EntityOwnerInterface && empty($entity->getOwner())) {
$owner = User::load(Drupal::currentUser()->id());
$entity->setOwner($owner);
}
return $entity;
}
contd.
12.
13. Not that kind of Thunder
A suggestion for a better solution
14. KISS: Keep It Simple Stupid
Don’t do it yourself. Use Drupal 8 APIs - The New Solution
public function analysisSubmitAjax(array &$form, FormStateInterface
$form_state) {
$preview_entity = $form_state->getFormObject()
->buildEntity($form, $form_state);
$preview_entity->in_preview = TRUE;
$entity_data = $this->entityAnalyser->createEntityPreview($preview_entity);
// The current value of the alias field, if any,
// takes precedence over the entity url.
$user_input = $form_state->getUserInput();
if (!empty($user_input['path'][0]['alias'])) {
$entity_data['url'] = $user_input['path'][0]['alias'];
}
drupal_get_messages();
$response = new AjaxResponse();
$response->addCommand(
new InvokeCommand('body', 'trigger', ['updateSeoData', $entity_data])
);
return $response;
}
AnalysisFormHandler
Use a Form Handler and Form API!
// It starts with a class.
class AnalysisFormHandler implements EntityHandlerInterface;
// In a hook_entity_type_build() implementation.
$entity_type->setHandlerClass(
'yoast_seo_preview',
AnalysisFormHandler::class
);
// In the Real-Time SEO field widget.
$target_type = $this->fieldDefinition->getTargetEntityTypeId();
if ($this->entityTypeManager->hasHandler($target_type, 'yoast_seo_preview')) {
$form_handler = $this->entityTypeManager
->getHandler($target_type, 'yoast_seo_preview');
if ($form_handler instanceof AnalysisFormHandler) {
$element['yoast_seo_preview_button'] = [
'#type' => 'button',
'#ajax' => [ 'callback' => [$this, 'analysisSubmitAjax'] ],
];
}
}
15.
16. From configuration page to Field API
Don’t do it yourself. Use Drupal 8 APIs
Configuration form + custom FieldManager class to manage which
entities (nodes) were analysed
Suggested by Christian Fritsch at Thunder
9 files changed, 67 insertions(+), 531 deletions(-)
(Including a new Empty FieldFormatter)
17. From configuration page to Field API
You have 1 new issue
Summary
Installed 2.x, nothing happened
Back to 1.3, enabled for all
Installed 2.x, nothing happened
Help?
18. From configuration page to Field API
Drupal issue queue to the rescue
Just 4 days later
Contribution from Wilbur Ince
19. Version 2.x
● Disabled by default
● Add using the Field API
● Supports any fieldable Entity
● Supports any field type out of the box
● Worked only with the Path and Metatag field visible on the Node
create/edit form
● Support for images embedded with Media
● Support for images outside of the main content field
● Support for popular modules such as Paragraphs
20. Summary
Try the Drupal way! Issue queue collaboration is awesome.
● If you’re writing a lot of code, it could be that you missed something
● Think about whether you’re not duplicating Drupal functionality
● The Drupal way can be difficult but it’s very rewarding (new field support for free)
● Use the Drupal issue queue, it helps!
○ Contribute to existing issues
○ Ask questions the maintainer may not have thought of
○ Suggest new features
Things may take a while, but we will get there!
21. What’s next?
Roadmap
● Support for Social Media
○ Preview/adjust how your content looks when shared
● schema.org support
○ Preview rich snippets that are found in your content such
as recipes, reviews or contact information
● Feedback in languages other than English
○ Provide a better experience to content editors who don’t
use English for their content
Help out! Contribute in the issue queue or ...
22. Become a backer for $100 / year
https://opencollective.com/realtimeseo/
Funding open source is hard
Make it possible for me to spend more time on this
23. Thanks!
● To everyone who contributes in the issue queue
● To everyone who uses the module
● Everyone who helped build the first version of the module
● My colleagues in preparing for this presentation
● You for attending!