Skip to content
Browse files

release-1.11.11

  • Loading branch information...
1 parent 33d7a56 commit 82d2aa6bf16dbf9eae139a50aba95d89a33d2490 @mridgway committed
Showing with 7,543 additions and 419 deletions.
  1. +1 −1 README.txt
  2. +2 −2 documentation/manual/en/module_specs/Zend_Cache-Backends.xml
  3. +2 −2 documentation/manual/en/module_specs/Zend_Controller-ActionHelpers-ContextSwitch.xml
  4. +1 −0 documentation/manual/en/module_specs/Zend_Form-StandardElements.xml
  5. +3 −3 documentation/manual/ja/module_specs/Zend_Cache-Backends.xml
  6. +3 −3 documentation/manual/ja/module_specs/Zend_Controller-ActionHelpers-ContextSwitch.xml
  7. +3 −3 documentation/manual/ja/module_specs/Zend_Db_Adapter.xml
  8. +105 −0 documentation/manual/pt-br/module_specs/Zend_Acl-Advanced.xml
  9. +184 −0 documentation/manual/pt-br/module_specs/Zend_Acl-Refining.xml
  10. +391 −0 documentation/manual/pt-br/module_specs/Zend_Acl.xml
  11. +788 −0 documentation/manual/pt-br/module_specs/Zend_Amf-Server.xml
  12. +1 −1 documentation/manual/pt-br/module_specs/Zend_Amf.xml
  13. +68 −0 documentation/manual/pt-br/module_specs/Zend_Application-AvailableResources-CacheManager.xml
  14. +101 −0 documentation/manual/pt-br/module_specs/Zend_Application-AvailableResources-Db.xml
  15. +31 −0 documentation/manual/pt-br/module_specs/Zend_Application-AvailableResources-Dojo.xml
  16. +427 −0 documentation/manual/pt-br/module_specs/Zend_Application-CoreFunctionality-Application.xml
  17. +19 −0 documentation/manual/pt-br/module_specs/Zend_Application-CoreFunctionality.xml
  18. +1 −1 documentation/manual/pt-br/module_specs/Zend_Application-Introduction.xml
  19. +1 −1 documentation/manual/pt-br/module_specs/Zend_Barcode-Creation.xml
  20. +1 −1 documentation/manual/pt-br/module_specs/Zend_Barcode-Introduction.xml
  21. +1 −1 documentation/manual/pt-br/module_specs/Zend_Barcode-Objects.xml
  22. +41 −1 documentation/manual/pt-br/module_specs/Zend_Barcode-Objects_Details.xml
  23. +56 −5 documentation/manual/pt-br/module_specs/Zend_Barcode-Renderers.xml
  24. +1 −1 documentation/manual/pt-br/module_specs/Zend_Captcha.xml
  25. +1 −1 documentation/manual/pt-br/module_specs/Zend_Config-Introduction.xml
  26. +1 −1 documentation/manual/pt-br/module_specs/Zend_Config-TheoryOfOperation.xml
  27. +1 −1 documentation/manual/pt-br/module_specs/Zend_Config_Ini.xml
  28. +76 −25 documentation/manual/pt-br/module_specs/Zend_Config_Writer.xml
  29. +1 −1 documentation/manual/pt-br/module_specs/Zend_Config_Xml.xml
  30. +1 −1 documentation/manual/pt-br/module_specs/Zend_Controller-Basics.xml
  31. +1 −1 documentation/manual/pt-br/module_specs/Zend_Controller-QuickStart.xml
  32. +16 −19 documentation/manual/pt-br/module_specs/Zend_Db_Adapter.xml
  33. +1 −1 documentation/manual/pt-br/module_specs/Zend_Db_Profiler-Firebug.xml
  34. +1 −1 documentation/manual/pt-br/module_specs/Zend_Dom.xml
  35. +1 −1 documentation/manual/pt-br/module_specs/Zend_Exception-Basic.xml
  36. +1 −1 documentation/manual/pt-br/module_specs/Zend_Exception-Previous.xml
  37. +1 −1 documentation/manual/pt-br/module_specs/Zend_Exception.xml
  38. +1 −1 documentation/manual/pt-br/module_specs/Zend_Form-Introduction.xml
  39. +1 −1 documentation/manual/pt-br/module_specs/Zend_Json-Basics.xml
  40. +1 −1 documentation/manual/pt-br/module_specs/Zend_Json-Introduction.xml
  41. +1 −1 documentation/manual/pt-br/module_specs/Zend_Json-Objects.xml
  42. +59 −5 documentation/manual/pt-br/module_specs/Zend_Json-xml2json.xml
  43. +3 −3 documentation/manual/pt-br/module_specs/Zend_Layout-Advanced.xml
  44. +1 −1 documentation/manual/pt-br/module_specs/Zend_Layout-Introduction.xml
  45. +1 −1 documentation/manual/pt-br/module_specs/Zend_Layout-Options.xml
  46. +1 −1 documentation/manual/pt-br/module_specs/Zend_Layout-QuickStart.xml
  47. +1 −1 documentation/manual/pt-br/module_specs/Zend_Paginator-Configuration.xml
  48. +1 −1 documentation/manual/pt-br/module_specs/Zend_Paginator-Introduction.xml
  49. +1 −1 documentation/manual/pt-br/module_specs/Zend_Pdf-Create.xml
  50. +18 −6 documentation/manual/pt-br/module_specs/Zend_Pdf-Drawing.xml
  51. +1 −1 documentation/manual/pt-br/module_specs/Zend_Pdf-Introduction.xml
  52. +10 −10 documentation/manual/pt-br/module_specs/Zend_Pdf-Pages.xml
  53. +1 −1 documentation/manual/pt-br/module_specs/Zend_Pdf-Properties.xml
  54. +1 −1 documentation/manual/pt-br/module_specs/Zend_Pdf-Save.xml
  55. +1 −1 documentation/manual/pt-br/module_specs/Zend_Search_Lucene-Advanced.xml
  56. +1 −1 documentation/manual/pt-br/module_specs/Zend_Search_Lucene-Charset.xml
  57. +1 −1 documentation/manual/pt-br/module_specs/Zend_Search_Lucene-Extending.xml
  58. +1 −1 documentation/manual/pt-br/module_specs/Zend_Search_Lucene-IndexCreation.xml
  59. +1 −1 documentation/manual/pt-br/module_specs/Zend_Search_Lucene-JavaLucene.xml
  60. +1 −1 documentation/manual/pt-br/module_specs/Zend_Search_Lucene-Overview.xml
  61. +1 −1 documentation/manual/pt-br/module_specs/Zend_Server.xml
  62. +1 −1 documentation/manual/pt-br/module_specs/Zend_Server_Reflection.xml
  63. +13 −1 documentation/manual/pt-br/module_specs/Zend_Service.xml
  64. +1 −1 documentation/manual/pt-br/module_specs/Zend_Test.xml
  65. +876 −0 documentation/manual/pt-br/module_specs/Zend_Tool-Extending.xml
  66. +596 −0 documentation/manual/pt-br/module_specs/Zend_Tool-Usage-CLI.xml
  67. +1 −1 documentation/manual/pt-br/module_specs/Zend_Version.xml
  68. +1 −1 documentation/manual/pt-br/module_specs/Zend_View-Controllers.xml
  69. +1 −1 documentation/manual/pt-br/module_specs/Zend_View-Helpers-HeadStyle.xml
  70. +4 −1 documentation/manual/pt-br/module_specs/Zend_View-Helpers.xml
  71. +43 −45 documentation/manual/pt-br/module_specs/Zend_View-Introduction.xml
  72. +1 −1 documentation/manual/pt-br/module_specs/Zend_View-Scripts.xml
  73. +1 −1 documentation/manual/pt-br/module_specs/Zend_Wildfire.xml
  74. +1 −1 documentation/manual/pt-br/ref/copyrights.xml
  75. +669 −0 documentation/manual/pt-br/ref/documentation-standard.xml
  76. +1 −1 documentation/manual/pt-br/ref/installation.xml
  77. +1 −1 documentation/manual/pt-br/ref/language-snippets.xml
  78. +1 −1 documentation/manual/pt-br/ref/overview.xml
  79. +1 −1 documentation/manual/pt-br/ref/performance-introduction.xml
  80. +1 −1 documentation/manual/pt-br/ref/requirements.xml
  81. +33 −0 documentation/manual/pt-br/tutorials/autoloading-intro.xml
  82. +21 −0 documentation/manual/pt-br/tutorials/layout-conclusions.xml
  83. +57 −0 documentation/manual/pt-br/tutorials/layout-intro.xml
  84. +247 −0 documentation/manual/pt-br/tutorials/layout-usage.xml
  85. +37 −0 documentation/manual/pt-br/tutorials/paginator-intro.xml
  86. +125 −0 documentation/manual/pt-br/tutorials/paginator-simple.xml
  87. +78 −0 documentation/manual/pt-br/tutorials/paginator-together.xml
  88. +62 −0 documentation/manual/pt-br/tutorials/plugins-conclusion.xml
  89. +57 −0 documentation/manual/pt-br/tutorials/plugins-intro.xml
  90. +159 −0 documentation/manual/pt-br/tutorials/plugins-usage.xml
  91. +538 −0 documentation/manual/pt-br/tutorials/quickstart-create-project.xml
  92. +120 −0 documentation/manual/pt-br/tutorials/quickstart-intro-mvc.xml
  93. +0 −2 externals/dojo/dijit/_HasDropDown.js
  94. +15 −7 externals/dojo/dijit/_editor/plugins/TextColor.js
  95. +5 −3 externals/dojo/dijit/form/Button.js
  96. +6 −4 externals/dojo/dijit/layout/StackContainer.js
  97. +99 −0 externals/dojo/dijit/tests/layout/StackContainer.html
  98. +2 −1 externals/dojo/dijit/tests/layout/module.js
  99. +16 −1 externals/dojo/dojox/grid/_FocusManager.js
  100. +1 −1 extras/library/ZendX/Exception.php
  101. +24 −24 extras/library/ZendX/JQuery/View/Helper/AjaxLink.php
  102. +39 −21 extras/tests/ZendX/JQuery/View/AjaxLinkTest.php
  103. +2 −1 library/Zend/Amf/Parse/Amf3/Deserializer.php
  104. +25 −3 library/Zend/Amf/Response/Http.php
  105. +2 −2 library/Zend/Amf/Value/Messaging/ArrayCollection.php
  106. +4 −2 library/Zend/Application/Bootstrap/BootstrapAbstract.php
  107. +1 −2 library/Zend/Cache/Backend/Sqlite.php
  108. +2 −2 library/Zend/CodeGenerator/Php/Class.php
  109. +2 −2 library/Zend/CodeGenerator/Php/Docblock/Tag/Param.php
  110. +5 −2 library/Zend/CodeGenerator/Php/File.php
  111. +2 −2 library/Zend/Controller/Request/Abstract.php
  112. +14 −1 library/Zend/Db.php
  113. +3 −3 library/Zend/Feed/Writer/Extension/RendererAbstract.php
  114. +13 −2 library/Zend/Filter/Input.php
  115. +17 −4 library/Zend/Form/Decorator/Captcha/ReCaptcha.php
  116. +11 −1 library/Zend/Form/Decorator/FormElements.php
  117. +4 −3 library/Zend/Form/Decorator/HtmlTag.php
  118. +18 −6 library/Zend/Form/Element.php
  119. +3 −3 library/Zend/Gdata/Docs.php
  120. +55 −1 library/Zend/Http/Client.php
  121. +2 −2 library/Zend/InfoCard/Xml/EncryptedData/XmlEnc.php
  122. +76 −36 library/Zend/Json.php
  123. +1 −1 library/Zend/Json/Server.php
  124. +1 −3 library/Zend/Json/Server/Response.php
  125. +3 −2 library/Zend/Ldap/Converter.php
  126. +9 −4 library/Zend/Ldap/Node.php
  127. +14 −6 library/Zend/Navigation/Container.php
  128. +95 −1 library/Zend/Navigation/Page.php
  129. +59 −8 library/Zend/Navigation/Page/Mvc.php
  130. +13 −2 library/Zend/Navigation/Page/Uri.php
  131. +2 −2 library/Zend/Oauth/Client.php
  132. +2 −2 library/Zend/Oauth/Config.php
  133. +4 −3 library/Zend/OpenId.php
  134. +2 −2 library/Zend/Reflection/Docblock/Tag/Param.php
  135. +3 −3 library/Zend/Reflection/Docblock/Tag/Return.php
  136. +78 −1 library/Zend/Service/Amazon/Sqs.php
  137. +3 −3 library/Zend/Tool/Project/Provider/Controller.php
  138. +47 −15 library/Zend/Tool/Project/Provider/Layout.php
  139. +2 −2 library/Zend/Version.php
  140. +4 −3 library/Zend/View/Helper/Form.php
  141. +6 −2 library/Zend/View/Helper/HtmlElement.php
  142. +2 −1 library/Zend/View/Helper/Navigation/Menu.php
  143. +4 −3 library/Zend/XmlRpc/Generator/XmlWriter.php
  144. +2 −2 resources/languages/ja/Zend_Validate.php
  145. +21 −1 tests/Zend/Cache/SqliteBackendTest.php
  146. +82 −0 tests/Zend/CodeGenerator/Php/FileTest.php
  147. +13 −0 tests/Zend/CodeGenerator/Php/_files/zf-11703.php
  148. +16 −0 tests/Zend/CodeGenerator/Php/_files/zf-11703_1.php
  149. +14 −1 tests/Zend/Controller/Request/SimpleTest.php
  150. +13 −1 tests/Zend/Dojo/Form/Element/DateTextBoxTest.php
  151. +13 −1 tests/Zend/Dojo/Form/Element/TimeTextBoxTest.php
  152. +101 −1 tests/Zend/Filter/InputTest.php
  153. +5 −2 tests/Zend/Form/Decorator/ReCaptchaTest.php
  154. +19 −1 tests/Zend/Form/FormTest.php
  155. +27 −1 tests/Zend/InfoCard/XmlParsingTest.php
  156. +26 −0 tests/Zend/InfoCard/_files/encryptedtoken2.xml
  157. +76 −1 tests/Zend/Json/JsonXMLTest.php
  158. +5 −4 tests/Zend/Json/Server/ResponseTest.php
  159. +1 −1 tests/Zend/Json/ServerTest.php
  160. +74 −1 tests/Zend/JsonTest.php
  161. +20 −3 tests/Zend/Ldap/ConverterTest.php
Sorry, we could not display the entire diff because it was too big.
View
2 README.txt
@@ -2,7 +2,7 @@ Welcome to the Zend Framework 1.11 Release!
RELEASE INFORMATION
---------------
-Zend Framework 1.11.10 Release ([INSERT REV NUM HERE]).
+Zend Framework 1.11.11 Release ([INSERT REV NUM HERE]).
Released on <Month> <Day>, <Year>.
SECURITY NOTICE FOR 1.11.6
View
4 documentation/manual/en/module_specs/Zend_Cache-Backends.xml
@@ -114,7 +114,7 @@
<row>
<entry><emphasis>cache_file_umask</emphasis></entry>
<entry><type>Integer</type></entry>
- <entry>0700</entry>
+ <entry>0600</entry>
<entry>umask for cache files</entry>
</row>
@@ -820,7 +820,7 @@ RewriteRule ^.*$ index.php [NC,L]
<row>
<entry><emphasis>cache_file_umask</emphasis></entry>
<entry><type>Integer</type></entry>
- <entry>0700</entry>
+ <entry>0600</entry>
<entry>umask for cached files.</entry>
</row>
View
4 documentation/manual/en/module_specs/Zend_Controller-ActionHelpers-ContextSwitch.xml
@@ -103,7 +103,7 @@ class NewsController extends Zend_Controller_Action
<itemizedlist>
<listitem>
<para>
- Set the 'Content-Type' response header to '<filename>text/xml</filename>'.
+ Set the 'Content-Type' response header to '<filename>application/xml</filename>'.
</para>
</listitem>
@@ -187,7 +187,7 @@ $this->_helper->contextSwitch()->setAutoJsonSerialization(false);
<listitem>
<para>
<emphasis><acronym>XML</acronym></emphasis>. The <acronym>XML</acronym> context
- sets the 'Content-Type' response header to '<filename>text/xml</filename>', and
+ sets the 'Content-Type' response header to '<filename>application/xml</filename>', and
the view script suffix to '<filename>xml.phtml</filename>'. You will need to
create a new view script for the context.
</para>
View
1 documentation/manual/en/module_specs/Zend_Form-StandardElements.xml
@@ -276,6 +276,7 @@ $location = $form->foo->getFileName();
</para>
</listitem>
</itemizedlist>
+ </para>
</note>
<para>
View
6 documentation/manual/ja/module_specs/Zend_Cache-Backends.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
-<!-- EN-Revision: 23148 -->
+<!-- EN-Revision: 24434 -->
<sect1 id="zend.cache.backends">
<title><classname>Zend_Cache</classname> のバックエンド</title>
<para>
@@ -106,7 +106,7 @@
<row>
<entry><emphasis>cache_file_umask</emphasis></entry>
<entry><type>Integer</type></entry>
- <entry>0700</entry>
+ <entry>0600</entry>
<entry>
キャッシュファイルの umask を設定します。
</entry>
@@ -737,7 +737,7 @@ RewriteRule ^.*$ index.php [NC,L]
<row>
<entry><emphasis>cache_file_umask</emphasis></entry>
<entry><type>Integer</type></entry>
- <entry>0700</entry>
+ <entry>0600</entry>
<entry>
umask for cached files.
</entry>
View
6 documentation/manual/ja/module_specs/Zend_Controller-ActionHelpers-ContextSwitch.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
-<!-- EN-Revision: 21824 -->
+<!-- EN-Revision: 24438 -->
<sect3 id="zend.controller.actionhelpers.contextswitch">
<title>ContextSwitch および AjaxContext</title>
@@ -98,7 +98,7 @@ class NewsController extends Zend_Controller_Action
<itemizedlist>
<listitem><para>
- レスポンスヘッダ 'Content-Type' を '<filename>text/xml</filename>' にします。
+ レスポンスヘッダ 'Content-Type' を '<filename>application/xml</filename>' にします。
</para></listitem>
<listitem><para>
@@ -174,7 +174,7 @@ $this->_helper->contextSwitch()->setAutoJsonSerialization(false);
<listitem>
<para>
<emphasis><acronym>XML</acronym></emphasis>。<acronym>XML</acronym> コンテキストは、
- 'Content-Type' レスポンスヘッダを '<filename>text/xml</filename>' に設定し、
+ 'Content-Type' レスポンスヘッダを '<filename>application/xml</filename>' に設定し、
ビュースクリプトのサフィックスを '<filename>xml.phtml</filename>' とします。
このコンテキスト用に、新しいビュースクリプトを作成する必要があります。
</para>
View
6 documentation/manual/ja/module_specs/Zend_Db_Adapter.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
-<!-- EN-Revision: 23282 -->
+<!-- EN-Revision: 24249 -->
<!-- Skip-EN-Revisions: 21358 -->
<sect1 id="zend.db.adapter">
@@ -661,7 +661,7 @@ $result = $db->fetchAll($sql, 2);
<para>
デフォルトでは、<methodname>fetchAll()</methodname>
は行の配列を返します。各行のデータは連想配列となります。
- 連署配列のキーは、列名かあるいは SELECT
+ 連想配列のキーは、列名かあるいは SELECT
クエリで指定した列の別名となります。
</para>
@@ -1714,7 +1714,7 @@ try {
</para>
<para>
- リリース 1.7.2 以降でしゃ、現在 <acronym>RDBMS</acronym> に接続しているかどうかを
+ リリース 1.7.2 以降では、現在 <acronym>RDBMS</acronym> に接続しているかどうかを
<methodname>isConnected()</methodname> メソッドで取得できます。
これは、コネクションリソースが初期化されたまままだ閉じられていないことを確認します。
現在のところ、たとえばサーバ側で接続が切断された場合などは検出することができません。
View
105 documentation/manual/pt-br/module_specs/Zend_Acl-Advanced.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 24249 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.acl.advanced">
+ <title>Uso Avançado</title>
+
+ <sect2 id="zend.acl.advanced.storing">
+ <title>Armazenando ACL para Persistência de Dados</title>
+
+ <para>
+ <classname>Zend_Acl</classname> foi projetado de uma maneira que não requer nenhuma
+ teconologia de backend em particular, como um banco de dados ou servidor de cache, para
+ armazenamento de dados <acronym>ACL</acronym>. Sua implementação completamente em
+ <acronym>PHP</acronym> permite que ferramentas personalizadas de admnistração sejam
+ construídas sob <classname>Zend_Acl</classname> com relativa facilidade e flexibilidade.
+ Muitas situações necessitam de alguma forma de manutenção da <acronym>ACL</acronym> e
+ <classname>Zend_Acl</classname> fornece métodos para estabelecer e consultar os
+ controles de acesso de uma aplicação.
+ </para>
+
+ <para>
+ O armazenamento dos dados da <acronym>ACL</acronym> é uma tarefa deixada para o
+ desenvolvedor, visto que espera-se que os casos de uso possam variar muito de acordo com
+ situações diversas. Por conta de <classname>Zend_Acl</classname> ser serializável,
+ objetos <acronym>ACL</acronym> podem ser serializados com a função
+ <ulink url="http://php.net/serialize"><methodname>serialize()</methodname></ulink> do
+ <acronym>PHP</acronym> e o resultado pode ser armazenado em qualquer lugar que o
+ desenvolvedor desejar, como um arquivo, banco de dados ou mecanismo de cache.
+ </para>
+ </sect2>
+
+ <sect2 id="zend.acl.advanced.assertions">
+ <title>Escrevendo Regras ACL Condicionais com Asserções</title>
+
+ <para>
+ Algumas vezes uma regra para permitir ou negar acesso de um papel a um recurso não deve
+ ser absoluta, mas dependente de vários critérios. Por exemplo, suponha que certo acesso
+ deva ser liberado, mas somente entre o horário entre 8h00 e 17h00. Outro exemplo seria
+ negar um acesso por conta de uma requisição vinda de um <acronym>IP</acronym> que foi
+ identificado como fonte de abuso. <classname>Zend_Acl</classname> foi construído para
+ suportar a implementação de regras baseadas em quaisquer condições que o desenvolvedor
+ necessitar.
+ </para>
+
+ <para>
+ <classname>Zend_Acl</classname> fornece suporte para regras condicionais com
+ <classname>Zend_Acl_Assert_Interface</classname>. Para utilizar a interface de asserção
+ de regra, o desenvolvedor escreve uma classe que implemente o método
+ <methodname>assert()</methodname> da interface:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+class CleanIPAssertion implements Zend_Acl_Assert_Interface
+{
+ public function assert(Zend_Acl $acl,
+ Zend_Acl_Role_Interface $role = null,
+ Zend_Acl_Resource_Interface $resource = null,
+ $privilege = null)
+ {
+ return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
+ }
+
+ protected function _isCleanIP($ip)
+ {
+ // ...
+ }
+}
+]]></programlisting>
+
+ <para>
+ Uma vez que uma classe de asserção está disponível, o desenvolvedor deve fornecer uma
+ instância de classe de asserção ao atribuir regras condicionais. Uma regra criada com
+ uma asserção somente se aplica quando o método de asserção retorna
+ <constant>TRUE</constant>.
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$acl = new Zend_Acl();
+$acl->allow(null, null, null, new CleanIPAssertion());
+]]></programlisting>
+
+ <para>
+ O código acima cria uma regra condicional que permite acesso a todos os priviégios, para
+ tudo e para todos, exceto quando o <acronym>IP</acronym> solicitante está em uma
+ "lista negra". Se a requisição vem de um <acronym>IP</acronym> que não é considerado
+ "confiável" a regra não se aplicará. Um vez que a regra se aplica a todos os papéis,
+ todos os recursos e todos os privilégios, um <acronym>IP</acronym> "não confiável"
+ resultará em uma recusa de acesso. Contudo, este é um caso especial, e deve ser
+ entendido que para todos os outros casos (ex., quando um papel específico, recurso ou
+ privilégio é especificado para a regra), um asserção falsa resultará na regra não sendo
+ aplicada, e outras regras serão utilizadas para determinar se o acesso é permitido ou
+ negado.
+ </para>
+
+ <para>
+ Ao método <methodname>assert()</methodname> de um objeto de asserção é passada a
+ <acronym>ACL</acronym>, o papel, recurso e privilégio de que a consulta de autorização
+ (ex., <methodname>isAllowed()</methodname>) se aplica, a fim de fornecer um contexto
+ para que a classe de asserção possa determinar se suas condições são necessárias.
+ </para>
+ </sect2>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->
View
184 documentation/manual/pt-br/module_specs/Zend_Acl-Refining.xml
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 24249 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.acl.refining">
+ <title>Refinando Controles de Acesso</title>
+
+ <sect2 id="zend.acl.refining.precise">
+ <title>Controles de Acesso Precisos</title>
+
+ <para>
+ A <acronym>ACL</acronym> básica definida na
+ <link linkend="zend.acl.introduction">seção anterior</link> mostra como vários
+ privilégios podem ser permitidos em toda a <acronym>ACL</acronym> (todos os recursos).
+ Contudo, na prática, controles de acesso tendem a possuir exceções e diversos níveis
+ de complexidade. <classname>Zend_Acl</classname> permite a você realizar estas melhorias
+ de uma forma simples e flexível.
+ </para>
+
+ <para>
+ Para o <acronym>CMS</acronym> de exemplo, foi determinado que, embora o grupo 'equipe'
+ cubra as necessidades da grande maioria dos usuários, há necessidade de um novo
+ grupo 'marketing', que necessita de acesso a newsletter e últimas notícias no
+ <acronym>CMS</acronym>. O grupo é quase auto-suficiente e terá a habilidade de publicar
+ e arquivar tanto newsletters como últimas notícias.
+ </para>
+
+ <para>
+ Adicionalmente, também foi solicitado que o grupo 'equipe' tenha acesso liberado para
+ visualizar notícias mas não possam revisar as notícias mais recentes. Finalmente, deve
+ ser impossível para qualquer um (inclusive adminsitradores) arquivar qualquer notícia
+ de 'comunicado', pois eles ficam visíveis por somente 1 ou 2 dias.
+ </para>
+
+ <para>
+ Primeiro, revisamos o registro de papéis para refletir estas alterações. Determinamos
+ que o grupo 'marketing' tem o mesmo conjunto básico de permissões que 'equipe',
+ portanto definimos 'marketing' de modo a herdar as permissões de 'equipe':
+ </para>
+
+ <programlisting language="php"><![CDATA[
+// O novo grupo 'marketing' herda permissões de 'equipe'
+$acl->addRole(new Zend_Acl_Role('marketing'), 'equipe');
+]]></programlisting>
+
+ <para>
+ Em seguida, note que os controles de acesso acima se referem a recursos específicos
+ (ex., "newsletter", "últimas notícias", "comunicados"). Agora vamos adicionar esses
+ recursos:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+// Create Resources for the rules
+
+// newsletter
+$acl->addResource(new Zend_Acl_Resource('newsletter'));
+
+// Notícias
+$acl->addResource(new Zend_Acl_Resource('notícias'));
+
+// Últimas notícias
+$acl->addResource(new Zend_Acl_Resource('últimas'), 'notícias');
+
+// Comunicados
+$acl->addResource(new Zend_Acl_Resource('comunicados'), 'notícias');
+]]></programlisting>
+
+ <para>
+ Então é simplesmente uma questão de definição dessas regras mais específicas para as
+ áreas da <acronym>ACL</acronym>:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+// Marketing deve publicar e arquivar newsletters e últimas notícias
+$acl->allow('marketing',
+ array('newsletter', 'últimas'),
+ array('publicar', 'arquivar'));
+
+// 'Equipe' (e 'Marketing', por herança) são negados a revisar últimas
+//notícias
+$acl->deny('equipe', 'últimas', 'revisar');
+
+// Todos (incluindo administradores) não podem arquivar notícias de comunicados
+$acl->deny(null, 'comunicados', 'arquivar');
+]]></programlisting>
+
+ <para>
+ Agora podemos consultar a <acronym>ACL</acronym>, respeitando as últimas alterações:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+echo $acl->isAllowed('equipe', 'newsletter', 'publicar') ?
+ "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('marketing', 'newsletter', 'publicar') ?
+ "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('equipe', 'últimas', 'publicar') ?
+ "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('marketing', 'últimas', 'publicar') ?
+ "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('marketing', 'últimas', 'arquivar') ?
+ "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('marketing', 'últimas', 'revisar') ?
+ "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('editor', 'comunicados', 'arquivar') ?
+ "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('administrador', 'comunicados', 'arquivar') ?
+ "permitido" : "negado";
+// negado
+]]></programlisting>
+ </sect2>
+
+ <sect2 id="zend.acl.refining.removing">
+ <title>Removendo Controles de Acesso</title>
+
+ <para>
+ Para remover um ou mais regras de acesso da <acronym>ACL</acronym>, simplesmente use os
+ métodos disponíveis <methodname>removeAllow()</methodname> ou
+ <methodname>removeDeny()</methodname>. Assim como <methodname>allow()</methodname> e
+ <methodname>deny()</methodname>, você pode fornecer um valor <constant>NULL</constant>
+ para indicar aplicação a todos os papéis, recursos e/ou privilégios:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+// Remove a recusa de revisão de últimas notícias para 'equipe' (e marketing,
+// por herança)
+$acl->removeDeny('equipe', 'últimas', 'revisar');
+
+echo $acl->isAllowed('marketing', 'últimas', 'revisar') ?
+ "permitido" : "negado";
+// permitido
+
+// Remove a permissão para publicar e arquivar newsletters para 'marketing'
+$acl->removeAllow('marketing',
+ 'newsletter',
+ array('publicar', 'arquivar'));
+
+echo $acl->isAllowed('marketing', 'newsletter', 'publicar') ?
+ "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('marketing', 'newsletter', 'arquivar') ?
+ "permitido" : "negado";
+// negado
+]]></programlisting>
+
+ <para>
+ Privilégios podem ser modificados incrementalmente, como indicado acima, mas um valor
+ <constant>NULL</constant> para privilégios sobrescreve tais mudanças incrementais:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+// Concede a 'marketing' todas as permissões sobre 'últimas notícias'
+$acl->allow('marketing', 'últimas');
+
+echo $acl->isAllowed('marketing', 'últimas', 'publicar') ?
+ "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('marketing', 'últimas', 'arquivar') ?
+ "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('marketing', 'útlimas', 'qualquer coisa') ?
+ "permitido" : "negado";
+// permitido
+]]></programlisting>
+ </sect2>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->
View
391 documentation/manual/pt-br/module_specs/Zend_Acl.xml
@@ -0,0 +1,391 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 24249 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.acl.introduction">
+ <title>Introdução</title>
+
+ <para>
+ <classname>Zend_Acl</classname> fornece uma implementação de lista de controle de acesso
+ (<acronym>ACL</acronym>, na sigla em inglês) leve e flexível para a gestão privilégios.
+ Em geral, uma aplicação pode utilizar essa <acronym>ACL</acronym> para controlar o acesso a
+ determinados objetos protegidos por outros objetos requerentes.
+ </para>
+
+ <para>
+ Para o propósito desta documentação:
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ Um <emphasis>recurso</emphasis> é um objeto cujo acesso é controlado
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Um <emphasis>papel</emphasis> é um objeto que pode solicitar acesso a um Recurso.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ De modo simples, <emphasis>papéis requisitam acesso a recursos</emphasis>. Por exemplo, se
+ um atendente de estacionamento solicita acesso ao um carro, o atendente é o papel
+ requisitante e o carro é o recurso, pois o acesso ao carro pode não ser garantido a qualquer
+ um.
+ </para>
+
+ <para>
+ Através da especificação e uso de uma <acronym>ACL</acronym>, uma aplicação pode controlar
+ como os papéis têm acesso aos recursos.
+ </para>
+
+ <sect2 id="zend.acl.introduction.resources">
+ <title>Recursos</title>
+
+ <para>
+ A criação de um recurso em <classname>Zend_Acl</classname> é muito simples.
+ <classname>Zend_Acl</classname> fornece um meio,
+ <classname>Zend_Acl_Resource_Interface</classname>, para facilitar a criação de recursos
+ em uma aplicação. Uma classe precisa apenas implementar esta interface, que consiste em
+ um único método, <methodname>getResourceId()</methodname>, para que
+ <classname>Zend_Acl</classname> reconheça o objeto como um recurso. Adicionalmente,
+ <classname>Zend_Acl_Resource</classname> é fornecida por <classname>Zend_Acl</classname>
+ como uma implementação básica de recurso para que desenvolvedores a extendam conforme
+ necessário.
+ </para>
+
+ <para>
+ <classname>Zend_Acl</classname> fornece uma estrutura de árvore na qual múltiplos
+ recursos podem ser adicionados. Como os recursos são armazenados em uma estrutura de
+ árvore, eles podem ser organizados do geral (em direção à raiz da árvore) para o
+ específico (em direção às folhas da árvore). Consultas em um recurso específico irá
+ automaticamente pesquisar sua hierarquia por regras definidas em recursos ancenstrais,
+ permitindo herança simplificada de regras. Por exemplo, se uma regra deve ser aplicada a
+ cada construção em uma cidade, pode-se simplesmente aplicar a regra à cidade, ao invés
+ de atribuir a mesma regra para cada construção. Contudo, algumas construções podem
+ necessitar de exceções para tal regra e isto pode ser feito em
+ <classname>Zend_Acl</classname> atribuindo tal exceção a cada construção que a
+ necessite. Um recurso pode descender de apenas um recurso pai, embora este recurso pai
+ pode possuir seu próprio pai, etc.
+ </para>
+
+ <para>
+ <classname>Zend_Acl</classname> também suporta privilégios em recursos (ex., "criar",
+ "ler", "atualizar", "excluir") e o desenvolvedor pode atribuir regras que afetam todos
+ os privilégios ou apenas privilégios específicos em um ou mais recursos.
+ </para>
+ </sect2>
+
+ <sect2 id="zend.acl.introduction.roles">
+ <title>Papéis</title>
+
+ <para>
+ Assim como recursos, criar um papel é também muito simples. Todos os papéis devem
+ implementar <classname>Zend_Acl_Role_Interface</classname>. Esta interface consiste
+ em um único método, <methodname>getRoleId()</methodname>. Adicionalmente,
+ <classname>Zend_Acl_Role</classname> é fornecida por <classname>Zend_Acl</classname>
+ como uma implementação de papel básica da qual desenvolvedores podem extender,
+ quando necessário.
+ </para>
+
+ <para>
+ Em <classname>Zend_Acl</classname>, um papel pode derivar de um ou mais papéis. Isto
+ é para suportar herança de regras através de papéis. Por exemplo, um papel de usuário,
+ tal como "sally", pode derivar de um ou mais papéis pai, como "editor" e
+ "administrador". O desenvolvedor pode atribuir regras para "editor" e "administrador"
+ separadamente, e "sally" herdará tais regras de ambos, sem a necessidade de atribuir
+ regras diretamente a "sally".
+ </para>
+
+ <para>
+ Embora a abilidade de herdaer de múltiplios papéis seja muito útil, herança múltipla
+ também introduz algum grau de complexidade. O exemplo a seguir ilustra a condição
+ ambígua e como <classname>Zend_Acl</classname> a soluciona.
+ </para>
+
+ <example id="zend.acl.introduction.roles.example.multiple_inheritance">
+ <title>Herança múltipla através de Papéis</title>
+
+ <para>
+ O código a seguir define três papéis fundamentais - "visitante", "membro" e
+ "admin" - dos quais outros papéis irão descender. Então, um papel identificado por
+ "algumUsuario" é estabelecido e descende dos outros três papéis. A ordem em que
+ estes papéis aparecem no array <varname>$parents</varname> é importante. Quando
+ necessário, <classname>Zend_Acl</classname> procura por regras de acesso definidas
+ não somente para o papél consultado (aqui, "algumUsuario"), mas também em papéis
+ do qual o papel consultado descende (aqui, "visitante", "membro" e "admin"):
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$acl = new Zend_Acl();
+
+$acl->addRole(new Zend_Acl_Role('visitante'))
+ ->addRole(new Zend_Acl_Role('membro'))
+ ->addRole(new Zend_Acl_Role('admin'));
+
+$parents = array('visitante', 'membro', 'admin');
+$acl->addRole(new Zend_Acl_Role('algumUsuario'), $parents);
+
+$acl->add(new Zend_Acl_Resource('algumRecurso'));
+
+$acl->deny('visitante', 'algumRecurso');
+$acl->allow('membro', 'algumRecurso');
+
+echo $acl->isAllowed('algumUsuario', 'algumRecurso') ? 'permitido' : 'negado';
+]]></programlisting>
+
+ <para>
+ Como não há regra especificamente definida para o papel "algumUsuario" e
+ "algumRecurso", <classname>Zend_Acl</classname> deve procurar por regras que tenham
+ sido definidas para papéis dos quais "algumUsuario" descende. Primeiro, o papel
+ "admin" é visitado e não há regra de acesso definida para ele. Depois, o papel
+ "membro" é visitado e <classname>Zend_Acl</classname> verifica que há uma regra
+ especificando que "membro" tem acesso permitido a "algumRecurso".
+ </para>
+
+ <para>
+ Se <classname>Zend_Acl</classname> continuar examinando as regras definidas para
+ outros papéis pai, contudo, ela encontrará que "visitante" tem acesso negado a
+ "algumRecurso". Este é o fato que introduz uma ambiguidade, pois agora
+ "algumUsuario" possui, ao mesmo tempo, acesso negado e permitido a "algumRecurso",
+ pelo motivo de herdar regras conflitantes de diferentes papéis pai.
+ </para>
+
+ <para>
+ <classname>Zend_Acl</classname> soluciona esta ambiguidade concluindo a consulta
+ quando ela encontra a primeira regra diretamente aplicável a consulta. Neste caso,
+ como o papel "membro" é examinado antes do papel "visitante", o código de exemplo
+ exibirá "permitido".
+ </para>
+ </example>
+
+ <note>
+ <para>
+ Quando especificando múltiplos pais para um papel, tenha em mente que o último pai
+ listado será o primeiro buscado para regras aplicáveis a uma consulta de
+ autorização.
+ </para>
+ </note>
+ </sect2>
+
+ <sect2 id="zend.acl.introduction.creating">
+ <title>Criando Listas de Controle de Acesso</title>
+
+ <para>
+ Uma Lista de Controle de Acesso (<acronym>ACL</acronym>, na sigla em inglês) pode
+ representar qualquer conjunto de objetos físicos ou virtuais que você desejar. Contudo,
+ para o propósito de demonstração, criaremos uma <acronym>ACL</acronym> básica de um
+ Sistema de Gerenciamento de Conteúdo (<acronym>CMS</acronym>, na sigla em inglês) que
+ mentém diversas camadas de grupos através de uma grande variedade de áreas. Para criar
+ um novo objeto <acronym>ACL</acronym>, instanciamos a <acronym>ACL</acronym> sem
+ parâmetros:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$acl = new Zend_Acl();
+]]></programlisting>
+
+ <note>
+ <para>
+ A menos que um desenvolvedor especifique uma regra "allow" (permitir - em inglês),
+ <classname>Zend_Acl</classname> negará acesso a todo privilégio em todo recurso para
+ todo papel.
+ </para>
+ </note>
+ </sect2>
+
+ <sect2 id="zend.acl.introduction.role_registry">
+ <title>Registrando Papéis</title>
+
+ <para>
+ O <acronym>CMS</acronym> irá quase sempre necessitar de uma hierarquia de permissões
+ para determinar as capacidades de autoridade de seus usuários. Pode haver um grupo
+ 'Visitante' para permitir acesso limitado para demonstrações, um grupo 'Equipe' para
+ que a maioria dos usuários do <acronym>CMS</acronym> que executam grande parte das
+ operações diárias, um grupo 'Editor' responsável pela publicação, revisão, arquivamento
+ e exclusão de conteúdo, e finalmente um grupo 'Administrador' cujas tarefas podem
+ incluir todas as de outros grupos bem como a manutenção de informações sensíveis,
+ gerenciamento de usuários, configuração de back-end, dados de configuração, cópias de
+ segurança e exportação. Este conjunto de permissões podem ser representadas em um
+ registro de papéis, permitindo a cada grupo herdar privilégios de grupos 'pai', assim
+ como fornecer privilégios distintos para grupos únicos. As permissões podem ser
+ expressas como:
+ </para>
+
+ <table id="zend.acl.introduction.role_registry.table.example_cms_access_controls">
+ <title>Controles de Acesso para um CMS de Exemplo</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Nome</entry>
+ <entry>Permissões Únicas</entry>
+ <entry>Permissões herdadas de</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>Visitante</entry>
+ <entry>Visualizar</entry>
+ <entry>N/D</entry>
+ </row>
+
+ <row>
+ <entry>Equipe</entry>
+ <entry>Editar, Enviar, Revisar</entry>
+ <entry>Visitante</entry>
+ </row>
+
+ <row>
+ <entry>Editor</entry>
+ <entry>Publicar, Arquivar, Excluir</entry>
+ <entry>Equipe</entry>
+ </row>
+
+ <row>
+ <entry>Administrador</entry>
+ <entry>(Todos os acessos garantidos)</entry>
+ <entry>N/D</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>
+ Para este exemplo, <classname>Zend_Acl_Role</classname> é usado, mas qualquer objeto
+ que implemente <classname>Zend_Acl_Role_Interface</classname> é aceitável. Estes
+ grupos podem ser adicionados ao registro de papéis, como a seguir:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$acl = new Zend_Acl();
+// Adiciona grupos ao registro de papéis usando Zend_Acl_Role
+// 'Visitante' não herda controles de acesso
+$roleGuest = new Zend_Acl_Role('visitante');
+$acl->addRole($roleGuest);
+
+// 'Equipe' descende de 'Visitante'
+$acl->addRole(new Zend_Acl_Role('equipe'), $roleGuest);
+
+/*
+Alternativamente, o código acima poderia ser escrito como:
+$acl->addRole(new Zend_Acl_Role('equipe'), 'visitante');
+*/
+
+// 'Editor' descende de 'Equipe'
+$acl->addRole(new Zend_Acl_Role('editor'), 'equipe');
+
+// 'Administrador' não herda controles de acesso
+$acl->addRole(new Zend_Acl_Role('administrator'));
+]]></programlisting>
+ </sect2>
+
+ <sect2 id="zend.acl.introduction.defining">
+ <title>Definindo Controles de Acesso</title>
+ <para>
+ Agora que a <acronym>ACL</acronym> contém os papéis relevantes, regras podem ser
+ estabelecidas para definir quais recursos podem ser acessados por quais papéis. Você
+ pode notar que não definimos nenhum recurso em particular para este exemplo, que é
+ simplificado para ilustrar que regras se aplicam a todos os recursos.
+ <classname>Zend_Acl</classname> fornece uma implementação onde regras necessitam apenas
+ serem atribuidas do caso geral para o específico, minimizando o número de regras
+ necessárias, pois recursos e papéis herdam regras definidas em seus ancestrais.
+ </para>
+
+ <note>
+ <para>
+ Em geral, <classname>Zend_Acl</classname> obedecerá uma regra dada se e somente se
+ uma regra mais específica não for aplicável.
+ </para>
+ </note>
+
+ <para>
+ Consequentemente, podemos definir um conjunto razoavelmente complexo de regras com o
+ mínimo de código. Para aplicar as permissões básicas, tal como definido acima:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$acl = new Zend_Acl();
+
+$roleGuest = new Zend_Acl_Role('visitante');
+$acl->addRole($roleGuest);
+$acl->addRole(new Zend_Acl_Role('equipe'), $roleGuest);
+$acl->addRole(new Zend_Acl_Role('editor'), 'equipe');
+$acl->addRole(new Zend_Acl_Role('administrador'));
+
+// 'Visitante' pode apenas visualizar conteúdo
+$acl->allow($roleGuest, null, 'visualizar');
+
+/*
+Alternatively, the above could be written:
+$acl->allow('visitante', null, 'visualizar');
+//*/
+
+// 'Equipe' herda privilégios de 'Visitante', porém precisa de
+// privilégios adicionais
+$acl->allow('equipe', null, array('editar', 'enviar', 'revisar'));
+
+// 'Editor' herda os privilégios visualizar, editar, enviar, e revisar de
+// 'Equipe', mas também precisa de privilégios adicionais
+$acl->allow('editor', null, array('publicar', 'arquivar', 'excluir'));
+
+// Administrador não herda nada, mas têm acesso a tudo
+$acl->allow('administrador');
+]]></programlisting>
+
+ <para>
+ Os valores <constant>NULL</constant> nas chamadas <methodname>allow()</methodname>
+ acima indicam que as regras para permitir acesso se aplicam a todos os recursos.
+ </para>
+ </sect2>
+
+ <sect2 id="zend.acl.introduction.querying">
+ <title>Consultando uma ACL</title>
+
+ <para>
+ Temos agora uma <acronym>ACL</acronym> flexível que pode ser usada para determinar quais
+ solicitantes têm permissão para executar funções através da aplicação web.
+ Realizar consultas é bastante simples usando o método
+ <methodname>isAllowed()</methodname>:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+echo $acl->isAllowed('visitante', null, 'visualizar') ?
+ "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('equipe', null, 'publicar') ?
+ "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('equipe', null, 'revisar') ?
+ "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('editor', null, 'visualizar') ?
+ "permitido" : "negado";
+// 'permitido' por conta da herança de 'visitante'
+
+echo $acl->isAllowed('editor', null, 'atualizar') ?
+ "permitido" : "negado";
+// 'negado' pois não há regra 'atualizar'
+
+echo $acl->isAllowed('administrador', null, 'visualizar') ?
+ "permitido" : "negado";
+// permitido, pois administrador é permitido a todos os privilégios
+
+echo $acl->isAllowed('administrador') ?
+ "permitido" : "negado";
+// permitido, pois administrador é permitido a todos os privilégios
+
+echo $acl->isAllowed('administrador', null, 'atualizar') ?
+ "permitido" : "negado";
+// permitido, pois administrador é permitido a todos os privilégios
+]]></programlisting>
+ </sect2>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->
View
788 documentation/manual/pt-br/module_specs/Zend_Amf-Server.xml
@@ -0,0 +1,788 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 24249 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.amf.server">
+ <title>Zend_Amf_Server</title>
+
+ <para>
+ <classname>Zend_Amf_Server</classname> fornece um servidor no estilo <acronym>RPC</acronym>
+ para manipular requisições feitas com Adobe Flash Player usando o protocolo
+ <acronym>AMF</acronym>. Como todas as classes de servidor do Zend Framework, ela segue a
+ <acronym>API</acronym> SoapServer, fornecendo uma interface fácil de lembrar para criar
+ servidores.
+ </para>
+
+ <example id="zend.amf.server.basic">
+ <title>Servidor AMF Básico</title>
+ <para>
+ Vamos assumir que você tenha criado uma classe <classname>Foo</classname> com uma
+ variedade de métodos públicos. Você pode criar um servidor <acronym>AMF</acronym> usando
+ o código a seguir:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$server = new Zend_Amf_Server();
+$server->setClass('Foo');
+$response = $server->handle();
+echo $response;
+]]></programlisting>
+
+ <para>
+ Alternativamente, você pode optar por atribuir uma simples função como chamada de
+ retorno:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$server = new Zend_Amf_Server();
+$server->addFunction('myUberCoolFunction');
+$response = $server->handle();
+echo $response;
+]]></programlisting>
+
+ <para>
+ Você também pode misturar e combinar várias classes e funções. Quando fizer isso,
+ sugerimos que utilize namespaces para que nenhuma colisão de nomes de métodos ocorra;
+ isso pode ser feito simplesmente passando uma string como segundo argumento, tanto para
+ <methodname>addFunction()</methodname> ou <methodname>setClass()</methodname>.
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$server = new Zend_Amf_Server();
+$server->addFunction('myUberCoolFunction', 'my')
+ ->setClass('Foo', 'foo')
+ ->setClass('Bar', 'bar');
+$response = $server->handle();
+echo $response;
+]]></programlisting>
+
+ <para>
+ O <classname>Zend_Amf_Server</classname> também permite que serviços sejam
+ dinamicamente carregados baseado em um caminho de diretório fornecido. Você pode
+ adicionar tantos quantos diretórios desejar ao servidor. A ordem em que você adiciona os
+ diretórios ao servidor será a ordem em que a pesquisa <acronym>LIFO</acronym> será
+ realizada nos diretórios para encontrar a classe. Adição de diretórios é feita com
+ o método <methodname>addDirectory()</methodname>.
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$server->addDirectory(dirname(__FILE__) .'/../services/');
+$server->addDirectory(dirname(__FILE__) .'/../package/');
+]]></programlisting>
+
+ <para>
+ Ao chamar serviços remotos, os nomes de seus fontes podem conter sublinhados ("_") e
+ pontos (".") como delimitadores de diretórios. Quando um sublinhado é usado, as
+ conveções <acronym>PEAR</acronym> e Zend Framework para nomenclaturas serão respeitadas.
+ Isso significa que se você chamar um serviço <filename>com_Foo_Bar</filename> o servidor
+ procurará pelo arquivo <filename>Bar.php</filename> em cada caminho incluído em
+ <filename>com/Foo/Bar.php</filename>. Se a notação de ponto é usada para seu serviço
+ remoto como em <filename>com.Foo.Bar</filename>, <filename>com/Foo/Bar.php</filename>
+ será adicionado ao final de cada caminho incluído para autocarregar
+ <filename>Bar.php</filename>
+ </para>
+
+ <para>
+ Todas as requisições <acronym>AMF</acronym> enviadas ao script serão manipuladas
+ posteriormente pelo servidor, e uma resposta <acronym>AMF</acronym> será retornada.
+ </para>
+ </example>
+
+ <note>
+ <title>
+ Todas as Funções e Métodos atribuídos precisam de Blocos de Documentação (Docblocks)
+ </title>
+
+ <para>
+ Como todos os componentes de servidor no Zend Framework, você precisa documentar seus
+ métodos de classe usando docblocks <acronym>PHP</acronym>. Você precisa fornecer,
+ no mínimo, anotações para cada argumento obrigatório assim como o valor de retorno.
+ Exemplo:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+// Função para atribuição:
+
+/**
+ * @param string $name
+ * @param string $greeting
+ * @return string
+ */
+function helloWorld($name, $greeting = 'Hello')
+{
+ return $greeting . ', ' . $name;
+}
+]]></programlisting>
+
+ <programlisting language="php"><![CDATA[
+// Classe atribuída
+
+class World
+{
+ /**
+ * @param string $name
+ * @param string $greeting
+ * @return string
+ */
+ public function hello($name, $greeting = 'Hello')
+ {
+ return $greeting . ', ' . $name;
+ }
+}
+]]></programlisting>
+
+ <para>
+ Outras anotações podem ser usadas, mas serão ignoradas.
+ </para>
+ </note>
+
+ <sect2 id="zend.amf.server.flex">
+ <title>Conectando ao servidor com Flex</title>
+
+ <para>
+ Conectar a seu <classname>Zend_Amf_Server</classname> a partir de seu projeto Flex é
+ bem simples; você simplesmente precisa apontar sua <acronym>URI</acronym> de ponto de
+ extremidade (endpoint) para seu script <classname>Zend_Amf_Server</classname>
+ </para>
+
+ <para>
+ Digamos, por exemplo, que você tenha criado seu servidor e o colocado no arquivo
+ <filename>server.php</filename> na raiz de sua aplicação, e seu <acronym>URI</acronym> é
+ <filename>http://example.com/server.php</filename>. Neste caso, você modificaria seu
+ arquivo <filename>services-config.xml</filename> para definir o atributo uri de ponto de
+ extremidade, <property>channel</property>, para este valor.
+ </para>
+
+ <para>
+ Se você nunca criou um arquivo <filename>services-config.xml</filename> você poderá
+ fazê-lo abrindo seu projeto na janela 'Navigator' do Flex Builder. Clique com o botão
+ direito sobre nome do projeto e selecione 'properties'. Na janela de diálogo de
+ propriedades do projeto vá para o menu 'Flex Build Path', aba 'Library path' e tenha
+ certeza de que o arquivo '<filename>rpc.swc</filename>' foi adicionado aos caminhos de
+ seus projetos e pressione 'Ok' para fechar a janela.
+ </para>
+
+ <para>
+ Você também precisará informar ao compilador para usar o arquivo
+ <filename>services-config.xml</filename> para encontrar o ponto de extremidade do
+ <classname>RemoteObject</classname>. Para isso, abra novamente o painel de propriedades
+ de seu projeto clicando com o botão direito do mouse no diretório do projeto a partir
+ da janela 'Navigator' e selecionando 'properties'. Na popup de propriedades selecione
+ 'Flex COmpiler' e adicione a seqüência de caracteres:
+ <command>-services "services-config.xml"</command>. Pressione 'Apply' e depois 'OK' para
+ voltar e atualizar a opção. O que você acabou de fazer foi dizer ao compilador Flex para
+ procurar por variáveis de tempo de execução no arquivo
+ <filename>services-config.xml</filename> que serão usadas pela classe
+ <classname>RemoteObject</classname>
+ </para>
+
+ <para>
+ Agora precisamos dizer ao Flex qual arquivo de configuração de serviços usar para
+ conectar a nossos métodos remotos. Por essa razão crie um novo arquivo
+ '<filename>services-config.xml</filename>' em seu diretório <filename>src</filename> do
+ seu projeto Flex. Pra fazer isso clique com o botão direito no diretório do projeto e
+ selecione 'new'; 'File' que uma nova janela se abrirá. Selecione o diretório do projeto
+ e nomeie o arquivo '<filename>services-config.xml</filename>' e pressione 'finish'.
+ </para>
+
+ <para>
+ O Flex criou um novo <filename>servies-config.xml</filename> e o abriu. Use o texto de
+ exemplo a seguir para seu arquivo <filename>services-config.xml</filename>. Tenha
+ certeza de atualizar seu ponto de extremidade (endpoint) para coincidir com seu servidor
+ de testes e que você salve o arquivo.
+ </para>
+
+ <programlisting language="xml"><![CDATA[
+<?xml version="1.0" encoding="UTF-8"?>
+<services-config>
+ <services>
+ <service id="zend-service"
+ class="flex.messaging.services.RemotingService"
+ messageTypes="flex.messaging.messages.RemotingMessage">
+ <destination id="zend">
+ <channels>
+ <channel ref="zend-endpoint"/>
+ </channels>
+ <properties>
+ <source>*</source>
+ </properties>
+ </destination>
+ </service>
+ </services>
+ <channels>
+ <channel-definition id="zend-endpoint"
+ class="mx.messaging.channels.AMFChannel">
+ <endpoint uri="http://example.com/server.php"
+ class="flex.messaging.endpoints.AMFEndpoint"/>
+ </channel-definition>
+ </channels>
+</services-config>
+]]></programlisting>
+
+ <para>
+ Há dois pontos chave no exemplo. Primeiro, mas por último na listagem, criamos um canal
+ <acronym>AMF</acronym> e especificados o poonto de extremidade (endpoint) como
+ <acronym>URL</acronym> para nosso <classname>Zend_Amf_Server</classname>:
+ </para>
+
+ <programlisting language="xml"><![CDATA[
+<channel-definition id="zend-endpoint"
+ <endpoint uri="http://example.com/server.php"
+ class="flex.messaging.endpoints.AMFEndpoint"/>
+</channel-definition>
+]]></programlisting>
+
+ <para>
+ Note que demos a este canal um identificador, "zend-endpoint". O exemplo cria um destino
+ de serviço que se refere a este canal, atribuindo a ele um ID também - neste caso
+ "zend".
+ </para>
+
+ <para>
+ Em nossos arquivos <acronym>MXML</acronym> do Flex, precisamos ligar um
+ <classname>RemoteObject</classname> ao serviço. Em <acronym>MXML</acronym>, isto é feito
+ como a seguir:
+ </para>
+
+ <programlisting language="xml"><![CDATA[
+<mx:RemoteObject id="myservice"
+ fault="faultHandler(event)"
+ showBusyCursor="true"
+ destination="zend">
+]]></programlisting>
+
+ <para>
+ Aqui, definimos um novo objeto remoto identificado por "myservice" ligado ao destino de
+ serviço "zend" que definimos no arquivo <filename>services-config.xml</filename>. Nós
+ depois chamamos métodos em nosso ActionScript simplesmente
+ chamando "myservice.&lt;método&gt;". Como no exemplo:
+ </para>
+
+ <programlisting language="ActionScript"><![CDATA[
+myservice.hello("Wade");
+]]></programlisting>
+
+ <para>
+ Quando usando espaços de nomes (namespaces), usamos:
+ "myservice.&lt;espaço de nome&gt;.&lt;método&gt;":
+ </para>
+
+ <programlisting language="ActionScript"><![CDATA[
+myservice.world.hello("Wade");
+]]></programlisting>
+
+ <para>
+ Para mais informações sobre como utilizar o <classname>RemoteObject</classname> do Flex,
+ <ulink url="http://livedocs.adobe.com/flex/3/html/help.html?content=data_access_4.html">
+ visite o site da Ajuda do Adobre Flex 3</ulink>.
+ </para>
+ </sect2>
+
+ <sect2 id="zend.amf.server.errors">
+ <title>Manipulação de Erros</title>
+
+ <para>
+ Por padrão, todas as exceções lançadas em suas classes ou funções anexadas serão obtidas
+ e retornadas como <classname>ErrorMessage</classname>s do <acronym>AMF</acronym>.
+ No entando, o conteúdos destes objetos <classname>ErrorMessage</classname> variam se
+ o servidor está ou não em modo de "produção" (o estado padrão).
+ </para>
+
+ <para>
+ Quando em modo de produção, somente o código da exceção será retornado. Se você
+ desabilitar o modo de produção - algo que você deve fazer apenas para testes - a maioria
+ dos detalhes de exceção serão retornados: a mensagem de exceção, linha, e
+ pilha de execução (backtrace) serão todos anexados.
+ </para>
+
+ <para>
+ Para desabilitar o modo de produção, faça o seguinte:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$server->setProduction(false);
+]]></programlisting>
+
+ <para>
+ Para habilitá-lo novamnete, passe um valor booleano <constant>TRUE</constant>:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$server->setProduction(true);
+]]></programlisting>
+
+ <note>
+ <title>Desabilite o modo de produção com moderação!</title>
+
+ <para>
+ Recomendamos desabilitar o modo de produção somente durante o desenvolvimento.
+ Mensagens de exceção e pilhas de execução podem conter informações sensíveis que
+ você provavelmente não deseje que terceiros tenham acesso. Mesmo
+ <acronym>AMF</acronym> sendo um formato binário, a especificação é aberta, o que
+ quer dizer que qualquer um pode, potencialmente, desserializar os dados carregados.
+ </para>
+ </note>
+
+ <para>
+ Uma área para ser especialmente cuidadoso são os próprios erros <acronym>PHP</acronym>.
+ Quando a diretiva <property>display_errors</property> do <acronym>INI</acronym> está
+ habilitada, qualquer erro <acronym>PHP</acronym> para o nível atual de reltório de erros
+ são mostrados diretamente na saída - potencialmente interrompendo a carga de dados
+ <acronym>AMF</acronym>. Sugerimos desabilitar a diretiva
+ <property>display_errors</property> em modo de produção para evitar tais problemas
+ </para>
+ </sect2>
+
+ <sect2 id="zend.amf.server.response">
+ <title>Respostas AMF</title>
+
+ <para>
+ Ocasionalmente você pode desejar manipular levemente o objeto de resposta, tipicamente
+ para retornar cabeçalhos de mensagem extra. O método <methodname>handle()</methodname>
+ do servidor retorna o objeto da resposta, possibilitando a você fazer isto.
+ </para>
+
+ <example id="zend.amf.server.response.messageHeaderExample">
+ <title>Adicionando Cabeçalhos de Mensagem à Resposta AMF</title>
+
+ <para>
+ Neste exemplo, adicionamos um <classname>MessageHeader</classname> 'foo' com o
+ valor 'bar' à resposta antes de retorná-la.
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$response = $server->handle();
+$response->addAmfHeader(new Zend_Amf_Value_MessageHeader('foo', true, 'bar'))
+echo $response;
+]]></programlisting>
+ </example>
+ </sect2>
+
+ <sect2 id="zend.amf.server.typedobjects">
+ <title>Objetos Tipados</title>
+
+ <para>
+ De modo similar ao <acronym>SOAP</acronym>, <acronym>AMF</acronym> permite que sejam
+ passados objetos entre o cliente e o servidor. Isso permite uma grande quantidade de
+ flexibilidade e coerência entre os dois ambientes.
+ </para>
+
+ <para>
+ <classname>Zend_Amf</classname> fornece três métodos para mapeamento entre objetos
+ ActionScript e <acronym>PHP</acronym>.
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ Primeiro, você deve criar explicitamente ligações no nível do servidor, usando o
+ método <methodname>setClassMap()</methodname>. O primeiro argumento é o nome da
+ classe ActionScript, o segundo é a classe <acronym>PHP</acronym> que a mapeia:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+// Mapeia a classe ActionScript 'ContactVO' para a classe PHP 'Contact':
+$server->setClassMap('ContactVO', 'Contact');
+]]></programlisting>
+ </listitem>
+
+ <listitem>
+ <para>
+ Em segundo lugar, você definir a propriedade pública
+ <varname>$_explicitType</varname> em sua classe <acronym>PHP</acronym>, com o
+ valor representando a classe ActionScript para mapear:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+class Contact
+{
+ public $_explicitType = 'ContactVO';
+}
+]]></programlisting>
+ </listitem>
+
+ <listitem>
+ <para>
+ Terceiro, de maneira similar, você pode definir o método público
+ <methodname>getASClassName()</methodname> em sua classe <acronym>PHP</acronym>;
+ este método deve retornar a classe ActionScript apropriada:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+class Contact
+{
+ public function getASClassName()
+ {
+ return 'ContactVO';
+ }
+}
+]]></programlisting>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ Embora tenhamos criado o ContactVO no servidor precisamos agora fazer a classe
+ correspondente em <acronym>AS3</acronym> para que o objeto de servidor seja mapeado.
+ </para>
+
+ <para>
+ Clique com o botão direito na pasta <filename>src</filename> de seu projeto Flex e
+ selecione 'New' -> 'ActionScript File'. Nomeie o arquivo como 'ContactVO' e pressione
+ 'finish' para ver o novo arquivo. Copie o seguinte código para finalizar a criação da
+ classe.
+ </para>
+
+ <programlisting language="as"><![CDATA[
+package
+{
+ [Bindable]
+ [RemoteClass(alias="ContactVO")]
+ public class ContactVO
+ {
+ public var id:int;
+ public var firstname:String;
+ public var lastname:String;
+ public var email:String;
+ public var mobile:String;
+ public function ContactVO():void {
+ }
+ }
+}
+]]></programlisting>
+
+ <para>
+ A classe é sintaticamente equivalente à classe <acronym>PHP</acronym> com o mesmo nome.
+ Os nomes de variáveis são exatamente os mesmos e precisam estar sob o mesmo caso para
+ que funcione apropriadamente. Existem duas marcações meta (meta tags)
+ <acronym>AS3</acronym> únicas nesta classe. A primeira é Bindable, que faz com
+ que um evento de alteração (change) seja disparado quando ela é atualizada. A segunda
+ marcação é RemoteClass, que define que esta classe pode ter um objeto remoto mapeado a
+ ela com um apelido, neste caso <emphasis>ContactVO</emphasis>. É obrigatório que o valor
+ desta marcação seja definido seja estritamente equivalente ao da classe
+ <acronym>PHP</acronym>.
+ </para>
+
+ <programlisting language="as"><![CDATA[
+[Bindable]
+private var myContact:ContactVO;
+
+private function getContactHandler(event:ResultEvent):void {
+ myContact = ContactVO(event.result);
+}
+]]></programlisting>
+
+ <para>
+ O evento de resultado gerado pela chamada ao serviço é instantaneamente convertido para
+ o ContactVO do Flex. Qualquer coisa que seja direcionada a <varname>myContact</varname>
+ será atualizado e os dados de ContactVO serão retornados.
+ </para>
+ </sect2>
+
+ <sect2 id="zend.amf.server.resources">
+ <title>Recursos</title>
+
+ <para>
+ <classname>Zend_Amf</classname> fornece ferramentas para mapear tipos de recursos
+ retornados por classes de serviços em informações consumíveis pelo ActionScript.
+ </para>
+
+ <para>
+ A fim de lidar com tipo de recurso específico, o usuário precisa criar uma classe plugin
+ chamado após o nome do recurso, com palavras em maiúsculas e espaços removidos (assim
+ recurso do tipo "resultado mysql" torna-se ResultadoMysql), com algum prefixo, ex.:
+ <classname>Meu_ResultadoMysql</classname>. Esta classe precisa implementar um método,
+ <methodname>parse()</methodname>, recebendo um argumento - o recurso - e retornando o
+ valor a ser enviado para o ActionScript. A classe deve estar localizada no arquivo
+ chamado após o nome do componente, ex.: <filename>ResultadoMysql.php</filename>.
+ </para>
+
+ <para>
+ O diretório contendo os plugins para manipulação de recursos devem ser registrados com o
+ carregador de tipo <classname>Zend_Amf</classname>:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+Zend_Amf_Parse_TypeLoader::addResourceDirectory(
+ "Meu",
+ "application/library/recursos/Meu"
+);
+]]></programlisting>
+
+ <para>
+ Para uma discussão detalhada sobre o plugins carregadores, por favor veja a seção
+ <link linkend="zend.loader.pluginloader">plugin carregador</link>.
+ </para>
+
+ <para>
+ O diretório padrão para recursos <classname>Zend_Amf</classname> é registrado
+ automaticamente e atualmente contém manipuladores para recursos "resultado mysql" e
+ "stream".
+ </para>
+
+ <programlisting language="php"><![CDATA[
+// Classe de exemplo implementando a manipulação de recursos do tipo "resultado mysql"
+class Zend_Amf_Parse_Recurso_ResultadoMysql
+{
+ /**
+ * Decodifica o recurso em uma matriz
+ *
+ * @param resource $resource
+ * @return array
+ */
+ public function parse($resource) {
+ $result = array();
+ while($row = mysql_fetch_assoc($resource)) {
+ $result[] = $row;
+ }
+ return $result;
+ }
+}
+]]></programlisting>
+
+ <para>
+ Ao tentar retornar um tipo desconhecido de recirso (ex., um para o qual não haja plugin
+ manipulador existente) resultará em uma exceção.
+ </para>
+ </sect2>
+
+ <sect2 id="zend.amf.server.flash">
+ <title>Conectando ao Servidor a partir do Flash</title>
+
+ <para>
+ Conectando ao seu <classname>Zend_Amf_Server</classname> a partir de seu projeto Flash é
+ ligeiramente diferente do que com Flex. Contudo, depois da conexão, Flash funciona com
+ <classname>Zend_Amf_Server</classname> da mesma forma que com Flex. O exemplo a seguir
+ também pode ser usado com um arquivo <acronym>AS3</acronym> do Flex. Reutilizaremos a
+ mesma configuração <classname>Zend_Amf_Server</classname> com a classe Mundo para nossa
+ conexão.
+ </para>
+
+ <para>
+ Abra o Flash CS e crie um novo arquivo Flash (ActionScript 3). Nomeie o documento
+ <filename>ExemploZend.fla</filename> e salve o documento em uma pasta que você usará
+ para este exemplo. Crie uma nova classe <acronym>AS3</acronym> no mesmo diretório e
+ nomeie o arquivo como <filename>Principal.as</filename>. Tenha ambos os arquivos abertos
+ em seu editor. Vamos conectar os dois arquivos através da classe de documento. Selecione
+ ExemploZend e clique no palco. No painel de propriedade dos palco, altere a classe de
+ documento (Document class) para Principal. Isso ligará o arquivo ActionScript
+ <filename>Principal.as</filename> com a interface do usuário do arquivo
+ <filename>ExemploZend.fla</filename>. Quando você executa o arquivo Flash ExemploZend, a
+ classe <filename>Principal.as</filename> será executada agora. Agora, vamos adicionar o
+ código ActionScript para fazer a chamada <acronym>AMF</acronym>.
+ </para>
+
+ <para>
+ Agora nós faremos a classe Principal de modo que possamos enviar dados ao servidor e
+ exibir o resultado. Copie o código a seguir para seu arquivo
+ <filename>Principal.as</filename> e depois vamos descrever, passo a passo, o papel de
+ cada elemento nele.
+ </para>
+
+ <programlisting language="as"><![CDATA[
+package {
+ import flash.display.MovieClip;
+ import flash.events.*;
+ import flash.net.NetConnection;
+ import flash.net.Responder;
+
+ public class Principal extends MovieClip {
+ private var gateway:String = "http://exemplo.com/server.php";
+ private var connection:NetConnection;
+ private var responder:Responder;
+
+ public function Principal() {
+ responder = new Responder(onResult, onFault);
+ connection = new NetConnection;
+ connection.addEventListener(NetStatusEvent.NET_STATUS, onComplete);
+ connection.connect(gateway);
+ }
+
+ public function onComplete( e:NetStatusEvent ):void {
+ if(e.info.code == "NetGroup.Connect.Succcess") {
+ var params = "Sent to Server";
+ connection.call("Mundo.alo", responder, params);
+ }
+ }
+
+ private function onResult(result:Object):void {
+ // Display the returned data
+ trace(String(result));
+ }
+ private function onFault(fault:Object):void {
+ trace(String(fault.description));
+ }
+ }
+}
+]]></programlisting>
+
+ <para>
+ Primeiro precisamos importar duas bibliotecas ActionScriot que executam a maior parte do
+ trabalho. A primeira é NetConnection que atua como um tubo bi-direcional entre o cliente
+ e o servidor. A segunda é o objeto Responder, que manipula os valores de retorno do
+ servidor relacionados ao sucesso ou falha da chamada.
+ </para>
+
+ <programlisting language="as"><![CDATA[
+import flash.net.NetConnection;
+import flash.net.Responder;
+]]></programlisting>
+
+ <para>
+ Na classe, precisamos de três variáveis para representar a NetConnection, Responder e a
+ <acronym>URL</acronym> da porta de entrada (gateway) para nossa instalação
+ <classname>Zend_Amf_Server</classname>.
+ </para>
+
+ <programlisting language="as"><![CDATA[
+private var gateway:String = "http://exemplo.com/server.php";
+private var connection:NetConnection;
+private var responder:Responder;
+]]></programlisting>
+
+ <para>
+ No contrutor de Principal criamos um respondedor e uma nova conexão ao
+ ponto de extremidade (gateway) <classname>Zend_Amf_Server</classname>. O respondedor
+ define dois métodos diferentes para manipular as respostas do servidor. Por simplicidade
+ eles foram chamados de onResult e onFault.
+ </para>
+
+ <programlisting language="as"><![CDATA[
+responder = new Responder(onResult, onFault);
+connection = new NetConnection;
+connection.addEventListener(NetStatusEvent.NET_STATUS, onComplete);
+connection.connect(gateway);
+]]></programlisting>
+
+ <para>
+ Na função onComplete, que é executada assim que o construtor tenha sido terminado, nós
+ enviamos dados ao servidor. Precisamos adicionar mais uma linha que realiza a chamada a
+ função Mundo->alo do <classname>Zend_Amf_Server</classname>
+ </para>
+
+ <programlisting language="as"><![CDATA[
+connection.call("Mundo.alo", responder, params);
+]]></programlisting>
+
+ <para>
+ Quando instanciamos a variável responder, definimos uma função onResult e onFault para
+ manipular a resposta do servidor. Adicionamos esta função para um resultado de sucesso
+ vindo do servidor. Um manipulador de eventos de sucesso é executado sempre que uma
+ conexão é manipulada apropriadamente no servidor.
+ </para>
+
+ <programlisting language="as"><![CDATA[
+private function onResult(result:Object):void {
+ // Mostra os dados retornados
+ trace(String(result));
+}
+]]></programlisting>
+
+ <para>
+ A função onFault é chamada se há uma resposta inválida vinda do servidor. Isso acontece
+ quando há um erro no servidor, a <acronym>URL</acronym> para o servidor é inválida, o
+ serviço remoto ou método não existe ou se há qualquer outro problema relacionado à
+ conexão.
+ </para>
+
+ <programlisting language="as"><![CDATA[
+private function onFault(fault:Object):void {
+ trace(String(fault.description));
+}
+]]></programlisting>
+
+ <para>
+ Completamos então a inclusão do ActionScript para realizar a conexão remota. Executando
+ o arquivo ExemploZend agora faz a conexão ao <classname>Zend_Amf</classname>. Numa
+ revisão, você adicionou as variáveis necessárias para abrir uma conexão ao servidor
+ remoto, definiu quais métodos devem ser usados em sua aplicação para receber respostas
+ do servidor e finalmente exibido os dados retornados através da função
+ <methodname>trace()</methodname>.
+ </para>
+ </sect2>
+
+ <sect2 id="zend.amf.server.auth">
+ <title>Autenticação</title>
+
+ <para>
+ <classname>Zend_Amf_Server</classname> permite que você especifique ganchos de
+ autentcação e autorização para controlar acesso aos serviços. Isso é feito usando a
+ infraestrutura fornecida pelos componentes
+ <link linkend="zend.auth"><classname>Zend_Auth</classname></link> e
+ <link linkend="zend.acl"><classname>Zend_Acl</classname></link>.
+ </para>
+
+ <para>
+ Para definir autenticação, o usuário fornece um adaptador de autenticação extendendo a
+ classe abstrata <classname>Zend_Amf_Auth_Abstract</classname>. O adaptador deve
+ implementar o método <methodname>authenticate()</methodname> como qualquer outro
+ <link linkend="zend.auth.introduction.adapters">adaptador de autenticação</link>.
+ </para>
+
+ <para>
+ O adaptador deve utilizar as propriedades <emphasis>_username</emphasis> e
+ <emphasis>_password</emphasis> da classe pai,
+ <classname>Zend_Amf_Auth_Adapter</classname>, para autenticar. Estes valores são
+ definidos pelo servidor usando o método <methodname>setCredentials()</methodname> antes
+ da chamada à <methodname>authenticate()</methodname> se as credenciais forem recebidas
+ nos cabeçalhos da requisição <acronym>AMF</acronym>.
+ </para>
+
+ <para>
+ A identidade retornada pelo adaptador deve ser um objeto contendo a propriedade
+ <property>role</property> para que o controle de acesso da <acronym>ACL</acronym>
+ funcione.
+ </para>
+
+ <para>
+ Se o resultado da autenticação não for bem sucedido, a requisição não é mais procesada e
+ uma mensagem de falha é retornada contendo as razões da falha obtida do resultado.
+ </para>
+
+ <para>
+ O adaptador é conectado ao servidor usando o método <methodname>setAuth()</methodname>:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$server->setAuth(new My_Amf_Auth());
+]]></programlisting>
+
+ <para>
+ O controle de acesso é realizado usando um objeto <classname>Zend_Acl</classname>
+ definido pelo método <methodname>setAcl()</methodname>:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$acl = new Zend_Acl();
+criarPermissoes($acl); // Cria a estrutura de permissões
+$server->setAcl($acl);
+]]></programlisting>
+
+ <para>
+ Se o objeto <acronym>ACL</acronym> é definido e a classe sendo chamada define o método
+ <methodname>initAcl()</methodname>, este método será chamado com o objeto
+ <acronym>ACL</acronym> como um argumento. A classe depois cria regras
+ <acronym>ACL</acronym> adicionais e retorna <constant>TRUE</constant>, ou retorna
+ <constant>FALSE</constant> se nenhum controle de acesso for necessário para esta classe.
+ </para>
+
+ <para>
+ Depois de a <acronym>ACL</acronym> ser definida, o servidor verificará se o acesso é
+ permitido com o papel definido pela autenticação, sendo o recurso o nome da classe (ou
+ <constant>NULL</constant> para chamadas de funções) e o privileǵio sendo o nome da
+ função. Se nenhuma autenticação for fornecida, e se o papel
+ <emphasis>anonymous</emphasis> foi definido, ele será usado, em outro caso o acesso será
+ negado.
+ </para>
+
+ <programlisting language="php"><![CDATA[
+if($this->_acl->isAllowed($role, $class, $function)) {
+ return true;
+} else {
+ require_once 'Zend/Amf/Server/Exception.php';
+ throw new Zend_Amf_Server_Exception("Accesso não permitido");
+}
+]]></programlisting>
+ </sect2>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->
View
2 documentation/manual/pt-br/module_specs/Zend_Amf.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 15786 -->
+<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.amf.introduction">
<title>Introdução</title>
View
68 documentation/manual/pt-br/module_specs/Zend_Application-AvailableResources-CacheManager.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 24312 -->
+<!-- Reviewed: no -->
+<sect2 id="zend.application.available-resources.cachemanager">
+ <title>Zend_Application_Resource_Cachemanager</title>
+
+ <para>
+ <classname>Zend_Application_Resource_Cachemanager</classname> pode ser
+ utilizado para configurar um conjunto de <classname>Zend_Cache</classname> opção
+ de pacotes para uso de caches de carregamento preguiçoso (lazy loading) usando
+ <classname>Zend_Cache_Manager</classname>
+ </para>
+
+ <para>
+ Cache Manager tem um mecanismo de carregamento preguiçoso (lazy loading), as opções são traduzidas
+ para modelos e usados para instanciar um objeto em requisição.
+ </para>
+
+ <example id="zend.application.available-resources.cachemanager.configExample">
+ <title>Exemplo de configuração do recurso Cachemanager</title>
+
+ <para>
+ Abaixo está um exemplo de arquivo <acronym>INI</acronym> mostrando como
+ <classname>Zend_Cache_Manager</classname> pode ser configurado. O formato
+ do recurso Cachemanager prefixo (<property>resources.cachemanager</property>)
+ seguido do name a ser atribuído para o modelo de cache ou pacote (e.g.
+ <property>resources.cachemanager.database</property>) e finalmente seguido por uma
+ típica <classname>Zend_Cache</classname> opção.
+ </para>
+
+ <programlisting language="ini"><![CDATA[
+resources.cachemanager.database.frontend.name = Core
+resources.cachemanager.database.frontend.customFrontendNaming = false
+resources.cachemanager.database.frontend.options.lifetime = 7200
+resources.cachemanager.database.frontend.options.automatic_serialization = true
+resources.cachemanager.database.backend.name = File
+resources.cachemanager.database.backend.customBackendNaming = false
+resources.cachemanager.database.backend.options.cache_dir = "/path/to/cache"
+resources.cachemanager.database.frontendBackendAutoload = false
+]]></programlisting>
+
+ <para>
+ Atualmente recuperar esse cache do Cache Manager é tão simples como
+ acessar uma instância do Manager (<classname>Zend_Cache_Manager</classname>)
+ recuparada de <classname>Zend_Application_Resource_Cachemanager</classname> e
+ chamando <methodname>Zend_Cache_Manager::getCache('database')</methodname>. O exemplo
+ abaixo é tirado de um controlador onde a classe de Inicialização da aplicação (bootstrap) pode ser acessada como
+ um parâmetro Front Controller (que é atribuído automaticamente durante a inicialização).
+ Como vocẽ pode ver, o Recurso Cache Manager implementa um método
+ <methodname>getCacheManager()</methodname> para recuperar uma instãncia
+ de <classname>Zend_Cache_Manager</classname>.
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$manager = $this->getFrontController()
+ ->getParam('bootstrap')
+ ->getPluginResource('cachemanager')
+ ->getCacheManager();
+$dbCache = $manager->getCache('database');
+]]></programlisting>
+
+ <para>
+ Veja método <methodname>Zend_Cache::factory()</methodname> para obter uma
+ descrição dos valores padrão que você pode atribuir ao configurar um
+ cache através de arquivo de configuração como exemplo <acronym>INI</acronym> acima.
+ </para>
+ </example>
+</sect2>
View
101 documentation/manual/pt-br/module_specs/Zend_Application-AvailableResources-Db.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 24249 -->
+<!-- Reviewed: no -->
+<sect2 id="zend.application.available-resources.db">
+ <title>Zend_Application_Resource_Db</title>
+
+ <para>
+ <classname>Zend_Application_Resource_Db</classname> irá inicializar um
+ <classname>Zend_Db</classname> adaptador com base nas opções passados para ele. Por
+ padrão, ele também define o adaptador como o adaptador padrão para uso com
+ <classname>Zend_Db_Table</classname>. Se você quiser usar múltiplas base de dados
+ simultaneamente, você pode usar o <link
+ linkend="zend.application.available-resources.multidb">Multidb Resource
+ Plugin</link>.
+ </para>
+
+ <para>
+ As chaves de configuração a seguir são reconhecidas:
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis><property>adapter</property></emphasis>: <classname>Zend_Db</classname>
+ tipo de adaptador.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ <emphasis><property>params</property></emphasis>: array associativo de parâmetros de
+ configuração para usar ao recuperar a instância do adaptador.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ <emphasis><property>isDefaultTableAdapter</property></emphasis>: se deve ou não
+ estabelecer esse adaptador como o adaptador padrão de tabela.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ <emphasis><property>defaultMetadataCache</property></emphasis>: o nome do modelo de
+ cache ou uma instãncia de <classname>Zend_Cache_Core</classname> para uso do
+ cache de metadados para <classname>Zend_Db_Table</classname>.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <example id="zend.application.available-resources.db.configExample">
+ <title>Exemplo de configuração do recurso DB</title>
+
+ <para>
+ Abaixo está um exemplo <acronym>INI</acronym> configuração que pode ser usada para inicializar
+ o recurso DB.
+ </para>
+
+ <programlisting language="ini"><![CDATA[
+[production]
+resources.db.adapter = "pdo_mysql"
+resources.db.params.host = "localhost"
+resources.db.params.username = "webuser"
+resources.db.params.password = "XXXXXXX"
+resources.db.params.dbname = "test"
+resources.db.isDefaultTableAdapter = true
+
+; Optionally you can also the cache template to use for metadata caching:
+resources.db.defaultMetadataCache = "database"
+]]></programlisting>
+ </example>
+
+ <note>
+ <title>Recuperar uma instância do Adaptador</title>
+
+ <para>
+ Se você optar por não fazer o adaptador instanciado com este
+ recurso o adaptador padrão de tabela, como você recupera a instância do
+ adaptador?
+ </para>
+
+ <para>
+ Como acontece com qualquer plugin recurso, você pode buscar o plugin recurso DB
+ a partir de seu bootstrap:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$resource = $bootstrap->getPluginResource('db');
+]]></programlisting>
+
+ <para>
+ Depois de ter o objeto recurso, você pode buscar o adaptador DB
+ usando o método <methodname>getDbAdapter()</methodname>:
+ </para>
+
+ <programlisting language="php"><![CDATA[
+$db = $resource->getDbAdapter();
+]]></programlisting>
+ </note>
+</sect2>
View
31 documentation/manual/pt-br/module_specs/Zend_Application-AvailableResources-Dojo.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 24249 -->
+<!-- Reviewed: no -->
+<sect2 id="zend.application.available-resources.dojo">
+ <title>Zend_Application_Resource_Dojo</title>
+
+ <para>
+ <classname>Zend_Application_Resource_Dojo</classname> pode ser usado
+ para configurar o <classname>Zend_Dojo</classname> viewhelpers.
+ </para>
+
+ <example id="zend.application.available-resources.dojo.configExample">
+ <title>Amostra de configuração do recurso Dojo</title>
+
+ <para>
+ Abaixo está um exemplo de arquivo <acronym>INI</acronym> mostrado como
+ <classname>Zend_Dojo</classname> pode ser habilitado.
+ </para>
+
+ <programlisting language="ini"><![CDATA[
+resources.dojo.enable = true ; Always load the Dojo javascript files
+]]></programlisting>
+
+ <para>
+ O <classname>Zend_Dojo</classname> plugin recurso utiliza as opções para o
+ <methodname>Zend_Dojo_View_Helper_Dojo_Container::setOptions()</methodname> para
+ configurar os viewhelpers. Consulte o <link linkend="zend.dojo">Zend_Dojo</link>
+ capítulo para obter as descrições completas e opções disponíveis.
+ </para>
+ </example>
+</sect2>
View
427 documentation/manual/pt-br/module_specs/Zend_Application-CoreFunctionality-Application.xml
@@ -0,0 +1,427 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 24249 -->
+<!-- Reviewed: no -->
+<sect2 id="zend.application.core-functionality.application">
+ <title>Zend_Application</title>
+
+ <para>
+ <classname>Zend_Application</classname> fornece a base da funcionalidade do componente, é o
+ ponto de entrada para sua aplicação Zend Framework. Seu propósito duplo: definir o ambiente
+ <acronym>PHP</acronym> (incluindo autocarregamento) e para executar a inicialização da
+ aplicação.
+ </para>
+
+ <para>
+ Tipicamenteo, você passará todas as configurações ao construtor de
+ <classname>Zend_Application</classname>, mas você também pode configurar inteiramente o
+ objeto usando seus próprios métodos. Esta referência é voltada a ilustrar ambos os casos.
+ </para>
+
+ <table id="zend.application.core-functionality.application.api.options">
+ <title>Opções de Zend_Application</title>
+
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Opção</entry>
+ <entry>Descrição</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><emphasis><property>phpSettings</property></emphasis></entry>
+
+ <entry>
+ <para>
+ Matriz de opções <filename>php.ini</filename> para utilizar. Chaves
+ devem devem ser as mesmas do <filename>php.ini</filename>.
+ </para>
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis><property>includePaths</property></emphasis></entry>
+
+ <entry>
+ <para>
+ Caminhos adicionais para acrescentar ao
+ <emphasis>include_path</emphasis>. Deve ser uma matriz de caminhos.
+ </para>
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis><property>autoloaderNamespaces</property></emphasis></entry>
+
+ <entry>
+ <para>
+ Matriz de espaços de nomes adicionais para registrar com a instância de
+ <classname>Zend_Loader_Autoloader</classname>.
+ </para>
+ </entry>
+ </row>
+
+ <row>
+ <entry><emphasis><property>bootstrap</property></emphasis></entry>
+
+ <entry>
+ <para>
+ Pode ser tanto uma sequência de caracteres (string) para o caminho da
+ classe de inicialização, ou uma matriz com elementos 'path' e 'class'
+ (caminho e classe, respectivamente) para a inicialização da aplicação.
+ </para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <note>
+ <title>Nomes das opções</title>
+
+ <para>
+ Tenha em mente que os nomes das opções são insensíveis ao caso.
+ </para>
+ </note>
+
+ <table id="zend.application.core-functionality.application.api.table">
+ <title>Métodos Zend_Application</title>
+
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Método</entry>
+ <entry>Valor de Retorno</entry>
+ <entry>Parameteros</entry>
+ <entry>Descrição</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>
+ <methodname>__construct($environment, $options = null)</methodname>
+ </entry>
+
+ <entry><type>Void</type></entry>
+
+ <entry>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <varname>$environment</varname>:
+ <emphasis>obrigatória</emphasis>,.
+ Sequência de caracteres representando o ambiente da aplicação
+ atual. Sequências típicas podem incluir "development",
+ "testing", "qa" ou "production" mas serão definidas por seus
+ requisitos organizacionais.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ <varname>$options</varname>: <emphasis>opcional</emphasis>.
+ O argumento pode ser um dos seguintes valores:
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis><type>String</type></emphasis>: path to
+ a <classname>Zend_Config</classname> file to load
+ as configuration for your application.
+ <varname>$environment</varname> will be used
+ to determine what section of the
+ configuration to pull.
+ </para>
+
+ <para>
+ As of 1.10, you may also pass multiple paths containing
+ config files to be merged into a single configuration.
+ This assists in reducing config duplication across many
+ contexts which share common settings (e.g. configs for
+ <acronym>HTTP</acronym>, or <acronym>CLI</acronym>, each
+ sharing some characteristics but with their own
+ conflicting values for others) or merely splitting a
+ long configuration across many smaller categorised
+ files. The parameter in this case is an array with a
+ single key "config" whose value is an array of the
+ files to merge. Note: this means you either pass a
+ literal path, or
+ <command>
+ array("config"=>array("/path1","/path2"[,...]));
+ </command>.