Hi,

thx for your comment. I've tried to get the component by the following code without success:

private void setLink(FacesContext context)
    {
UIComponent comp = context.getViewRoot().findComponent("company:forgottenLink");
        if (comp != null)
        {
            System.out.println("found");
            try
            {
                HtmlButton button = (HtmlButton) comp;
                button.setRendered(false);
            } catch (Exception ex)
            {
                System.out.println(ex.getMessage());
            }

        } else
        {
            System.out.println("notfound");
        }
    }

The component is found but If I wan't to cast the component as HTMLButton (it's definitely a HTMLButton -> Debug Windows -> Variables) I get the seam debug page with error "Caused by javax.servlet.ServletException with message: "Servlet execution threw an exception" .
The exception catch part will be ignored.

If I don't cast and execute the "setRendered" method from the UIComponent class nothing happens. The html button is still on the page. Doesn't matter if I reRender the HtmlButton in the page.

Does anyone have an idea?

Thx
Ben


Am 08.11.2010 12:44, schrieb Anton Gavazuk:
Hi,

rendered option is your friend:

2 possibilities inside your validator
1) you are looking for the link component in your view and change rendered
property of discovered UIComponent
2) you create a binding method for the rendered attribute of the link and
binding method will verify the condition
drawback of this method is that you will have to introduce session Variable
(Bean) or maintain your own 'custom' scope variable.

So prefer to use case #1

Cheers,
Anton

2010/11/8 Benjamin Mark<[email protected]>

Hello,

I have the following problem:

If some user is entering a already used email adress or username I wan't to
let appear a link (s:link/button) to the "forgott password" page in a form?

I'm not sure how to solve it with my custom email validator?

Has someone an idea how I could solve that?

Thx for any help

Best regards

Ben


Validator
######################################################################

public class EmailValidator implements Validator, Serializable {


    public void validate(FacesContext context, UIComponent component, Object
value) throws ValidatorException
    {

        context.getViewRoot().getChildren()
        if (value instanceof String)
        {
            if (!isValid((String) value))
            {
                throw new ValidatorException(new
FacesMessage(Messages.instance().get("text_validemail")));
            } else if (!isAvailable((String) value))
            {
                throw new ValidatorException(new
FacesMessage(Messages.instance().get("test_emailalreadyused")));
            }
        } else
        {
            throw new ValidatorException(new FacesMessage("The object ["
+ value
                    + "] is no instance of String which is needed for email
validation"));
        }

    }

    private boolean isValid(String eMail)
    {
        String expression = "....@.+\\.[a-z]+";
        // Make the comparison case-insensitive.
        Pattern pattern = Pattern.compile(expression,
Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(eMail);
        if (matcher.matches())
        {
            return true;
        }
        return false;
    }

    private boolean isAvailable(String eMail)
    {
        EntityManager entityManager = (EntityManager)
Component.getInstance("entityManager");

        entityManager.joinTransaction();

        Query q = entityManager.createQuery("from Person p where p.email =
:email");
        q.setParameter("email", eMail);
        if (q.getResultList().size()>  0)
        {
            return false;
        }
        return true;
    }
}

Email in Form
##############################################################

<s:decorate id="emailField" template="layout/edit.xhtml">
                    <ui:define
name="label">#{messages.text_email}</ui:define>
                    <h:inputText id="email" required="true" size="45"
maxlength="45"
                        label="#{messages.text_email}"
                        value="#{personHome.instance.email}">
                        <f:validator validatorId="emailValidator" />
                        <a:support event="onblur" reRender="emailField"
                            bypassUpdates="true" ajaxSingle="true" />
                    </h:inputText>
                </s:decorate>






Reply via email to