Sujet : Diverses questions (Xyl/Router)

Yep,

Afin de ne pas perdre mes interrogations pendant, la nuit, je les couches ici (Dormez bien, soyez sages! huhu hmm).

Deux questions pour le moment :
Je souhaiterais reproduire le fonctionnement des "urls générée" de Xyl (à partir des règles du routeur), et cela en php...
En gros remplacer @regle:var=value par un genre de \Hoa\Router\Http::constructURL(array('var'=>'val')) (je ne sais pas du tout si il y a quelque chose pour le faire et si ce quelque chose et dans la lib Router ou bien dans la lib Xyl...)
Le but serait de sortir une liste d'éléments d'une bdd... donc au lieu d'écrire "statiquement" dans Xyl:

            <ulist>
                <item><link href="@project:project=projet1">Projet1</link></item>
                <item><link href="@project:project=projet2">Projet2</link></item>
            </ulist>

On aurait un bind du genre ou un yield pour remplacer les items...:

<yield name="projectItem">
    <item><link href="@project:project=?projectName">Project <value bind="?projectName" /></link></item>
</yield>

<ulist>
     <projectItem bind="?projectList" />
</ulist>

Mais je ne comprend pas comment générer les urls dans ce cas là? j'avais penser à générer l'url en php au préalable, mais je ne vois pas comment ensuite comment remplir le href avec...

Deuxième question, toujours au sujet de ces urls générées dans Xyl, comment faire demander une sous-domaine vide?
Je n'ai pas réussit dans mes divers essais...
Je souhaitais donner un lien vers la home dans le Main.xyl (même depuis des sous-domaines...
Donc avec les règles suivantes:

    ->get(
        'project',
        '(?<project>.*)@/(?<query>.*?)',
        'project',
        'index'
    )
    ->get(
        'www',
        '(?<query>.*?)',
        'www',
        'index'
    );

J'ai pensé pouvoir utiliser @www mais ça ne fonctionne pas correctement, j'ai voulu modifier la règle www, afin qu'elle accepte un www. facultatif, mais sans succès, la solution actuelle, mais qui ne me plait pas, j'ai rajouté la règle:

    ->_get('siteurl','www@')

(j'ai mis _get un peu au hasard, mais c'était à priori pour ne pas en tenir compte lors du dispatch)
Et j'utilise donc ensuite @siteurl sauf qu'il à le www...

Ah en écrivant, ces mots, j'ai trouvé la solution, la règle siteurl est transformée comme suit:

    ->_get('siteurl','')

Et cela fonctionne.... est-ce une bonne chose, une bonne pratique?

Voilà c'est sûrement brouillons puisque c'est un peu dans cet état dans ma tête wink

Merci d'avance pour les réponses wink

2

Re : Diverses questions (Xyl/Router)

Hey smile,

Je vais répondre sous forme d'un tutoriel.

On a besoin de deux fichiers : index.php et main.xyl.
Dans le premier, on commence classiquement :

<?php

require_once '/usr/local/lib/hoa/Core/Core.php';

from('Hoa')
-> import('Xyl.~')
-> import('Xyl.Interpreter.Html')
-> import('File.Read')
-> import('Http.Response');

$xyl = new \Hoa\Xyl(
    new \Hoa\File\Read('main.xyl'),
    new \Hoa\Http\Response(),
    new \Hoa\Xyl\Interpreter\Html()
);
$d = $xyl->getData();
$d->foo[0]->bar = 'baz0';
$d->foo[0]->baz = 'qux0';
$d->foo[1]->bar = 'baz1';
$d->foo[1]->baz = 'qux1';

$xyl->render();

Bien, ici on a mis quelques données. On va les utiliser dans main.xyl :

<?xml version="1.0" encoding="utf-8"?>

<document xmlns="http://hoa-project.net/xyl/xylophone">
  <title>Test</title>

  <p>Test:
  <ulist>
    <item bind="?foo">
       <value bind="?bar" /> — <value bind="?baz" />
    </item>
  </ulist>
  </p>
</document>

Bien. Quand on lance

$ php index.php

il va nous afficher ceci (je n'affiche que le <body>) :

<p>Test:
  <ul><li>
       baz0 — qux0
    </li><li>
       baz1 — qux1
    </li></ul>
  </p>

Chouette, on est tout bon. On va bien qu'il itère sur nos données, pas de soucis.

Maintenant on va mettre mettre un lien là au milieu. Rien de plus facile. Pour faire écrire un lien il nous faut un routeur. \Hoa\Xyl ne supporte que le routeur \Hoa\Router\Http pour l'instant. Notre index.php devient alors :

<?php

require_once '/usr/local/lib/hoa/Core/Core.php';

from('Hoa')
-> import('Xyl.~')
-> import('Xyl.Interpreter.Html')
-> import('File.Read')
-> import('Http.Response')
-> import('Router.Http');

$router = new \Hoa\Router\Http();
$router->_get('r1', '/here/is/(?<hello>)\.html');

$xyl = new \Hoa\Xyl(
    new \Hoa\File\Read('main.xyl'),
    new \Hoa\Http\Response(),
    new \Hoa\Xyl\Interpreter\Html(),
    $router
);
$d = $xyl->getData();
$d->foo[0]->bar = 'baz0';
$d->foo[0]->baz = 'qux0';
$d->foo[1]->bar = 'baz1';
$d->foo[1]->baz = 'qux1';

$xyl->render()

On a ajouté l'import de Router.Http et on a créé une règle, r1, qui est une règle privée. Une règle privée est une règle qui ne peut pas être appelée depuis l'extérieur (depuis le public, l'utilisateur, le navigateur, le client), mais seulement par Hoa lui-même (PHP lui-même). Une conséquence : pas besoin de préciser un call et un able. Donc _get('r1', …) est équivalent à addPrivateRule('r1', array('get'), …) (le chapitre du manuel d'apprentissage à propos du routeur est bientôt terminé).

Maintenant on se place dans XYL. Comment écrire un lien ? Le composant <link /> et son attribut href (on trouve aussi sref, attention à ne pas confondre : hyper- et static-reference). Cet attribut accepte plusieurs formes. L'une d'elle : @rule:key=value[&key=value]*. Ainsi, on modifie notre main.xyl :

<?xml version="1.0" encoding="utf-8"?>

<document xmlns="http://hoa-project.net/xyl/xylophone">
  <title>Test</title>

  <p>Test:
  <ulist>
    <item bind="?foo">
       <value bind="?bar" /> <link href="@r1:hello=foobar">link</link>
    </item>
  </ulist>
  </p>
</document>

Et le résultat :

<p>Test:
  <ul><li>
       baz0 <a href="/here/is/foobar.html">link</a>
    </li><li>
       baz1 <a href="/here/is/foobar.html">link</a>
    </li></ul>
  </p>

Oh great! Ça a marché smile.

Mais tu voulais avoir du binding dans un attribut. Pour cela, on utilise cette forme : attribut="va(?binding)lue", donc :

<link href="@r1:hello=(?baz)">link</link>

et on aura le résultat suivant :

<p>Test:
  <ul><li>
       baz0 <a href="/here/is/qux0.html">link</a>
    </li><li>
       baz1 <a href="/here/is/qux1.html">link</a>
    </li></ul>
  </p>

Et voilà. Tu as bindé tout comme il faut.


Si tu utilises \Hoa\Dispatcher\Basic pour dispatcher tes données, tu peux récupérer le kit (\Hoa\Dispatcher\Kit) qui a l'attribut data qui te permet d'accéder aux données de la vue directement. Tu peux très bien faire quelque chose du genre (on imagine un MVC) :

public function MyAction ( ) {

    $this->data->foo[0]->baz = …
}

Facile ? Donc tu peux passer les données de ta base vers la vue de cette manière.


Enfin, je n'ai pas bien saisi ton problème de lien. Tu peux rééexpliquer ?

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »