Professional Website Development
Ryan Ellis: salesforce.com
John Stritzinger: Radian Guaranty Inc
Phil Calvin: salesforce.com
Developers
Questions
Please post your questions to
Dreamforce Chatter
Safe HarborSafe harbor statement under the Private Securities Litigation Reform Act of 1995: This presentation may
contain forward-looking statements that involve risks, uncertainties, and assumptions. If any such uncertainties
materialize or if any of the assumptions proves incorrect, the results of salesforce.com, inc. could differ
materially from the results expressed or implied by the forward-looking statements we make. All statements
other than statements of historical fact could be deemed forward-looking, including any projections of
subscriber growth, earnings, revenues, or other financial items and any statements regarding strategies or
plans of management for future operations, statements of belief, any statements concerning new, planned, or
upgraded services or technology developments and customer contracts or use of our services.
The risks and uncertainties referred to above include – but are not limited to – risks associated with developing
and delivering new functionality for our service, our new business model, our past operating losses, possible
fluctuations in our operating results and rate of growth, interruptions or delays in our Web hosting, breach of
our security measures, risks associated with possible mergers and acquisitions, the immature market in which
we operate, our relatively limited operating history, our ability to expand, retain, and motivate our employees
and manage our growth, new releases of our service and successful customer deployment, our limited history
reselling non-salesforce.com products, and utilization and selling to larger enterprise customers. Further
information on potential factors that could affect the financial results of salesforce.com, inc. is included in our
annual report on Form 10-Q for the most recent fiscal quarter ended April 30, 2010. This document and others
are available on the SEC Filings section of the Investor Information section of our Web site.
Any unreleased services or features referenced in this or other press releases or public statements are not
currently available and may not be delivered on time or at all. Customers who purchase our services should
make the purchase decisions based upon features that are currently available. Salesforce.com, inc. assumes
no obligation and does not intend to update these forward-looking statements.
CachingLeverage the Akamai Content Delivery Network (CDN)
Fast page load times
Global reach
Offload bandwidth
Keep in mind:
Entire page
content is static
CachingUse static resources to store and cache js, css and images
Caching
Base class for all Controllers in AppExchange
Page tag for AppExchange home page
Set your cache configuration on each page
Search Engine Optimization
global class appexchangeRewriter implements Site.UrlRewriter {
global PageReference mapRequestUrl(PageReference externalUrl) {
String url = externalUrl.getUrl();
if(url.startsWith('/')){
String name = url.substring(1,url.length());
Listing__c listing = [select Listing_ID__c from Listing__c where Listing_URL__c =:name LIMIT 1];
System.debug('Returning Friendly URL');
return new PageReference('/listingDetail?listingId=' + listing.Listing_id__c);
} else {
return externalUrl;
}
}
global List<PageReference> generateUrlFor(List<PageReference> internalLinks) {
System.debug('In Generate URL');
List<PageReference> newLinks = new List<PageReference>();
List<String> newIds = new List<String>();
for(PageReference link : internalLinks) {
System.debug(link.getUrl());
if(link.getUrl().indexOf('/listingDetail?listingId=') >= 0) {
String lid = link.getUrl().substring(22,link.getUrl().length());
Listing__c listing = [select Listing_URL__c from Listing__c where Listing_ID__c =:lid LIMIT 1];
newLinks.add(new PageReference('/'+listing.ListingURL__c));
} else {
newLinks.add(link);
}
}
return newLinks;
}
}
Visualforce Page
<apex:page showHeader="false" standardStylesheets="false" standardController="Listing__c">
<h1><apex:outputLabel value="{!Listing__c.Name}"></apex:outputLabel></h1>
{!Listing__c.Description__c}
<HR />
<a href="{!URLFOR($Page.ListingDetail,null,[id=Listing__c.Listing_ID__c])}">Detail Link</a>
</apex:page>
Controlled through configuration and simple code
Verify Your Site with Search Engines
Internationalization & LocalizationMake your website available to the world
Translation Workbench
• Get it enabled on your Salesforce organization
• Select your supported languages
Custom Labels
• labels/CustomLabels.Labels
Translations
• translations/ja.translation
Internationalization & Localization
HomePageController Class Util Class
Exchange Class
Web Analytics
1 2Google Analytics Omniture
Multiple options for tracking web activity
Include js snippet on pages you want to track
Content Management Systems
1
2
CMSForce 2
AppExchange Partners
OrchestraCMS
Arxxus
Cool Sites
3 Build Your Own
Enable easy management of your content
John Stritzinger
Radian Guaranty Inc
CMSForce* and Dynamic Content
Content Pushed to Site
Realtime Web Service Calls
Dynamic Data Driven Architecture
Phil Calvin
salesforce.com
What's wrong with this?
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false"%>
<%@ taglib tagdir="/WEB-INF/tags/Front" prefix="front" %>
<%@ taglib tagdir="/WEB-INF/tags/UI" prefix="ui" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Login Page</title>
<!-- Frame buster.. -->
<script type="text/javascript"> if (window != top) top.location.href = location.href; </script>
<!-- CSS for new configuration/ui. Will be moved to external file -->
<style type='text/css'> body { background: #F7F7F7 url(bg_body.png) 0 0 repeat-x; }</style>
</head>
<body id="studioBody" onload="if (typeof(startSessionTimer)!='undefined') {startSessionTimer(); }">
<%
// Inject the session timeout popup code.
if (!Ctx.config().get().getConfigInfo().isTimeoutEnabled()) { SessionTimeout.display(); }
%>
<ul class='loginForm'>
<li>Please enter your login creentials</li>
<li>Login</li><li><input type='text' id='loginID' /></li>
<li>Login</li><li><input type='password' id='password' /></li>
<li>Login</li><li><input type='submit' id='loginButton' value='LoginNow' /></li>
</ul>
</body>
</html>
SiteforceMaking web content management easy
Unauthenticated websites
myDomain
Built with visual force pages
Integrated with your Force.com data/content
Content Delivery Network
URL rewriting
myDomain for sandbox
Usage workflow alerts
301/302 redirects
Coming soon…Integrated CMS
Pixel perfect Declarative Designer
Collaboration
Drag and drop data integrations
Analytics
Dashboard for governance
SiteforceDesign, Build, Manage and Monitor on Force.com
Build a new site
Change the layout, add new pages
Edit the content
Make it Social
Hook up some data
Publish it
We have 10 mins to do all this !
Professional Website Development
D I S C O V E R
Visit the Developer Training and Support Booth
in Force.com Zone
Developer training, certification and support resources
S U C C E S SFind us in the Partner Demo Area of
Force.com Zone 2nd Floor Moscone West
that help you achieve
Remember. . .
Check Chatter for additional session information
Get your developer Workbooks and Cheat Sheets in
the Force.com Zone
Visit for more information related to
this topic
Don’t forget
the survey!
How Could Dreamforce Be Better? Tell Us!
Log in to the Dreamforce app to submit
surveys for the sessions you attended
Use the
Dreamforce Mobile
app to submit
surveysEvery session survey you submit is
a chance to win an iPod nano!
OR