cvs: phpdoc-ca /chapters tutorial.xml

[email protected] ("Bernat Foj Capell") Tue, 30 Aug 2005 15:09:49 -0000
Newsgroups php.doc.ca
Message-ID <cvsjabro1125414589@cvsserver>
--jabro1125414589
Content-Type: text/plain

jabro		Tue Aug 30 11:09:49 2005 EDT

  Added files:                 
    /phpdoc-ca/chapters	tutorial.xml 
  Log:
  initial translation
  
--jabro1125414589
Content-Type: text/plain
Content-Disposition: attachment; filename="jabro-20050830110949.txt"


http://cvs.php.net/co.php/phpdoc-ca/chapters/tutorial.xml?r=1.1&p=1
Index: phpdoc-ca/chapters/tutorial.xml
+++ phpdoc-ca/chapters/tutorial.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.1 $ -->
<!-- EN-Revision: 1.37 Maintainer: jabro Status: ready -->
 <chapter id="tutorial">
  <title>Un simple tutorial</title>

  <para>
   Aquí ens agradaria ensenyar els bàsics del PHP en un tutorial simple
   i curt. Aquest text només tracta de creació de pàgines web dinàmiques
   amb el PHP, tot i que aquest no és només capaç de crear pàgines web.
   Vegeu la secció titulada <link linkend="intro-whatcando">Què pot fer el
   PHP</link> per a més informació.
  </para>
  <para>
   Les pàgines web amb contingut PHP es tracten igual que les pàgines
   HTML normals i les podeu crear i editar de la mateixa manera que creeu
   normalment les pàgines HTML normals.
  </para>

  <sect1 id="tutorial.requirements">
   <title>Què necessito?</title>
   <para>
    En aquest tutorial assumim que el vostre servidor té suport activat
    per al PHP i que tots els fitxers acabats en <filename>.php</filename>
    són manegats pel PHP. En la majoria de servidors, aquesta és l'extensió
    per defecte dels fitxers PHP, però pregunteu a l'administrador
    per estar-ne segur. Si el vostre servidor suporta PHP, llavors
    no necessiteu fer res. Simplement creeu els vostres fitxers 
    <filename>.php</filename>, poseu-los en el vostre directori
    web i el servidor automàticament els analitzarà per vosaltres.
    No hi ha necessitat de compilar res ni necessiteu instal·lar eines
    extra. Penseu en aquests fitxers amb contingut PHP com fitxers
    HTML normals amb una família sencera de nous marcadors màgics que 
    us permetran fer tot un munt de coses. Els servidors web ofereixen
    normalment suport per PHP, però si el vostre no ho fa, considereu
    el llegir la secció <ulink url="&url.php.links;">
    Enllaços PHP</ulink> per trobar servidors web amb el PHP habilitat.
   </para>
   <para>
    Deixeu-nos dir que voldreu estalviar el preciós ample de banda i
    desenvolupar localment. En aquest cas, voldreu instal·lar un servidor
    web, com ara 
    <ulink url="&url.apache;">Apache</ulink>, i per descomptat el 
    <ulink url="&url.php.downloads;">PHP</ulink>. Segurament també voldreu
    instal·lar una base de dades, com ara 
    <ulink url="&url.mysql.docs;">MySQL</ulink>.
   </para>
   <para>
    Podeu o bé instal·lar aquests elements individualment o bé triar una 
    manera més simple. El nostre manual disposa de <link linkend="install">instruccions
    d'instal·lació per al PHP</link> (assumint que ja teniu un servidor
    web muntat). En cas que tingueu problemes instal·lant el PHP vós mateix,
    us suggerim que formuleu les vostres preguntes a la nostra 
    <ulink url="&url.php.mailing-lists;">llista de correu d'instal·lació</ulink>. 
    Si en canvi voleu triar la ruta curta, llavors
    <ulink url="&url.installkits;">localitzeu un paquet preconfigurat</ulink>
    per al vostre sistema operatiu, el qual instal·la automàticament tot això
    en tot just uns quants clics de ratolí. És fàcil construir un servidor web
    amb suport PHP en qualsevol sistema operatiu, inclosos MacOSX, Linux i Windows.
    En Linux, pot ser que trobeu útils <ulink url="&url.rpmfind;">rpmfind</ulink> i
    <ulink url="&url.rpmfind.pbone;">PBone</ulink> per a localitzar els
    RPMs. Potser també voldreu visitar <ulink
     url="&url.apt-get;">apt-get</ulink> per a trobar paquets per a Debian.
   </para>
  </sect1>

  <sect1 id="tutorial.firstpage">
   <title>La vostra primera pàgina amb contingut PHP</title>
   <para>
    Creeu un fitxer anomenat <filename>hola.php</filename> i poseu-lo
    al directori web del vostre servidor web (<varname>DOCUMENT_ROOT</varname>) 
    amb el contingut següent:
   </para>
   <para>
    <example>
     <title>La nostra primera seqüència PHP: <filename>hola.php</filename></title>
     <programlisting role="php">
<![CDATA[
<html>
 <head>
  <title>Prova PHP</title>
 </head>
 <body>
 <?php echo '<p>Hola, món</p>'; ?>
 </body>
</html>
]]>
     </programlisting>
     <simpara>
      Utilitzeu el vostre navegador per accedir al fitxer a través de l'URL
      del vostre servidor, acabant amb la referència al fitxer "/hola.php".
      Si desenvolupeu localment aquest URL serà quelcom com ara
      <literal>http://localhost/hola.php</literal> 
      o <literal>http://127.0.0.1/hola.php</literal> però això depèn de la
      configuració del servidor web. Si tot està configurat correctament, 
      aquest fitxer serà analitzat pel PHP i s'enviarà la següent sortida
      al vostre navegador:
     </simpara>
     <screen role="html">
<![CDATA[
<html>
 <head>
  <title>Prova PHP</title>
 </head>
 <body>
 <p>Hola, món</p>
 </body>
</html>
]]>
     </screen>
    </example>
   </para>
   <para>
    Aquest programa és extremadament simple i realment no necessitàveu utilitzar
    PHP per crear una pàgina com aquesta. Tot el que fa és mostrar
    <literal>Hola, món</literal> utilitzant la sentència <function>echo</function>.
    Noteu que el fitxer <emphasis>no necessita ser executable</emphasis>
    o especial de cap manera. El servidor sap que aquest fitxer s'ha d'interpretar
    pel PHP perquè porta l'extensió ".php", amb la qual el servidor està configurat
    per a que la passi al processador PHP. Podeu pensar en això com un fitxer normal
    HTML que té un conjunt de marcadors especials disponibles que us permeten fer
    un munt de coses interessants.
   </para>
   <para>
    Si heu intentat aquest exemple i no ha sortit res, us ha preguntat si voleu
    descarregar-lo, o heu vist el fitxer sencer com a text, les possibilitats són
    que no hagueu habilitat el PHP al servidor, o que no estigui correctament
    configurat. Demaneu al vostre administrador que l'habiliti per vós usant
    el capítol <link linkend="install">Instal·lació</link> del manual. Si esteu 
    desenvolupant localment, llegiu també el capítol d'instal·lació per assegurar-vos
    que tot està configurat correctament. Assegureu-vos que accediu al fitxer
    via http amb el servidor que us proveeix la sortida. Si simplement crideu
    el fitxer des del sistema de fitxers, llavors el PHP no l'analitzarà. Si
    els problemes persisteixen, no dubteu a utilitzar alguna de les opcions
    <ulink url="&url.php.support;">d'ajuda PHP</ulink>.
   </para>
   <para>
    L'interès de l'exemple és mostrar el format del marcador especial del PHP.
    En aquest exemple hem usat <literal>&lt;?php</literal> per a indicar l'inici
    d'un marcador PHP. Llavors posem la sentència PHP i deixem el mode PHP tot
    afegint el marcador de clausura, <literal>?&gt;</literal>. Podeu entrar i
    sortir del mode PHP en un fitxer HTML com aquest on i quan volgueu. Per a més
    detalls, llegiu la secció del manual de la <link linkend="language.basic-syntax">
    sintaxi bàsica del PHP</link>.
   </para>
   
   <note>
    <title>Una nota sobre els editors de text</title>
    <para>
     Hi ha força editors de text i entorns integrats de desenvolupament (IDEs)
     que podeu usar per a crear, editar i gestionar els fitxers PHP. Una llista
     parcial d'aquestes eines es manté a <ulink url="&url.phpeditorlist;">Llista 
     d'editors PHP</ulink>. Si desitgeu recomanar un editor, si us plau, visiteu
     la pàgina anterior i demaneu al mantenidor de la pàgina que afegeixi l'editor
     a la llista. Tenir un editor amb ressaltat de sintaxi pot ser d'ajuda.
    </para>
   </note>
   
   <note>
    <title>Una nota sobre processadors Word</title>
    <para>
     Els processadors Word com ara el StarOffice Writer, el Microsoft Word i l'Abiword
     no són òptims per a l'edició de fitxers PHP. Si desitgeu usar un d'aquests 
     per a aquesta seqüència de prova, us heu d'assegurar que deseu el fitxer com
     a <emphasis>text pla</emphasis> o el PHP no podrà llegir i executar la seqüència.
    </para>
   </note>
   
   <note>
    <title>Una nota sobre la Llibreta de Windows</title>
    <para>
     Si esteu escrivint les vostres seqüències PHP amb la Llibreta de Windows
     (Bloc de notes), necessitareu assegurar-vos que els vostres fitxers es desen
     amb l'extensió .php (la Llibreta afegeix una extensió .txt als fitxers
     automàticament a no ser que feu un dels següents passos per a prevenir-ho).
     Quan deseu el fitxer i se us pregunta quin nom li voleu donar, poseu el nom
     del fitxer entre cometes (és a dir "<filename>hola.php</filename>"). Alternativament,
     podeu premer a la caixa 'Documents de text' del diàleg 'Desa' i canviar
     el paràmetre a 'Tots els fitxers'. Llavors podeu introduir el nom del fitxer
     sense cometes.
    </para>
   </note>
  
   <para>
    Ara que heu creat amb èxit una seqüència PHP que funciona, és hora de crear
    la seqüència PHP més famosa! Feu una crida a la funció
    <function>phpinfo</function> i veureu un munt d'informació útil sobre el
    vostre sistema i la seva configuració, com ara les
    <link linkend="language.variables.predefined">variables predefinides</link>
    disponibles, els mòduls PHP carregats i els paràmetres de  
    <link linkend="configuration">configuració</link>. Preneu-vos una mica de
    temps i reviseu aquesta informació important.
   </para>
   <para>
    <example>
     <title>Aconseguir informació de sistema del PHP</title>
     <programlisting role="php">
<![CDATA[
<?php phpinfo(); ?>
]]>
     </programlisting>
    </example>
   </para>
  </sect1>

  <sect1 id="tutorial.useful">
   <title>Quelcom útil</title>
   <para>
    Deixeu-nos fer ara quelcom més útil. Veureum quin tipus de navegador
    està usant el visitant. Per a això, revisem la cadena d'agent usuari
    que el navegador envia com a part de la demanda HTTP. Aquesta informació
    s'emmagatzema en una <link linkend="language.variables">variable</link>. 
    Les variables en PHP sempre han de començar amb un signe de dòlar. La 
    variable en què estem interessats ara mateix és <varname>$_SERVER['HTTP_USER_AGENT']</varname>.
   </para>
   <note>
    <para>
     <link linkend="reserved.variables.server">$_SERVER</link> és una 
     variable especial reservada del PHP que conté tota la informació del 
     servidor web. És coneguda com autoglobal (o superglobal). Vegeu la pàgina
     del manual relacionada a
     <link linkend="language.variables.superglobals">superglobals</link>
     per a més informació. Aquestes variables especials es van introduir al PHP 
     <ulink url="&url.php.release4.1.0;">4.1.0</ulink>. Abans d'aquest moment,
     usàvem les antigues matrius <varname>$HTTP_*_VARS</varname> en el seu
     lloc, com ara la <varname>$HTTP_SERVER_VARS</varname>. Tot i que són
     obsoletes, aquestes variables més velles encara existeixen. (Vegeu
     també la nota de
     <link linkend="tutorial.oldcode">codi antic</link>.)
    </para>
   </note>
   <para>
    Per a visualitzar aquesta variable, podeu fer simplement:
   </para>
   <para>
    <example>
    <title>Impressió d'una variable (element d'una matriu)</title>
    <programlisting role="php">
<![CDATA[
<?php echo $_SERVER['HTTP_USER_AGENT']; ?>
]]>
    </programlisting>
    <para>
     Un exemple de sortida d'aquesta seqüència pot ser:
    </para>
    <screen role="html">
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
    </screen>
   </example>
   </para>
   <para>
    Hi ha força <link linkend="language.types">tipus</link> de  
    variables disponibles al PHP. A l'exemple de dalt hem imprès 
    un element d'una <link linkend="language.types.array">Matriu</link>.
    Les matrius poden ser molt útils.
   </para>
   <para>
    <varname>$_SERVER</varname> és tan sols una variable que el PHP posa
    automàticament a la vostra disposició. Hi ha una llista que es pot veure
    a la secció <link linkend="reserved.variables">Variables reservades</link> 
    del manual o també en podeu aconseguir una llista completa mirant a la
    sortida de la funció <function>phpinfo</function> usada en l'exemple de
    la secció prèvia.
   </para>
   <para>
    Podeu posar múltiples sentències PHP dins dels marcadors PHP i crear
    petits blocs de codi que fan més que un simple echo. 
    Per exemple, si voleu verificar si té Internet Explorer 
    podeu fer això:
   </para>
   <para>
    <example>
     <title>Exemple que usa <link linkend="language.control-structures">estructures 
     de control</link> i <link linkend="language.functions">funcions</link></title>
     <programlisting role="php">
<![CDATA[
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
    echo 'Esteu usant Internet Explorer.<br />';
}
?>
]]>
     </programlisting>
     <para>
      Un exemple de sortida d'aquesta seqüència podria ser:
     </para>
     <screen role="html">
<![CDATA[
Esteu usant Internet Explorer.<br />
]]>
     </screen>
    </example>
   </para>
   <para>
    Aquí introduïm un parell de conceptes nous. Tenim una sentència 
    <link linkend="control-structures.if">if</link>.
    Si sou familiar amb la sintaxi bàsica del llenguatge C, això
    us hauria de semblar lògic. Altrament, probablement hauríeu 
    d'agafar un llibre introductori de PHP i llegir el primer parell
    de capítols, o llegir la part del manual de <link linkend="langref">Referència
    de llenguatge</link>. Podeu trobar una llista de llibres sobre PHP
    a <ulink url="&url.php.books;">&url.php.books;</ulink>.
   </para>
   <para>
    El segon concepte que hem introduït és la crida a la funció <function>strpos</function>. 
    <function>strpos</function> és una construida al PHP que
    cerca una cadena dins una altra cadena. En aquest cas
    estem cercant <literal>'MSIE'</literal> (l'anomenada agulla)
    dins de <varname>$_SERVER['HTTP_USER_AGENT']</varname> (l'anomenat 
    paller). Si l'agulla es troba dins del paller, la funció retorna
    la posició de l'agulla relativa a l'inici del paller. Altrament,
    retorna &false;.  Si no retorna &false;, l'expressió <link
    linkend="control-structures.if">if</link> s'evalua a &true;
    i el codi entre les {claus} s'executa. Altrament, el codi no
    s'executa. Sentiu-vos lliure de crear exemples similars, amb  
    <link linkend="control-structures.if">if</link>, 
    <link linkend="control-structures.else">else</link>, i altres 
    funcions com ara <function>strtoupper</function> i 
    <function>strlen</function>.  Cada pàgina del manual conté exemples,
    també. Si teniu dubtes sobre l'ús de funcions, voldreu llegiu
    tan la pàgina del manual sobre
    <link linkend="about.prototypes">com llegir una definició de funció</link>
    i la secció sobre  
    <link linkend="language.functions">funcions PHP</link>.
   </para>
   <para>
    Podem portar això més lluny i ensenyar-vos com podeu entrar i sortir
    del mode PHP àdhuc al mig d'un bloc PHP:
   </para>
   <para>
    <example>
     <title>Barrejar els modes PHP i HTML</title>
     <programlisting role="php">
<![CDATA[
<?php
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
?>
<h3>strpos() ha d'haver retornat no-fals</h3>
<p>Esteu usant Internet Explorer</p>
<?php
} else {
?>
<h3>strpos() ha d'haver retornat fals</h3>
<p>No esteu usant Internet Explorer</p>
<?php
}
?>
]]>
     </programlisting>
     <para>
      Un exemple de sortida d'aquesta seqüència podria ser:
     </para>
     <screen role="html">
<![CDATA[
<h3>strpos() ha d'haver retornat no-fals</h3>
<p>Esteu usant Internet Explorer</p>
]]>
     </screen>
    </example>
   </para>
   <para>
    En lloc d'utilitzar una sentència echo de PHP per treure alguna cosa, 
    hem sortit del mode PHP i simplement hem enviat HTML directament. El
    punt més important i poderós que cal notar és que el flux lògic de la
    seqüència roman intacte. Només un dels blocs HTML al final es mostrarà
    al visitant depenent del resultat de <function>strpos</function>. 
    En altres paraules, depenent de si la cadena <literal>MSIE</literal> 
    es troba o no.
   </para>
  </sect1>
   
  <sect1 id="tutorial.forms">
   <title>Tractament de formularis</title>
   <para>
    Una de les característiques més potents del PHP és la forma amb què
    gestiona els formularis HTML. El concepte bàsic que és important
    entendre és que qualsevol element de formulari estarà disponible
    automàticament a les vostres seqüències PHP. Si us plau, llegiu
    la secció del manual de <link linkend="language.variables.external">Variables 
    de fora el PHP</link> per a més informació i exemples sobre l'ús
    de formularis amb PHP. Heus aquí un exemple de formulari HTML:
   </para>
   <para>
    <example>
     <title>Un formulari HTML simple</title>
     <programlisting role="html">
<![CDATA[
<form action="action.php" method="post">
 <p>El vostre nom: <input type="text" name="nom" /></p>
 <p>La vostra edat: <input type="text" name="edat" /></p>
 <p><input type="submit" /></p>
</form>
]]>
     </programlisting>
    </example>
   </para>
   <para>
    No hi ha res especial en aquest formulari. És un formulari directament
    en HTML sense marcadors especials de cap tipus. Quan l'usuari omple
    el formulari i prem el botó d'enviar, es crida la pàgina 
    <filename>action.php</filename>. En aquest fitxer escriuríem quelcom
    com ara això:
   </para>
   <para>
    <example>
     <title>Impressió de dades del nostre formulari</title>
     <programlisting role="php">
<![CDATA[
Hola <?php echo $_POST['nom']; ?>.
Tens <?php echo $_POST['edat']; ?> anys.
]]>
     </programlisting>
     <para>
      Un exemple de sortida d'aquesta seqüència podria ser:
     </para>
     <screen role="html">
<![CDATA[
Hola Joan. Tens 22 anys.
]]>
     </screen>
    </example>
   </para>
   <para>
    Hauria de ser obvi veure què fa. No hi ha res més.
    Les variables <varname>$_POST['nom']</varname> i <varname>$_POST['edat']</varname>
    les prepara automàticament el PHP per a vós. Prèviament hem usat
    l'autoglobal <varname>$_SERVER</varname>; a dalt acabem d'introduir
    l'autoglobal <link linkend="reserved.variables.post">$_POST</link>
    la qual conté totes les dades POST. Noteu com el
    <emphasis>method</emphasis> del nostre formulari és POST.  Si haguéssim 
    usat el mètode <emphasis>GET</emphasis>, llavors la nostra informació
    seria a l'autoglobal <link linkend="reserved.variables.get">$_GET</link>.
    Podeu també usar l'autoglobal <link linkend="reserved.variables.request">$_REQUEST</link>,
    si no voleu preocupar-vos de l'origen de les vostres dades. Aquesta
    conté informació barrejada de les dades de GET, POST i COOKIE. També
    vegeu la funció <function>import_request_variables</function>.
   </para>
   <para>
    Podeu tractar també amb entrades de dades XForms en PHP, tot i que
    us trobareu còmodes amb els formularis HTML durant un bon temps.
    Tot i que treballar amb XForms no és per a principiants, pot ser que
    hi esteu interessat. Tenim una <link linkend="features.xforms">petita
    introducció de gestió de dades rebudes d'XForms</link> a la secció de
    característiques. 
   </para>
  </sect1>

  <sect1 id="tutorial.oldcode">
   <title>Ús de codi antic amb noves versions del PHP</title>
   <para>
    Ara que el PHP ha crescut fins a ser un llenguatge de seqüències popular,
    hi ha un munt de repositoris públics i biblioteques que contenen codi que
    podeu reutilitzar. Els desenvolupadors PHP han tractat força de preservar
    la compatibilitat cap enrera, així que una seqüència escrita per a una 
    versió més antiga funcionarà (idealment) sense canvis en una versió més
    nova del PHP. A la pràctica, es necessitaran fer alguns canvis.
   </para>
   <para>
    Dos dels canvis recents més importants que afecten el codi vell són:
    <itemizedlist>
     <listitem>
      <simpara>
       L'obsoletització de les antigues matrius <varname>$HTTP_*_VARS</varname>
       (les quals s'han d'indicar com a global quan s'usen dins una funció o un
       mètode). Les
       <link linkend="language.variables.superglobals">matrius autoglobals</link>
       següents es van introduir al PHP <ulink url="&url.php.release4.1.0;">4.1.0</ulink>. 
       Són: <varname>$_GET</varname>, <varname>$_POST</varname>, 
       <varname>$_COOKIE</varname>, <varname>$_SERVER</varname>, 
       <varname>$_FILES</varname>, <varname>$_ENV</varname>,
       <varname>$_REQUEST</varname>, i <varname>$_SESSION</varname>.  Les
       antigues matrius <varname>$HTTP_*_VARS</varname>, com ara
       <varname>$HTTP_POST_VARS</varname>, encara existeixen tal com han fet des del PHP 3. 
       &avail.register-long-arrays;
      </simpara>
     </listitem>
     <listitem>
      <simpara>
       Ja no es registren variables externes en l'àmbit global per defecte.
       En altres paraules, des del PHP
       <ulink url="&url.php.release4.2.0;">4.2.0</ulink> la directiva PHP 
       <link linkend="ini.register-globals">register_globals</link> està 
       <emphasis>off</emphasis> (desactivada) per defecte al &php.ini;. El 
       mètode preferit d'accedir a aquests valors és via les matrius autoglobals
       mencionades abans. Les seqüències velles, llibres i tutorials pot ser
       que confiïn que aquesta directiva està activada. Si ho estés, per exemple,
       hom podria usar <varname>$id</varname> de l'URL 
       <literal>http://www.example.com/foo.php?id=42</literal>. Estigui o no 
       activat, <varname>$_GET['id']</varname> sempre està disponible.
      </simpara>
     </listitem>
    </itemizedlist>
    Per a més detalls d'aquests canvis, vegeu la secció de 
    <link linkend="language.variables.predefined">variables predefinides</link>
    i els enllaços que hi ha.
   </para>
  </sect1>
  
  <sect1 id="tutorial.whatsnext">
   <title>I ara què ve?</title>
   <para>
    Amb el vostre nou coneixement hauríeu de poder entendre la
    majoria del manual i també les diverses seqüències d'exemple
    disponibles als arxius d'exemple. També podeu trobar altres 
    exemples dels webs php.net a la secció d'enllaços:
    <ulink url="&url.php.links;">&url.php.links;</ulink>.
   </para>
   <para>
    Per a veure diverses presentacions de diapositiva que mostren
    més del què el PHP pot fer, vegeu els Llocs de material de
    conferències PHP: <ulink url="&url.php.conf;">
    &url.php.conf;</ulink> i <ulink url="&url.php.talks;">&url.php.talks;
    </ulink>
   </para>
  </sect1>
 </chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->


--jabro1125414589--