web-dev-qa-db-fra.com

Comment écrire une boucle en XML?

J'ai un fichier XML comme

<?xml version="1.0" encoding="UTF-8"?>
<form>
     <field name="age" type="list"
        default="1"
        description="age"
        label="Age"
        size="1"
    >
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>

    </field>
</form>

Je dois répéter cette option un nombre de fois déterminé. Comment puis-je écrire une boucle pour répéter l'option? Est-il possible d'écrire une boucle?

4
aish

Actuellement, vous pouvez parfaitement utiliser champ de formulaire Integer .

Le type de champ de formulaire entier fournit une zone de sélection avec une plage de valeurs entières.

<field 
  name="age" 
  type="integer" 
  default="1" 
  label="Age" 
  description="age" 
  first="1" 
  last="100" 
  step="1" 
/>

premier serait l'âge minimum et dernier serait l'âge maximum.

[~ # ~] alternative [~ # ~]

Une autre option serait de créer un champ de formulaire personnalisé. Cela vous donne plus de flexibilité si vous souhaitez étendre votre domaine.

administrateur/composants/[nom de votre composant] /models/fields/Age.php

<?php
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die('Restricted access');

jimport('joomla.form.formfield');

class JFormFieldAge extends JFormField {

  protected $type = 'Age';

  // getLabel() left out, no need to overwrite it (at least for this example)

  public function getInput() {

    // Define min and max ages, if not set by field, defaults to 1 and 100.
    $minAge = isset($this->element['min']) ? $this->element['min'] : 1;
    $maxAge = isset($this->element['max']) ? $this->element['max'] : 100;

    $html = '<select id="'.$this->id.'" name="'.$this->name.'">';

    // Loop
    for ($i = $minAge; $i <= $maxAge; $i++) { 
      $html .= '<option value="'.$i.'">'.$i.'</option>';
    }

    $html .= '</select>';

    return $html;
  }
}

Chargez vos champs dans votre fichier principal d'extension.

JForm::addFieldPath(JPATH_COMPONENT . '/models/fields'); // Change the path for your needs

[~ # ~] xml [~ # ~]

De plus, vous devrez peut-être ajouter le chemin du champ au parent:

<fieldset addfieldpath="/administrator/components/<component name>/models/fields">

Encore une fois, changez le chemin pour vos besoins.

Et enfin, utilisez votre type de champ personnalisé

<field 
  name="age"
  type="Age"
  description="age"
  label="Age"
  min="18"
  max="90"
  size="1" />

En savoir plus sur création d'un type de champ de formulaire personnalisé .

7
Rene Korss

Bien que la solution de René soit beaucoup plus élégante, j'aimerais ajouter une autre alternative. Au lieu de créer une boucle dans votre fichier XML (ce dont je doute, c'est possible), vous pouvez générer le texte XML à l'aide de tout autre langage de programmation, tel que PHP, puis simplement copier/coller le contenu dans votre fichier XML.

Voici un exemple pour votre champ Âge:

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>XML Loop</title>
</head>
<body>
<textarea rows="50" cols="100">
<field name="age" type="list"
        default="1"
        description="age"
        label="Age"
        size="1"
    >
<?php 
    for ($x = 1; $x <= 100; $x++) { // Change values according to your desired range
        echo "        <option value=\"$x\">$x</option> \n";
    }
?>
</field>
</textarea>
</body>
</html>

Cela produira le <option> balise avec des valeurs de 1 à 100, dans une zone de texte. Le code peut ensuite être copié dans votre fichier XML.

Peut-être pas aussi élégant, mais ça marche vraiment ...

1
johanpw