Как я создаю пользовательское диалоговое окно в WiX для ввода данных пользователем?

Проблема с созданием «простого» фильтра в twig заключается в том, что он не учитывает неопределенные переменные / свойства. Чтобы решить эту проблему, вам нужно создать свой собственный node class с тем же поведением, что и фильтр default

Шаг 1. Зарегистрируйте фильтр / функцию с помощью класса узлов

$filter = new \Twig_SimpleFilter('yesNoNa', function ($v) {
    return isset($v)?($v?'Yes':'No'):'N/A';
}, [ 'node_class' => \MyProject\Base\Twig\Expression\Filter\YesNoNa::class);

Шаг 2. Создайте класс узла

namespace MyProject\Base\Twig\Expression\Filter;

class YesNoNa extends \Twig_Node_Expression_Filter_Default {
    public function __construct(\Twig_NodeInterface $node, \Twig_Node_Expression_Constant $filterName, \Twig_NodeInterface $arguments, $lineno, $tag = null)
    {
        $yesNoNa = new \Twig_Node_Expression_Filter($node, new \Twig_Node_Expression_Constant('yesNoNa', $node->getLine()), $arguments, $node->getLine());

        if ('yesNoNa' === $filterName->getAttribute('value') && ($node instanceof \Twig_Node_Expression_Name || $node instanceof \Twig_Node_Expression_GetAttr)) {
            $test = new \Twig_Node_Expression_Test_Defined(clone $node, 'defined', new \Twig_Node(), $node->getLine());
            $false = count($arguments) ? $arguments->getNode(0) : new \Twig_Node_Expression_Constant('N/A', $node->getLine());

            $node = new \Twig_Node_Expression_Conditional($test, $yesNoNa, $false, $node->getLine());
        } else {
            $node = $yesNoNa;
        }

        parent::__construct($node, $filterName, $arguments, $lineno, $tag);
    }
}

Чтобы узнать об этом классе, я только что покопался в источнике, чтобы узнать, как фильтр по умолчанию был определен внутри ядра.

Кажется, эта строка, $false = count($arguments) ? $arguments->getNode(0) : new \Twig_Node_Expression_Constant('N/A', $node->getLine()); будет определять вывод «по умолчанию», когда переменная не определена. (Отсюда и N / A)


Использование фильтра в моей песочнице дает следующий результат:

{% set foo = false %}
{% set bar = true %}
{% set foobar = null %}
{% set arr = { 10: 'foobar', 1: 'foo', 5 : 'bar', 'foo': 42, } %}

Foo: {{ foo | yesNoNa }}                {# No #}
Bar: {{ bar | yesNoNa }}                {# Yes #}
Undefined: {{ undefined | yesNoNa }}    {# N/A #}
Foobar: {{ foobar | yesNoNa }}          {# N/A #}
foo.bar.foo {{foo.bar.foo | yesNoNa }}  {# N/A #}
arr.foo {{ arr.foo | yesNoNa }}         {# Yes #}

Это было проверено в [117 ] - Возможно, это решение требует правильных пространств имен для всех используемых классов twig вместо корневых в twig 2.x

27
задан Scott Saad 24 April 2009 в 22:31
поделиться

1 ответ

Веселитесь с пользовательским интерфейсом!

Редактировать: исходная ссылка на ответ больше не существует. FireGiant (сопровождающие Wix) некоторые примеры для части этого процесса, но он не полностью отвечает на этот вопрос. есть еще одно учебное пособие ( ОБНОВЛЕНИЕ Авг. 2018 : Ссылка воскрешена из Wayback Machine), которое дает большую часть ответов на этот вопрос.

Обзор высокого уровня того, что будет происходить следующее:

  1. Создать свойство
  2. Задать этому свойству элемент управления UI.
  3. Атрибут name в службе будет ссылаться на свойство, т.е. [ServiceNameProperty].

Однако это сложно, и способ, который предлагается создать новый диалог пользовательского интерфейса, это взять существующий диалог, сделать его клон,

29
ответ дан 28 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: