Добрый день!
Если пытаться из события добавить какой-то элемент на форму, то он может появиться два раза, так как панель перед вызовом функции делает InternalCall на неё же, а при использовании wizard делает InternalCall на соседние функции и как-то объединяет результат.
Придумал пока два способа:
1) Смотреть, есть ли уже поле в метаданных, и если нет, выходить. Но, получается, в такие проверки надо оборачивать абсолютно всю обработку, а при использовании slist / setvalues это совсем не очевидно.
2) Смотреть, ses.conn.isInternal(). Но хочется на нормальные внутренние вызовы отдавать полный ответ.
Есть ли третий, лишённый указанных недостатков?
С уважением, Борис Долгов.
ISPlicense.ru - администрирование и разработка плагинов к продуктам ISPsystem, лицензии и прочее.
Здравствуйте, если вы используете заголовочные файлы, можно ипользовать проверку ses.IsSetValues().
В плагине используете AfterExecute или BeforeAction?
>Здравствуйте, если вы используете заголовочные файлы, можно ипользовать проверку ses.IsSetValues().
Получается, надо добавлять поле/slist, если его уже нет и если это не вызов setvalues?
>В плагине используете AfterExecute или BeforeAction?
AfterExecute
С уважением, Борис Долгов.
ISPlicense.ru - администрирование и разработка плагинов к продуктам ISPsystem, лицензии и прочее.
Поле добавляете только если ses.IsGet(), slis можно заполнять и в ses.IsGet() и в ses.IsSetValues(). Во втором случае список элементов в списке выбора можно изменить. В BILLmanager поля часто добавляются динамически, в том числе и в визардах, дублирования не замечали.
Можете показать базовый пример плагина, при котором дублируются поля?
Пример тут: http://pastebin.com/MqSExpi6
С уважением, Борис Долгов.
ISPlicense.ru - администрирование и разработка плагинов к продуктам ISPsystem, лицензии и прочее.
Действительно в визардах есть нюанс. Попробуйте так:
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());
}
}