SlideShare a Scribd company logo
ISSET INTERNET
PROFESSIONALS
How to approach CI projects which
go beyond the ‘homepage’
Who we are
 Jeroen van der Gulik
    Lead Developer Isset
    jeroen@isset.nl


 Rommert van Til
    Project Manager
    rommert@isset.nl
What we do
 Isset Internet Professionals targets companies with an
 ambition on the internet.
 We provide solutions for problems related to the web
 using internet technology.
 Isset only works with professionals who are up to date on
 current internet problems as well as solutions.
 We are purely functional and technical.
What we are currently doing
 Building custom web applications / websites.
 Building connectors/ middleware applications.
 Optimizing and monitoring SEO performance on a
 technical level (not ga).
 Migrating a large custom build webshop.
 We are currently developing an in house application that
 will be make sense of SEO / SEA.
Why we chose CodeIgniter
Avoiding the DreamWeaver effect.
The DreamWeaver Effect
General pros
 Lightweight
 Fast (!)
 Open Source
 Very good documentation
 Very good User Community
 Simple (KISS)
 MVC
What we think is important
 All we need is routing + database abstraction.
 Easily extendible/ adjustable.
 Simple Caching mechanism.
 Has few ‘conventions’.
 Has many ‘add-ons’.
 Easy to add external classes/ libraries
What we discovered
 Application framework, not a website framework.
 Forces a team to work in the same structure.
 CI is fast so you can write ‘sloppy’ code.
 CI plays nice (mostly) with Zend which is a good thing
 CodeIgniter is relaxed.
What we will talk about
Why not Expression Engine?

                                           Client server 2
Client server 1



                  Middleware application




        Client server N
Topics
 Making what the client needs
 Database Driven Development (DDD).
 How we design our projects
 Project file organization
 Source control management
 Extending Classes (Base Classes)
 DB routing
 Layout/ Templating
 ICF (Isset Content Framework)
 Logging
 Security (CLRF, AR)
 Making sense of SEO / SEM
The Client
Making the Client happy
 Force the client to participate.
 Three tier communication : developer(s), project
 manager, client(s)
 Make a ‘design’ document.
 Make sure both the client and the developer can
 understand the document.
 Use the project manager as mediator.
 Use feature list to determine if all requirements are made.
 Don’t use vague terminology.
 Prevent scope creep.
Database Driven Development
 Think about the data structure first.
 Generate template CRUD based on DB scheme
Isset Presentation @ EECI2009
How we design our projects
 Making a test environment
 New project
 Migration
 Middleware / connector / webservice
Make a test environment
 Make sure that it matches the production environment.
 Replace all e-mail addresses and cell phone numbers
 with traceable test data.
 Don’t use offensive test data for fun, just don’t use it.
New Project
 Prerequisite : no database, no legacy system.
 Database Driven Development.
 Plan meeting(s) to write the design document with the
 client.
 Use agile approach (small iterations so the Client can see
 progress and test).
Migration
 Prerequisite: any project that has a database or legacy
 functionality.
 Should we migrate to CodeIgniter?
 What is the database scheme like? (DDD)
 What is the scope of the legacy functionality?
 How maintainable is the legacy code?
 Are their 3rd party components?
 What is the platform?
 Bottom line: start from scratch or migrate functionality
 over time.
Migration Path
 Make legacy application work next to CodeIgniter.
 Be aware of sessions (authentication).
 Be aware of absolute paths.
 Be aware of User Generated Content.
 Avoid changing existing code; move functionality into
 CodeIgniter.
Middleware / connector / webservice.
 Prerequisite; the application has to communicate with
 other applications.
 Demand (api) documentation up front.
 Log every transaction (request and response).
 Avoid connecting to third party databases directly.
 Clearly outline the responsibilities. (next slide)
Taking care of responsibilities
Project file organization
 Depends on scale and environment
 Learn about symlinks!
 Separate system from site root if possible
 Separate application from site root if possible
 Separate public (or assets)
 Use what works for you
Source control management
 Just do it.
 Git/ SVN/ Mercurial/ Bazar: Use what works for you
 We chose SVN because of general acceptance
 Use sensible commit messages
Extending Classes (base classes)
 Base Controllers will make your life easier
 For details: Jamie Rumbelow
 Use MY_Controller
    Use different base controllers according to the purpose of the
    (sub)application
    Alternatively use modules
MY_Controller
Isset Presentation @ EECI2009
Isset Presentation @ EECI2009
DB Routing / MY_Router
 How to match database records with controllers that do
 not exist.
 If a controller exist, the controller will be executed. Else
 it will do a db lookup.
 Make a table that has the external url eg
 http://mysite.tld/home with an internal controller e.g.
 pagecontroller/page/1
 Make exceptions for things like news, blog items etc. in
 the router file
 For heavy traffic websites, make a pre-system cache
 hook.
Isset Presentation @ EECI2009
Example Lookup Table
Isset Presentation @ EECI2009
Exceptions
Tackling the layout / template issue
 Default template
    Overwrite when needed with variations
 Little template partials like navigation, sidebars etc.
 Every partial can be associated with model(s) and/or
 view(s).
 INCMS uses db records to define the relation between
 pages and partials.
 Complete separation of logic en layout (mvc)
    Making a new layout for a site is easy.
Template sections
Issues with ‘standard’ solutions
 80% was easy (click ‘n go)
 15% was hard (modify base code/ write workarounds or
 custom modules/plugins)
 5% was not doable (restrictions by standard solution)
 Standard solutions that did work were either expensive
 or far too complex for the end user
 We hope that Ellis Labs will provide the ‘ultimate’
 solution with Expression Engine 2.0
ICF (Isset Content Framework)
 NOT a CMS
 Generating editable content sections.
 Using default template most of the time, specific
 templates when necessary.
 Best of both worlds: making basic content pages easy,
 making complex pages doable. (using standard CI
 framework).
 80% of a website is just content.
 20% of a website is custom made. No restrictions!
 Think custom ajaxified ‘shiny’ contact forms clients love
 to torture developers with.
ICF database scheme
Logging
 Especially important when making middleware.
 Helps when playing ‘the blame game’.
 Log incoming, outgoing requests.
 Log email / sms / whatever.
 Logging is cheap but provides valuable debug
 information.
 Logging 404 can help determine routing issues, SEO
 issues, hacking attempts.
 Logging executed queries can help find bottlenecks.
 Logging to a DB makes analyzing data easy.
Example E-Mail Logging
 ‘Build’ the email to send
 Save it to a database
 Pass it to an email queue / cronjob
 Update the record when send
 Log if any errors occur
Example Email Database Scheme
Isset Presentation @ EECI2009
Security
 Sanitize input, escape output.
 Be aware of XSS (CI provides some security).
 Be aware of Cross-Site Request Forgery (CSRF).
 Be aware of (MySQL) typecasting when using Active
 Record.
Example 1 - PyroCMS
Example 2 - SyntaxCMS
<img src=“http://domain.tld/admin/users/delete/1” />
How to prevent CSRF
 Any destructive action should always be taken with a
 POST (update and delete).
 Cross Site POST is easy so gives no security.
 Use a token to verify that the send POST data is coming
 from the website.
 Michael Wales wrote extensively about it:
 http://www.michaelwales.com/codeigniter/protecting-
 against-csrf-exploit
Isset Presentation @ EECI2009
Isset Presentation @ EECI2009
Isset Presentation @ EECI2009
Isset Presentation @ EECI2009
Making sense of SEO / SEM efforts
 Keeping track of the position for a given landing page in
 combination with a search string
 Monitoring Google PageRank
 Measure cause and effect listing milestones in
 conversion / visitor timeline.
 Relate all search strings to conversions.
 Adding search strings to a campaign that are cheaper but
 also make a conversion
 Exclude search strings from a campaign that are
 expensive but never make a conversion.
You can (in a few months)
 Visit sedindex.com (next monday)
 Pre register
 Find more information
 We will get back to you in January 2010
Questions ?

Thanks for listening. We hope you enjoyed it

More Related Content

PPTX
How Custom is your Org? CEER at Dreamforce 2019
Steven Herod
 
PDF
Web architecture pocket guide
meroooo
 
PPT
Symantec I3 Presentation
sebastian.guerrero
 
PPT
Symantec I3 - Inquire & Cluster
sebastian.guerrero
 
ODP
IBM ConnectED 2015 - AD302 - Responsive Application Development for XPages
beglee
 
PPTX
PHP Symfony MicroServices Migration @MeeticTech
meeticTech
 
PDF
REX Meetic, Comment la qualité reflète-t-elle nos organisations ?
meeticTech
 
PDF
Anatomy of an HTML 5 mobile web app
Ivano Malavolta
 
How Custom is your Org? CEER at Dreamforce 2019
Steven Herod
 
Web architecture pocket guide
meroooo
 
Symantec I3 Presentation
sebastian.guerrero
 
Symantec I3 - Inquire & Cluster
sebastian.guerrero
 
IBM ConnectED 2015 - AD302 - Responsive Application Development for XPages
beglee
 
PHP Symfony MicroServices Migration @MeeticTech
meeticTech
 
REX Meetic, Comment la qualité reflète-t-elle nos organisations ?
meeticTech
 
Anatomy of an HTML 5 mobile web app
Ivano Malavolta
 

What's hot (16)

PDF
Blue mix overview
Leon Henry
 
ZIP
3-18-11
MDuckinson
 
PDF
Spring Mvc
ifnu bima
 
PPT
Ruby on Rails Plugins - Rich Collins
Rich Collins
 
DOCX
Interview questions
mallareddy0107
 
PPTX
Five Enterprise Best Practices That EVERY Salesforce Org Can Use (DF15 Session)
Vivek Chawla
 
PDF
A Gentle introduction to Web Development & Django
PRASANNAVENK
 
PDF
Slipstream Rapid Application Design
phptechtalk
 
PPT
Top 10 web application development frameworks 2016
iMOBDEV Technologies Pvt. Ltd.
 
PPTX
SharePoint 2010 design and deploy
Chris Riley ☁
 
PDF
Fundamentals of Web for Non-Developers
Lemi Orhan Ergin
 
PPTX
Advanced PowerShell Automation
kieranjacobsen
 
PPTX
Introduction to MVC Web Framework with CodeIgniter
Pongsakorn U-chupala
 
PPTX
Salesforce Multitenant Architecture: How We Do the Magic We Do
Salesforce Developers
 
PDF
Unlock the Power of Streaming Data with Kinetica and Confluent Platform
confluent
 
PDF
Using Cool New Frameworks in (Mobile) Domino Apps
Teamstudio
 
Blue mix overview
Leon Henry
 
3-18-11
MDuckinson
 
Spring Mvc
ifnu bima
 
Ruby on Rails Plugins - Rich Collins
Rich Collins
 
Interview questions
mallareddy0107
 
Five Enterprise Best Practices That EVERY Salesforce Org Can Use (DF15 Session)
Vivek Chawla
 
A Gentle introduction to Web Development & Django
PRASANNAVENK
 
Slipstream Rapid Application Design
phptechtalk
 
Top 10 web application development frameworks 2016
iMOBDEV Technologies Pvt. Ltd.
 
SharePoint 2010 design and deploy
Chris Riley ☁
 
Fundamentals of Web for Non-Developers
Lemi Orhan Ergin
 
Advanced PowerShell Automation
kieranjacobsen
 
Introduction to MVC Web Framework with CodeIgniter
Pongsakorn U-chupala
 
Salesforce Multitenant Architecture: How We Do the Magic We Do
Salesforce Developers
 
Unlock the Power of Streaming Data with Kinetica and Confluent Platform
confluent
 
Using Cool New Frameworks in (Mobile) Domino Apps
Teamstudio
 
Ad

Similar to Isset Presentation @ EECI2009 (20)

PPTX
CODE IGNITER
Yesha kapadia
 
PDF
Codeigniter For Rapid Php Application Development 1st Edition David Upton
ikelqueezy
 
DOCX
Codeigniter
Chirag Parmar
 
KEY
Why You Need a Front End Developer
Mike Wilcox
 
PPT
Introduction To CodeIgniter
schwebbie
 
PPT
Benefits of the CodeIgniter Framework
Toby Beresford
 
PDF
Codeigniter
Joram Salinas
 
PDF
Introduction To CodeIgniter
Muhammad Hafiz Hasan
 
PDF
New recipes for the ever growing content cloud
Cédric Hüsler
 
PDF
resume
Brent Ransom
 
PPTX
CodeIgniter & MVC
Jamshid Hashimi
 
PPTX
Intro to ExpressionEngine and CodeIgniter
brightrocket
 
PPT
Codeigniter
minhrau111
 
PDF
Code igniter - A brief introduction
Commit University
 
DOCX
MUHAMMAD SAJID_Final
Muhammad Sajid
 
PPT
Introduction To Code Igniter
Amzad Hossain
 
PPTX
Codeignitor
Gandhi Ravi
 
PDF
CodeIgniter Website Development a Comprehensive Guide 2024 .pdf
JPLoft Solutions
 
ODP
Codegnitorppt
sreedath c g
 
PDF
Analyzing Optimal Practises for Web Frameworks
IRJET Journal
 
CODE IGNITER
Yesha kapadia
 
Codeigniter For Rapid Php Application Development 1st Edition David Upton
ikelqueezy
 
Codeigniter
Chirag Parmar
 
Why You Need a Front End Developer
Mike Wilcox
 
Introduction To CodeIgniter
schwebbie
 
Benefits of the CodeIgniter Framework
Toby Beresford
 
Codeigniter
Joram Salinas
 
Introduction To CodeIgniter
Muhammad Hafiz Hasan
 
New recipes for the ever growing content cloud
Cédric Hüsler
 
resume
Brent Ransom
 
CodeIgniter & MVC
Jamshid Hashimi
 
Intro to ExpressionEngine and CodeIgniter
brightrocket
 
Codeigniter
minhrau111
 
Code igniter - A brief introduction
Commit University
 
MUHAMMAD SAJID_Final
Muhammad Sajid
 
Introduction To Code Igniter
Amzad Hossain
 
Codeignitor
Gandhi Ravi
 
CodeIgniter Website Development a Comprehensive Guide 2024 .pdf
JPLoft Solutions
 
Codegnitorppt
sreedath c g
 
Analyzing Optimal Practises for Web Frameworks
IRJET Journal
 
Ad

Recently uploaded (20)

PPTX
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
PPTX
Simple and concise overview about Quantum computing..pptx
mughal641
 
PDF
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
PDF
The Future of Artificial Intelligence (AI)
Mukul
 
PDF
Software Development Methodologies in 2025
KodekX
 
PDF
Using Anchore and DefectDojo to Stand Up Your DevSecOps Function
Anchore
 
PDF
Get More from Fiori Automation - What’s New, What Works, and What’s Next.pdf
Precisely
 
PDF
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
PDF
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
PDF
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
PPTX
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
PDF
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 
PPTX
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
PDF
Brief History of Internet - Early Days of Internet
sutharharshit158
 
PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PPTX
AI and Robotics for Human Well-being.pptx
JAYMIN SUTHAR
 
PDF
Doc9.....................................
SofiaCollazos
 
PPTX
Applied-Statistics-Mastering-Data-Driven-Decisions.pptx
parmaryashparmaryash
 
PDF
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
PDF
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
Simple and concise overview about Quantum computing..pptx
mughal641
 
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
The Future of Artificial Intelligence (AI)
Mukul
 
Software Development Methodologies in 2025
KodekX
 
Using Anchore and DefectDojo to Stand Up Your DevSecOps Function
Anchore
 
Get More from Fiori Automation - What’s New, What Works, and What’s Next.pdf
Precisely
 
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
Brief History of Internet - Early Days of Internet
sutharharshit158
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
AI and Robotics for Human Well-being.pptx
JAYMIN SUTHAR
 
Doc9.....................................
SofiaCollazos
 
Applied-Statistics-Mastering-Data-Driven-Decisions.pptx
parmaryashparmaryash
 
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 

Isset Presentation @ EECI2009

  • 1. ISSET INTERNET PROFESSIONALS How to approach CI projects which go beyond the ‘homepage’
  • 2. Who we are Jeroen van der Gulik Lead Developer Isset [email protected] Rommert van Til Project Manager [email protected]
  • 3. What we do Isset Internet Professionals targets companies with an ambition on the internet. We provide solutions for problems related to the web using internet technology. Isset only works with professionals who are up to date on current internet problems as well as solutions. We are purely functional and technical.
  • 4. What we are currently doing Building custom web applications / websites. Building connectors/ middleware applications. Optimizing and monitoring SEO performance on a technical level (not ga). Migrating a large custom build webshop. We are currently developing an in house application that will be make sense of SEO / SEA.
  • 5. Why we chose CodeIgniter Avoiding the DreamWeaver effect.
  • 7. General pros Lightweight Fast (!) Open Source Very good documentation Very good User Community Simple (KISS) MVC
  • 8. What we think is important All we need is routing + database abstraction. Easily extendible/ adjustable. Simple Caching mechanism. Has few ‘conventions’. Has many ‘add-ons’. Easy to add external classes/ libraries
  • 9. What we discovered Application framework, not a website framework. Forces a team to work in the same structure. CI is fast so you can write ‘sloppy’ code. CI plays nice (mostly) with Zend which is a good thing CodeIgniter is relaxed.
  • 10. What we will talk about
  • 11. Why not Expression Engine? Client server 2 Client server 1 Middleware application Client server N
  • 12. Topics Making what the client needs Database Driven Development (DDD). How we design our projects Project file organization Source control management Extending Classes (Base Classes) DB routing Layout/ Templating ICF (Isset Content Framework) Logging Security (CLRF, AR) Making sense of SEO / SEM
  • 14. Making the Client happy Force the client to participate. Three tier communication : developer(s), project manager, client(s) Make a ‘design’ document. Make sure both the client and the developer can understand the document. Use the project manager as mediator. Use feature list to determine if all requirements are made. Don’t use vague terminology. Prevent scope creep.
  • 15. Database Driven Development Think about the data structure first. Generate template CRUD based on DB scheme
  • 17. How we design our projects Making a test environment New project Migration Middleware / connector / webservice
  • 18. Make a test environment Make sure that it matches the production environment. Replace all e-mail addresses and cell phone numbers with traceable test data. Don’t use offensive test data for fun, just don’t use it.
  • 19. New Project Prerequisite : no database, no legacy system. Database Driven Development. Plan meeting(s) to write the design document with the client. Use agile approach (small iterations so the Client can see progress and test).
  • 20. Migration Prerequisite: any project that has a database or legacy functionality. Should we migrate to CodeIgniter? What is the database scheme like? (DDD) What is the scope of the legacy functionality? How maintainable is the legacy code? Are their 3rd party components? What is the platform? Bottom line: start from scratch or migrate functionality over time.
  • 21. Migration Path Make legacy application work next to CodeIgniter. Be aware of sessions (authentication). Be aware of absolute paths. Be aware of User Generated Content. Avoid changing existing code; move functionality into CodeIgniter.
  • 22. Middleware / connector / webservice. Prerequisite; the application has to communicate with other applications. Demand (api) documentation up front. Log every transaction (request and response). Avoid connecting to third party databases directly. Clearly outline the responsibilities. (next slide)
  • 23. Taking care of responsibilities
  • 24. Project file organization Depends on scale and environment Learn about symlinks! Separate system from site root if possible Separate application from site root if possible Separate public (or assets) Use what works for you
  • 25. Source control management Just do it. Git/ SVN/ Mercurial/ Bazar: Use what works for you We chose SVN because of general acceptance Use sensible commit messages
  • 26. Extending Classes (base classes) Base Controllers will make your life easier For details: Jamie Rumbelow Use MY_Controller Use different base controllers according to the purpose of the (sub)application Alternatively use modules
  • 30. DB Routing / MY_Router How to match database records with controllers that do not exist. If a controller exist, the controller will be executed. Else it will do a db lookup. Make a table that has the external url eg http://mysite.tld/home with an internal controller e.g. pagecontroller/page/1 Make exceptions for things like news, blog items etc. in the router file For heavy traffic websites, make a pre-system cache hook.
  • 35. Tackling the layout / template issue Default template Overwrite when needed with variations Little template partials like navigation, sidebars etc. Every partial can be associated with model(s) and/or view(s). INCMS uses db records to define the relation between pages and partials. Complete separation of logic en layout (mvc) Making a new layout for a site is easy.
  • 37. Issues with ‘standard’ solutions 80% was easy (click ‘n go) 15% was hard (modify base code/ write workarounds or custom modules/plugins) 5% was not doable (restrictions by standard solution) Standard solutions that did work were either expensive or far too complex for the end user We hope that Ellis Labs will provide the ‘ultimate’ solution with Expression Engine 2.0
  • 38. ICF (Isset Content Framework) NOT a CMS Generating editable content sections. Using default template most of the time, specific templates when necessary. Best of both worlds: making basic content pages easy, making complex pages doable. (using standard CI framework). 80% of a website is just content. 20% of a website is custom made. No restrictions! Think custom ajaxified ‘shiny’ contact forms clients love to torture developers with.
  • 40. Logging Especially important when making middleware. Helps when playing ‘the blame game’. Log incoming, outgoing requests. Log email / sms / whatever. Logging is cheap but provides valuable debug information. Logging 404 can help determine routing issues, SEO issues, hacking attempts. Logging executed queries can help find bottlenecks. Logging to a DB makes analyzing data easy.
  • 41. Example E-Mail Logging ‘Build’ the email to send Save it to a database Pass it to an email queue / cronjob Update the record when send Log if any errors occur
  • 44. Security Sanitize input, escape output. Be aware of XSS (CI provides some security). Be aware of Cross-Site Request Forgery (CSRF). Be aware of (MySQL) typecasting when using Active Record.
  • 45. Example 1 - PyroCMS
  • 46. Example 2 - SyntaxCMS
  • 48. How to prevent CSRF Any destructive action should always be taken with a POST (update and delete). Cross Site POST is easy so gives no security. Use a token to verify that the send POST data is coming from the website. Michael Wales wrote extensively about it: http://www.michaelwales.com/codeigniter/protecting- against-csrf-exploit
  • 53. Making sense of SEO / SEM efforts Keeping track of the position for a given landing page in combination with a search string Monitoring Google PageRank Measure cause and effect listing milestones in conversion / visitor timeline. Relate all search strings to conversions. Adding search strings to a campaign that are cheaper but also make a conversion Exclude search strings from a campaign that are expensive but never make a conversion.
  • 54. You can (in a few months) Visit sedindex.com (next monday) Pre register Find more information We will get back to you in January 2010
  • 55. Questions ? Thanks for listening. We hope you enjoyed it