cms icon indicating copy to clipboard operation
cms copied to clipboard

Registration form password validation shows no error

Open wm-simon opened this issue 3 years ago • 4 comments

Bug description

When your password is invalid there is no error shown.

How to reproduce

Register with 1234 as password.

{{ user:register_form redirect="/account/dashboard?message=register" }}

    {{ if errors }}
        <div class="p-4 mt-8 text-white bg-red-700">
            {{ errors }}
                {{ value }}<br>
            {{ /errors }}
        </div>
    {{ /if }}

{{ /user:register_form }}
// Output
<div class="p-4 mt-8 text-white bg-red-700">
</div>

Logs

No response

Versions

Statamic 3.2.33 Pro Laravel 8.83.1 PHP 8.0.12

Installation

Fresh statamic/statamic site via CLI

Additional details

No response

wm-simon avatar Feb 21 '22 12:02 wm-simon

Try to customize password validation rules maybe that will help: https://statamic.dev/tags/user-register_form#password-rules

jasonbaciulis avatar Feb 22 '22 14:02 jasonbaciulis

I've got the same issue and setting the password rules doesn't seem to help either.

The error object just stays empty, but the user fails to be registered.

Humni avatar Sep 12 '22 04:09 Humni

I did some extra digging into this - the issue is quite deep within the antlers template engine I think. I didn't do a minimal replication on this, but I've included the relevant parts of my codebase for replication.

When debugging this, when the form is parsed, the "errors" variable is set correctly.

vendor/statamic/cms/src/Auth/UserTags.php:153 image

{{ user:register_form class="space-y-6" redirect="/dashboard?registered=true" }}
  ...
  <div>
    <div>
      <input id="remember-me" name="remember-me" type="checkbox">
      <label for="remember-me"> Remember me </label>
    </div>
  </div>
  
  {{ get_errors }} <br> <!-- get_errors -->
  {{ errors | to_json }} <br> <!-- errors -->
  {{ if errors }}
      <div>
          {{ errors }}
              {{ value }}<br>
          {{ /errors }}
      </div>
  {{ /if }}

  <div>
    <button type="submit">
      Register
    </button>
  </div>
{{ /user:register_form }}

Resulting HTML (I did note that there is no closing form bracket, is that is expected behaviour?)

<form method="POST" action="http://127.0.0.1/!/auth/register">
	<input type="hidden" name="_token" value="...">
	<input type="hidden" name="_redirect" value="/dashboard?registered=true" />

	...

	<div>
	  <div>
		<input id="remember-me" name="remember-me" type="checkbox">
		<label for="remember-me"> Remember me </label>
	  </div>
	</div>
	 
	 <br> <!-- get_errors -->
	 {} <br> <!-- errors -->
	<div>
	  <button type="submit">
		Register
	  </button>
	</div>

Humni avatar Sep 12 '22 05:09 Humni

I think this is related to the session not being available inside the antlers rendering engine (for an unknown reason). If I do a "session:dump" it dumps the session correctly, but as soon as I do a "session:errors" it does not.

Anyway, I wrote a workaround for this. This only works when using the new Antlers parser as it relies on inline PHP

{{? $errors_fixed = collect(view()->shared('errors')->getBag('user.register')?->toArray() ?? [])->flatten(); ?}}
{{ if errors_fixed }}
    <div class="text-red text-sm">
        {{ errors_fixed }}
            {{ value }}<br>
        {{ /errors_fixed }}
    </div>
{{ /if }}

Humni avatar Sep 12 '22 06:09 Humni

This seems to be working for me on the latest version of Statamic:

CleanShot 2023-11-20 at 18 32 56

{{ user:register_form }}
    {{ if errors }}
        <div class="bg-red-500 text-white rounded-md px-4 py-2 mb-8">
            {{ errors }}
                {{ value }}<br>
            {{ /errors }}
        </div>
    {{ /if }}

    <!-- Form fields ... -->
{{ /user:register_form }}

I'm going to close this issue now. If you're still experiencing this issue, please leave a comment and we can take another look.

duncanmcclean avatar Nov 20 '23 18:11 duncanmcclean