<!--
-File $Id: AdvancedObjectModel.html,v 1.2 2005/03/22 02:47:50 hlellelid Exp $
-License GNU FDL (http://www.gnu.org/copyleft/fdl.html)
-Copyright 2003, Propel project
-Author Hans Lellelid, hide@address.com
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Propel Guide</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<link rel="Stylesheet" rev="Stylesheet" href="../css/Documentation.css" type="text/css" charset="iso-8859-1"/>
</head>
<body>
<h1>Modelo Avanzado de Objetos</h1>
<p>En este capitulo revisaremos algunas opciones avanzadas para el modelo de objetos de Propel.</p>
<h2><a name="AdvancedOM.OverridingBaseClasses"></a>Overriding
Base Classes</h2>
<h3>Para Objectos</h3>
<p>Por defecto todas las clases base objeto se extienden de la clase <strong>propel.om.BaseObject</strong>,
la cual provee un juego compartido de métodos y propiedades que los objetos usan
para trazar sus estados de modificación.En lugar de eso en algunos casos usted puede
querer especificar una subclase <strong>BaseObject(objeto base)</strong> para usarla ; usted puede
hacer esto desde los datos de definición en XML:</p>
<pre title="Overriding base object class"><table name="book" idMethod="native" baseClass="bookstore.BookstoreComponent"></pre>
<p>Note que usted debe usar la notación de ruta con punto(en lugar de /) cuando especifica la nueva clase base,
como la clase debe ser incluida antes de que sea referenciada. La notación punto
especifica una ruta relativa a una locación en el <em>include_path</em> de PHP. Ahora
la clase generada BaseBook extendera de BookstoreComponent. Note que <strong>BookstoreComponent</strong>
debe extender a <strong>BaseObject</strong>, o PHP generara un error fatal cuando
usted intente usar su objeto generado o clasee peer. </p>
<pre title="overriding base object class PHP code">require_once 'bookstore/BookstoreComponent.php';
class BaseBook extends BookstoreComponent {</pre>
<h3>Para Peers</h3>
<p>Por defecto todas las clases base peer no tienen una super clase. Usted puede querer especificar
una clase base peer -- ej. proveer algunas funcionalidades adicionales compartidas usadas por su
modelo objeto.</p>
<p>Como con la clase objeto base, cambiar la clase base peer es posible en el
archivo de definicion XML:</p>
<pre title="Overriding base object class"><table name="book" idMethod="native" basePeer="BookstorePeer"></pre>
<p>como usted lo esperaba, la clase <strong>BaseBookPeer</strong> ahora extiende de <strong>BookstorePeer</strong>
en lugar de <strong>BasePeer</strong>. Esta clase debe proveer todos los métodos publicos y protejidos
de <strong>BasePeer</strong>.</p>
<h2><a name="AdvancedOM.Inheritance"></a>Inheritance</h2>
<p>Propel provee un soporte básico para implementar herencia orientada a onjetos
(subclases) de su objeto de modelos. Hay varias opciones de implementación para
mapear clases entidades y subclases para las tablas de bases de datos. Propel usa la mayoria
de modelos eficientes desde SQL y perspectivas optimas de consulta: una tabla es usada
para todas las subclases. Esto tiene la implementación que su tabla debe tener en todas las columnas
necesitadas por la calse principal y las subclases. Propel creará subclases tropiezo, pero
usted debe adicionar logica a la clase peer si requiere que la subclases sólo contenga
un subjuego de la infomación -- por dedfecto todas las subclases seran popularizadas
con la entera columna fila.</p>
<p>Usted debe definir un columna en su tabla que servirá para identificar que clase
debe ser usada para representar la tabla fila; haga esto usando el atributo <strong>inheritance="single"
</strong> (actualmente "single" es la única otra opción aparte de la
que es por defecto, "false"). También el árbol de herencia es conocido, usted
debe usar la etiqueta <strong><inheritance></strong> para especificar la clase
heredada. <em>Note que esta 'llave' columna debe ser una columna real en su tabla.</em></p>
<pre title="example of inheritance definition"><table name="publication">
<column name="id" type="INTEGER" primaryKey="true"/>
<column name="class_key" type="INTEGER" inheritance="single">
<inheritance key="1" class="Journal" extends="bookstore.Publication"/>
<inheritance key="2" class="Magazine" extends="bookstore.Journal"/>
</column>
<column name="title" type="VARCHAR" size="100"/>
</table></pre>
<p><em><strong>Importante:</strong> Usted debe especificar el paquete prefijo cuando la clase
pariente (extends="package.ClassName") para que esas clases
puedan ser correctamente incluidas en loa lto de las definiciones de subclase; como sea, usted
no puede especificar un paquete para las subclases, porque Propel sólo construye un
paquete a la vez (el unico especificado por la propiedad ${propel.targetPackage}
en <tt>build.properties</tt>) y es requerido que la subclase sea parte
del paquete que usted esta construyendo actualmente. Concevible, las clases pariente
pueden ser parte de un paquete separado.</em></p>
<p>El código anterior resultará en la creación de 2 clases base -- <strong>BasePublicationPeer</strong>
y <strong>BasePublication</strong><em> </em>-- y 4 subclases stub -- <strong>PublicationPeer</strong>,
<strong>Publication</strong>, <strong>Journal</strong><em> </em>(extiende de <strong>Publication</strong><em>)</em>,
y <strong>Magazine</strong> (extiende de <strong>Journal</strong><em>).</em></p>
<p align="center"><img src="../images/inheritance.gif" width="113" height="385" /></p>
<p>Note que sólo una clase base por clase es creada. Si usted quiere estar seguro que
su subclase sólo trabaja con un subjuegode columnas para cada fila, usted debe
sobrepasar el método<strong>BasePublicationPeer::populateObject()</strong>
para proveer popularización personalizada basado en una clase objeto. en algunos casos, como sea,
el hecho que objetos de la clase correcta es retornado puede ser suficiente
y de él mismo para la necesidad de su aplicación.</p>
<p>Si el árbol de herencia es dinámico -- o desconocido -- usted puede omitir la etiqueta <strong><inheritance></strong>
y es asumido que la llave columna contendra un nombre clase -- usando
la notación punto (ej. "bookstore.Journal", "myapp.entity.MyClassName").
También, puede sobrepasar la base de peer <strong>getOMClass()</strong> para retornar
el nombre clase para usar basado en una lógica más compleja (o consulta).</p>
<h3>Entidades Abstractas</h3>
<p>Si usted desea imponer usando subclases de una entidad, usted puede declarar una tabla
"abstract" en su modelo de datos XML.</p>
<pre title="abstract table example"><table name="publication" abstract="true"></pre>
<p>Especificando que una tabla es abstracta generara clases objeto stub abstractas,
y también requerirá que usted implemente el método <strong>getOMClass()</strong>
en su clase peer stub(la ecepción sera thrown si usted no lo hace).</p>
</body>
</html>