Macrura Posted May 18, 2015 Posted May 18, 2015 it was actually the same line; i can check more, but all i did was replace that line and then got the same exact error on the same line, but line 65, because of the added 2 lines
pwFoo Posted May 18, 2015 Author Posted May 18, 2015 I think empty() can't handle method calls and objects. In the evening I'll take a look and fix it. Thanks for feedback and testing!!!
Fester Posted May 18, 2015 Posted May 18, 2015 Hi pwFoo, I'm messing around with your module and it's great! But now I'm trying to add custom fields to the user registration form and I can't seem to get it working. My code is this: <?php $fu = $modules->get('FrontendUser'); $myField = $fields->get(139); echo $fu->register(array('username', 'email', 'password', $myField), $pages->get("template=home")->httpUrl); ?> I'm 100% certain that the $myField variable is not empty too. Is this a bug or am I doing something wrong?
pwFoo Posted May 18, 2015 Author Posted May 18, 2015 Hi Fester, You have to add an Inputfield. See example. // Create form field $myField = $modules->get('InputfieldText');
pwFoo Posted May 18, 2015 Author Posted May 18, 2015 it was actually the same line; i can check more, but all i did was replace that line and then got the same exact error on the same line, but line 65, because of the added 2 lines I shouldn't post workarounds and fixes in hurry... It's a missing feature with php < 5.5 Note: Prior to PHP 5.5, empty() only supports variables; anything else will result in a parse error. In other words, the following will not work: empty(trim($name)). Instead, use trim($name) == false. So I removed one method call... but there are TWO Maybe this fix will work, because it's without an method call. But I don't know if php <5.5 empty() can handle object properties... At the moment I haven't a php 5.3 test env, so maybe it works for you and you can report back here //if (empty(wire('session')->get('registerStep'))) { $session = wire('session'); if (empty($session->registerStep)) { If the PW alternate syntax ($session->registerStep) shouldn't work with empty() isset could work. //if (empty(wire('session')->get('registerStep'))) { $session = wire('session'); if (!isset($session->registerStep)) {
Beluga Posted May 18, 2015 Posted May 18, 2015 Just a note to all having to deal with a host that only offers 5.3: demand better service or switch hosts! It's not anything special these days to use multiple PHP versions on a Linux distro, newer than the one in the distro's repository. 5.3 is EOL for almost a year and simply a security catastrophe waiting to happen. Bottom line: any host that forces 5.3 on you is inept and not worthy of your/your client's money.
pwFoo Posted May 18, 2015 Author Posted May 18, 2015 PW 2.x requires php 5.3. So I wouldn't increase the requirements by my module... Just a note to all having to deal with a host that only offers 5.3: demand better service or switch hosts! It's not anything special these days to use multiple PHP versions on a Linux distro, newer than the one in the distro's repository. 5.3 is EOL for almost a year and simply a security catastrophe waiting to happen. Bottom line: any host that forces 5.3 on you is inept and not worthy of your/your client's money. but you're right! php 5.3 is EOL and an modern hosting should offer a new(er) version or multiple php versions.
Macrura Posted May 18, 2015 Posted May 18, 2015 I'm not running 5.3 on any of my new/development sites, its all 5.4; we just released a module (AceExtended) that is for 5.4+; i think it's fine, just put that in the requirements and don't use any> 5.4 features? Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/0.9.8r DAV/2 PHP/5.4.10
pwFoo Posted May 18, 2015 Author Posted May 18, 2015 Habe you tested this? I shouldn't post workarounds and fixes in hurry... It's a missing feature with php < 5.5 Note: Prior to PHP 5.5, empty() only supports variables; anything else will result in a parse error. In other words, the following will not work: empty(trim($name)). Instead, use trim($name) == false. So I removed one method call... but there are TWO Maybe this fix will work, because it's without an method call. But I don't know if php <5.5 empty() can handle object properties... At the moment I haven't a php 5.3 test env, so maybe it works for you and you can report back here //if (empty(wire('session')->get('registerStep'))) { $session = wire('session'); if (empty($session->registerStep)) { If the PW alternate syntax ($session->registerStep) shouldn't work with empty() isset could work. //if (empty(wire('session')->get('registerStep'))) { $session = wire('session'); if (!isset($session->registerStep)) {
Macrura Posted May 19, 2015 Posted May 19, 2015 yep, tried changing everything, isset and nothing works.. WSOD all the way. Maybe you can setup a temp account on lightning.pw so that your module can be tested with some more widely used version of php?
naldrocks98 Posted May 20, 2015 Posted May 20, 2015 it works for me... i just change all the empty(wire('session')->get('registerStep')) to $session = wire('session'); !isset($session->registerStep) there alteast 4 errors are there....
pwFoo Posted May 20, 2015 Author Posted May 20, 2015 Last update should be php 5.3 compatible. I just removed empty() calls like that. //if (empty(wire('session')->get('registerStep'))) { if (!wire('session')->get('registerStep')) { //if (!empty(wire('session')->get('registerStep')) && wire('session')->get('registerEmail') !== $form->fhValue('email')) { if (wire('session')->get('registerStep') && wire('session')->get('registerEmail') !== $form->fhValue('email')) { No warnings or errors with php 5.5. Would be great if somebody could test the new version 0.8.6 with php 5.3. @naldrocks98 Thank You for your feedback! Could you explain which errors you mean? Error mesage? 1
Macrura Posted May 21, 2015 Posted May 21, 2015 Hi Fester, You have to add an Inputfield. See example. // Create form field $myField = $modules->get('InputfieldText'); this seems to be working for me: // Create form field $last_name = $modules->get('InputfieldText'); $last_name->label = 'Last Name'; $last_name->attr('id+name', 'last_name'); $last_name->required = 1;
pwFoo Posted May 21, 2015 Author Posted May 21, 2015 @Macrura, @Fester Right. You have to use an Inputfield instead of an "Field". Take a look at this topic how to use the PW form api. https://processwire.com/talk/topic/2089-create-simple-forms-using-api/ After field is added you need a hook to handle the input value (sanitize, maybe additional processing and add to userObj). For example see usernameRegister() and passwordRegister().
Macrura Posted May 28, 2015 Posted May 28, 2015 I'm getting this error when trying to use the register form Error: Exception: Method FrontendUser::attr does not exist or is not callable in this context (in /Volumes/Docs/MAMP/htdocs/processwire_xys/wire/core/Wire.php line 350) not sure what the issue could be; tried various things - has anyone got a registration form working with FU yet, and if so could you post steps? TIA .. also - i noticed you are maybe using using $sanitizer->username() but it seems to be deprecated in favor of pageName (?) http://cheatsheet.processwire.com/sanitizer/properties-and-methods/sanitizer-username-value/
pwFoo Posted May 28, 2015 Author Posted May 28, 2015 Module and sub module should work as is. "attr()" is removed during PHP 5.3 compatibility changes. Just use $fu->userObj or $fu->form inside the template. Inside a hook wire('fu') instead of $fu works with PHP 5.3+
Macrura Posted May 28, 2015 Posted May 28, 2015 @pwFoo - thanks for the reply & info. i'll see if i can make it work, and carry on testing the various features. in terms of sanitizing/processing additional custom fields on a registration form, any tips on how and where in the process to do that? thanks again
pwFoo Posted May 28, 2015 Author Posted May 28, 2015 Sanitize field value is a FormHelper feature Set sanitizer to field as an additional attribute $emailField->fhSanitizer = 'email'; Get sanitized value after form processing / submitted $value = $fu->form->fhValue('emailField') Change sanitizer if needed... $value = $fu->form->fhValue('emailField', 'pageName') Or just do it without FormHelper inside a field processInput hook // hook after field processed (form need to be submitted) $myField->addHookAfter('processInput', function($event) { $currentField = $event->object; $value = $currentField->value; §sanitizedValue = wire('sanitizer')->pageName($value); // Do ... } You can take a look in each FU field (like username field for registration) to see some examples. Or at the wiki plugin examples (register, login). Set additional user field "nickname" based on username during registration (plugin). Just hook before "save", generate the value and set it to the userObj. "userObj" is a temp object of type User. All existing fields will be saved. $fu->addHookBefore('save', function($event) { $form = wire('fu')->form; if(!count($form->getErrors())) { wire('fu')->userObj->nickname = $form->fhValue('username', 'text'); } }); You need an additional field with user input? Add a field with sanitizer and a processing hook... Same as username field So you can use it as starting point $myField = $modules->get('InputfieldText'); $myField->label = $this->_('MyLabel'); $myField->attr('id+name', 'MyField'); //$myField->required = 1; $myField->fhSanitizer = 'text'; // Call hook after field is processed by PW form api $myField->addHookAfter('processInput', function($event) { $field = $event->object; // Value will be sanitized as text with "$sanitizer->text()" $mySanitizedCustomInput = wire('fu')->form->fhValue($field->name); // Do ... // Example: Add value to user during registration wire('fu')->userObj->myField = $mySanitizedCustomInput; // Need to set an field error? // $field->error('Custom field has an error...'); }); // Define the field before you call FU and add it as additional field... $fu->register(array('username', 'email', 'password', $myField)); If You need more examples or have a plugin idea just post it here. 1
Jonathan Lahijani Posted June 15, 2015 Posted June 15, 2015 Question... let's say I want users only with a particular role to be able to log in, how would I go about that using hooks? Current code: $fu = $modules->get('FrontendUser'); $fu->login(); $fu->login(array('username', 'password', 'persist', 'forgot')); $fu->process($pages->get("/")->url); echo $fu->render();
pwFoo Posted June 15, 2015 Author Posted June 15, 2015 Should be done with several hooks. For example hookAfter field username "processInput", get the user object by username and check the role. If role is missing, just set a error to the field and login will fail with a custom error message. Or take a look at this example. https://bitbucket.org/pwFoo/frontenduser/wiki/Login%20extensions%20and%20plugins Instead of change the login name to email address or nickname just get the user and check the role. Is the role missing, just replace the hooked method. The FrontendUser::auth method returns (===) "true" if login was successful. So just replace and set an error message, that is displayed next to the submit button. $event->replace = true; $event->return = "Login failed! Missing required user role!";
pwFoo Posted June 21, 2015 Author Posted June 21, 2015 Updated 0.8.7 config email type html | text added to FrontendUserRegisterEmailValidation changed username sanitizer to pageName
Beluga Posted July 14, 2015 Posted July 14, 2015 Maybe I'm a bit daft, but I can't figure out how to create a logout link. The regular ?logout=1 doesn't seem to work. So I'm looking at $fu->logout($redirectDestination); but don't know what to do with it. Plz help Edit: bah, I figured it out: if($user->isLoggedin()) { $fu = $modules->get('FrontendUser'); if (isset($_GET['logout'])) $fu->logout($redirectDestination); echo "<a href='?logout'>Logout</a>"; } Thanks again for the great modules Edit: bonus tip: $redirectdestination must be a url, so if you want to redirect to the front page after registering: $redirectDestination = $pages->get(1)->url; 1
pwFoo Posted July 14, 2015 Author Posted July 14, 2015 It's designed in order to avoid the need URL parameters So you can create a template / page logout or just use your code above.
Beluga Posted July 17, 2015 Posted July 17, 2015 How could we integrate this reCAPTCHA module to the registering action?
pwFoo Posted July 18, 2015 Author Posted July 18, 2015 Hi Beluga, I don't like captcha solutions and so I haven't used the recaptcha module. I use my emailValidation plugin (shipped with FrontendUser module). echo $fu->register(array('username', 'email', 'emailValidation', 'password'), $redirectDestination); It validates the email address as an additional registration step before the user will be added. If recaptcha needs an additional form field just add the form field object echo $fu->register(array('username', 'email', 'password', $myRecaptchaField), $redirectDestination); Add a hook to the form processing (a $form->addHookAfter 'processInput' should do it...) to execute "verifyResponse". If the recaptcha validation isn't ok just set a field error inside the hook to stop the user registration process. $form->fhSubmitBtn->error('reCAPTCHA validation not ok!'); I hope that will help you to figure it out, because I'm in hurry and have no time to take a closer look at it.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now