Показано с 1 по 6 из 6

Тема: Как сейчас правильно добавлять элемент на форму?

  1. #1
    Senior Member
    Регистрация
    30.08.2007
    Адрес
    ISPlicense.ru
    Сообщений
    1,081

    По умолчанию Как сейчас правильно добавлять элемент на форму?

    Добрый день!

    Если пытаться из события добавить какой-то элемент на форму, то он может появиться два раза, так как панель перед вызовом функции делает InternalCall на неё же, а при использовании wizard делает InternalCall на соседние функции и как-то объединяет результат.
    Придумал пока два способа:
    1) Смотреть, есть ли уже поле в метаданных, и если нет, выходить. Но, получается, в такие проверки надо оборачивать абсолютно всю обработку, а при использовании slist / setvalues это совсем не очевидно.
    2) Смотреть, ses.conn.isInternal(). Но хочется на нормальные внутренние вызовы отдавать полный ответ.
    Есть ли третий, лишённый указанных недостатков?
    С уважением, Борис Долгов.
    ISPlicense.ru - администрирование и разработка плагинов к продуктам ISPsystem, лицензии и прочее.

  2. #2
    Senior Member
    Регистрация
    17.09.2010
    Сообщений
    8,674

    По умолчанию

    Здравствуйте, если вы используете заголовочные файлы, можно ипользовать проверку ses.IsSetValues().
    В плагине используете AfterExecute или BeforeAction?

  3. #3
    Senior Member
    Регистрация
    30.08.2007
    Адрес
    ISPlicense.ru
    Сообщений
    1,081

    По умолчанию

    >Здравствуйте, если вы используете заголовочные файлы, можно ипользовать проверку ses.IsSetValues().
    Получается, надо добавлять поле/slist, если его уже нет и если это не вызов setvalues?

    >В плагине используете AfterExecute или BeforeAction?
    AfterExecute
    С уважением, Борис Долгов.
    ISPlicense.ru - администрирование и разработка плагинов к продуктам ISPsystem, лицензии и прочее.

  4. #4
    Senior Member
    Регистрация
    17.09.2010
    Сообщений
    8,674

    По умолчанию

    Поле добавляете только если ses.IsGet(), slis можно заполнять и в ses.IsGet() и в ses.IsSetValues(). Во втором случае список элементов в списке выбора можно изменить. В BILLmanager поля часто добавляются динамически, в том числе и в визардах, дублирования не замечали.

    Можете показать базовый пример плагина, при котором дублируются поля?

  5. #5
    Senior Member
    Регистрация
    30.08.2007
    Адрес
    ISPlicense.ru
    Сообщений
    1,081

    По умолчанию

    Пример тут: http://pastebin.com/MqSExpi6
    С уважением, Борис Долгов.
    ISPlicense.ru - администрирование и разработка плагинов к продуктам ISPsystem, лицензии и прочее.

  6. #6
    Senior Member
    Регистрация
    17.09.2010
    Сообщений
    8,674

    По умолчанию

    Действительно в визардах есть нюанс. Попробуйте так:
    void AfterExecute(Session &ses) const override {
    if ((ses.Checked("checkonly") || ses.Param("step").empty()) && !ses.Checked(GET_METADATA))
    return;

    auto item_field = ses.xml.GetNode("//metadata/form/field[@name='item']");
    if (item_field) {
    item_field.FindNode("input").Unlink();
    item_field.AppendChild("select").SetProp("name", "item");
    }
    }

    virtual void BeforeExecute(Session& ses) const
    {
    ses.NewSelect("item");
    auto soft = InternalCall(ses, "soft");
    for (auto item : soft.GetNodes("//elem")) {
    ses.AddChildNode("val", item.FindNode("name").Str())
    .SetProp("key", item.FindNode("id").Str());
    }
    }

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •