Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

All other Modules /

Discuss all other Modules here.

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

Event Calendar Module: Filtering based on a Many_Many Rship


Go to End


4 Posts   1748 Views

Avatar
dizzystuff

Community Member, 94 Posts

12 April 2010 at 3:00am

Hey Guys

I have extended the Event Calendar in similar ways to the recipe in the docs http://doc.silverstripe.org/doku.php?id=recipes:extending_the_event_calendar but I'm having an issue adding an extra Filter Dropdown field (under the Calendar Widget) and getting it to work.

Basically, in the context of the tutorial/recipe I linked to, I want to be able to filter by Instructor.

That is, I have a many_many relationship between CalendarDateTime.php and Instructor.php and I would like to add a drop down field of Instructors under the existing From and To Calendar Filter dropdowns.

I got to here:

	public function getFilterFields() {
		$fields = parent::getFilterFields(); // returns a CalendarFilterFieldSet
		$instructors = DataObject::get('Instructor');
		$map = $instructors ? $instructors->toDropdownMap('ID','Name') : array();
		$fields->addFilterField(new DropdownField('CalendarDateTime_Instructors','Instructor', $map));
		return $fields;
	}

but as I expected it's looking in the db for an "Instructors" column in the CalendarDateTime table (which it doesn't find and so errors) rather than matching it up via a joint CalendarDateTime_Instructors table.

Is what I'm trying to do possible?

Avatar
UncleCheese

Forum Moderator, 4102 Posts

15 April 2010 at 1:50am

Sorry, it's a one-to-one filter at the moment. If you want to try to modify the filter functionality to support many_many or has_many, that would be awesome. I imagine it's a lot of work, especially to do it cleanly.

Ultimately, I think we just need to have the ability to hand off the filtering to a custom callback function.

Avatar
dizzystuff

Community Member, 94 Posts

16 April 2010 at 2:28am

Yeah fair enough. I think might be a little beyond me, time-wise but also mad-skillz-wise atm lol. If I do end up tweaking I'll post what I come up with here. Any starting points/suggestions?

Avatar
Gene

Community Member, 41 Posts

21 September 2010 at 6:46pm

It's a little sloppy but you can get a many_many join going by overriding 3 Calendar methods: Events, getEventJoin, and getDateJoin

Here's a quick example...

	public function getEventJoin() {
		$join = parent::getEventJoin();
		
		if (isset($_GET['center']) && is_numeric($_GET['center']) && (int)$_GET['center'] > 0) {
			$center = (int)$_GET['center'];
			$join .= " LEFT JOIN `EventDateTime_Centers` ON `EventDateTime_Centers`.`EventDateTimeID` = `EventDateTime`.`ID`";
		}
		
		return $join;
	}
	
	public function getDateJoin() {
		$join = parent::getDateJoin();
		
		if (isset($_GET['center']) && is_numeric($_GET['center']) && (int)$_GET['center'] > 0) {
			$center = (int)$_GET['center'];
			$join .= " LEFT JOIN `EventDateTime_Centers` ON `EventDateTime_Centers`.`EventDateTimeID` = `EventDateTime`.`ID`";
		}
		
		return $join;
	}

	public function Events($filter = null, $start_date = null, $end_date = null, $default_view = false, $limit = null, $announcement_filter = null) {
		if (isset($_GET['center']) && is_numeric($_GET['center']) && (int)$_GET['center'] > 0) {
			$center = (int)$_GET['center'];

			if ($filter) {
				$filter .= ' AND ';
			}
			$filter .= "`EventDateTime_Centers`.`CenterPageID` = '$center'";
		}
		
		return parent::Events($filter, $start_date, $end_date, $default_view, $limit, $announcement_filter);
	}