rgf100 Posted October 18, 2017 Posted October 18, 2017 I'm working on a small application which will a) Allow those in a moderation usergroup to move new (moderated) members into the normal (unmoderated) usergroup. b) Send a notification I've got a) working smoothly. I've figured out how to send the notifications I want, but only to one person. $notification->recipients->attach( \IPS\Member::load(1) ); I want to send to an entire usergroup. I can see how I can check an individual member against a usergroup with ->inGroup. But what's the most efficient way to do a foreach loop over a usergroup (which will only ever be very small, against a membership in the tens of thousands. Or alternatively, a foreach loop over every member who has the notification turn on (they'll be one and the same). I can see stuff that might be useful in code for sending notifications for moderators foreach ( \IPS\Db::i()->select( '*', 'core_members', ( count( $moderators['m'] ) ? \IPS\Db::i()->in( 'member_id', $moderators['m'] ) . ' OR ' : '' ) . \IPS\Db::i()->in( 'member_group_id', $moderators['g'] ) . ' OR ' . \IPS\Db::i()->findInSet( 'mgroup_others', $moderators['g'] ) ) as $member ) { $notification->recipients->attach( \IPS\Member::constructFromData( $member ) ); } But I'm wondering if there's a better / recommended way of doing it. It's a little different from the usual IPS notification, as nothing is being followed.
Aiwa Posted October 18, 2017 Posted October 18, 2017 If you're loading multiple members in a loop, it's better to either query for them in your second example, and constructFromData or use an ActiveRecordIterator to return an array of member objects that meet your criteria.
rgf100 Posted October 18, 2017 Author Posted October 18, 2017 Ah, didn't know about active record iteratators. That looks like what I need.
rgf100 Posted October 20, 2017 Author Posted October 20, 2017 Ok, so got it working with this code, for anyone else like me who finds themselves in need of it. Quote foreach ( \IPS\Db::i()->query ("SELECT * FROM core_members WHERE member_group_id=4") as $tonotify) { $notification->recipients->attach( \IPS\Member::constructFromData( $tonotify ) ); } I spent a bit of time trying to get it work with \IPS\Db::i()->select but for some reason failed. I'm not done here as I'll actually need it to work on a secondary user group ultimately. I'm also unsure if this is an efficient way of doing it? It's fine on my test install, but when there are 20,000 members... Learning as I go here... Anyway, thanks for help.
rgf100 Posted October 20, 2017 Author Posted October 20, 2017 And the foreach for a secondary user group... Quote foreach ( \IPS\Db::i()->query ("SELECT * FROM core_members WHERE". \IPS\Db::i()->findInSet( 'mgroup_others', array(6) )) as $tonotify) This took me an embarrassing amount of time to figure out, but I got there!
Recommended Posts
Archived
This topic is now archived and is closed to further replies.