<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect2 id="zend.validate.set.callback">
    <title>Callback (fonction de rappel)</title>

    <para>
        <classname>Zend_Validate_Callback</classname> permet de fournir une fonction de rappel
        utilisée pour valider la valeur.
    </para>

    <sect3 id="zend.validate.set.callback.options">
        <title>Options supportées par Zend_Validate_Callback</title>

        <para>
            Les options suivantes sont supportées par
            <classname>Zend_Validate_Callback</classname>&#160;:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis><property>callback</property></emphasis>&#160;: spécifie la fonction
                    de rappel qui sera utilisée pour la validation.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><property>options</property></emphasis>&#160;: spécifie les options
                    additionnelles qui seront fournies à la fonction de rappel.
                </para>
            </listitem>
        </itemizedlist>
    </sect3>

    <sect3 id="zend.validate.set.callback.basic">
        <title>Utilisation classique</title>

        <para>
            Le plus simple est de posséder une fonction classique, qui sera utilisée
            pour valider la donnée. Soit la fonction ci-après :
        </para>

        <programlisting language="php"><![CDATA[
function myMethod($value)
{
    // ici de la validation à effectuer
    return true;
}
]]></programlisting>

        <para>
            Pour l'utiliser avec<classname>Zend_Validate_Callback</classname> vous devez simplement
            effectuer votre appel comme ceci:
        </para>

        <programlisting language="php"><![CDATA[
$valid = new Zend_Validate_Callback('myMethod');
if ($valid->isValid($input)) {
    // input semble valide
} else {
    // input est invalide
}
]]></programlisting>
    </sect3>

    <sect3 id="zend.validate.set.callback.closure">
        <title>Utilisation avec les fonctions anonymes (closures)</title>

        <para>
            PHP 5.3 introduit les <ulink url="http://php.net/functions.anonymous">fonctions
            anonymes</ulink> ou fonctions de <emphasis>fermeture</emphasis>. PHP traite les
            fonctions anonymes comme des fonctions de rappel valides, et il est donc
            possible d'utiliser celles-ci avec <classname>Zend_Validate_Callback</classname>.
            Exemple:
        </para>

        <programlisting language="php"><![CDATA[
$valid = new Zend_Validate_Callback(function($value){
    // Validation ici
    return true;
});

if ($valid->isValid($input)) {
    // input semble valide
} else {
    // input est invalide
}
]]></programlisting>
    </sect3>

    <sect3 id="zend.validate.set.callback.class">
        <title>Utilisation avec les méthodes de rappel</title>

        <para>
            Bien sûr, il est aussi possible d'utiliser des méthodes de rappel:
        </para>

        <programlisting language="php"><![CDATA[
class MyClass
{
    public function myMethod($value)
    {
        // Validation ici
        return true;
    }
}
]]></programlisting>

        <para>
            La définition de la fonction de rappel se fait alors dans un tableau contenant un
            objet de la classe et la méthode à appeler:
        </para>

        <programlisting language="php"><![CDATA[
$object = new MyClass;
$valid = new Zend_Validate_Callback(array($object, 'myMethod'));
if ($valid->isValid($input)) {
    // input semble valide
} else {
    // input est invalide
}
]]></programlisting>

        <para>
            Il est aussi possible d'utiliser une méthode statique comme fonction de rappel:
        </para>

        <programlisting language="php"><![CDATA[
class MyClass
{
    public static function test($value)
    {
        // Validation ici
        return true;
    }
}

$valid = new Zend_Validate_Callback(array('MyClass', 'test'));
if ($valid->isValid($input)) {
    // input semble valide
} else {
    // input est invalide
}
]]></programlisting>

        <para>
            Enfin, PHP 5.3 définit la méthode magique <methodname>__invoke()</methodname>.
            Si vous l'utilisez, alors un simple objet suffira comme fonction de rappel:
        </para>

        <programlisting language="php"><![CDATA[
class MyClass
{
    public function __invoke($value)
    {
        // Validation ici
        return true;
    }
}

$object = new MyClass();
$valid = new Zend_Validate_Callback($object);
if ($valid->isValid($input)) {
    // input semble valide
} else {
    // input est invalide
}
]]></programlisting>
    </sect3>

    <sect3 id="zend.validate.set.callback.options2">
        <title>Ajouter des options</title>

        <para>
            <classname>Zend_Validate_Callback</classname> permet d'utiliser des options, celles-ci
            seront alors passées comme argument supplémentaires à la fonction de callback.
        </para>

        <para>
            Soit la définition suivante:
        </para>

        <programlisting language="php"><![CDATA[
class MyClass
{
    function myMethod($value, $option)
    {
        // De la validation ici
        return true;
    }
}
]]></programlisting>

        <para>
            Il extsite deux manières d'indiquer des options au validateur : via le constructeur ou sa
            méthode <methodname>setOptions()</methodname>.
        </para>

        <para>
            Via le constructeur, passez un tableau contenant les clés "callback" et "options":
        </para>

        <programlisting language="php"><![CDATA[
$valid = new Zend_Validate_Callback(array(
    'callback' => array('MyClass', 'myMethod'),
    'options'  => $option,
));

if ($valid->isValid($input)) {
    // input semble valide
} else {
    // input est invalide
}
]]></programlisting>

        <para>
            Sinon, vous pouvez passer les options après:
        </para>

        <programlisting language="php"><![CDATA[
$valid = new Zend_Validate_Callback(array('MyClass', 'myMethod'));
$valid->setOptions($option);

if ($valid->isValid($input)) {
    // input semble valide
} else {
    // input est invalide
}
]]></programlisting>

        <para>
            Si des valeurs supplémentaires sont passées à <methodname>isValid()</methodname> elles
            seront utilisées comme arguments supplémentaires lors de l'appel à la fonction de rappel,
            mais avant les options <varname>$options</varname>.
        </para>

        <programlisting language="php"><![CDATA[
$valid = new Zend_Validate_Callback(array('MyClass', 'myMethod'));
$valid->setOptions($option);

if ($valid->isValid($input, $additional)) {
    // input semble valide
} else {
    // input est invalide
}
]]></programlisting>

        <para>
            Lors de l'appel à la fonction de rappel, la valeur à valider sera toujours passée comme premier argument
            à la fonction de rappel suivie de toutes les autres valeurs passées à
            <methodname>isValid()</methodname>; les autres options suivront. Le nombre et le type d'options qui
            peuvent être utilisées est illimité.
        </para>
    </sect3>
</sect2>
<!--
vim:se ts=4 sw=4 et:
-->
