This talk will give attendees details on how to set up their directory layout in larger PHP/ExtJS applications, along with hints to build processing and deployment. In the second part the talk will cover context based applications, how to detect context and how to utilize it with ExtJS. The third and last part will show how developers can use Ext.direct.* with an already existing Zend Framework backend, including merged requests and how to set up sandboxes for processing merged requests.
Doctrine is a PHP library that provides persistence services and related functionality. It includes an object relational mapper (ORM) for mapping database records to PHP objects, and a database abstraction layer (DBAL). Other libraries include an object document mapper (ODM) for NoSQL databases, common annotations, caching, data fixtures, and migrations. The presentation provides an overview of each library and how to use Doctrine for common tasks like mapping classes, saving and retrieving objects, and schema migrations. Help and contribution opportunities are available on Google Groups, IRC channels, and the project's GitHub page.
The document provides an overview of the Django documentation, which contains tutorials, guides, and reference materials on the major components of the Django web framework, including the model layer, view layer, template layer, forms, and the development and deployment processes. It describes how the documentation is organized and where to find information on specific topics like databases, security, internationalization, and contributing to the Django project.
The document provides an overview of PHP and frameworks. It discusses open source software, widely used open source products like Linux, Apache, MySQL, and PHP. It covers the difference between open source and closed source software, pros and cons of open source, and background information on PHP including its history, variables, data types, conditional and looping statements, functions, arrays, and more. The document also discusses PHP frameworks, popular frameworks like WordPress, Magento and Opencart, and includes an index of topics covered.
Using Zend Framework 2 Book Presentationolegkrivtsov
The document summarizes a book about programming web sites with the Zend Framework 2 PHP framework. The book is intended for beginners and covers topics like installing ZF2, the model-view-controller pattern, routing, forms, and validation. It uses examples and publicly available source code to illustrate concepts. The book is available for purchase through Leanpub with options like a discount coupon and free sample chapters.
Erfahren Sie in diesem Talk, wie Sie das Zend Framework 2 gewinnbringend für Ihre eigenen Projekte einsetzen können. Sie erhalten Tipps aus der Praxis für die Praxis zu Themen wie Performance, Security, Wiederverwendbarkeit von Modulen, Einsatz des Event-Managers für eigene Zwecke, interessante Fremdmodule, Migration vom ZF1, und vieles mehr.
Communication can make or break any project. And consistently maintaining good communication can feel like herding cats. Learn how the false consensus effect and various facets of communication can work for you and help keep people and projects moving in a positive direction.
A presentation given at the Federal Reserve’s 2015 Joint Web Developers Group Exchange (WEDGE) and Editors & Designers Conference on September 23, 2015, in Kansas City, Missouri.
The document discusses Zend Framework forms, subforms, display groups, and decorators. It explains that Zend Framework provides object-oriented interfaces for building forms, validating input, and grouping form elements. Decorators handle the markup of forms and implement the decorator design pattern. The document demonstrates how developers can create form elements and add validators, while web integrators can style forms by adding decorators to control rendering.
Doctrine is a PHP library that provides persistence services and related functionality. It includes an object relational mapper (ORM) for mapping database records to PHP objects, and a database abstraction layer (DBAL). Other libraries include an object document mapper (ODM) for NoSQL databases, common annotations, caching, data fixtures, and migrations. The presentation provides an overview of each library and how to use Doctrine for common tasks like mapping classes, saving and retrieving objects, and schema migrations. Help and contribution opportunities are available on Google Groups, IRC channels, and the project's GitHub page.
The document provides an overview of the Django documentation, which contains tutorials, guides, and reference materials on the major components of the Django web framework, including the model layer, view layer, template layer, forms, and the development and deployment processes. It describes how the documentation is organized and where to find information on specific topics like databases, security, internationalization, and contributing to the Django project.
The document provides an overview of PHP and frameworks. It discusses open source software, widely used open source products like Linux, Apache, MySQL, and PHP. It covers the difference between open source and closed source software, pros and cons of open source, and background information on PHP including its history, variables, data types, conditional and looping statements, functions, arrays, and more. The document also discusses PHP frameworks, popular frameworks like WordPress, Magento and Opencart, and includes an index of topics covered.
Using Zend Framework 2 Book Presentationolegkrivtsov
The document summarizes a book about programming web sites with the Zend Framework 2 PHP framework. The book is intended for beginners and covers topics like installing ZF2, the model-view-controller pattern, routing, forms, and validation. It uses examples and publicly available source code to illustrate concepts. The book is available for purchase through Leanpub with options like a discount coupon and free sample chapters.
Erfahren Sie in diesem Talk, wie Sie das Zend Framework 2 gewinnbringend für Ihre eigenen Projekte einsetzen können. Sie erhalten Tipps aus der Praxis für die Praxis zu Themen wie Performance, Security, Wiederverwendbarkeit von Modulen, Einsatz des Event-Managers für eigene Zwecke, interessante Fremdmodule, Migration vom ZF1, und vieles mehr.
Communication can make or break any project. And consistently maintaining good communication can feel like herding cats. Learn how the false consensus effect and various facets of communication can work for you and help keep people and projects moving in a positive direction.
A presentation given at the Federal Reserve’s 2015 Joint Web Developers Group Exchange (WEDGE) and Editors & Designers Conference on September 23, 2015, in Kansas City, Missouri.
The document discusses Zend Framework forms, subforms, display groups, and decorators. It explains that Zend Framework provides object-oriented interfaces for building forms, validating input, and grouping form elements. Decorators handle the markup of forms and implement the decorator design pattern. The document demonstrates how developers can create form elements and add validators, while web integrators can style forms by adding decorators to control rendering.
Rapidly prototyping web applications using BackPressNathaniel Taintor
From my talk at WordCamp Seattle 2011:
Most people who work with WordPress every day have at best a passing familiarity with what BackPress is. And for good reason – its a very unfinished project, with very few real-world examples and very scarce documentation. At its heart, though, BackPress is (was) a very ambitious project, and still can be valuable to developers who learned to code hacking on WordPress. The same functionality and structure that makes WordPress so easy and pleasant to work on can be harnessed to just about any end you can imagine. I’ll try to explain when and where BackPress might be a good choice to use on a project, and what to look at if you’re thinking about getting started in it.
The document discusses the author's approach to setting up a development environment for Django projects. It describes establishing a project layout with separate folders for source code, virtual environments, requirements files, and more. It also covers tools and practices for tasks like dependency management, testing, debugging, deployment, and overall software development philosophy.
Foundation is a popular front-end framework for building responsive, mobile-first sites. It includes a grid system, pre-built components, and is designed to be customizable. Developers can integrate Foundation through CSS, Sass, or a Rails gem. Using a framework like Foundation allows developers to build interfaces faster while maintaining quality and flexibility.
Organinzing Your PHP Projects (2010 Memphis PHP)Paul Jones
By using a single organizational principle, developers can easily make their project structure more predictable, extensible, and modular. The talk will discuss this one lesson, how it can be discovered from researching publicly available PHP projects, how to apply it, and how it is used (or not used) in well-known applications and frameworks.
Organizing Your PHP Projects (2010 ConFoo)Paul Jones
By using a few simple organizational principles, developers can make their project structure predictable, extensible, and modular. These techniques make it easy to de-conflict and share code between multiple projects. They also make it easy to automate project-support tasks such as testing, documentation, and distribution. This talk will discuss these principles, how they can be discovered from researching publicly available PHP projects, and how they are used (or not used) in popular applications and frameworks.
This document discusses techniques for preserving design information in code. It begins by explaining how design information can get lost when only code exists. It then discusses key design constructs like layers, modules, and dependencies. The document uses a simple CRM system as an example application to demonstrate finding and keeping design in code. Techniques discussed include naming conventions, dependency analysis tools, module systems, augmenting code with annotations and rules, and aspect-oriented programming.
The document summarizes an event called UKLUG 2012 that was held from September 2-4, 2012 at Cardiff University in Wales. It focused on XPages topics beyond the basics. The agenda included sessions on JavaScript/CSS aggregation, enabling pre-load for XPages, Java design elements, JAR design elements, Faces-config design elements, themes, and the XPages Extension Library.
Matteo Moretti discusses scaling PHP applications. He covers scaling the web server, sessions, database, filesystem, asynchronous tasks, and logging. The key aspects are decoupling services, using caching, moving to external services like Redis, S3, and RabbitMQ, and allowing those services to scale automatically using techniques like auto-scaling. Sharding the database is difficult to implement and should only be done if really needed.
This document provides an overview of Node.js, including what it is, how it works, and why it is useful. Node.js is a runtime environment that allows JavaScript to be used for high-performance, low-latency applications. It uses an event-driven, non-blocking I/O model that makes it efficient even under heavy loads. Node.js is commonly used for backend development, APIs, microservices, and real-time applications due to its fast performance. It also has a large ecosystem of packages and tools that can be used for building applications and development workflows.
This document discusses WordPress coding standards for writing plugins. It recommends following WordPress coding standards to improve code readability, avoid errors, and ensure consistency. The standards cover HTML, CSS, JavaScript, PHP, naming conventions including prefixing everything, documentation using DocBlocks, and organizing plugin files into folders for admin, includes, languages and public functionality. Following these standards makes the code easier to understand, modify and automatically generate documentation.
This document discusses tools for Magento programmers, including text editors, IDEs, and other development tools. It recommends Visual Studio Code as a free and feature-rich IDE, noting important extensions like PHP Intelephense, PHP Debug, and Code Sniffer. PHPStorm is also mentioned as a popular commercial IDE for Magento. The document provides information on database tools like DBeaver and MySQL Workbench and emphasizes the importance of tools for writing optimized, standard, and secure code.
APEX Application Lifecycle and Deployment 20220714.pdfRichard Martens
APEX application deployment is mostly done by exporting the application and importing it into the target environment.
But what if your team continuously develops (as they should), where do you stop developing to start preparing your release-deployment? You should be able to deploy based on features; without your developers having to halt their development.
Using the deployment-method explained in this presentation you will be able to do just that.
The method includes things like Code versioning (GIT), Feature-tickets (Jira), Code Review (Quality), Automated Deployment using Jenkins and Flyway. When implemented you will be able to successfully and predictively deploy your APEX applications (including underlying database objects) to the different deployment-environments.
With a few modifications you can even upgrade the methodology to be a "continuous delivery" methodology.
This document outlines workflows and tools for managing Magento 2 development. It discusses challenges with scalable and complicated processes and assumptions of skill. Lessons learned include keeping developer freedom and code integrity while maintaining accountability. Recommended tools include Vagrant for simplified developer setups, PHPStorm for code completion and testing, Git for version control, and Composer for dependencies. The workflow uses separate modules in a Git repository structure with branches for different environments and deployment automation.
This document discusses automation testing for Drupal using behavior-driven development. It introduces test-driven development (TDD) and behavior-driven development (BDD) approaches. Key frameworks discussed include Gherkin for writing tests in a business-readable format, Behat as a BDD framework, and Mink for browser emulation. The Drupal extension is also covered, which adds Drupal-specific steps and functionality to Behat.
R is an open source programming language used for statistical analysis and graphics. It allows users to create objects like vectors, matrices, data frames and lists to manipulate and analyze data. RStudio is an integrated development environment for R that provides a user interface, debugging tools and package management. The document introduces key R concepts like data types, packages and resources for learning R. It also provides best practices for file management, naming conventions and version control when programming in R.
The Ultimate IBM and Lotus on Linux Workshop for Windows AdminsBill Malchisky Jr.
Linux is quite simple to learn and understand when you have proper comprehension of the fundamentals. So let's teach attendees about the insights into administering a Linux server, allowing you to manage your IBM/Lotus applications with ease. You will receive highlights of the full training course Bill teaches his clients: application install tips, Linux shell techniques, basic scripting, and your questions answered throughout the class.
Given at Midwest LUG 2012 and UKLUG 2012
MongoDB: Advantages of an Open Source NoSQL DatabaseFITC
Save 10% off ANY FITC event with discount code 'slideshare'
See our upcoming events at www.fitc.ca
OVERVIEW
The presentation will present an overview of the MongoDB NoSQL database, its history and current status as the leading NoSQL database. It will focus on how NoSQL, and in particular MongoDB, benefits developers building big data or web scale applications. Discuss the community around MongoDB and compare it to commercial alternatives. An introduction to installing, configuring and maintaining standalone instances and replica sets will be provided.
Presented live at FITC's Spotlight:MEAN Stack on March 28th, 2014.
More info at FITC.ca
The document provides information about a PHP framework lecture on Laravel. It includes the course code, department, lecturer, semester, and lecture outline. The lecture covers an introduction to Laravel, installing and running the framework, the directory structure, routing basics, the view engine Blade, and creating views. Key points about Laravel are that it makes tasks like authentication and caching easy and offers a powerful tool called Artisan to perform repetitive tasks. Composer is used to manage Laravel dependencies.
This document provides an introduction to Nodejs, NoSQL technologies like MongoDB, and how to build applications using these technologies. It discusses key aspects of Nodejs like its event-driven architecture and how it uses JavaScript. It then covers setting up and running basic CRUD operations in MongoDB. Finally, it demonstrates how to build sample applications integrating Nodejs and MongoDB.
This document discusses opportunities for the Zarafa WebApp using ExtJS 5. ExtJS 5 is a JavaScript framework that provides over 150 UI components and supports MVC, declarative configurations, and tablet compatibility. The document suggests ways Zarafa WebApp could benefit from ExtJS 5's features like MVVM/VC support, data binding, and theming to work across devices. Challenges for developers include ExtJS 5's learning curve and need for application architecture knowledge.
Rapidly prototyping web applications using BackPressNathaniel Taintor
From my talk at WordCamp Seattle 2011:
Most people who work with WordPress every day have at best a passing familiarity with what BackPress is. And for good reason – its a very unfinished project, with very few real-world examples and very scarce documentation. At its heart, though, BackPress is (was) a very ambitious project, and still can be valuable to developers who learned to code hacking on WordPress. The same functionality and structure that makes WordPress so easy and pleasant to work on can be harnessed to just about any end you can imagine. I’ll try to explain when and where BackPress might be a good choice to use on a project, and what to look at if you’re thinking about getting started in it.
The document discusses the author's approach to setting up a development environment for Django projects. It describes establishing a project layout with separate folders for source code, virtual environments, requirements files, and more. It also covers tools and practices for tasks like dependency management, testing, debugging, deployment, and overall software development philosophy.
Foundation is a popular front-end framework for building responsive, mobile-first sites. It includes a grid system, pre-built components, and is designed to be customizable. Developers can integrate Foundation through CSS, Sass, or a Rails gem. Using a framework like Foundation allows developers to build interfaces faster while maintaining quality and flexibility.
Organinzing Your PHP Projects (2010 Memphis PHP)Paul Jones
By using a single organizational principle, developers can easily make their project structure more predictable, extensible, and modular. The talk will discuss this one lesson, how it can be discovered from researching publicly available PHP projects, how to apply it, and how it is used (or not used) in well-known applications and frameworks.
Organizing Your PHP Projects (2010 ConFoo)Paul Jones
By using a few simple organizational principles, developers can make their project structure predictable, extensible, and modular. These techniques make it easy to de-conflict and share code between multiple projects. They also make it easy to automate project-support tasks such as testing, documentation, and distribution. This talk will discuss these principles, how they can be discovered from researching publicly available PHP projects, and how they are used (or not used) in popular applications and frameworks.
This document discusses techniques for preserving design information in code. It begins by explaining how design information can get lost when only code exists. It then discusses key design constructs like layers, modules, and dependencies. The document uses a simple CRM system as an example application to demonstrate finding and keeping design in code. Techniques discussed include naming conventions, dependency analysis tools, module systems, augmenting code with annotations and rules, and aspect-oriented programming.
The document summarizes an event called UKLUG 2012 that was held from September 2-4, 2012 at Cardiff University in Wales. It focused on XPages topics beyond the basics. The agenda included sessions on JavaScript/CSS aggregation, enabling pre-load for XPages, Java design elements, JAR design elements, Faces-config design elements, themes, and the XPages Extension Library.
Matteo Moretti discusses scaling PHP applications. He covers scaling the web server, sessions, database, filesystem, asynchronous tasks, and logging. The key aspects are decoupling services, using caching, moving to external services like Redis, S3, and RabbitMQ, and allowing those services to scale automatically using techniques like auto-scaling. Sharding the database is difficult to implement and should only be done if really needed.
This document provides an overview of Node.js, including what it is, how it works, and why it is useful. Node.js is a runtime environment that allows JavaScript to be used for high-performance, low-latency applications. It uses an event-driven, non-blocking I/O model that makes it efficient even under heavy loads. Node.js is commonly used for backend development, APIs, microservices, and real-time applications due to its fast performance. It also has a large ecosystem of packages and tools that can be used for building applications and development workflows.
This document discusses WordPress coding standards for writing plugins. It recommends following WordPress coding standards to improve code readability, avoid errors, and ensure consistency. The standards cover HTML, CSS, JavaScript, PHP, naming conventions including prefixing everything, documentation using DocBlocks, and organizing plugin files into folders for admin, includes, languages and public functionality. Following these standards makes the code easier to understand, modify and automatically generate documentation.
This document discusses tools for Magento programmers, including text editors, IDEs, and other development tools. It recommends Visual Studio Code as a free and feature-rich IDE, noting important extensions like PHP Intelephense, PHP Debug, and Code Sniffer. PHPStorm is also mentioned as a popular commercial IDE for Magento. The document provides information on database tools like DBeaver and MySQL Workbench and emphasizes the importance of tools for writing optimized, standard, and secure code.
APEX Application Lifecycle and Deployment 20220714.pdfRichard Martens
APEX application deployment is mostly done by exporting the application and importing it into the target environment.
But what if your team continuously develops (as they should), where do you stop developing to start preparing your release-deployment? You should be able to deploy based on features; without your developers having to halt their development.
Using the deployment-method explained in this presentation you will be able to do just that.
The method includes things like Code versioning (GIT), Feature-tickets (Jira), Code Review (Quality), Automated Deployment using Jenkins and Flyway. When implemented you will be able to successfully and predictively deploy your APEX applications (including underlying database objects) to the different deployment-environments.
With a few modifications you can even upgrade the methodology to be a "continuous delivery" methodology.
This document outlines workflows and tools for managing Magento 2 development. It discusses challenges with scalable and complicated processes and assumptions of skill. Lessons learned include keeping developer freedom and code integrity while maintaining accountability. Recommended tools include Vagrant for simplified developer setups, PHPStorm for code completion and testing, Git for version control, and Composer for dependencies. The workflow uses separate modules in a Git repository structure with branches for different environments and deployment automation.
This document discusses automation testing for Drupal using behavior-driven development. It introduces test-driven development (TDD) and behavior-driven development (BDD) approaches. Key frameworks discussed include Gherkin for writing tests in a business-readable format, Behat as a BDD framework, and Mink for browser emulation. The Drupal extension is also covered, which adds Drupal-specific steps and functionality to Behat.
R is an open source programming language used for statistical analysis and graphics. It allows users to create objects like vectors, matrices, data frames and lists to manipulate and analyze data. RStudio is an integrated development environment for R that provides a user interface, debugging tools and package management. The document introduces key R concepts like data types, packages and resources for learning R. It also provides best practices for file management, naming conventions and version control when programming in R.
The Ultimate IBM and Lotus on Linux Workshop for Windows AdminsBill Malchisky Jr.
Linux is quite simple to learn and understand when you have proper comprehension of the fundamentals. So let's teach attendees about the insights into administering a Linux server, allowing you to manage your IBM/Lotus applications with ease. You will receive highlights of the full training course Bill teaches his clients: application install tips, Linux shell techniques, basic scripting, and your questions answered throughout the class.
Given at Midwest LUG 2012 and UKLUG 2012
MongoDB: Advantages of an Open Source NoSQL DatabaseFITC
Save 10% off ANY FITC event with discount code 'slideshare'
See our upcoming events at www.fitc.ca
OVERVIEW
The presentation will present an overview of the MongoDB NoSQL database, its history and current status as the leading NoSQL database. It will focus on how NoSQL, and in particular MongoDB, benefits developers building big data or web scale applications. Discuss the community around MongoDB and compare it to commercial alternatives. An introduction to installing, configuring and maintaining standalone instances and replica sets will be provided.
Presented live at FITC's Spotlight:MEAN Stack on March 28th, 2014.
More info at FITC.ca
The document provides information about a PHP framework lecture on Laravel. It includes the course code, department, lecturer, semester, and lecture outline. The lecture covers an introduction to Laravel, installing and running the framework, the directory structure, routing basics, the view engine Blade, and creating views. Key points about Laravel are that it makes tasks like authentication and caching easy and offers a powerful tool called Artisan to perform repetitive tasks. Composer is used to manage Laravel dependencies.
This document provides an introduction to Nodejs, NoSQL technologies like MongoDB, and how to build applications using these technologies. It discusses key aspects of Nodejs like its event-driven architecture and how it uses JavaScript. It then covers setting up and running basic CRUD operations in MongoDB. Finally, it demonstrates how to build sample applications integrating Nodejs and MongoDB.
This document discusses opportunities for the Zarafa WebApp using ExtJS 5. ExtJS 5 is a JavaScript framework that provides over 150 UI components and supports MVC, declarative configurations, and tablet compatibility. The document suggests ways Zarafa WebApp could benefit from ExtJS 5's features like MVVM/VC support, data binding, and theming to work across devices. Challenges for developers include ExtJS 5's learning curve and need for application architecture knowledge.
This document discusses practices and obstacles in agile development based on a presentation. It begins with introductions of the presenter and definitions of key terms like agile development. It then discusses approaches for introducing agile development into a company, such as starting with a pilot project or going "stealth". Technical practices covered include test-driven development, collective code ownership, pair programming, refactoring, and continuous integration. The document concludes with resources for further reading.
🔥🔥🔥🔥🔥🔥🔥🔥🔥
إضغ بين إيديكم من أقوى الملازم التي صممتها
ملزمة تشريح الجهاز الهيكلي (نظري 3)
💀💀💀💀💀💀💀💀💀💀
تتميز هذهِ الملزمة بعِدة مُميزات :
1- مُترجمة ترجمة تُناسب جميع المستويات
2- تحتوي على 78 رسم توضيحي لكل كلمة موجودة بالملزمة (لكل كلمة !!!!)
#فهم_ماكو_درخ
3- دقة الكتابة والصور عالية جداً جداً جداً
4- هُنالك بعض المعلومات تم توضيحها بشكل تفصيلي جداً (تُعتبر لدى الطالب أو الطالبة بإنها معلومات مُبهمة ومع ذلك تم توضيح هذهِ المعلومات المُبهمة بشكل تفصيلي جداً
5- الملزمة تشرح نفسها ب نفسها بس تكلك تعال اقراني
6- تحتوي الملزمة في اول سلايد على خارطة تتضمن جميع تفرُعات معلومات الجهاز الهيكلي المذكورة في هذهِ الملزمة
واخيراً هذهِ الملزمة حلالٌ عليكم وإتمنى منكم إن تدعولي بالخير والصحة والعافية فقط
كل التوفيق زملائي وزميلاتي ، زميلكم محمد الذهبي 💊💊
🔥🔥🔥🔥🔥🔥🔥🔥🔥
This document provides an overview of wound healing, its functions, stages, mechanisms, factors affecting it, and complications.
A wound is a break in the integrity of the skin or tissues, which may be associated with disruption of the structure and function.
Healing is the body’s response to injury in an attempt to restore normal structure and functions.
Healing can occur in two ways: Regeneration and Repair
There are 4 phases of wound healing: hemostasis, inflammation, proliferation, and remodeling. This document also describes the mechanism of wound healing. Factors that affect healing include infection, uncontrolled diabetes, poor nutrition, age, anemia, the presence of foreign bodies, etc.
Complications of wound healing like infection, hyperpigmentation of scar, contractures, and keloid formation.
A Visual Guide to 1 Samuel | A Tale of Two HeartsSteve Thomason
These slides walk through the story of 1 Samuel. Samuel is the last judge of Israel. The people reject God and want a king. Saul is anointed as the first king, but he is not a good king. David, the shepherd boy is anointed and Saul is envious of him. David shows honor while Saul continues to self destruct.
THE SACRIFICE HOW PRO-PALESTINE PROTESTS STUDENTS ARE SACRIFICING TO CHANGE T...indexPub
The recent surge in pro-Palestine student activism has prompted significant responses from universities, ranging from negotiations and divestment commitments to increased transparency about investments in companies supporting the war on Gaza. This activism has led to the cessation of student encampments but also highlighted the substantial sacrifices made by students, including academic disruptions and personal risks. The primary drivers of these protests are poor university administration, lack of transparency, and inadequate communication between officials and students. This study examines the profound emotional, psychological, and professional impacts on students engaged in pro-Palestine protests, focusing on Generation Z's (Gen-Z) activism dynamics. This paper explores the significant sacrifices made by these students and even the professors supporting the pro-Palestine movement, with a focus on recent global movements. Through an in-depth analysis of printed and electronic media, the study examines the impacts of these sacrifices on the academic and personal lives of those involved. The paper highlights examples from various universities, demonstrating student activism's long-term and short-term effects, including disciplinary actions, social backlash, and career implications. The researchers also explore the broader implications of student sacrifices. The findings reveal that these sacrifices are driven by a profound commitment to justice and human rights, and are influenced by the increasing availability of information, peer interactions, and personal convictions. The study also discusses the broader implications of this activism, comparing it to historical precedents and assessing its potential to influence policy and public opinion. The emotional and psychological toll on student activists is significant, but their sense of purpose and community support mitigates some of these challenges. However, the researchers call for acknowledging the broader Impact of these sacrifices on the future global movement of FreePalestine.
Elevate Your Nonprofit's Online Presence_ A Guide to Effective SEO Strategies...TechSoup
Whether you're new to SEO or looking to refine your existing strategies, this webinar will provide you with actionable insights and practical tips to elevate your nonprofit's online presence.
2. Who am I?
● Thorsten Suckow-Homberg
● Born 1976, Aachen, Germany
● Webdeveloper since 1999
● Senior Software Developer for K&K GmbH,
Aachen
● Focus on planning, architecture and
deployment of web based software
3. Who am I?
… oh, and UI programming, of course:
Author of:
● conjoon – http://www.conjoon.org
● Ext.ux.Livegrid – http://www.ext-livegrid.com
● various other open source ExtJS extensions/
components
● Numerous bug reports, rants and proposals over at
the sencha forums :) (MindPatterns)
4. This talk will show you...
● … how you should plan your directory layout in
larger projects
5. This talk will show you...
● … how you should plan your directory layout in
larger projects
● … what is application context - and how to use
it to your advantage
6. This talk will show you...
● … how you should plan your directory layout in
larger projects
● … what is application context - and how to use
it to your advantage
● … how to use Ext.Direct with existing ZF
backend code
7. This talk will show you...
● … how you should plan your directory layout in
larger projects
● … what is application context - and how to use
it to your advantage
● … how to use Ext.Direct with existing ZF
backend code
● In short: ...why Zend Framework could become
the framework of your choice when combining
Ext and PHP
9. The Basics – Directory Layout
● Top level should be a
directory named after your
project (obviously)
● ...containing three child
directories:
10. The Basics – Directory Layout
build-tools
● Real tools, like:
● yuicompressor
● phing
● ant
11. The Basics – Directory Layout
build-tools
● Real tools, like:
● yuicompressor
● phing
● ant
● (XML-)build scripts
● code sanity
● tests
● deployment
● etc... in short: Continuous
Integration[1]!
12. The Basics – Directory Layout
vendor
● All the third party libs
you're using in your code
● ExtJS
● ZendFramework
● etc.
13. The Basics – Directory Layout
vendor
● All the third party libs
you're using in your code
● ExtJS
● ZendFramework
● etc.
Note:
● files from separate repository vendor branch will be
merged into this directory
● Best case: developers will not touch the vendor directory
● Read [2] for more infos on how to use vendor branches
18. The Basics – Directory Layout
corelib
● js – your client libraries
(ExtJS, own
implementations)
19. The Basics – Directory Layout
corelib
● js – your client libraries
(ExtJS, own
implementations)
● php – your backend
code (including tests)
20. The Basics – Directory Layout
datastore
● data storage
definition/structure goes
here
21. The Basics – Directory Layout
datastore
● data storage
definition/structure goes
here
Note:
● build scripts can refer to the structure file when deploying
an application
22. The Basics – Directory Layout
www
● one step more towards
a „callable“ application
27. The Basics – Directory Layout
htdocs
● Finally! The document
root for your application
● the only „public“ folder
28. The Basics – Directory Layout
htdocs
● Finally! The document
root for your application
● the only „public“ folder
Note:
● Build-process focuses on this folder
29. The Basics – Directory Layout
„This layout gets way too
complex!“
Don't go berserk!
There's a solution to all of
it!
30. The Basics – Directory Layout
„Do I need to run a build
process every time a line
of code changed?“
„How do I get the
resources from vendor into
my src folder where –
obviously - running code
will resist?“
31. The Basics – Directory Layout
working copy (development):
/var/www/your_project/vendor/ext-ux-util-messagebus
/var/www/your_project/src/www/htdocs/index.php
33. The Basics – Directory Layout
working copy (development):
/var/www/your_project/vendor/ext-ux-util-messagebus
/var/www/your_project/src/www/htdocs/index.php
<?php if ($isDeployment) { ?>
<script type="text/javascript" src="/js/ext-ux-util-messagebus/src/messagebus.js"></script>
<?php } else { ?>
<script type="text/javascript" src="/vendor/ext-ux-util-messagebus/src/messagebus.js"></script>
<?php } ?>
index.phtml
# Alias for Ext.ux.util.MessageBus
Alias /js/ext-ux-util-messagebus "/htdocs/your_project/vendor/ext-ux-util-messagebus/src"
<Directory "/htdocs/your_project/vendor/ext-ux-util-messagebus/src">
Order allow,deny
Allow from all
</Directory>
apache.conf
34. The Basics – Directory Layout
working copy (development):
/var/www/your_project/vendor/ext-ux-util-messagebus
/var/www/your_project/src/www/htdocs/index.php
<?php if ($isDeployment) { ?>
<script type="text/javascript" src="/js/ext-ux-util-messagebus/src/messagebus.js"></script>
<?php } else { ?>
<script type="text/javascript" src="/vendor/ext-ux-util-messagebus/src/messagebus.js"></script>
<?php } ?>
index.phtml
# Alias for Ext.ux.util.MessageBus
Alias /js/ext-ux-util-messagebus "/htdocs/your_project/vendor/ext-ux-util-messagebus/src"
<Directory "/htdocs/your_project/vendor/ext-ux-util-messagebus/src">
Order allow,deny
Allow from all
</Directory>
apache.conf
<script type="text/javascript" src="/js/ext-ux-util-messagebus/src/messagebus.js"></script>
index.phtml
35. The Basics – Directory Layout
working copy (development):
/var/www/your_project/vendor/ext-ux-util-messagebus
/var/www/your_project/src/www/htdocs/index.php
# Alias for Ext.ux.util.MessageBus
Development: Alias /js/ext-ux-util-messagebus
Virtual
36. The Basics – Directory Layout
working copy (development):
/var/www/your_project/vendor/ext-ux-util-messagebus
/var/www/your_project/src/www/htdocs/index.php
# Alias for Ext.ux.util.MessageBus
Development: Alias /js/ext-ux-util-messagebus
Virtual
Build: ...
<target name="build_js">
<delete dir="./build/js/ext-ux-util-messagebus" />
<copy todir="./build/js/ext-ux-util-messagebus" includeemptydirs="true">
<fileset dir="./vendor/ext-ux-util-messagebus">
<exclude name="**/.svn" />
</fileset>
</copy>
</target>
... Build process
37. The Basics – Directory Layout
working copy (development):
/var/www/your_project/vendor/ext-ux-util-messagebus
/var/www/your_project/src/www/htdocs/index.php
# Alias for Ext.ux.util.MessageBus
Development: Alias /js/ext-ux-util-messagebus
Virtual
Build: ...
<target name="build_js">
<delete dir="./build/js/ext-ux-util-messagebus" />
<copy todir="./build/js/ext-ux-util-messagebus" includeemptydirs="true">
<fileset dir="./vendor/ext-ux-util-messagebus">
<exclude name="**/.svn" />
</fileset>
</copy>
</target>
... Build process
<script type="text/javascript" src="/js/ext-ux-util-messagebus/src/messagebus.js"></script>
index.phtml
38. The Basics – Directory Layout
Cons
● will need some webserver configuration to get things
working
● build-files depend on initial layout, changes mean
adjustment at several locations at once
● needs documentation for your dev team
● users need to know how to set up their dev
environment when they check out „including sources“
39. The Basics – Directory Layout
Pros
● No symlinks –> not f***ing up the repository
● Code structured after purpose
● No need to run builds after you've changed one line of
code (except for tests, of course)
● Clean approach towards build- and development-code
● Makes build-definitions easy due to strictly defined
layout
Advice:
● Use svn.ignore and template files! - it will help you and you're
coworkers to set up things on different machines
47. Context based data
● Different devices need different views
● Content delivery optimizations
● One domain serves all (www.senchadevcon.eu
vs. m.senchadevcon.eu)
● Specific data format (send/receive) might not be
available on devices used by our users
50. Context based data
class Zend_Controller_Action_Helper_ContextSwitch
ContextSwitch.php
● Action helper that will detect context based requests
● Capable of sending specially formatted responses based on
detected context and configuration
● Available as a default action helper provided by Zend Framework
●
For more informations on how to use action helper, see [3]
52. Context based data - detection
We can define a context based on (virtually) all data
that's available during runtime!
53. Context based data - detection
We can define a context based on (virtually) all data
that's available during runtime!
For example:
http://myproject.com/user/reception/get.user/format/json
url
54. Context based data - detection
We can define a context based on (virtually) all data
that's available during runtime!
For example:
http://myproject.com/user/reception/get.user/format/json
url
module
55. Context based data - detection
We can define a context based on (virtually) all data
that's available during runtime!
For example:
http://myproject.com/user/reception/get.user/format/json
url
controller
56. Context based data - detection
We can define a context based on (virtually) all data
that's available during runtime!
For example:
http://myproject.com/user/reception/get.user/format/json
url
action
57. Context based data - detection
We can define a context based on (virtually) all data
that's available during runtime!
For example:
http://myproject.com/user/reception/get.user/format/json
url
parameter/value pair
58. Context based data - detection
We can define a context based on (virtually) all data
that's available during runtime!
For example:
http://myproject.com/user/reception/get.user/format/json
url
$_GET['format'] == 'json'
59. Context based data - detection
We can define a context based on (virtually) all data
that's available during runtime!
For example:
http://myproject.com/user/reception/get.user/format/json
url
$_GET['format'] == 'json'
● Application is now in „json“ context – i.e., return all responses
json formatted, since the client told us so!
60. Context based data - detection
We can define a context based on (virtually) all data
that's available during runtime!
For example:
http://myproject.com/user/reception/get.user/format/json
url
$_GET['format'] == 'json'
● Application is now in „json“ context – i.e., return all responses
json formatted, since the client told us so!
● In fact, this is a default option coming with the ContextSwitch
action helper
61. Context based data - detection
We can define a context based on (virtually) all data
that's available during runtime!
Another example:
...
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
// request coming from ipad?
if (strpos($userAgent, 'ipad') !== false) {
$this->currentContext = 'ipad';
// request coming from android?
} else if (strpos($userAgent), 'android') !== false) {
$this->currentContext = 'android';
}
...
User Agent
● Context set by detection, not manually enforced by
parameters
64. Context based data
● Detect devices/users (webbrowser, mobile, bots)
● One codebase for all devices: „Write once, run
anywhere“
65. Context based data
● Detect devices/users (webbrowser, mobile, bots)
● One codebase for all devices: „Write once, run
anywhere“
66. Context based data
● Detect devices/users (webbrowser, mobile, bots)
● One codebase for all devices: „Write once, run
anywhere“
67. Context based data
● Detect devices/users (webbrowser, mobile, bots)
● One codebase for all devices:„Write once, run
anywhere“
● View variables will either be assigned to templates
(plain html mixed with PHP for example) or
transformed to json (xml etc.) – automatically – no
need to implement special logic as long as your client
can handle the response
● Requesting different formats is often just a thing of
switching a parameter at client site
● Makes even delivering views from the backend very easy!
● Test a context by switching a parameter
● Only views? No, different business logic depending on
the context, too!
68. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
public function init()
{
// define the actions that should consider different contexts
$this->_helper->contextSwitch()
->addActionContext('get.user', 'json')
->initContext();
}
/**
* This method will return user data to the client as requested.
*/
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
}
ReceptionController.php
69. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
public function init()
{
// define the actions that should consider different contexts
$this->_helper->contextSwitch()
->addActionContext('get.user', 'json')
implement parent's init() method
->initContext();
} to add action contexts...
/**
* This method will return user data to the client as requested.
*/
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
}
ReceptionController.php
70. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
public function init()
{
// define the actions that should consider different contexts
$this->_helper->contextSwitch()
->addActionContext('get.user', 'json')
->initContext();
}
/**
* This method will return user data to the client as requested.
...which happens here:
*/
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
}
ReceptionController.php
71. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
public function init()
{
// define the actions that should consider different contexts
$this->_helper->contextSwitch()
->addActionContext('get.user', 'json')
->initContext();
}
/**
* This method will return user data to the client as requested.
getUserAction() will now...
*/
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
}
ReceptionController.php
72. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
public function init()
{
// define the actions that should consider different contexts
$this->_helper->contextSwitch()
->addActionContext('get.user', 'json')
->initContext();
}
/**
* This method will return user data response json-formatted if
… return the to the client as requested.
*/ the get-Parameter „format“ was set to „json“
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
}
ReceptionController.php
73. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
public function init()
{
// define the actions that should consider different contexts
$this->_helper->contextSwitch()
->addActionContext('get.user', 'json')
->initContext();
}
/**
* This method will return user data to the client as requested.
*/
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
} We have just added an action
context to this action
}
ReceptionController.php
74. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
public function init()
{
// define the actions that should consider different contexts
$this->_helper->contextSwitch()
->addActionContext('get.user', 'json')
->initContext();
}
/**
* This method will return user data to the client as requested.
*/
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
} We have just added an action
context to this action
}
ReceptionController.php
75. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
public function init()
{
// define the actions that should consider different contexts
$this->_helper->contextSwitch()
->addActionContext('get.user', 'json')
->initContext();
}
/**
* This method will return user data to the client as requested.
*/ Call business logic...
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
}
ReceptionController.php
76. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
public function init()
{
// define the actions that should consider different contexts
$this->_helper->contextSwitch()
->addActionContext('get.user', 'json')
->initContext();
}
/**
* This method will return user data to the client as requested.
*/ And finally: Assign values to the
public function getUserAction() controller's view
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
}
ReceptionController.php
77. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
...
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
}
ReceptionController.php
Ext.Ajax.request({
url : „/user/reception/get.user/format/json“,
success : function(response) {
console.log(response.responseText);
}
});
client.js
78. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
...
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
Module
}
ReceptionController.php
Ext.Ajax.request({
url : „/user/reception/get.user/format/json“,
success : function(response) {
console.log(response.responseText);
}
});
client.js
79. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
...
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
Controller
}
ReceptionController.php
Ext.Ajax.request({
url : „/user/reception/get.user/format/json“,
success : function(response) {
console.log(response.responseText);
}
});
client.js
80. Context based data - example
class User_ReceptionController extends Zend_Controller_Action() {
...
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
Action
}
ReceptionController.php
Ext.Ajax.request({
url : „/user/reception/get.user/format/json“,
success : function(response) {
console.log(response.responseText);
}
});
client.js
81. Context based data - example
Note
● This illustration explains
how a request gets
processed by Zend
Framework [6]
● We'll use it to show how
ContextSwitch changes
the ResponseObject
based on the
application's context
83. Context based data - example
Request Router
Zend Framework routes to
User_ReceptionController::getUserAction()
84. Context based data - example
Request Router pre Any plugins defined?
Dispatch Signal a preDispatch to them!
85. Context based data - example
Request Router pre Any plugins defined?
Dispatch Signal a preDispatch to them!
public function preDispatch()
{
}
Zend_Controller_Action_Helper_Abstract
86. Context based data - example
Request Router pre Dispatch the action –
Dispatch getUserAction() gets processed!
Dispatch
87. Context based data - example
Request Router pre
Dispatch
Dispatch
Action
Controller
public function getUserAction()
{
...
$this->view->userName = 'Peter Griffin';
$this->view->userEmail = 'peter@birdistheword.com';
}
ReceptionController.php
88. Context based data - example
Request Router pre
Dispatch
Action
Dispatch
Controller
Any plugins defined?
post Signal a postDispatch to them!
Dispatch
89. Context based data - example
Request Router pre
Dispatch
Action
Dispatch
Controller
Any plugins defined?
post Signal a postDispatch to them!
Dispatch
public function postDispatch()
{
$context = $this->getCurrentContext();
...
//$this->postJsonContext();
}
ContextSwitch.php
90. Context based data - example
Request Router pre
Dispatch
Action
Dispatch
Controller
post
Dispatch
$response->setHeader('Content-Type', 'application/json');
ContextSwitch.php
actions
left?
Response
Object
91. Context based data - example
Request Router pre
Dispatch
Action
Dispatch
Controller
post
Dispatch
$response->setHeader('Content-Type', 'application/json');
ContextSwitch.php
actions
left?
$response->setBody(Zend_Json::encode($view->getVars()));
ContextSwitch.php
Response
Object
92. Context based data - example
Request Router pre
Dispatch
Action
Dispatch
Controller
post
Dispatch
actions
left?
send
response Response
Object
93. Context based data - example
Request Router pre
Dispatch
Action
Dispatch
Controller
post
Dispatch
actions
left?
{'userName' : „Peter Griffin“, 'userEmail' : „peter@birdistheword.com“}
console
send
response Response
Object
98. Ext.direct.*
„Ext Direct is a platform and language agnostic
technology to remote server-side methods to the
client-side.“[4]
99. Ext.direct.*
● That new kid in class no one wants to play with
100. Ext.direct.*
● That new kid in class no one wants to play with
● Bugs
101. Ext.direct.*
● That new kid in class no one wants to play with
● Bugs
● Clumsy
102. Ext.direct.*
● That new kid in class no one wants to play with
● Bugs
● Clumsy
● Implementation too complex
103. Ext.direct.*
● That new kid in class no one wants to play with
● Bugs
● Clumsy
● Implementation too complex
● The bad thing:
– Sencha started to focus remote functionality in their
library on Ext.direct.* with 3.*
104. Ext.direct.*
● That new kid in class no one wants to play with
● Bugs
● Clumsy
● Implementation too complex
● The bad thing:
– Sencha started to focus remote functionality in their
library on Ext.direct.* with 3.*
● The good thing:
– Sencha eliminated almost all implementation issues
105. Ext.direct.* - advantages
● Let's you call remote procedures directly from
client code
class User_ReceptionController extends Zend_Controller_Action {
public function getUserAction()
{
...
}
} ReceptionController.php
106. Ext.direct.* - advantages
● Let's you call remote procedures directly from
client code
class User_ReceptionController extends Zend_Controller_Action {
public function getUserAction()
{
...
}
} ReceptionController.php
user.reception.getUser();
client.js
107. Ext.direct.* - advantages
● Let's you call remote procedures directly from
client code
class User_ReceptionController extends Zend_Controller_Action {
public function getUserAction()
{
...
}
} ReceptionController.php
module
user.reception.getUser();
client.js
108. Ext.direct.* - advantages
● Let's you call remote procedures directly from
client code
class User_ReceptionController extends Zend_Controller_Action {
public function getUserAction()
{
...
}
} ReceptionController.php
controller
user.reception.getUser();
client.js
109. Ext.direct.* - advantages
● Let's you call remote procedures directly from
client code
class User_ReceptionController extends Zend_Controller_Action {
public function getUserAction()
{
...
}
} ReceptionController.php
action
user.reception.getUser();
client.js
110. Ext.direct.* - advantages
● Can stack remote procedure calls and send
them as one „batched request“
class Groupware_AccountController extends Zend_Controller_Action {
public function getEmailAccountsAction(){ ... }
public function getFeedAccountsAction(){ ... }
}
GroupwareController.php
111. Ext.direct.* - advantages
● Can stack remote procedure calls and send
them as one „batched request“
class Groupware_AccountController extends Zend_Controller_Action {
public function getEmailAccountsAction(){ ... }
public function getFeedAccountsAction(){ ... }
}
GroupwareController.php
groupware.account.getEmailAccounts();
client.js
112. Ext.direct.* - advantages
● Can stack remote procedure calls and send
them as one „batched request“
class Groupware_AccountController extends Zend_Controller_Action {
public function getEmailAccountsAction(){ ... }
public function getFeedAccountsAction(){ ... }
}
GroupwareController.php
groupware.account.getEmailAccounts();
client.js
113. Ext.direct.* - advantages
● Can stack remote procedure calls and send
them as one „batched request“
class Groupware_AccountController extends Zend_Controller_Action {
public function getEmailAccountsAction(){ ... }
public function getFeedAccountsAction(){ ... }
}
GroupwareController.php
groupware.account.getEmailAccounts();
groupware.account.getFeedAccounts();
client.js
Firebug
114. Ext.direct.* - advantages
● Can stack remote procedure calls and send
them as one „batched request“
class Groupware_AccountController extends Zend_Controller_Action {
public function getEmailAccountsAction(){ ... }
public function getFeedAccountsAction(){ ... }
}
GroupwareController.php
groupware.account.getEmailAccounts();
groupware.account.getFeedAccounts();
client.js
POST http://sourcedevcon/groupware/account/get.email.accounts
POST http://sourcedevcon/groupware/account/get.feed.accounts
Firebug
115. Ext.direct.* - advantages
● Can stack remote procedure calls and send
them as one „batched request“
class Groupware_AccountController extends Zend_Controller_Action {
public function getEmailAccountsAction(){ ... }
public function getFeedAccountsAction(){ ... }
}
GroupwareController.php
groupware.account.getEmailAccounts();
groupware.account.getFeedAccounts();
client.js
POST http://sourcedevcon/groupware/account/get.email.accounts
POST http://sourcedevcon/groupware/account/get.feed.accounts
Firebug
POST http://sourcedevcon/groupware
Firebug
116. Ext.direct.* - advantages
● Can stack remote procedure calls and send
them as one „batched request“
class Groupware_AccountController extends Zend_Controller_Action {
public function getEmailAccountsAction(){ ... }
public function getFeedAccountsAction(){ ... }
}
GroupwareController.php
groupware.account.getEmailAccounts();
groupware.account.getFeedAccounts();
client.js
POST http://sourcedevcon/groupware/account/get.email.accounts
POST http://sourcedevcon/groupware/account/get.feed.accounts
Firebug
POST http://sourcedevcon/groupware
extDirectData
[{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1},
{"action":"account","method":"getFeedAccounts","data":null,"type":"rpc","tid":2}]
Firebug
118. Ext.direct.*
● Can reduce serverload (1 request with n calls to
specific actions instead of n calls)
119. Ext.direct.*
● Can reduce serverload (1 request with n calls to
specific actions instead of n calls)
● Reduces possibility of losing connections (http
allows for n concurrent connections to one
domain at a time)
120. Ext.direct.*
● Can reduce serverload (1 request with n calls to
specific actions instead of n calls)
● Reduces possibility of losing connections (http
allows for n concurrent connections to one
domain at a time)
This alone are tremendously important reasons
for you to go ahead and make friendship with
that new kid in class!
122. Ext.direct.* w/ Zend Framework
… so let's find a solution.
Let's sum up our goals:
123. Ext.direct.* w/ Zend Framework
● Switch client code to Ext.direct.* without having to
change backend source code
● Add another tier of complexity and automatically
create backend methods/client code. Tests,
changing naming conventions etc. have to be
added by hand then.
● Keep our backend testable, reusable and make
sure it runs with any other client library/
implementation
124. Ext.direct.* w/ Zend Framework
● Switch client code to Ext.direct.* without having to
change backend source code
● Add another tier of complexity and automatically
create backend methods/client code. Tests,
changing naming conventions etc. have to be
added by hand then.
● Keep our backend testable, reusable and make
sure it runs with any other client library/
implementation
125. Ext.direct.* w/ Zend Framework
● Switch client code to Ext.direct.* without having to
change backend source code
● Add another tier of complexity and automatically
create backend methods/client code. Tests,
changing naming conventions etc. have to be
added by hand then.
● Keep our backend testable, reusable and make
sure it runs with any other client library/
implementation
126. Ext.direct.* w/ Zend Framework
● Switch client code to Ext.direct.* without having to
change backend source code
● Add another tier of complexity and automatically
create backend methods/client code. Tests,
changing naming conventions etc. have to be
added by hand then.
● Keep our backend testable, reusable and make
sure it runs with any other client library/
implementation
128. Ext.direct.* w/ Zend Framework
– Show requests sent by Ext.direct.* their way through
Zend Framework to their module/controller/action
– Teach Zend Framework how to distinguish between old
fashioned and merged requests
– Show Zend Framework how to disassemble 1 request
into n requests
– Give Zend Framework a sandbox where it can
work/play/you name it with a disamssembled request
– Collect sandboxed requests and merge them back into
one response
129. Ext.direct.* w/ Zend Framework
Change Ext.direct.RemotingProvider
URLs on the fly
130. Ext.direct.* w/ Zend Framework
Remember?
The Ext.direct.RemotingProvider exposes access to
server side methods on the client.
By mapping those remote methods to the client, there is
almost no need anymore to spray URLs around the
source like crazy.
It establishes a connection between the client and the
backend by providing a programmer friendly interface.
131. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
132. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware', URL
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
133. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware', URL
format : 'json',
type : 'zend',
actions : {
account : [{ „action“
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
134. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware', URL
format : 'json',
type : 'zend',
actions : {
account : [{ „action“
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts' method
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
135. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
136. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
});
namespace client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
137. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}] action
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
138. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider' method
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
139. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
POST http://sourcedevcon/groupware
Firebug
140. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
POST http://sourcedevcon/groupware
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
141. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
POST http://sourcedevcon/groupware
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
142. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
POST http://sourcedevcon/groupware
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
143. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
POST http://sourcedevcon/groupware
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
144. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
POST http://sourcedevcon/groupware
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
145. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
POST http://sourcedevcon/groupware
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
if (isset($_POST['extDirectData'])) {
...
}
/groupware Firebug
146. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
POST http://sourcedevcon/groupware
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
if (isset($_POST['extDirectData'])) {
...
}
/groupware Firebug
147. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
POST http://sourcedevcon/groupware
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
if (isset($_POST['extDirectData'])) { http://sourcedevcon/groupware/account/get.email.accounts
...
}
/groupware Firebug
148. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
URL = module
client.js
POST http://sourcedevcon/groupware
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
if (isset($_POST['extDirectData'])) { Http://sourcedevcon/groupware/account/get.email.accounts
...
}
/groupware Firebug
149. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
URL = module
client.js
action = controller
POST http://sourcedevcon/groupware
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
if (isset($_POST['extDirectData'])) { http://sourcedevcon/groupware/account/get.email.accounts
...
}
/groupware Firebug
150. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
URL = module
client.js
action = controller
POST http://sourcedevcon/groupware
extDirectData
method = action
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
if (isset($_POST['extDirectData'])) { http://sourcedevcon/groupware/account/get.email.accounts
...
}
/groupware Firebug
151. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware', URL
format : 'json',
type : 'zend',
actions : {
account : [{ „action“
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts' method
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
URL = module
client.js
action = controller
POST http://sourcedevcon/groupware
extDirectData
method = action
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
if (isset($_POST['extDirectData'])) { http://sourcedevcon/groupware/account/get.email.accounts
...
}
/groupware Firebug
152. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
153. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
154. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
Ext.define('eu.sourcedevcon.direct.ZendProvider', {
alias : 'direct.zendprovider',
extend : 'Ext.direct.RemotingProvider'
});
ZendProvider.js
164. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
165. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
POST http://sourcedevcon/groupware
166. Ext.direct.* w/ Zend Framework
Ext.direct.Manager.addProvider({
id : 'eu.sourcedevcon.provider',
enableUrlEncode : 'extDirectData',
url : './groupware',
format : 'json',
type : 'zend',
actions : {
account : [{
name : 'getFeedAccounts'
}, {
name : 'getEmailAccounts'
}]
},
namespace : 'eu.sourcedevcon.provider'
}); client.js
eu.sourcedevcon.provider.account.getEmailAccounts();
client.js
POST http://sourcedevcon/groupware
POST http://sourcedevcon/groupware/account/get.email.accounts/format/json
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
167. Ext.direct.* w/ Zend Framework
POST http://sourcedevcon/groupware/account/get.email.accounts/format/json
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
Note:
● Teach your actions the „extDirectData“-POST parameter
168. Ext.direct.* w/ Zend Framework
POST http://sourcedevcon/groupware/account/get.email.accounts/format/json
extDirectData
{"action":"account","method":"getEmailAccounts","data":null,"type":"rpc","tid":1}
Firebug
Note:
● Teach your actions the „extDirectData“-POST parameter
● Your responses must return the „tid“ as received by the
request
173. Ext.direct.* w/ Zend Framework
queueTransaction: function(transaction){
var me = this,
enableBuffer = me.enableBuffer;
if (transaction.form) {
me.sendFormRequest(transaction);
return;
}
me.callBuffer.push(transaction);
if (enableBuffer) {
if (!me.callTask) {
me.callTask = Ext.create('Ext.util.DelayedTask', me.combineAndSend, me);
}
me.callTask.delay(Ext.isNumber(enableBuffer) ? enableBuffer : 10);
} else {
me.combineAndSend();
}
}
RemotingProvider.js
174. Ext.direct.* w/ Zend Framework
queueTransaction: function(transaction){ add transaction to callBuffer Array
var me = this,
enableBuffer = me.enableBuffer;
if (transaction.form) {
me.sendFormRequest(transaction);
return;
}
me.callBuffer.push(transaction);
if (enableBuffer) {
if (!me.callTask) {
me.callTask = Ext.create('Ext.util.DelayedTask', me.combineAndSend, me);
}
me.callTask.delay(Ext.isNumber(enableBuffer) ? enableBuffer : 10);
} else {
me.combineAndSend();
}
}
RemotingProvider.js
175. Ext.direct.* w/ Zend Framework
queueTransaction: function(transaction){ add transaction to callBuffer Array
var me = this,
enableBuffer = me.enableBuffer; if batching is enabled, create a task
if (transaction.form) {
me.sendFormRequest(transaction);
return;
}
me.callBuffer.push(transaction);
if (enableBuffer) {
if (!me.callTask) {
me.callTask = Ext.create('Ext.util.DelayedTask', me.combineAndSend, me);
}
me.callTask.delay(Ext.isNumber(enableBuffer) ? enableBuffer : 10);
} else {
me.combineAndSend();
}
}
RemotingProvider.js
176. Ext.direct.* w/ Zend Framework
queueTransaction: function(transaction){ add transaction to callBuffer Array
var me = this,
enableBuffer = me.enableBuffer; if batching is enabled, create a task
wait for 10ms for another
if (transaction.form) {
transaction to be added
me.sendFormRequest(transaction);
return;
}
me.callBuffer.push(transaction);
if (enableBuffer) {
if (!me.callTask) {
me.callTask = Ext.create('Ext.util.DelayedTask', me.combineAndSend, me);
}
me.callTask.delay(Ext.isNumber(enableBuffer) ? enableBuffer : 10);
} else {
me.combineAndSend();
}
}
RemotingProvider.js
177. Ext.direct.* w/ Zend Framework
queueTransaction: function(transaction){ add transaction to callBuffer Array
var me = this,
enableBuffer = me.enableBuffer; if batching is enabled, create a task
wait for 10ms for another
if (transaction.form) {
transaction to be added
me.sendFormRequest(transaction);
no more transactions coming in? Call
return;
combineAndSend
}
me.callBuffer.push(transaction);
if (enableBuffer) {
if (!me.callTask) {
me.callTask = Ext.create('Ext.util.DelayedTask', me.combineAndSend, me);
}
me.callTask.delay(Ext.isNumber(enableBuffer) ? enableBuffer : 10);
} else {
me.combineAndSend();
}
}
RemotingProvider.js
183. Ext.direct.* w/ Zend Framework
What is this Plugin?
● „Plugin“ for Zend Framework's Front Controller
● Actually not a real plugin, but rather a mediator for
preDispatch/postDispatch Events
● Capable of detecting batched requests
● Capable of disassembling a batched request into
individual requests
● Capable of creating a sandbox for each request,
and processing it