Автозаполнение с использованием расширенной модели в калитке - PullRequest
2 голосов
/ 07 сентября 2011

Сначала я хочу сказать, что видел сайт:https://cwiki.apache.org/WICKET/autocomplete-using-a-wicket-model.html

Тем не менее у меня есть некоторые проблемы с реализацией.

Context У меня есть форма, где хотите редактировать заказ из моей базы данных.Я хочу автозаполнить имя клиента в форме и сохранить его в базе данных.

Задача Я вижу предложения по именам клиентов и могу выбрать, какое имя клиента я буду использовать.Просто когда я отправляю форму, новый клиент не будет сохранен в порядке, в базе данных.Я не знаю, как связать модель формы с AutoCompleteTextField.

Есть идеи?

Псевдокод моих классов:

Order{
  Long id;
  String date;
  Client client;
  Status status;
  ...
}

Client{
  Long id;
  String name;
  String nip;
  String address;
  String postcode;
  String city;
  String phone;
  String mail;
  ...
}

Status{
   Long id;
   String name;
   String value;
}

Отредактировано: Да, вы правы.

Моя реализация AbstractAutoCompleteTextField с сайта:

AbstractAutoCompleteRenderer autoCompleteRenderer = new AbstractAutoCompleteRenderer() {

                protected final String getTextValue(final Object object) {
                    Client client = (Client) object;
                    return client.getName();
                }

                protected final void renderChoice(final Object object, final Response response, final String criteria) {
                    response.write(getTextValue(object));
                }

            };


            // textfield
            AbstractAutoCompleteTextField<Client> name = new AbstractAutoCompleteTextField<Client>("name", new PropertyModel(order, "client"), autoCompleteRenderer) {

                protected final List<Client> getChoiceList(final String input) {
                    return clientService.findByNames(10, 0, input);
                }

                protected final String getChoiceValue(final Client choice) throws Throwable {
                    return choice.getId().toString();
                }
            };
form.add(name);

Моя реализация формы, которую вы запросили:

form = new Form("orderForm", new CompoundPropertyModel(order)) {
            @Override
            public void onSubmit() {
                orderService.update((Order) getDefaultModelObject());
                setResponsePage(OrdersPage.class);
                // Form validation successful. Display message showing edited
                // model.
            }
        };

С этим кодом я получил: "«Hurtownia Techniczna« ADA »не является надлежащим клиентом».(перевод с польского) в панели обратной связи.

1 Ответ

3 голосов
/ 07 сентября 2011

Я думаю, что здесь все идет не так: AbstractAutoCompleteTextField<Client> name = new AbstractAutoCompleteTextField<Client>("name", new PropertyModel(order, "client"), autoCompleteRenderer)

Остальная часть ответа отредактирована для отражения правильного варианта использования

Чтобы быть конкретным: Вы 'заново создайте PropertyModel вашего клиентского значения заказов, которое является Client-Object, и свяжите его с TextField.Чтобы создать Client-объект из TextField, wicket необходим конвертер.Есть много встроенных конвертеров, но ни один из них не способен конвертировать в пользовательский объект.Таким образом, вам нужно будет предоставить конвертер путем реализации IConverter.Поскольку я не знаю, как вы храните и извлекаете ваши клиентские объекты, я могу показать вам только общий пример, Locale-Converter, используемый в одном из моих проектов:

public class LocaleConverter implements IConverter {

    private static final long serialVersionUID = 3251433094703013493L;

    /* (non-Javadoc)
     * @see org.apache.wicket.util.convert.IConverter#convertToObject(java.lang.String, java.util.Locale)
     */
    @Override
    public Object convertToObject(String value, Locale locale) {
    Locale retValue = null;
    try {
        retValue = LocaleUtils.toLocale(value);
    } catch (IllegalArgumentException e) {
        throw (new ConversionException("" + value + " is not a valid locale.", e));
    }
    return retValue;
}

    /* (non-Javadoc)
     * @see org.apache.wicket.util.convert.IConverter#convertToString(java.lang.Object, java.util.Locale)
     */
    @Override
    public String convertToString(Object value, Locale locale) {
        return value.toString();
    }

}

Тогда вам нужнозарегистрируйте новый конвертер в своем приложении.Опять же, это будет немного отличаться для вас, так как у вас есть другой конвертер ...

@Override
protected IConverterLocator newConverterLocator() {
    ConverterLocator newConverterLocator = (ConverterLocator) super.newConverterLocator();
    newConverterLocator.set(Locale.class, new LocaleConverter());
    return newConverterLocator;
}

Этот метод должен быть включен в ваш класс приложения.

...