<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 17172 -->
<!-- Reviewed: no -->
<sect1 id="zend.db.table.definition">
    <title>Zend_Db_Table_Definition</title>

    <sect2 id="zend.db.table.definition.introduction">
        <title>Introduction</title>

        <para>
            <classname>Zend_Db_Table_Definition</classname> est une classe qui peut être
            utilisée pour décrire les relations et les options de configuration qui devraient
            être utilisées lorsque <classname>Zend_Db_Table</classname> est manipulée par
            instantiation concrête.
        </para>
    </sect2>

    <sect2 id="zend.db.table.definition.usage">
        <title>Utilisation de base</title>

        <para>
            Les options décrites dans un objet de définition sont les mêmes que celles
            qu'utilisent les classes étendant Zend_Db_Table_Abstract. Votre objet de définition
            peut alors être passé à la classe à l'instanciation, celle-ci connaitra alors la
            définition de toutes les tables concernées.
        </para>

        <para>
            Voici un exemple d'objet de définition qui va décrire les noms des tables
            et les relations entre les objets supports de ces tables.
            Note: Si 'name' n'est pas précisé, la clé servira alors de nom à la table,
            c'est le cas dans notre exemple avec 'genre'.
        </para>

        <example id="zend.db.table.definition.example1">
            <title>Décrire un modèle de base de données</title>

            <programlisting language="php"><![CDATA[
$definition = new Zend_Db_Table_Definition(array(
    'author' => array(
        'name' => 'author',
        'dependentTables' => array('book')
        ),
    'book' => array(
        'name' => 'book',
        'referenceMap' => array(
            'author' => array(
                'columns' => 'author_id',
                'refTableClass' => 'author',
                'refColumns' => 'id'
                )
            )
        ),
    'genre' => null,
    'book_to_genre' => array(
        'referenceMap' => array(
            'book' => array(
                'columns' => 'book_id',
                'refTableClass' => 'book',
                'refColumns' => 'id'
                ),
            'genre' => array(
                'columns' => 'genre_id',
                'refTableClass' => 'genre',
                'refColumns' => 'id'
                )
            )
        )
    ));
]]></programlisting>
        </example>

        <para>
            Comme vous le voyez, les mêmes options que vous utilisez en général en étendant
            Zend_Db_Table_Abstract sont présentes dans ce tableau. Cette définition va
            <emphasis>persister</emphasis> vers toutes les tables qui seront créees par votre
            objet, ceci assure une isolation et un bon fonctionnement.
        </para>

        <para>
            Ci-après un exemple d'instanciation d'une table et de l'utilisation de
            findDependentRowset() et findManyToManyRowset() qui vont correspondre au modèle
            de données:
        </para>

        <example id="zend.db.table.definition.example2">
            <title>Intéragir avec la définition utilisée</title>

            <programlisting language="php"><![CDATA[
$authorTable = new Zend_Db_Table('author', $definition);
$authors = $authorTable->fetchAll();

foreach ($authors as $author) {
    echo $author->id . ': ' . $author->first_name . ' ' . $author->last_name . PHP_EOL;
    $books = $author->findDependentRowset('book');
    foreach ($books as $book) {
        echo '    Book: ' . $book->title . PHP_EOL;
        $genreOutputArray = array();
        foreach ($book->findManyToManyRowset('genre', 'book_to_genre') as $genreRow) {
            $genreOutputArray[] = $genreRow->name;
        }
        echo '        Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
    }
}
]]></programlisting>
        </example>
    </sect2>

    <sect2 id="zend.db.table.definition.advanced-usage">
        <title>Utilisation avancée</title>

        <para>
            Quelques fois vous voudriez mixer les utilisations, via la définition et
            une extension concrête de Zend_Db_Table_Abstract. Pour ce faire, omettez
            de spécifier une définition concernant la classe concrête.
            Zend_Db_Table utiisera alors l'instance que vous lui passerez.
        </para>

        <para>
            Dans l'exemple d'après, nous allons placer une des tables sous forme de classe
            concrête, et laisser les autres sous forme de définitions. Nous allons voir
            alors comment les faire intéragir.
        </para>

        <example id="zend.db.table.definition.example3">
            <title>Mixer la définition et l'extension concrête</title>

            <programlisting language="php"><![CDATA[
class MyBook extends Zend_Db_Table_Abstract
{
    protected $_name = 'book';
    protected $_referenceMap = array(
        'author' => array(
            'columns' => 'author_id',
            'refTableClass' => 'author',
            'refColumns' => 'id'
            )
        );
}

$definition = new Zend_Db_Table_Definition(array(
    'author' => array(
        'name' => 'author',
        'dependentTables' => array('MyBook')
        ),
    'genre' => null,
    'book_to_genre' => array(
        'referenceMap' => array(
            'book' => array(
                'columns' => 'book_id',
                'refTableClass' => 'MyBook',
                'refColumns' => 'id'
                ),
            'genre' => array(
                'columns' => 'genre_id',
                'refTableClass' => 'genre',
                'refColumns' => 'id'
                )
            )
        )
    ));

$authorTable = new Zend_Db_Table('author', $definition);
$authors = $authorTable->fetchAll();

foreach ($authors as $author) {
    echo $author->id . ': ' . $author->first_name . ' ' . $author->last_name . PHP_EOL;
    $books = $author->findDependentRowset(new MyBook());
    foreach ($books as $book) {
        echo '    Book: ' . $book->title . PHP_EOL;
        $genreOutputArray = array();
        foreach ($book->findManyToManyRowset('genre', 'book_to_genre') as $genreRow) {
            $genreOutputArray[] = $genreRow->name;
        }
        echo '        Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
    }
}
]]></programlisting>
        </example>
    </sect2>
</sect1>