[V2.0.18.8] Two-in-one: "new user registered callback/ default user image" and "updating a DB value"
Hello again!
I'm quite liking Vanilla so far, but there're still two small challenges I'm currently facing.
First, I would like all of my members to have a default user picture. There doesn't seem to be a standard option for this, so I was wondering if there is some kind of callback I can use when a user registers so I can set it automatically.
The second question ties in neatly to this, namely "how would I set this"? I am also offering some standard pictures for my users to use, and here I'm facing the same problem. I moved these images to "uploads/userpics/default" for consistencies sake and am presenting them to the user. Once they click an item though, what should happen? I mean, I could write a setUserPic.php script, but I'm guessing there's an easier/ more preferred way of going about this. Any tips?
And no, I haven't updated yet, but yes, I will soon.
Best Answers
-
x00 MVP
sorry there is also
UserPhotoDefaultUrl
This is a function you can predefine in conf/boostrap.before.php (create this file)
<?php if (!defined('APPLICATION')) exit(); if (!function_exists('UserPhotoDefaultUrl')) { function UserPhotoDefaultUrl(){ return Url('path/to/image'); } }
grep is your friend.
4 -
Linc Admin
Gravatar can have a custom default image, which is what you want. There's no other way out-of-the-box to do a default avatar.
The procedure for setting a Photo for a user is in ProfileController->Picture(). It boils down to this once you're sure you have a valid value for $UserPhoto:
$UserModel->Save(array('UserID' => $UserID, 'Photo' => $UserPhoto));
7 -
hgtonight MVP
APPLICATION is defined in the index.php file and it is checked at the beginning of most files to prevent them from being executed outside the framework. Which is a good thing.
Wrap your code in a plugin. Check out my Testing Ground plugin for a quick way to get into plugin development.
https://github.com/hgtonight/Plugin-TestingGround
This plugin will execute the
Controller_Index()
method when requesting 'http://forum.example.com/plugin/testingground/`. Put your code in that function and query it via AJAX.Check out the Documentation! We are always looking for new content and pull requests.
Click on insightful, awesome, and funny reactions to thank community volunteers for their valuable posts.
2 -
R_J Admin
@x00 said:
that applies to making a fork too.I think this is a very important part of the sentence you're disagreeing: if you are changing the core you are technically forking the project. If you by any means want to fork the repo, do it in a way that you can track your changes easily. That's how I read x00s statement
But originally I just wanted to give another solution for your problem. It might be the most dirtiest of all possibilities here, but it is the least obtrusive from the framework point of view...
That makes your picture the default value in user table so it will be used for each new user
ALTER TABLE `GDN_User` CHANGE `Photo` `Photo` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT 'http://forum.example.com/path/to/your/usericon.png'
And that will update the picture for every user who has not set his profile picture yet
UPDATE `GDN_User` SET `Photo` = 'http://forum.example.com/path/to/your/usericon.png' WHERE `Photo` IS NULL
1
Answers
Simplest way just use gravatar pluign and you can change the default image.
You wouldn't have to set anything in the db.
grep is your friend.
@x00: I'm afraid I really don't want to use gravatar for my forum though; otherwise it would have been fine.
EDIT: This also wouldn't solve the issue for the default avatars I'm afraid.
sorry there is also
UserPhotoDefaultUrl
This is a function you can predefine in conf/boostrap.before.php (create this file)
grep is your friend.
Gravatar can have a custom default image, which is what you want. There's no other way out-of-the-box to do a default avatar.
The procedure for setting a Photo for a user is in ProfileController->Picture(). It boils down to this once you're sure you have a valid value for $UserPhoto:
if you only care about discussions list, comments then that predefined function will do the job.
Because they use the UserPhoto function.
grep is your friend.
Yes, UserPhotoDefaultUrl works for a code solution. I was actually reticent to mention it because I couldn't remember what version we introduced it, haha.
Thanks both, UserPhotoDefaultUrl seems to work fine, though I had to forego the Url()* call, and it also seems to add an 'n' character before the picture's filename. It seems this is just a Vanilla thing though?
I can definitely ensure valid values for it, so I'll take a look at the $UserMode->Save() method; thanks!
*The code I'm using now, just in case a future visitor sees this:
When you upload a photo to Vanilla it creates multiple sizes and gives them a 1-letter prefix, 'n' is the one for the thumbnail version.
Ah, gotcha; perfect, thanks a bunch!! =D
Apologies for the many questions; I promise this is the last one.
I can get the "standard avatar" system working by executing $UserModel->Save() from inside an existing .php file and a $_GET variable, but I was wondering if I can cleanly separate this out somehow and call it using AJAX. Simply making an additional .php file isn't working as 'APPLICATION' isn't defined. Is there an easy way of giving this script access to 'APPLICATION' somehow?
Senshi if you are going to delve into proper development, I would broadly read the docs.
You should not edit the core, nor do you request individual scripts bypassing the dispatcher and framework. Not in a modern MVC framework.
grep is your friend.
APPLICATION is defined in the index.php file and it is checked at the beginning of most files to prevent them from being executed outside the framework. Which is a good thing.
Wrap your code in a plugin. Check out my Testing Ground plugin for a quick way to get into plugin development.
https://github.com/hgtonight/Plugin-TestingGround
This plugin will execute the
Controller_Index()
method when requesting 'http://forum.example.com/plugin/testingground/`. Put your code in that function and query it via AJAX.Search first
Check out the Documentation! We are always looking for new content and pull requests.
Click on insightful, awesome, and funny reactions to thank community volunteers for their valuable posts.
@x00: Eh, I was afraid you'd say that. Normally I would definitely go that route, but this forum is really just an "extra appendage", if anything, to my project, so I'd rather not spend too much time getting to know Vanilla and doing everything "the right way". I know it's bad practice, but in my case I think the time and effort involved just isn't worth it. I've only made some very small changes (and yes, one or two little hacks), and this is the last one. I'll just go with my working approach then.
Thanks again for both your help, it's very much appreciated!!
Cheers!
well, at least the responses may have been insightful for you! (hint: clicking insightful)
I may not provide the completed solution you might desire, but I do try to provide honest suggestions to help you solve your issue.
I have no problem with people hacking the core for personal projects. I really don't.
It makes it impossible to support, however.
Same to you
Search first
Check out the Documentation! We are always looking for new content and pull requests.
Click on insightful, awesome, and funny reactions to thank community volunteers for their valuable posts.
Honestly, that's refreshing to hear; really glad to hear I'm not the only one who thinks like this! Your solution worked perfectly btw, thank you so much!
They have most definitely been! Thanks for the reminder!
I promise I'm not normally so haphazard about things; next time I use Vanilla I'll be sure to go about it the proper route. It's a great piece of software!
tbh honest it should be discouraged, unless the person is willing to maintain that fork and knows what they are getting into. Not becuase they think they are saving time, when long term they are in for a world of pain.
Any security update will overwrite those changes, unless they are using some version control software an have prepared a patch which they will then have to resolve to apply it.
Doing thing properly is always the best option, that applies to making a fork too.
grep is your friend.
I'll have to politely disagree here. Learning Vanilla and figuring out how to do what I did the right way would probably take me quite a few days. In my case that's just not worth it. I don't even know if the forum will be used after my app's closed beta, and any changes I made to the core can be redone in ±20-30 minutes I reckon.
I get what you're saying, I really do, but "always" is a very strong word.
I think this is a very important part of the sentence you're disagreeing: if you are changing the core you are technically forking the project. If you by any means want to fork the repo, do it in a way that you can track your changes easily. That's how I read x00s statement
But originally I just wanted to give another solution for your problem. It might be the most dirtiest of all possibilities here, but it is the least obtrusive from the framework point of view...
That makes your picture the default value in user table so it will be used for each new user
And that will update the picture for every user who has not set his profile picture yet
I guess that's technically true; it is now a fork. And I definitely agree tracking the changes would be a huge time (and sanity) saver.
Ha, that would probably have been the easiest route! Silly I missed that; thanks for contributing!
I still needed the function for the "standard" avatars though.