web-dev-qa-db-ja.com

XMLでループを記述する方法は?

私のようなXMLファイルがあります

<?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>

このオプションを一定回数繰り返す必要があります。オプションを繰り返すループをどのように書くことができますか?ループを書くことは可能ですか?

4
aish

現在、完全に 整数フォームフィールド を使用できます。

整数フォームフィールドタイプは、整数値の範囲を含む選択ボックスを提供します。

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

firstは最小年齢であり、lastは最大年齢です。

[〜#〜]代替[〜#〜]

別のオプションは、カスタムフォームフィールドを作成することです。これにより、フィールドを拡張したい場合に柔軟性が高まります。

administrator/components/[コンポーネントの名前] /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;
  }
}

拡張メインファイルにフィールドをロードします。

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

[〜#〜] xml [〜#〜]

さらに、親へのフィールドパスの追加が必要になる場合があります。

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

ここでも、必要に応じてパスを変更します。

最後に、カスタムフィールドタイプを使用します

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

カスタムフォームフィールドタイプの作成 の詳細をご覧ください。

7
Rene Korss

ルネのソリューションははるかにエレガントですが、別の選択肢を追加したいと思います。 XMLファイル内にループを作成する代わりに(おそらく可能ではないでしょう)、PHPなどの他のプログラミング言語を使用してXMLテキストを生成し、コンテンツをXMLファイルにコピーして貼り付けるだけです。

次に、Ageフィールドの例を示します。

<!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>

これにより、テキスト領域内に1〜100の値を持つ<option>タグが出力されます。その後、コードをXMLファイルにコピーできます。

多分それほどエレガントではないかもしれませんが、それは間違いなく動作します...

1
johanpw