<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="generator" content="Adobe RoboHelp - www.adobe.com">
<title>Support</title>
<link rel="stylesheet" href="default_ns.css"><script type="text/javascript" language="JavaScript" title="WebHelpSplitCss">
<!--
if (navigator.appName !="Netscape")
{   document.write("<link rel='stylesheet' href='default.css'>");}
//-->
</script>
<style>
<!--
body { border-left-style:None; border-right-style:None; border-bottom-style:None; background-color:Transparent; border-top-style:None; }
-->
</style><style type="text/css">
<!--
h1.whs1 { color:#00709e; }
h3.whs2 { margin-left:40px; }
p.whs3 { margin-left:40px; }
div.whs4 { width:100%; }
p.whs5 { text-align:right; x-condition:Product, Online; }
p.whs6 { text-align:right; x-condition:Online; }
p.whs7 { text-align:center; x-condition:PDT; text-decoration:underline; }
-->
</style><script type="text/javascript" language="JavaScript" title="WebHelpInlineScript">
<!--
function reDo() {
  if (innerWidth != origWidth || innerHeight != origHeight)
     location.reload();
}
if ((parseInt(navigator.appVersion) == 4) && (navigator.appName == "Netscape")) {
	origWidth = innerWidth;
	origHeight = innerHeight;
	onresize = reDo;
}
onerror = null; 
//-->
</script>
<style type="text/css">
<!--
div.WebHelpPopupMenu { position:absolute; left:0px; top:0px; z-index:4; visibility:hidden; }
p.WebHelpNavBar { text-align:right; }
-->
</style><script type="text/javascript" language="javascript1.2" src="whmsg.js"></script>
<script type="text/javascript" language="javascript" src="whver.js"></script>
<script type="text/javascript" language="javascript1.2" src="whproxy.js"></script>
<script type="text/javascript" language="javascript1.2" src="whutils.js"></script>
<script type="text/javascript" language="javascript1.2" src="whlang.js"></script>
<script type="text/javascript" language="javascript1.2" src="whtopic.js"></script>
<script type="text/javascript" language="javascript1.2">
<!--
if (window.gbWhTopic)
{
	if (window.setRelStartPage)
	{
	addAvenueInfo("Zend Studio for Eclipse Help","Keymap.htm","Registering_Your_License.htm");

	}


	if(1)
	{
	
	}

	if (window.setRelStartPage)
	{
	setRelStartPage("IDE_Help.htm");

		autoSync(1);
		sendSyncInfo();
		sendAveInfoOut();
	}

}
else
	if (window.gbIE4)
		document.location.reload();
//-->
</script>
</head>
<body leftmargin="5" topmargin="5" rightmargin="5" bottommargin="5"><script type="text/javascript" language="javascript1.2">
<!--
if (window.writeIntopicBar)
	writeIntopicBar(4);
//-->
</script>
<h1 class="whs1">Support</h1>
<p>Zend Technologies provides a wide range of resources for obtaining additional 
 information and support, such as the <a href="#Support_Center">Zend Support 
 Center</a>, the <a href="#Newsletter">Zend Newsletter</a>, and the <a 
 href="#Developer_Zone">Zend Developer Zone</a>.</p>
<h2><a name=Support_Center></a>Zend Support Center</h2>
<p>&nbsp;</p>
<p>The <a href="http://www.zend.com/en/support-center">Zend Support Center</a> 
 is a portal for information on all Zend Product related issues.</p>
<p>From the Zend Support Center (http://www.zend.com/en/support-center) 
 you can access:</p>
<h3 class="whs2">Zend Forums</h3>
<p class="whs3">Hosted user forums for the Zend product user 
 community. See what other users have to say and get answers directly from 
 the Zend Support team.</p>
<p class="whs3">Visit: <a href="http://www.zend.com/en/forums">http://www.zend.com/en/forums</a></p>
<h3 class="whs2">Zend Support Knowledge Base</h3>
<p class="whs3">The <a href="https://www.zend.com/en/support/knowledgebase.php">Zend 
 Knowledge Base</a> contains an extensive range of articles on commonly 
 encountered problems, troubleshooting, tips and workarounds.</p>
<p class="whs3">Search the Knowledge Base for any Zend product 
 related issue at <a href="https://www.zend.com/en/support/knowledgebase.php">https://www.zend.com/en/support/knowledgebase.php</a>.</p>
<h3 class="whs2">Online Documentation</h3>
<p class="whs3">The <a href="http://www.zend.com/en/resources/zend-documentation/">Zend 
 Product Online Documentation Center</a> is an easily browseable and searchable 
 resource for accessing the most updated information on using all Zend 
 Products.</p>
<p class="whs3">Visit: <a href="http://www.zend.com/en/resources/zend-documentation/" 
 target=_blank>http://www.zend.com/en/resources/zend-documentation/</a></p>
<h3 class="whs2">Open a Support Ticket</h3>
<p class="whs3">If you did not find the answer to your question 
 in any of the Support resources, you can open a ticket with the Zend Support 
 team, who will answer each ticket on an individual basis.</p>
<p class="whs3">This can be done through <a href="https://www.zend.com/en/helpdesk/newticket.php">https://www.zend.com/en/helpdesk/newticket.php</a>.</p>
<p class=Note style="margin-left: 40px;">Note:</p>
<p class=NoteText style="margin-left: 40px;">More information on specific 
 PDT 
 component errors is sometimes recorded in PDT's error log. 
 This is located in a '.log' file, created in the .metadata folder of your 
 workspace. (e.g. C:\Documents and Settings\Bob\Zend\Workspaces\DefaultWorkspace\.metadata\.log.)<br>
The information in this log can help the Zend Support team to diagnose 
 a specific problem.</p>
<h2><a name=Newsletter></a>Zend Newsletter</h2>
<p>Sign up for Zend PHP email updates for the hottest updates, special 
 promotions and useful developer information.</p>
<p>To sign up, log in to your Zend account at https://www.zend.com/en/user/myzend, 
 enter your email address and click Subscribe.</p>
<h2><a name=Developer_Zone></a>Zend Developer Zone</h2>
<p>The <a href="http://devzone.zend.com" target=_blank>Zend Developer Zone</a> 
 is the leading resource center for PHP developers, where you can learn 
 about PHP and meet the experts.<br>
The Zend Developer Zone features the following:</p>
<ul><li class=p-ListBullet1><p class=ListBullet1>&nbsp;The 
 PHP 5 Info Center </p></li>
	<li class=p-ListBullet1><p class=ListBullet1>&nbsp;Articles 
 and Tutorials &nbsp;</p></li>
	<li class=p-ListBullet1><p class=ListBullet1>&nbsp;PHP 
 and PEAR News Weeklies </p></li>
	<li class=p-ListBullet1><p class=ListBullet1>&nbsp;Worldwide 
 Job Classifieds &nbsp;</p></li>
</ul>
<p>Visit: <a href="http://devzone.zend.com">http://devzone.zend.com</a></p>
<h2>Feedback</h2>
<p>Send feedback, questions and comments on the Online Help and Documentation 
 to: <a href="mailto:documentation@zend.com">documentation@zend.com</a></p>
<div placeholder id="footer" class="whs4">
 <p align="right" class="whs5"><span 
 style="background-color: #ffffff; x-condition: Online, Product;">V</span>iew 
 the Zend Product <a href="http://www.zend.com/en/resources/zend-documentation/Zend-Studio/zend-studio.htm" 
 style="color: #000000; x-condition: Product, Online;">Online Documentation</a> 
 for the most up-to-date information.</p>
 <p align="right" class="whs6"><span style="background-color: #ffffff;"><a 
 href="javascript:crlf=&quot;
&quot;;h=location.href;t=document.title;e = &quot;&quot; + (window.getSelection ? window.getSelection() : document.getSelection ? document.getSelection() : document.selection.createRange().text); if (e!=null) location=&quot;mailto:documentation@zend.com&quot; + &quot;?Subject= Feedback on &quot; + escape(t) + &quot;&amp;Body=&quot; + escape(e).replace(/ /g, &quot;+&quot;) + crlf + &quot; &quot;; void 0" 
 style="x-condition: Online;">Submit Documentation Feedback</a></span></p>
 <p align="center" class="whs7">PHP Development 
 Tools</p>
 </div>
<script type="text/javascript" language="javascript1.2">
<!--
highlightSearch();
if (window.writeIntopicBar)
	writeIntopicBar(0);
if(0)
{

}
//-->
</script>
</body>
</html>
