8

次のようなコンボボックスフォーム要素を作成するための小枝マクロがあります:

{% macro select(name, label, choices, help, value) %}
<div class="control-group">
    <label class="control-label" for="{{ name }}">{{ label }}</label>
    <div class="controls">
        {% for choice in choices %}
            {% if value is not empty and value == choice.id %}
                <option value="{{ choice.id }}" selected="selected">{{ choice.code }} - {{ choice.name }}</option>
            {% else %}
                <option value="{{ choice.id }}">{{ choice.name }}</option>
            {% endif %}
        {% endfor %}
        <p class="help-block">{{ help }}</p>
    </div>
</div>
{% endmacro %}

ご覧のとおり、オプションの値とラベルとして id と name フィールドを持つオブジェクトしか使用できないため、あまり柔軟ではありません。twig に移行する前に、次の PHP 関数を使用します。

function form_select($name, $label, $choices, $keycol, $valcol, $value=null, $help=null)
{ ?>
<div class="control-group">
    <label class="control-label" for="<?php echo $name; ?>"><?php echo $label; ?></label>
    <div class="controls">
        <select name="<?php echo $name; ?>" class="span7" id="<?php echo $name; ?>">
            <?php foreach ($choices as $choice) : ?>
                <option value="<?php echo $choice->$keycol; ?>" <?php if ($choice->$keycol == $value) echo "selected"; ?>>
                    <?php echo $choice->$valcol; ?>
                </option>
            <?php endforeach; ?>
        </select>
        <p class="help-block"><?php echo $help; ?></p>
    </div>
</div>
<?php }

この関数を使用すると、任意のオブジェクトを関数に送信し、フィールド名を関数 ( $keycoland ) に渡し、PHP の変数変数名機能 ( and )$valcolを介してアクセスすることで、オプション値とラベルとして使用できます。$choice->$keycol$choice->$valcol

この関数を小枝マクロとして再作成できる方法はありますか?

4

1 に答える 1

17

属性関数はこれを行います: http://twig.sensiolabs.org/doc/functions/attribute.html

{{ attribute(choice, valCol) }}
于 2012-04-23T23:00:45.483 に答える