Jump to content
pwFoo

FrontendUser: login, logout and register users / members

Recommended Posts

Hi,

You could check the url param to render the login / register form OR the password reset content?

I don't use register and login at the same page. I use different pages and urls like /login and /register.

Forgot Password is just the core module. You also could disable the integration and implement / load it with custom code.

Share this post


Link to post
Share on other sites

Hi pwFoo,

I think I have discovered a small part for improvement towards the user.

Currently, when a user chooses a username containing umlauts and/or mixed case (like: MötörCode), the first email will display the username as given, since it was sanitized by "text" only.

in the next step, the username in the session (which still has umlauts and mixed case chars) will be put inside the username field.

If the user now chooses a password and submits, this name will be sanitized by "pageName" - which in the above example will result in "mtrcode".

This username is correctly displayed in the second and final E-Mail.

Since PW stores username as a page pagename is correct, but I think it should be displayed as such in the first email as well.

And I would propose to use sanitizer "pageNameTranslate", since then the above would result in "moetoercode".

Regarding the first email, I think FrontendUserRegisterEmailValidation.module line 90:

wire('session')->set('registerUsername', $form->fhValue('username', 'text'));

changed to

wire('session')->set('registerUsername', $form->fhValue('username', 'pageNameTranslate'));

would do.

For the second part, I've hooked into before save,

$fu->addHookBefore('save',function($event){
        $event->object->userObj->name = $event->object->form->fhValue('username','pageNameTranslate');
    });

but I'm not sure where this would be covered best in the module's process.

Let me know what you think, unsure about the "username" part, since maybe it would be of greater flexibility to have a "nickname" field (which can keep up and lowercase and umlauts), independently from the "name" field - but even then "pageNameTranslate" would make for better page names in the backend for umlauterists. :-)

EDIT

ah, I just re-read the documentation on bitbucket, and in the plugin section I see you have covered the nick name case. Nice! :-)

Cheers,

Tom

  • Like 1

Share this post


Link to post
Share on other sites

Hey Guys,

I just installed the module and it seems to work since it's actually outputting a register form, but I don't have any styling to go with it?

The .css files in the modules directory are all but empty, just like the .js files, I also redownloaded the master file outside of processwire

and it doesn't contain any styling either. I read that It's possible to overwrite the styling by putting files with the same names as the ones

in the modules directory in templates/FrontendUser,  but the originals are pretty much empty, so what is there to overwrite?

Also, I can't find where I could change sentences like:

"Password must be at least 6 characters and have at least 1 letter and 1 digit. Password may not have whitespace."

Can anybody help me out?

thanx! :)

Bram

Share this post


Link to post
Share on other sites

Hello,

module uses the PW form api and isn't styled:

https://processwire.com/talk/topic/2089-create-simple-forms-using-api/

https://processwire.com/talk/topic/6184-form-and-css/

Just overwrite the (emtpy) style and script files ;)

Link to the documentation:

Styles, scripts & templates

The error message is defined by the form api / inputfield. You can overwrite it too.

https://processwire.com/talk/topic/4659-customizing-error-messages-for-inputfields/

Regards

  • Like 1

Share this post


Link to post
Share on other sites

Hi pwFoo,

Thanks for your reply! I checked out Soma's code and I understand it for the most part, but I find it hard to

translate the pieces of code for FrontEndUser to his examples since I don't know whether to use the same

code, or change $form to $fu and so on... So i was hoping you could help me out abit.

I implemented a register form already, and styled it myself O:)

I'm redirecting that form to /profile when its submitted succesfully. 

Now it does create a new user with the right attributed ( a role ) but

it doens't log the user in. And I don't know how to set this up.

Also it would be nice to send the new User a small confirmation email 

with his email and password. Is there any change you could point me

in the right direction for this? I would greatly appreciate any help with this :)

Thanx!

Bram

Share this post


Link to post
Share on other sites

You could use the email verification plugin (https://bitbucket.org/pwFoo/frontenduser/wiki/Documentation#markdown-header-register) or use PW hooks to add your own features (that's the way FrontendUser is built).

https://bitbucket.org/pwFoo/frontenduser/wiki/Register%20extensions%20and%20plugins

https://bitbucket.org/pwFoo/frontenduser/wiki/Login%20extensions%20and%20plugins

Send an email after user registration just use the PW addHookAfter (PW hooks) the method FrontendUser::save to send an email with WireMail.

All FrontendUser module messages should be translatable. For example ("$this->_()"):

    /**
     * Save the temp User object
     * @param User $user Temp User object to save
     * @return boolean Sucessful (true) saved or not (false)
     */
    protected function ___save($user) {
        if (empty($user->name) || empty($user->email) || $user->pass->hash == '') {
            return $this->_('Register process unexpected failed!');
        }
        if ($user->save()) {
            return true;
        }
        return $this->_('User registration failed!');
    }

Registered user won't logged in automatically, but you could add a hook to do it. addHookAfter FrontendUser::save and execute $this->session->login() or the FrontendUser method auth()

  • Like 3

Share this post


Link to post
Share on other sites

hi pwFoo!

Thanks for the reply! I've been dabbling around with it for hours but I can't get it to work  :huh:

why is this so fucking hard? :( :( I just want it to log in after registration and it simply doesn't.

$fu = $modules->get('FrontendUser');

// prepare register form
$fu->register();

// Default parameter
$fu->register(array('username', 'email', 'password'));

// De rol "ZZP" toevoegen aan gebruiker
$fu->addHookBefore('save', function($event) {
    $user = wire('fu')->userObj;
    $user->addRole('zzp');
});

// Login na succesvolle aanmelding
$fu->addHookAfter('save', function($event) {
	$this->session->login();	
});

// Additional email pre-register validation plugin (built-in)
//$fu->register(array('username', 'email', 'emailValidation', 'password'));

// Redirect destination:
$redirect = $pages->get('/zzp-ers/gegevens/')->url;

// process register / form submit
$fu->process($redirect);

// output register form
echo $fu->render();

This is de code i've been using and on the page "gegevens" I just show the username if logged in, and "You're not logged in" when

users aren't.

Could somebody please show me how to get this to work?

thanks!

Gr,

Bram

Share this post


Link to post
Share on other sites
// prepare register form
$fu->register();

// Default parameter
$fu->register(array('username', 'email', 'password'));

Remove one off the lines above. You prepare the form twice ;)

Take a look at the cheatsheet / API documentation. login()  need login credentials!

$session->login($name, $pass)

So you have to prepare username and password variables before you call login method.

Share this post


Link to post
Share on other sites

Thanks for the hint in the right direction,

after a few hours of searching I finally found the right syntax somewhere in the forum.

I couldn't find this specific call anywhere in the documentation on FrontEndUser?

This is how I logged in my user after a successfull login:

// Login after succesfull registration
$fu->addHookAfter('save', function($event) {
    $user = $event->object->form->fhValue('username','text');
    $pass = $event->object->form->fhValue('password','text');
    $this->session->login($user, $pass);	
});

  • Like 1

Share this post


Link to post
Share on other sites

How to add/remove css classes to rendered form?

I want to change how it's rendering, I can hide <li> through css, but how to add another class to form input field? 

Share this post


Link to post
Share on other sites

Hi Guys,

I've been trying to translate the registration form to dutch and I've managed to do so with Username and Password.

But I don't know which field to call for the password description field. 

Does anybody know which field to point to to change this?

"Password must be at least 6 characters and have at least 1 letter and 1 digit. Password may not have whitespace."

$usernameField = $fu->form->get("username");
$usernameField->label = "Gebruikersnaam";

$passwordField = $fu->form->get("password");
$passwordField->label = "Wachtwoord";

Thanks! :)

Bram

Share this post


Link to post
Share on other sites

Before you can modify fields the login / register form have to be created first by execute $fu->login() method with or without optional parameters.

After that you should be able to get form / fields and modify as needed.

Share this post


Link to post
Share on other sites

hi pwFoo,

thanks for your reply. I have indeed executed the register en login forms, and they work perfectly fine, the only problem I have is that I don't know which field to target to be able to change the password description text. Would you happen to know which one that is?

Thanks :)

Bram

Share this post


Link to post
Share on other sites

Hi,

fields are just PW form api fields. should be something like

$usernameField = $fu->form->get("username");
$usernameField->description = "this is my description";

Take a look here: https://processwire.com/talk/topic/7903-add-description-to-form-field-object-method-missing/

There are many great posts about PW form api here in the forums. Also link to Soma's post again ;)

https://processwire.com/talk/topic/2089-create-simple-forms-using-api/

Share this post


Link to post
Share on other sites

Yes! SOLVED

This is what I was looking for, quite obvious! But thanks alot :)

// update password field attributes in a login or registration form

$passwordField = $fu->form->get("password");
$passwordField->label = "New password label";
$passwordField->description = "Password description";
  • Like 1

Share this post


Link to post
Share on other sites

I've to write a little love letter!

I just play the whole day with your modules and i've to say that i'm very very overtaken by your simple modules with a real big benefit to rule API forms and user managment things!

Thumbs up for your input on this topic!

Until now, all i've done worked and i will use this for my first bigger community project website (about several hundred frontend users) and will report how fu() will work.

But this modules follow PW basic rules - simple - easy to use so i don't see any rough edges...;)

Just wanna say a real big thank you and make the suggestion to put the modules from "alpha" state to "beta" ...since many things are fixed the last few months and i think theese modules are indeed in production use...

Best Regards mr-fan

  • Like 3

Share this post


Link to post
Share on other sites

Thanks!  :D

FormHelper and FrontendUser are my first PHP modules. Written with a really basic knowledge of PHP and also PW (just after my first steps with it ;) ). That's why the first approach ignored the PW hooks and used custom code for that...

I learned how to use the power of the PW API and PW hooks. I surprised about the powerful and simple module creation with the PW API and PW hooks!

At the moment I moved to some other topics (Linux, Docker, change IDE,  ...). But I'll come back to PW soon, because I love PW and also the awesome community here!

  • Like 6

Share this post


Link to post
Share on other sites

How do I check whether the user who wants to register has entered a username that does not contain accents, spaces, and any other characters that are not allowed? Can it be achieved server-side with a hook, or do we have to use something like "InputfieldPageName.js" from the core on the frontend?

The issue I'm having is that if someone for example enters a space in his or her username, it will be converted into a dash (which they wouldn't realize unless we indicate it to them specifically), and they wouldn't understand why they can't log in after registering.

Share this post


Link to post
Share on other sites

Using FrontendUser and FormHelper modules on dev 3.0.18 here without problems...

  • Like 1

Share this post


Link to post
Share on other sites

Using FrontendUser and FormHelper modules on dev 3.0.18 here without problems...

@mr-fan, thanks for the good news.

Share this post


Link to post
Share on other sites

There was a little adjustment to be compatible with 3.0 in the past. 

@mr-fan

Thanks for helping out with support here :)

  • Like 1

Share this post


Link to post
Share on other sites

Oh i forgot one little problem...you mentioned....https://processwire.com/talk/topic/9811-frontenduser-login-logout-and-register-users-members/page-6#entry108578

i changed the module that the registration with emailverification works again:

// Load the plain / html email templates
$emailContentHtml =
'<html>
	<body>
		<p>'.$vars['content'].'</p>
		<!-- empty line and comment only lines works as a linebreak with plain emails -->
		<p>Internetseite: <strong>'.wire('config')->httpHost.'</strong></p>

		<p>Benutzername: <strong>'.$vars['username'].'</strong><br />
		Email Adresse: <strong>'.$vars['email'].'</strong></p>

		<p>Freischaltcode: <strong>'.$vars['token'].'</strong></p>

		<p>Link zur Registrierung:<br />
		<strong>'.$vars['url'].'</strong></p>
	</body>
</html>';

so the mailbody is generated directly in the module and not loaded via render->template - i think there is a little change in the 3.x render methode...so it doesn't work?

@pwFoo i'm glad to help here since i use this module for a bigger project and dig deep into - for now i've a little deadline but after it i could provide some snippets and detailed examples of usage...

Best regards mr-fan

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By d'Hinnisdaël
      Happy new year, everybody 🥬
      I've been sitting on this Dashboard module I made for a client and finally came around to cleaning it up and releasing it to the wider public. This is how it looks.
      ProcessWire Dashboard

      If anyone is interested in trying this out, please go ahead! I'd love to get some feedback on it. If this proves useful and survives some real-world testing, I'll add this to the module directory.
      Download
      You can find the latest release on Github.
      Documentation
      Check out the documentation to get started. This is where you'll find information about included panel types and configuration options.
      Custom Panels
      My goal was to make it really simple to create custom panels. The easiest way to do that is to use the panel type template and have it render a file in your templates folder. This might be enough for 80% of all use cases. For anything more complex (FormBuilder submissions? Comments? Live chat?), you can add new panel types by creating modules that extend the DashboardPanel base class. Check out the documentation on custom panels or take a look at the HelloWorld panel to get started. I'm happy to merge any user-created modules into the main repo if they might be useful to more than a few people.
       Disclaimer
      This is a pre-release version. Please treat it as such — don't install it on production sites. Just making sure 🍇
      Roadmap
      These are the things I'm looking to implement myself at some point. The wishlist is a lot longer, but those are the 80/20 items that I probably won't regret spending time on.
      Improve documentation & add examples ⚙️ Panel types Google Analytics ⚙️ Add new page  🔥 Drafts 🔥 At a glance / Page counter 404s  Layout options Render multiple tabs per panel panel groups with heading and spacing between ✅ panel wrappers as grid item (e.g. stacked notices) ✅ Admin themes support AdminThemeReno and AdminThemeDefault ✅ Shortcuts panel add a table layout with icon, title & summary ✅ Chart panel add default styles for common chart types ✅ load chart data from JS file (currently passed as PHP array) Collection panel support image columns ✅ add buttons: view all & add new ✅
    • By Pip
      Hi everyone!
      I'm trying out the Login/Register module for my site. Noted that the module assigns the newly registered user to login-register role. 
      Once you modify the login-register role's permissions, particularly adding page-edit, the new member role will be set to guest. 
      Thing is I'd like to grant my new users the power to create their own pages. Any advice? 
      Thanks. 
    • By Gadgetto
      SnipWire - Snipcart integration for ProcessWire
      Snipcart is a powerful 3rd party, developer-first HTML/JavaScript shopping cart platform. SnipWire is the missing link between Snipcart and the content management framework ProcessWire.
      With SnipWire, you can quickly turn any ProcessWire site into a Snipcart online shop. The SnipWire plugin helps you to get your store up and running in no time. Detailed knowledge of the Snipcart system is not required.
      SnipWire is free and open source licensed under Mozilla Public License 2.0! A lot of work and effort has gone into development. It would be nice if you could donate an amount to support further development:

      Status update links (inside this thread) for SnipWire development
      2020-07-03 -- SnipWire 0.8.7 (beta) released! Fixes some small bugs and adds an indicator for TEST mode 2020-04-06 -- SnipWire 0.8.6 (beta) released! Adds support for Snipcart subscriptions and also fixes some problems 2020-03-21 -- SnipWire 0.8.5 (beta) released! Improves SnipWires webhooks interface and provides some other fixes and additions 2020-03-03 -- SnipWire 0.8.4 (beta) released! Improves compatibility for Windows based Systems. 2020-03-01 -- SnipWire 0.8.3 (beta) released! The installation and uninstallation process has been heavily revised. 2020-02-08 -- SnipWire 0.8.2 (beta) released! Added a feature to change the cart and catalogue currency by GET, POST or SESSION param 2020-02-03 -- SnipWire 0.8.1 (beta) released! All custom classes moved into their own namespaces. 2020-02-01 -- SnipWire is now available via ProcessWire's module directory! 2020-01-30 -- SnipWire 0.8.0 (beta) first public release! (module just submitted to the PW modules directory) 2020-01-28 -- added Custom Order Fields feature (first SnipWire release version is near!) 2020-01-21 -- Snipcart v3 - when will the new cart system be implemented? 2020-01-19 -- integrated taxes provider finished (+ very flexible shipping taxes handling) 2020-01-14 -- new date range picker, discount editor, order notifiactions, order statuses, and more ... 2019-11-15 -- orders filter, order details, download + resend invoices, refunds 2019-10-18 -- list filters, REST API improvements, new docs platform, and more ... 2019-08-08 -- dashboard interface, currency selector, managing Orders, Customers and Products, Added a WireTabs, refinded caching behavior 2019-06-15 -- taxes provider, shop templates update, multiCURL implementation, and more ... 2019-06-02 -- FieldtypeSnipWireTaxSelector 2019-05-25 -- SnipWire will be free and open source Plugin Key Features
      Fast and simple store setup Full integration of the Snipcart dashboard into the ProcessWire backend (no need to leave the ProcessWire admin area) Browse and manage orders, customers, discounts, abandoned carts, and more Multi currency support Custom order and cart fields Process refunds and send customer notifications from within the ProcessWire backend Process Abandoned Carts + sending messages to customers from within the ProcessWire backend Complete Snipcart webhooks integration (all events are hookable via ProcessWire hooks) Integrated taxes provider (which is more flexible then Snipcart own provider) Useful Links
      SnipWire in PW modules directory SnipWire Docs (please note that the documentation is a work in progress) SnipWire @GitHub (feature requests and suggestions for improvement are welcome - I also accept pull requests) Snipcart Website  

       
      ---- INITIAL POST FROM 2019-05-25 ----
       
    • By Sten
      Hello
      Till now I hacked something with the twig template but it works no more with new PW versions so I look forward to create a module. I am working on a site in multiple languages : French, English, Italian, German, Spanish, Portuguese, Hebrew, Russian. The new posts are entered in any language with a field for language. Till now, I got twig files to get the translations with constants defined for each part of the pages.
      So I'd like to create a module to include theses files added according to the url /fr/en/...
      Have you some observations to do before I begin about the direction to take ?
      Thank you
    • By ukyo
      Mystique Module for ProcessWire CMS/CMF
      Github repo : https://github.com/trk/Mystique
      Mystique module allow you to create dynamic fields and store dynamic fields data on database by using a config file.
      Requirements
      ProcessWire 3.0 or newer PHP 7.0 or newer FieldtypeMystique InputfieldMystique Installation
      Install the module from the modules directory:
      Via Composer:
      composer require trk/mystique Via git clone:
      cd your-processwire-project-folder/ cd site/modules/ git clone https://github.com/trk/Mystique.git Module in live reaction with your Mystique config file
      This mean if you remove a field from your config file, field will be removed from edit screen. As you see on youtube video.
      Using Mystique with your module or use different configs path, autoload need to be true for modules
      Default configs path is site/templates/configs/, and your config file name need to start with Mystique. and need to end with .php extension.
      Adding custom path not supporting anymore !
      // Add your custom path inside your module class`init` function, didn't tested outside public function init() { $path = __DIR__ . DIRECTORY_SEPARATOR . 'configs' . DIRECTORY_SEPARATOR; Mystique::add($path); } Mystique module will search site/modules/**/configs/Mystique.*.php and site/templates/Mystique.*.php paths for Mystique config files.
      All config files need to return a PHP ARRAY like examples.
      Usage almost same with ProcessWire Inputfield Api, only difference is set and showIf usage like on example.
      <?php namespace ProcessWire; /** * Resource : testing-mystique */ return [ 'title' => __('Testing Mystique'), 'fields' => [ 'text_field' => [ 'label' => __('You can use short named types'), 'description' => __('In file showIf working like example'), 'notes' => __('Also you can use $input->set() method'), 'type' => 'text', 'showIf' => [ 'another_text' => "=''" ], 'set' => [ 'showCount' => InputfieldText::showCountChars, 'maxlength' => 255 ], 'attr' => [ 'attr-foo' => 'bar', 'attr-bar' => 'foo' ] ], 'another_text' => [ 'label' => __('Another text field (default type is text)') ] ] ]; Example:
      site/templates/configs/Mystique.seo-fields.php <?php namespace ProcessWire; /** * Resource : seo-fields */ return [ 'title' => __('Seo fields'), 'fields' => [ 'window_title' => [ 'label' => __('Window title'), 'type' => Mystique::TEXT, // or InputfieldText 'useLanguages' => true, 'attr' => [ 'placeholder' => __('Enter a window title') ] ], 'navigation_title' => [ 'label' => __('Navigation title'), 'type' => Mystique::TEXT, // or InputfieldText 'useLanguages' => true, 'showIf' => [ 'window_title' => "!=''" ], 'attr' => [ 'placeholder' => __('Enter a navigation title') ] ], 'description' => [ 'label' => __('Description for search engines'), 'type' => Mystique::TEXTAREA, 'useLanguages' => true ], 'page_tpye' => [ 'label' => __('Type'), 'type' => Mystique::SELECT, 'options' => [ 'basic' => __('Basic page'), 'gallery' => __('Gallery'), 'blog' => __('Blog') ] ], 'show_on_nav' => [ 'label' => __('Display this page on navigation'), 'type' => Mystique::CHECKBOX ] ] ]; Searching data on Mystique field is limited. Because, Mystique saving data to database in json format. When you make search for Mystique field, operator not important. Operator will be changed with %= operator.
      Search example
      $navigationPages = pages()->find('my_mystique_field.show_on_nav=1'); $navigationPages = pages()->find('my_mystique_field.page_tpye=gallery');
×
×
  • Create New...