public function OnLoadPageData() { $player_manager = new PlayerManager($this->GetSettings(), $this->GetDataConnection()); $player_manager->ReadPlayersInTeam(array($this->team->GetId())); $this->players = $player_manager->GetItems(); unset($player_manager); if (count($this->players)) { $this->team = $this->players[0]->Team(); } }
/** * Re-build from data posted by this control a single data object which this control is editing * * @param int $i_counter * @param int $i_id */ protected function BuildPostedItem($i_counter = null, $i_id = null) { $s_key = $this->GetNamingPrefix() . 'Points' . $i_counter; $s_award_key = $this->GetNamingPrefix() . 'Awarded' . $i_counter; $i_points = (int) (isset($_POST[$s_key]) and is_numeric($_POST[$s_key])) ? $_POST[$s_key] : 0; if (isset($_POST[$s_award_key]) and $_POST[$s_award_key] == '2') { $i_points = $i_points - $i_points * 2; } $s_key = $this->GetNamingPrefix() . 'PointsTeam' . $i_counter; $o_team = null; $o_team = new Team($this->GetSettings()); if (isset($_POST[$s_key]) and is_numeric($_POST[$s_key])) { $o_team->SetId($_POST[$s_key]); } $s_key = $this->GetNamingPrefix() . 'Reason' . $i_counter; $s_reason = (isset($_POST[$s_key]) and strlen($_POST[$s_key]) <= 200) ? $_POST[$s_key] : ''; if ($i_points != 0 or $o_team->GetId() or $s_reason) { $o_adjust = new PointsAdjustment($i_id, $i_points, $o_team, $s_reason); $i_date = $this->BuildPostedItemModifiedDate($i_counter, $o_adjust); $o_adjust->SetDate($i_date); $this->DataObjects()->Add($o_adjust); } else { $this->IgnorePostedItem($i_counter); } }
function OnLoadPageData() { /* @var Team $team */ # check parameter if (!isset($_GET['item']) or !is_numeric($_GET['item'])) { $this->Redirect(); } # get team $team_manager = new TeamManager($this->GetSettings(), $this->GetDataConnection()); $team_manager->FilterByTeamType(array()); $team_manager->ReadById(array($_GET['item'])); $this->team = $team_manager->GetFirst(); unset($team_manager); # must have found a team if (!$this->team instanceof Team) { $this->Redirect('/teams/'); } # get match stats require_once 'stoolball/statistics/statistics-manager.class.php'; $statistics_manager = new StatisticsManager($this->GetSettings(), $this->GetDataConnection()); $statistics_manager->FilterByTeam(array($this->team->GetId())); $statistics_manager->ReadMatchStatistics(); $this->stats = $statistics_manager->GetItems(); # Get some stats on the best players $this->statistics_query = "?team=" . $this->team->GetId(); if ($this->season) { # use midpoint of season to get season dates for filter $start_year = substr($this->season, 0, 4); $end_year = strlen($this->season) == 7 ? $start_year + 1 : $start_year; if ($start_year == $end_year) { $season_dates = Season::SeasonDates(mktime(0, 0, 0, 7, 1, $start_year)); } else { $season_dates = Season::SeasonDates(mktime(0, 0, 0, 12, 31, $start_year)); } $statistics_manager->FilterAfterDate($season_dates[0]); $statistics_manager->FilterBeforeDate($season_dates[1]); $this->statistics_query .= "&from=" . $season_dates[0] . "&to=" . $season_dates[1]; } $statistics_manager->FilterMaxResults(10); $this->most_runs = $statistics_manager->ReadBestPlayerAggregate("runs_scored"); $this->most_wickets = $statistics_manager->ReadBestPlayerAggregate("wickets"); $this->most_catches = $statistics_manager->ReadBestPlayerAggregate("catches"); $this->most_run_outs = $statistics_manager->ReadBestPlayerAggregate("run_outs"); $this->most_player_of_match = $statistics_manager->ReadBestPlayerAggregate("player_of_match"); unset($statistics_manager); }
function OnPostback() { # get object $this->team = $this->edit->GetDataObject(); # Check user has permission to edit this team. Authentication for team owners is based on the URI # so make sure we get that from the database, not untrusted user input. if ($this->team->GetId() and !AuthenticationManager::GetUser()->Permissions()->HasPermission(PermissionType::MANAGE_TEAMS)) { $this->team_manager->ReadById(array($this->team->GetId())); $check_team = $this->team_manager->GetFirst(); $this->team->SetShortUrl($check_team->GetShortUrl()); } if ($this->team->GetId() and !AuthenticationManager::GetUser()->Permissions()->HasPermission(PermissionType::MANAGE_TEAMS, $this->team->GetLinkedDataUri()) or !$this->team->GetId() and !AuthenticationManager::GetUser()->Permissions()->HasPermission(PermissionType::MANAGE_TEAMS)) { $this->GetAuthenticationManager()->GetPermission(); } # save data if valid if ($this->IsValid()) { $i_id = $this->team_manager->SaveTeam($this->team); $this->team->SetId($i_id); $this->Redirect($this->team->GetNavigateUrl()); } }
public function __construct(Team $team) { $this->team = $team; $this->searchable = new SearchItem(); $this->searchable->SearchItemId("team" . $team->GetId()); $this->searchable->SearchItemType("team"); $this->searchable->Url($team->GetNavigateUrl()); $this->searchable->Title($team->GetNameAndType()); $this->searchable->Description($this->GetSearchDescription()); $this->searchable->WeightOfType(1000); $keywords = array($team->GetName(), $team->GetGround()->GetAddress()->GetLocality(), $team->GetGround()->GetAddress()->GetTown()); $this->searchable->Keywords(implode(" ", $keywords)); $content = array($team->GetGround()->GetAddress()->GetAdministrativeArea(), $team->GetIntro(), $team->GetPlayingTimes(), $team->GetCost(), $team->GetContact()); $this->searchable->FullText(implode(" ", $content)); $this->searchable->RelatedLinksHtml('<ul>' . '<li><a href="' . $team->GetStatsNavigateUrl() . '">Statistics</a></li>' . '<li><a href="' . $team->GetPlayersNavigateUrl() . '">Players</a></li>' . '<li><a href="' . $team->GetCalendarNavigateUrl() . '">Match calendar</a></li>' . '</ul>'); }
/** * Re-build from data posted by this control a single data object which this control is editing * * @param int $i_counter * @param int $i_id */ protected function BuildPostedItem($i_counter = null, $i_id = null) { $s_key = $this->GetNamingPrefix() . 'Team' . $i_counter; $o_team = null; $o_team = new Team($this->GetSettings()); if (isset($_POST[$s_key]) and is_numeric($_POST[$s_key])) { $o_team->SetId($_POST[$s_key]); } $s_key = $this->GetNamingPrefix() . 'TeamValue' . $i_counter; if (isset($_POST[$s_key])) { $o_team->SetName($_POST[$s_key]); } $s_key = $this->GetNamingPrefix() . 'WithdrawnLeague' . $i_counter; $b_withdrawn_league = (isset($_POST[$s_key]) and $_POST[$s_key] == '1'); if ($o_team->GetId() or $b_withdrawn_league) { $team_in_season = new TeamInSeason($o_team, null, $b_withdrawn_league); $this->DataObjects()->Add($team_in_season); } else { $this->IgnorePostedItem($i_counter); } }
/** * Gets a hash of the specified team * * @param Team $data_object * @return string */ protected function GetDataObjectHash($data_object) { return $this->GenerateHash(array($data_object->GetId())); }
/** * Creates the controls when the editor is in its fixture view * */ private function CreateFixtureControls(Match $match, XhtmlElement $match_box) { $css_class = 'TournamentEdit'; if ($this->GetCssClass()) { $css_class .= ' ' . $this->GetCssClass(); } $match_outer_1 = new XhtmlElement('div'); $match_outer_1->SetCssClass($css_class); $this->SetCssClass(''); $match_outer_1->SetXhtmlId($this->GetNamingPrefix()); $match_outer_2 = new XhtmlElement('div'); $this->AddControl($match_outer_1); $match_outer_1->AddControl($match_outer_2); $match_outer_2->AddControl($match_box); if ($match->GetId()) { $heading = "Edit tournament"; } else { $heading = "Add your tournament"; } if ($this->show_step_number) { $heading .= ' – step 1 of 3'; } $o_title_inner_1 = new XhtmlElement('span', $heading); $o_title_inner_2 = new XhtmlElement('span', $o_title_inner_1); $o_title_inner_3 = new XhtmlElement('span', $o_title_inner_2); $match_box->AddControl(new XhtmlElement('h2', $o_title_inner_3, "large")); # Tournament title $suggested_title = $match->GetTitle(); if (isset($this->context_season)) { $suggested_title = $this->GetContextSeason()->GetCompetition()->GetName(); if (strpos(strtolower($suggested_title), 'tournament') === false) { $suggested_title .= ' tournament'; } } else { if (isset($this->context_team)) { $suggested_title = $this->GetContextTeam()->GetName(); if (strpos(strtolower($suggested_title), 'tournament') === false) { $suggested_title .= ' tournament'; } } } if ($suggested_title == "To be confirmed tournament") { $suggested_title = ""; } if ($suggested_title == "To be confirmed v To be confirmed") { $suggested_title = ""; } $title = new TextBox($this->GetNamingPrefix() . 'Title', $suggested_title, $this->IsValidSubmit()); $title->SetMaxLength(200); $match_box->AddControl(new FormPart('Tournament name', $title)); # Open or invite? require_once 'xhtml/forms/radio-button.class.php'; $qualify_set = new XhtmlElement('fieldset'); $qualify_set->SetCssClass('formPart radioButtonList'); $qualify_set->AddControl(new XhtmlElement('legend', 'Who can play?', 'formLabel')); $qualify_radios = new XhtmlElement('div', null, 'formControl'); $qualify_set->AddControl($qualify_radios); $qualify_radios->AddControl(new RadioButton($this->GetNamingPrefix() . 'Open', $this->GetNamingPrefix() . 'Qualify', 'any team may enter', MatchQualification::OPEN_TOURNAMENT, $match->GetQualificationType() === MatchQualification::OPEN_TOURNAMENT or !$match->GetId(), $this->IsValidSubmit())); $qualify_radios->AddControl(new RadioButton($this->GetNamingPrefix() . 'Qualify', $this->GetNamingPrefix() . 'Qualify', 'only invited or qualifying teams can enter', MatchQualification::CLOSED_TOURNAMENT, $match->GetQualificationType() === MatchQualification::CLOSED_TOURNAMENT, $this->IsValidSubmit())); $match_box->AddControl($qualify_set); # Player type $suggested_type = 2; if (isset($this->context_season)) { $suggested_type = $this->context_season->GetCompetition()->GetPlayerType(); } elseif (isset($this->context_team)) { $suggested_type = $this->context_team->GetPlayerType(); } if (!is_null($match->GetPlayerType())) { $suggested_type = $match->GetPlayerType(); } # Saved value overrides suggestion $player_set = new XhtmlElement('fieldset'); $player_set->SetCssClass('formPart radioButtonList'); $player_set->AddControl(new XhtmlElement('legend', 'Type of teams', 'formLabel')); $player_radios = new XhtmlElement('div', null, 'formControl'); $player_set->AddControl($player_radios); $player_radios_1 = new XhtmlElement('div', null, 'column'); $player_radios_2 = new XhtmlElement('div', null, 'column'); $player_radios->AddControl($player_radios_1); $player_radios->AddControl($player_radios_2); $player_radios_1->AddControl(new RadioButton($this->GetNamingPrefix() . 'Ladies', $this->GetNamingPrefix() . 'PlayerType', 'Ladies', 2, $suggested_type === 2, $this->IsValidSubmit())); $player_radios_1->AddControl(new RadioButton($this->GetNamingPrefix() . 'Mixed', $this->GetNamingPrefix() . 'PlayerType', 'Mixed', 1, $suggested_type === 1, $this->IsValidSubmit())); $player_radios_2->AddControl(new RadioButton($this->GetNamingPrefix() . 'Girls', $this->GetNamingPrefix() . 'PlayerType', 'Junior girls', 5, $suggested_type === 5, $this->IsValidSubmit())); $player_radios_2->AddControl(new RadioButton($this->GetNamingPrefix() . 'Children', $this->GetNamingPrefix() . 'PlayerType', 'Junior mixed', 4, $suggested_type === 6, $this->IsValidSubmit())); $match_box->AddControl($player_set); # How many? $per_side_box = new XhtmlSelect($this->GetNamingPrefix() . "Players", null, $this->IsValid()); $per_side_box->SetBlankFirst(true); for ($i = 6; $i <= 16; $i++) { $per_side_box->AddControl(new XhtmlOption($i)); } if ($match->GetIsMaximumPlayersPerTeamKnown()) { $per_side_box->SelectOption($match->GetMaximumPlayersPerTeam()); } else { if (!$match->GetId()) { # Use eight as sensible default for new tournaments $per_side_box->SelectOption(8); } } $players_per_team = new XhtmlElement("label", $per_side_box); $players_per_team->AddAttribute("for", $this->GetNamingPrefix() . "Players"); $players_per_team->AddControl(" players per team"); $players_part = new FormPart("How many players?", $players_per_team); $players_part->AddCssClass("playersPerTeam"); $match_box->AddControl($players_part); # Overs $overs_box = new XhtmlSelect($this->GetNamingPrefix() . "Overs", null, $this->IsValid()); $overs_box->SetBlankFirst(true); for ($i = 2; $i <= 8; $i++) { $overs_box->AddControl(new XhtmlOption($i)); } if ($match->GetIsOversKnown()) { $overs_box->SelectOption($match->GetOvers()); } $overs_label = new XhtmlElement("label", "Overs per innings"); $overs_label->AddAttribute("for", $overs_box->GetXhtmlId()); $overs_part = new FormPart($overs_label, new XhtmlElement("div", $overs_box)); $overs_part->AddCssClass("overs"); $match_box->AddControl($overs_part); # Start date and time if (!$match->GetStartTime()) { # if no date set, use specified default if ($this->i_default_time) { $match->SetStartTime($this->i_default_time); } else { # if no date set and no default, default to today at 10.30am BST # NOTE that if this is a new tournament in an old season, this date won't be selected because the available # dates will be limited below and won't include today. It'll be the same day in the relevant year though. $i_now = gmdate('U'); $match->SetStartTime(gmmktime(9, 30, 00, (int) gmdate('n', $i_now), (int) gmdate('d', $i_now), (int) gmdate('Y', $i_now))); $match->SetIsStartTimeKnown(true); } } $o_date = new DateControl($this->GetNamingPrefix() . 'Start', $match->GetStartTime(), $match->GetIsStartTimeKnown(), $this->IsValidSubmit()); $o_date->SetShowTime(true); $o_date->SetRequireTime(false); $o_date->SetMinuteInterval(5); # if only one season to choose from, limit available dates to the length of that season if ($this->context_season instanceof Season) { if ($this->context_season->GetStartYear() == $this->context_season->GetEndYear()) { $i_mid_season = gmmktime(0, 0, 0, 6, 30, $this->context_season->GetStartYear()); } else { $i_mid_season = gmmktime(0, 0, 0, 12, 31, $this->context_season->GetStartYear()); } $season_dates = Season::SeasonDates($i_mid_season); $season_start_month = gmdate('n', $season_dates[0]); $season_end_month = gmdate('n', $season_dates[1]); if ($season_start_month) { $o_date->SetMonthStart($season_start_month); } if ($season_end_month) { $o_date->SetMonthEnd($season_end_month); } $season_start_year = $this->context_season->GetStartYear(); $season_end_year = $this->context_season->GetEndYear(); if ($season_start_year) { $o_date->SetYearStart($season_start_year); } if ($season_end_year) { $o_date->SetYearEnd($season_end_year); } } $o_date_part = new FormPart('When?', $o_date); $o_date_part->SetIsFieldset(true); $match_box->AddControl($o_date_part); # Where? $o_ground_list = new XhtmlSelect($this->GetNamingPrefix() . 'Ground'); $o_ground_list->AddControl(new XhtmlOption("Don't know", -1)); $o_ground_list->AddControl(new XhtmlOption('Not listed (type the address in the notes field)', -2)); # Promote the most likely grounds to the top of the list $likely_ground_ids = array(); if ($match->GetGroundId()) { $likely_ground_ids[] = $match->GetGroundId(); } foreach ($this->probable_teams as $o_team) { $likely_ground_ids[] = $o_team->GetGround()->GetId(); } if (isset($this->context_season)) { foreach ($this->context_season->GetTeams() as $o_team) { $likely_ground_ids[] = $o_team->GetGround()->GetId(); } } if (isset($this->context_team) and is_object($this->context_team->GetGround())) { $likely_ground_ids[] = $this->context_team->GetGround()->GetId(); } $likely_grounds = array(); $a_other_grounds = array(); /* @var $o_ground Ground */ foreach ($this->grounds->GetItems() as $o_ground) { if (array_search($o_ground->GetId(), $likely_ground_ids) > -1) { $likely_grounds[] = $o_ground; } else { $a_other_grounds[] = $o_ground; } } # Add home grounds foreach ($likely_grounds as $o_ground) { $option = new XhtmlOption($o_ground->GetNameAndTown(), $o_ground->GetId()); $option->SetGroupName('Likely grounds'); $o_ground_list->AddControl($option); } # Add away grounds foreach ($a_other_grounds as $o_ground) { $option = new XhtmlOption($o_ground->GetNameAndTown(), $o_ground->GetId()); $option->SetGroupName('Other grounds'); $o_ground_list->AddControl($option); } # Select ground if ($match->GetGroundId()) { $o_ground_list->SelectOption($match->GetGroundId()); } elseif (isset($this->context_team)) { $o_ground_list->SelectOption($this->context_team->GetGround()->GetId()); } $o_ground_part = new FormPart('Where?', $o_ground_list); $match_box->AddControl($o_ground_part); # Notes $o_notes = new TextBox($this->GetNamingPrefix() . 'Notes', $match->GetNotes()); $o_notes->SetMode(TextBoxMode::MultiLine()); $o_notes_part = new FormPart('Notes<br />(remember to include contact details)', $o_notes); $match_box->AddControl($o_notes_part); # Remember short URL $o_short_url = new TextBox($this->GetNamingPrefix() . 'ShortUrl', $match->GetShortUrl()); $o_short_url->SetMode(TextBoxMode::Hidden()); $match_box->AddControl($o_short_url); # Note the context team to be added to the tournament by default if (isset($this->context_team)) { $context_team_box = new TextBox($this->GetNamingPrefix() . 'ContextTeam', $this->context_team->GetId()); $context_team_box->SetMode(TextBoxMode::Hidden()); $match_box->AddControl($context_team_box); } # Change Save button to "Next" button if ($this->show_step_number) { $this->SetButtonText('Next »'); } }
/** * Gets the unique id of the team * * @return int */ public function GetTeamId() { return $this->team instanceof Team ? $this->team->GetId() : null; }
/** * Ensures that an entry exists for the given team in the internal opponents * array * * @param string $season_key * @param Team $team */ private function EnsureTeamArray($season_key, Team $team) { if (!array_key_exists($season_key, $this->opponents)) { $this->opponents[$season_key] = array(); } if (!array_key_exists($team->GetId(), $this->opponents[$season_key])) { $this->opponents[$season_key][$team->GetId()] = array(); $this->opponents[$season_key][$team->GetId()]['team'] = $team; $this->opponents[$season_key][$team->GetId()]['matches'] = 0; $this->opponents[$season_key][$team->GetId()]['wins'] = 0; $this->opponents[$season_key][$team->GetId()]['losses'] = 0; $this->opponents[$season_key][$team->GetId()]['equal'] = 0; $this->opponents[$season_key][$team->GetId()]['cancelled'] = 0; } }
function OnLoadPageData() { /* @var $o_last_match Match */ /* @var $season Season */ /* @var $team Team */ # First best guess at where user came from is the page field posted back, # second best is tournaments page. Either can be tampered with, so there will be # a check later before they're used for redirection. If there's a context # season or team its URL will be read from the db and overwrite this later. if (isset($_POST['page'])) { $this->destination_url_if_cancelled = $_POST['page']; } else { $this->destination_url_if_cancelled = "/tournaments"; } # new data manager $match_manager = new MatchManager($this->GetSettings(), $this->GetDataConnection()); $match_manager->FilterByMatchType(array(MatchType::TOURNAMENT)); # Check whether cancel was clicked if ($this->IsPostback() and $this->editor->CancelClicked()) { # new tournament, nothing saved yet, so just send user back where they came from $this->Cancel(); } # Save match if ($this->IsPostback() and $this->IsValid()) { # Get posted match $this->tournament = $this->editor->GetDataObject(); # Save match $match_manager->SaveFixture($this->tournament); if (count($this->tournament->GetAwayTeams())) { $match_manager->SaveTeams($this->tournament); } if ($this->season instanceof Season) { $this->tournament->Seasons()->Add($this->season); $match_manager->SaveSeasons($this->tournament, true); } http_response_code(303); $this->Redirect($this->tournament->AddTournamentTeamsUrl()); } if (isset($this->season)) { $season_manager = new SeasonManager($this->GetSettings(), $this->GetDataConnection()); $season_manager->ReadById(array($this->season->GetId())); $this->season = $season_manager->GetFirst(); $this->editor->SetContextSeason($this->season); $this->destination_url_if_cancelled = $this->season->GetNavigateUrl(); unset($season_manager); # If we're adding a match to a season, get last game in season for its date $match_manager->ReadLastInSeason($this->season->GetId()); } if (isset($this->team)) { # Get more information about the team itself require_once 'stoolball/team-manager.class.php'; $team_manager = new TeamManager($this->GetSettings(), $this->GetDataConnection()); $team_manager->ReadById(array($this->team->GetId())); $this->team = $team_manager->GetFirst(); $this->editor->SetContextTeam($this->team); $this->destination_url_if_cancelled = $this->team->GetNavigateUrl(); # Get the last game already scheduled for the team to use its date $match_manager->ReadLastForTeam($this->team->GetId()); # Read teams played in the last year in order to get their grounds, which will be put at the top of the select list $team_manager->ReadRecentOpponents(array($this->team->GetId()), 12); $this->editor->ProbableTeams()->SetItems($team_manager->GetItems()); unset($team_manager); } # Use the date of the most recent tournament if it was this year, otherwise just use the default of today $o_last_match = $match_manager->GetFirst(); if (is_object($o_last_match) and gmdate('Y', $o_last_match->GetStartTime()) == gmdate('Y')) { if ($o_last_match->GetIsStartTimeKnown()) { # If the last match has a time, use it $this->editor->SetDefaultTime($o_last_match->GetStartTime()); } else { # If the last match has no time, use 11am BST $this->editor->SetDefaultTime(gmmktime(10, 0, 0, gmdate('m', $o_last_match->GetStartTime()), gmdate('d', $o_last_match->GetStartTime()), gmdate('Y', $o_last_match->GetStartTime()))); } } unset($match_manager); # Get grounds $o_ground_manager = new GroundManager($this->GetSettings(), $this->GetDataConnection()); $o_ground_manager->ReadAll(); $a_grounds = $o_ground_manager->GetItems(); $this->editor->Grounds()->SetItems($a_grounds); unset($o_ground_manager); }
protected function CreateControls() { $o_match = $this->GetDataObject(); if (is_null($o_match)) { $o_match = new Match($this->GetSettings()); } /* @var $o_match Match */ /* @var $o_team Team */ $b_got_home = !is_null($o_match->GetHomeTeam()); $b_got_away = !is_null($o_match->GetAwayTeam()); $b_is_new_match = !(bool) $o_match->GetId(); $b_is_tournament_match = false; if ($this->i_match_type == MatchType::TOURNAMENT_MATCH) { $b_is_tournament_match = $this->tournament instanceof Match; } else { if ($o_match->GetMatchType() == MatchType::TOURNAMENT_MATCH and $o_match->GetTournament() instanceof Match) { $this->SetTournament($o_match->GetTournament()); $this->SetMatchType($o_match->GetMatchType()); $b_is_tournament_match = true; } } $o_match_outer_1 = new XhtmlElement('div'); $o_match_outer_1->SetCssClass('MatchFixtureEdit'); $o_match_outer_1->AddCssClass($this->GetCssClass()); $this->SetCssClass(''); $o_match_outer_1->SetXhtmlId($this->GetNamingPrefix()); $o_match_outer_2 = new XhtmlElement('div'); $o_match_box = new XhtmlElement('div'); $this->AddControl($o_match_outer_1); $o_match_outer_1->AddControl($o_match_outer_2); $o_match_outer_2->AddControl($o_match_box); if ($this->GetShowHeading()) { $s_heading = str_replace('{0}', MatchType::Text($this->i_match_type), $this->GetHeading()); # Add match type if required $o_title_inner_1 = new XhtmlElement('span', htmlentities($s_heading, ENT_QUOTES, "UTF-8", false)); $o_title_inner_2 = new XhtmlElement('span', $o_title_inner_1); $o_title_inner_3 = new XhtmlElement('span', $o_title_inner_2); $o_match_box->AddControl(new XhtmlElement('h2', $o_title_inner_3, "medium large")); } # Offer choice of season if appropriate $season_count = $this->seasons->GetCount(); if ($season_count == 1 and $this->i_match_type != MatchType::PRACTICE) { $o_season_id = new TextBox($this->GetNamingPrefix() . 'Season', $this->seasons->GetFirst()->GetId()); $o_season_id->SetMode(TextBoxMode::Hidden()); $o_match_box->AddControl($o_season_id); } elseif ($season_count > 1 and $this->i_match_type != MatchType::PRACTICE) { $o_season_id = new XhtmlSelect($this->GetNamingPrefix() . 'Season', '', $this->IsValidSubmit()); foreach ($this->Seasons()->GetItems() as $season) { $o_season_id->AddControl(new XhtmlOption($season->GetCompetitionName(), $season->GetId())); } $o_match_box->AddControl(new FormPart('Competition', $o_season_id)); } # Start date and time $match_time_known = (bool) $o_match->GetStartTime(); if (!$match_time_known) { # if no date set, use specified default if ($this->i_default_time) { $o_match->SetStartTime($this->i_default_time); if ($b_is_tournament_match) { $o_match->SetIsStartTimeKnown(false); } } else { # if no date set and no default, default to today at 6.30pm BST $i_now = gmdate('U'); $o_match->SetStartTime(gmmktime(17, 30, 00, (int) gmdate('n', $i_now), (int) gmdate('d', $i_now), (int) gmdate('Y', $i_now))); } } $o_date = new DateControl($this->GetNamingPrefix() . 'Start', $o_match->GetStartTime(), $o_match->GetIsStartTimeKnown(), $this->IsValidSubmit()); $o_date->SetShowTime(true); $o_date->SetRequireTime(false); $o_date->SetMinuteInterval(5); # if no date set and only one season to choose from, limit available dates to the length of that season if (!$match_time_known and $season_count == 1) { if ($this->Seasons()->GetFirst()->GetStartYear() == $this->Seasons()->GetFirst()->GetEndYear()) { $i_mid_season = gmmktime(0, 0, 0, 6, 30, $this->Seasons()->GetFirst()->GetStartYear()); } else { $i_mid_season = gmmktime(0, 0, 0, 12, 31, $this->Seasons()->GetFirst()->GetStartYear()); } $season_dates = Season::SeasonDates($i_mid_season); $season_start_month = gmdate('n', $season_dates[0]); $season_end_month = gmdate('n', $season_dates[1]); if ($season_start_month) { $o_date->SetMonthStart($season_start_month); } if ($season_end_month) { $o_date->SetMonthEnd($season_end_month + 1); } // TODO: need a better way to handle this, allowing overlap. Shirley has indoor matches until early April. $season_start_year = $this->Seasons()->GetFirst()->GetStartYear(); $season_end_year = $this->Seasons()->GetFirst()->GetEndYear(); if ($season_start_year) { $o_date->SetYearStart($season_start_year); } if ($season_end_year) { $o_date->SetYearEnd($season_end_year); } } if ($b_is_tournament_match) { $o_date->SetShowDate(false); $o_date->SetShowTime(false); $o_match_box->AddControl($o_date); } else { $o_date_part = new FormPart('When?', $o_date); $o_date_part->SetIsFieldset(true); $o_match_box->AddControl($o_date_part); } # Who's playing? if ($this->i_match_type == MatchType::PRACTICE and isset($this->context_team)) { $home_id = new TextBox($this->GetNamingPrefix() . 'Home', $this->context_team->GetId()); $home_id->SetMode(TextBoxMode::Hidden()); $away_id = new TextBox($this->GetNamingPrefix() . 'Away', $this->context_team->GetId()); $away_id->SetMode(TextBoxMode::Hidden()); $o_match_box->AddControl($home_id); $o_match_box->AddControl($away_id); } else { $o_home_list = new XhtmlSelect($this->GetNamingPrefix() . 'Home'); $o_away_list = new XhtmlSelect($this->GetNamingPrefix() . 'Away'); $first_real_team_index = 0; if ($this->b_user_is_admin) { # Option of not specifying teams is currently admin-only # Value of 0 is important because PHP sees it as boolean negative, but it can be used as the indexer of an array in JavaScript $o_home_list->AddControl(new XhtmlOption("Don't know yet", '0')); $o_away_list->AddControl(new XhtmlOption("Don't know yet", '0')); $first_real_team_index = 1; } foreach ($this->a_teams as $group_name => $teams) { foreach ($teams as $o_team) { $home_option = new XhtmlOption($o_team->GetName(), $o_team->GetId()); if (is_string($group_name) and $group_name) { $home_option->SetGroupName($group_name); } $o_home_list->AddControl($home_option); $away_option = new XhtmlOption($o_team->GetName(), $o_team->GetId()); if (is_string($group_name) and $group_name) { $away_option->SetGroupName($group_name); } $o_away_list->AddControl($away_option); } } $o_home_part = new FormPart('Home team', $o_home_list); $o_away_part = new FormPart('Away team', $o_away_list); $o_match_box->AddControl($o_home_part); $o_match_box->AddControl($o_away_part); if ($b_got_home) { $o_home_list->SelectOption($o_match->GetHomeTeamId()); } if (!$b_got_home and $b_is_new_match) { // if no home team data, select the first team by default // unless editing a match, in which case it may be correct to have no teams (eg cup final) $o_home_list->SelectIndex($first_real_team_index); } if (!$b_got_away and $b_is_new_match) { // if no away team data, select the second team as the away team so that it's not the same as the first // unless editing a match, in which case it may be correct to have no teams (eg cup final). $o_away_list->SelectIndex($first_real_team_index + 1); // if there was a home team but not an away team, make sure we don't select the home team against itself if ($b_got_home and $o_away_list->GetSelectedValue() == (string) $o_match->GetHomeTeamId()) { $o_away_list->SelectIndex($first_real_team_index); } } else { if ($b_got_away) { $o_away_list->SelectOption($o_match->GetAwayTeamId()); } if (!$b_is_new_match) { # Note which away team was previously saved, even if it's "not known" - this is for JavaScript to know it shouldn't auto-change the away team $away_saved = new TextBox($this->GetNamingPrefix() . 'SavedAway', $o_match->GetAwayTeamId()); $away_saved->SetMode(TextBoxMode::Hidden()); $o_match_box->AddControl($away_saved); unset($away_saved); } } } # Where? # If tournament match, assume same ground as tournament. Otherwise ask the user for ground. if ($b_is_tournament_match) { $ground = new TextBox($this->GetNamingPrefix() . 'Ground', $this->tournament->GetGroundId() ? $this->tournament->GetGroundId() : $o_match->GetGroundId()); $ground->SetMode(TextBoxMode::Hidden()); $o_match_box->AddControl($ground); } else { $o_ground_list = new XhtmlSelect($this->GetNamingPrefix() . 'Ground'); $o_ground_list->AddControl(new XhtmlOption("Don't know", -1)); $o_ground_list->AddControl(new XhtmlOption('Not listed (type the address in the notes field)', -2)); # Promote home grounds for this season to the top of the list $a_home_ground_ids = array(); foreach ($this->a_teams as $teams) { foreach ($teams as $o_team) { $a_home_ground_ids[$o_team->GetId()] = $o_team->GetGround()->GetId(); } } $a_home_grounds = array(); $a_other_grounds = array(); /* @var $o_ground Ground */ foreach ($this->a_grounds as $o_ground) { if (array_search($o_ground->GetId(), $a_home_ground_ids) > -1) { $a_home_grounds[] = $o_ground; } else { $a_other_grounds[] = $o_ground; } } # Add home grounds foreach ($a_home_grounds as $o_ground) { $option = new XhtmlOption($o_ground->GetNameAndTown(), $o_ground->GetId()); $option->SetGroupName('Home grounds'); $o_ground_list->AddControl($option); } # Add away grounds foreach ($a_other_grounds as $o_ground) { $option = new XhtmlOption($o_ground->GetNameAndTown(), $o_ground->GetId()); $option->SetGroupName('Away grounds'); $o_ground_list->AddControl($option); } # Select ground if ($o_match->GetGroundId()) { $o_ground_list->SelectOption($o_match->GetGroundId()); } elseif ($this->i_match_type == MatchType::PRACTICE and isset($this->context_team)) { $o_ground_list->SelectOption($this->context_team->GetGround()->GetId()); } $o_ground_part = new FormPart('Where?', $o_ground_list); $o_match_box->AddControl($o_ground_part); # Note which grounds belong to which teams, for use by match-fixture-edit-control.js to select a ground when the home team is changed # Format is 1,2;2,3;4,5 # where ; separates each team, and for each team the first number identifies the team and the second is the ground $s_team_ground = ''; foreach ($a_home_ground_ids as $i_team => $i_ground) { if ($s_team_ground) { $s_team_ground .= ';'; } $s_team_ground .= $i_team . ',' . $i_ground; } $o_hidden = new TextBox($this->GetNamingPrefix() . 'TeamGround', $s_team_ground); $o_hidden->SetMode(TextBoxMode::Hidden()); $o_match_box->AddControl($o_hidden); unset($o_hidden); # Note which ground was previously saved - this is for JavaScript to know it shouldn't auto-change the ground if (!$b_is_new_match) { $o_hidden = new TextBox($this->GetNamingPrefix() . 'SavedGround', $o_match->GetGroundId()); $o_hidden->SetMode(TextBoxMode::Hidden()); $o_match_box->AddControl($o_hidden); unset($o_hidden); } } # Notes $o_notes = new TextBox($this->GetNamingPrefix() . 'Notes', $o_match->GetNotes()); $o_notes->SetMode(TextBoxMode::MultiLine()); $o_notes_part = new FormPart('Notes', $o_notes); $o_match_box->AddControl($o_notes_part); # Remember match type, tournament and short URL $o_type = new TextBox($this->GetNamingPrefix() . 'MatchType', $this->GetMatchType()); $o_type->SetMode(TextBoxMode::Hidden()); $o_match_box->AddControl($o_type); if ($b_is_tournament_match) { $tourn_box = new TextBox($this->GetNamingPrefix() . 'Tournament', $this->tournament->GetId()); $tourn_box->SetMode(TextBoxMode::Hidden()); $o_match_box->AddControl($tourn_box); } $o_short_url = new TextBox($this->GetNamingPrefix() . 'ShortUrl', $o_match->GetShortUrl()); $o_short_url->SetMode(TextBoxMode::Hidden()); $o_match_box->AddControl($o_short_url); # Note the context team - to be picked up by JavaScript to enable auto-changing of away team if # context team is not selected as home team if (isset($this->context_team)) { $context_team_box = new TextBox($this->GetNamingPrefix() . 'ContextTeam', $this->context_team->GetId()); $context_team_box->SetMode(TextBoxMode::Hidden()); $o_match_box->AddControl($context_team_box); } }
/** * @return int * @param Team $team * @desc Save the supplied Team to the database, and return the id */ public function SaveTeam(Team $team) { # First job is to check permissions. There are several scenarios: # - adding regular teams requires the highest privileges # - adding once-only teams requires low privileges # - editing teams has less access for a team owner than for a site admin # # Important to check the previous team type from the database before trusting # the one submitted, as changing the team type changes editing privileges $user = AuthenticationManager::GetUser(); $is_admin = $user->Permissions()->HasPermission(PermissionType::MANAGE_TEAMS); $is_team_owner = $user->Permissions()->HasPermission(PermissionType::MANAGE_TEAMS, $team->GetLinkedDataUri()); $adding = !(bool) $team->GetId(); $old_team = null; if (!$adding) { $this->ReadById(array($team->GetId())); $old_team = $this->GetFirst(); $team->SetTeamType($this->GetPermittedTeamType($old_team->GetTeamType(), $team->GetTeamType())); } $is_once_only = $team->GetTeamType() == Team::ONCE; # To add a regular team we need global manage teams permission if ($adding and !$is_once_only and !$is_admin) { throw new Exception("Unauthorised"); } # To edit a team we need global manage teams permission, or team owner permission if (!$adding and !$is_admin and !$is_team_owner) { throw new Exception("Unauthorised"); } # Only an admin can change the short URL after the team is created if ($adding or $is_admin) { # Set up short URL manager # Before changing the short URL, important that $old_team has a note of the current resource URI require_once 'http/short-url-manager.class.php'; $o_url_manager = new ShortUrlManager($this->GetSettings(), $this->GetDataConnection()); $new_short_url = $o_url_manager->EnsureShortUrl($team); } # build query $i_club_id = !is_null($team->GetClub()) ? $team->GetClub()->GetId() : null; $allowed_html = array('p', 'br', 'strong', 'em', 'a[href]', 'ul', 'ol', 'li'); $school_years = $team->GetSchoolYears(); $school_years_sql = "year1 = " . Sql::ProtectBool(array_key_exists(1, $school_years) and $school_years[1], false, false) . ", \r\n year2 = " . Sql::ProtectBool(array_key_exists(2, $school_years) and $school_years[2], false, false) . ", \r\n year3 = " . Sql::ProtectBool(array_key_exists(3, $school_years) and $school_years[3], false, false) . ", \r\n year4 = " . Sql::ProtectBool(array_key_exists(4, $school_years) and $school_years[4], false, false) . ", \r\n year5 = " . Sql::ProtectBool(array_key_exists(5, $school_years) and $school_years[5], false, false) . ", \r\n year6 = " . Sql::ProtectBool(array_key_exists(6, $school_years) and $school_years[6], false, false) . ", \r\n year7 = " . Sql::ProtectBool(array_key_exists(7, $school_years) and $school_years[7], false, false) . ", \r\n year8 = " . Sql::ProtectBool(array_key_exists(8, $school_years) and $school_years[8], false, false) . ", \r\n year9 = " . Sql::ProtectBool(array_key_exists(9, $school_years) and $school_years[9], false, false) . ", \r\n year10 = " . Sql::ProtectBool(array_key_exists(10, $school_years) and $school_years[10], false, false) . ", \r\n year11 = " . Sql::ProtectBool(array_key_exists(11, $school_years) and $school_years[11], false, false) . ", \r\n year12 = " . Sql::ProtectBool(array_key_exists(12, $school_years) and $school_years[12], false, false) . ", "; # if no id, it's a new Team; otherwise update the Team if ($adding) { $sql = 'INSERT INTO nsa_team SET ' . "team_name = " . $this->SqlString($team->GetName()) . ", \r\n comparable_name = " . Sql::ProtectString($this->GetDataConnection(), $team->GetComparableName(), false) . ",\r\n club_id = " . Sql::ProtectNumeric($i_club_id, true) . ", \r\n website = " . $this->SqlString($team->GetWebsiteUrl()) . ", " . 'ground_id = ' . Sql::ProtectNumeric($team->GetGround()->GetId(), true) . ', ' . 'active = ' . Sql::ProtectBool($team->GetIsActive()) . ", \r\n team_type = " . Sql::ProtectNumeric($team->GetTeamType()) . ", \r\n {$school_years_sql}\r\n player_type_id = " . Sql::ProtectNumeric($team->GetPlayerType()) . ",\r\n intro = " . $this->SqlHtmlString($team->GetIntro(), $allowed_html) . ",\r\n playing_times = " . $this->SqlHtmlString($team->GetPlayingTimes(), $allowed_html) . ", \r\n cost = " . $this->SqlHtmlString($team->GetCost(), $allowed_html) . ", " . "contact = " . $this->SqlHtmlString($team->GetContact(), $allowed_html) . ", " . "contact_nsa = " . $this->SqlHtmlString($team->GetPrivateContact(), $allowed_html) . ", " . "short_url = " . $this->SqlString($team->GetShortUrl()) . ", \r\n update_search = " . ($is_once_only ? "0" : "1") . ", \r\n date_added = " . gmdate('U') . ', ' . 'date_changed = ' . gmdate('U') . ", " . "modified_by_id = " . Sql::ProtectNumeric($user->GetId()); # run query $this->LoggedQuery($sql); # get autonumber $team->SetId($this->GetDataConnection()->insertID()); # Create default extras players require_once "player-manager.class.php"; $player_manager = new PlayerManager($this->GetSettings(), $this->GetDataConnection()); $player_manager->CreateExtrasPlayersForTeam($team->GetId()); unset($player_manager); # Create owner role require_once "authentication/authentication-manager.class.php"; require_once "authentication/role.class.php"; $authentication_manager = new AuthenticationManager($this->GetSettings(), $this->GetDataConnection(), null); $role = new Role(); $role->setRoleName("Team owner: " . $team->GetName()); $role->Permissions()->AddPermission(PermissionType::MANAGE_TEAMS, $team->GetLinkedDataUri()); $authentication_manager->SaveRole($role); $sql = "UPDATE nsa_team SET owner_role_id = " . Sql::ProtectNumeric($role->getRoleId(), false, false) . ' WHERE team_id = ' . Sql::ProtectNumeric($team->GetId()); $this->LoggedQuery($sql); # If creating a once-only team, make the current user an owner if ($is_once_only and !$is_admin) { $authentication_manager->AddUserToRole($user->GetId(), $role->getRoleId()); $authentication_manager->LoadUserPermissions(); } unset($authentication_manager); } else { # Now update the team, depending on permissions $sql = 'UPDATE nsa_team SET ' . "website = " . $this->SqlString($team->GetWebsiteUrl()) . ", " . "intro = " . $this->SqlHtmlString($team->GetIntro(), $allowed_html) . ", " . "cost = " . $this->SqlHtmlString($team->GetCost(), $allowed_html) . ", " . "contact = " . $this->SqlHtmlString($team->GetContact(), $allowed_html) . ", " . "contact_nsa = " . $this->SqlHtmlString($team->GetPrivateContact(), $allowed_html) . ", \r\n update_search = " . ($is_once_only ? "0" : "1") . ", \r\n date_changed = " . gmdate('U') . ", \r\n modified_by_id = " . Sql::ProtectNumeric($user->GetId()) . ' '; if (!$is_once_only) { $sql .= ", \r\n active = " . Sql::ProtectBool($team->GetIsActive()) . ", \r\n team_type = " . Sql::ProtectNumeric($team->GetTeamType()) . ",\r\n {$school_years_sql}\r\n ground_id = " . Sql::ProtectNumeric($team->GetGround()->GetId(), true) . ", \r\n playing_times = " . $this->SqlHtmlString($team->GetPlayingTimes(), $allowed_html); } if ($is_admin or $is_once_only) { $sql .= ",\r\n team_name = " . $this->SqlString($team->GetName()); } if ($is_admin) { $sql .= ",\r\n club_id = " . Sql::ProtectNumeric($i_club_id, true) . ", \r\n player_type_id = " . Sql::ProtectNumeric($team->GetPlayerType()) . ", \r\n comparable_name = " . Sql::ProtectString($this->GetDataConnection(), $team->GetComparableName(), false) . ",\r\n short_url = " . $this->SqlString($team->GetShortUrl()) . " "; } $sql .= "WHERE team_id = " . Sql::ProtectNumeric($team->GetId()); $this->LoggedQuery($sql); # In case team name changed, update stats table if ($is_admin or $is_once_only) { $sql = "UPDATE nsa_player_match SET team_name = " . $this->SqlString($team->GetName()) . " WHERE team_id = " . Sql::ProtectNumeric($team->GetId()); $this->LoggedQuery($sql); $sql = "UPDATE nsa_player_match SET opposition_name = " . $this->SqlString($team->GetName()) . " WHERE opposition_id = " . Sql::ProtectNumeric($team->GetId()); $this->LoggedQuery($sql); } } if ($adding or $is_admin) { # Regenerate short URLs if (is_object($new_short_url)) { $new_short_url->SetParameterValuesFromObject($team); $o_url_manager->Save($new_short_url); if (!$adding) { $o_url_manager->ReplacePrefixForChildUrls(Player::GetShortUrlFormatForType($this->GetSettings()), $old_team->GetShortUrl(), $team->GetShortUrl()); $old_prefix = $this->SqlString($old_team->GetShortUrl() . "/%"); $new_prefix = $this->SqlString($team->GetShortUrl()); $sql = "UPDATE nsa_player_match SET\r\n player_url = CONCAT({$new_prefix}, RIGHT(player_url,CHAR_LENGTH(player_url)-LOCATE('/',player_url)+1))\r\n WHERE player_url LIKE {$old_prefix}"; $this->LoggedQuery($sql); } } unset($o_url_manager); # Owner permission is based on the resource URI, which in turn is based on short URL, # so if it's changed update the permissions if ($old_team instanceof Team) { $old_resource_uri = $old_team->GetLinkedDataUri(); $new_resource_uri = $team->GetLinkedDataUri(); if ($old_resource_uri != $new_resource_uri) { $permissions_table = $this->GetSettings()->GetTable("PermissionRoleLink"); $sql = "UPDATE {$permissions_table} SET resource_uri = " . $this->SqlString($new_resource_uri) . " WHERE resource_uri = " . $this->SqlString($old_resource_uri); $this->LoggedQuery($sql); } } } if (!$is_once_only) { # Request search update for affected competitions $sql = "UPDATE nsa_competition SET update_search = 1 WHERE competition_id IN \r\n (\r\n SELECT competition_id FROM nsa_season WHERE season_id IN\r\n (\r\n SELECT season_id FROM nsa_team_season WHERE team_id = " . SQL::ProtectNumeric($team->GetId(), false) . " \r\n )\r\n )"; $this->LoggedQuery($sql); # Request searched update for effects of changing the team name $sql = "UPDATE nsa_player SET update_search = 1 WHERE team_id = " . SQL::ProtectNumeric($team->GetId(), false); $this->LoggedQuery($sql); $sql = "UPDATE nsa_match SET update_search = 1 WHERE match_id IN ( SELECT match_id FROM nsa_match_team WHERE team_id = " . SQL::ProtectNumeric($team->GetId(), false) . ")"; $this->LoggedQuery($sql); # Request search update for changing the team home ground $sql = "UPDATE nsa_ground SET update_search = 1 WHERE ground_id = " . Sql::ProtectNumeric($team->GetGround()->GetId(), false); $this->LoggedQuery($sql); } return $team->GetId(); }
function OnLoadPageData() { /* @var Team $team */ # check parameter if (!isset($_GET['item']) or !is_numeric($_GET['item'])) { $this->Redirect(); } # new data manager $team_manager = new TeamManager($this->GetSettings(), $this->GetDataConnection()); $match_manager = new MatchManager($this->GetSettings(), $this->GetDataConnection()); # get teams $team_manager->FilterByTeamType(array()); $team_manager->ReadById(array($_GET['item'])); $this->team = $team_manager->GetFirst(); # must have found a team if (!$this->team instanceof Team) { $this->Redirect('/teams/'); } # Update search engine if ($this->team->GetSearchUpdateRequired()) { require_once "search/team-search-adapter.class.php"; $this->SearchIndexer()->DeleteFromIndexById("team" . $this->team->GetId()); $adapter = new TeamSearchAdapter($this->team); $this->SearchIndexer()->Index($adapter->GetSearchableItem()); $this->SearchIndexer()->CommitChanges(); $team_manager->SearchUpdated($this->team->GetId()); } unset($team_manager); $this->is_one_time_team = $this->team->GetTeamType() == Team::ONCE; # get matches and match stats if (!$this->is_one_time_team) { $a_season_dates = Season::SeasonDates(); $this->season_key = date('Y', $a_season_dates[0]); if ($this->season_key != date('Y', $a_season_dates[1])) { $this->season_key .= "/" . date('y', $a_season_dates[1]); } $match_manager->FilterByDateStart($a_season_dates[0]); } $match_manager->FilterByTeam(array($this->team->GetId())); $match_manager->ReadMatchSummaries(); $this->a_matches = $match_manager->GetItems(); unset($match_manager); $club = $this->team->GetClub(); $this->has_facebook_group_url = ($club->GetFacebookUrl() and strpos($club->GetFacebookUrl(), '/groups/') !== false); $this->has_facebook_page_url = ($club->GetFacebookUrl() and !$this->has_facebook_group_url); if (!$this->has_facebook_page_url) { require_once 'stoolball/statistics/statistics-manager.class.php'; $statistics_manager = new StatisticsManager($this->GetSettings(), $this->GetDataConnection()); $statistics_manager->FilterByTeam(array($this->team->GetId())); $statistics_manager->FilterMaxResults(1); $this->best_batting = $statistics_manager->ReadBestBattingPerformance(); $this->best_bowling = $statistics_manager->ReadBestBowlingPerformance(); $this->most_runs = $statistics_manager->ReadBestPlayerAggregate("runs_scored"); $this->most_wickets = $statistics_manager->ReadBestPlayerAggregate("wickets"); $this->most_catches = $statistics_manager->ReadBestPlayerAggregate("catches"); # See what stats we've got available $best_batting_count = count($this->best_batting); $best_bowling_count = count($this->best_bowling); $best_batters = count($this->most_runs); $best_bowlers = count($this->most_wickets); $best_catchers = count($this->most_catches); $this->has_player_stats = ($best_batting_count or $best_batters or $best_bowling_count or $best_bowlers or $best_catchers); if (!$this->has_player_stats) { $player_of_match = $statistics_manager->ReadBestPlayerAggregate("player_of_match"); $this->has_player_stats = (bool) count($player_of_match); } unset($statistics_manager); } # Get whether to show add league/cup links $season_manager = new SeasonManager($this->GetSettings(), $this->GetDataConnection()); $season_manager->ReadCurrentSeasonsByTeamId(array($this->team->GetId()), array(MatchType::CUP, MatchType::LEAGUE)); $this->seasons = $season_manager->GetItems(); unset($season_manager); }
/** * Sets up controls for pages 2/3 of the wizard * @param Match $match * @param Team $batting_team * @param Collection $batting_data * @param Team $bowling_team * @param Collection $bowling_data * @param int $total * @param int $wickets_taken * @return void */ private function CreateScorecardControls(Match $match, Team $batting_team, Collection $batting_data, Team $bowling_team, Collection $bowling_data, $total, $wickets_taken) { require_once "xhtml/tables/xhtml-table.class.php"; $batting_table = new XhtmlTable(); $batting_table->SetCaption($batting_team->GetName() . "'s batting"); $batting_table->SetCssClass("scorecard scorecardEditor batting"); $out_by_header = new XhtmlCell(true, '<span class="small">Fielder</span><span class="large">Caught<span class="wrapping-hair-space"> </span>/<span class="wrapping-hair-space"> </span><span class="nowrap">run-out by</span></span>'); $out_by_header->SetCssClass("dismissedBy"); $bowler_header = new XhtmlCell(true, "Bowler"); $bowler_header->SetCssClass("bowler"); $score_header = new XhtmlCell(true, "Runs"); $score_header->SetCssClass("numeric"); $balls_header = new XhtmlCell(true, "Balls"); $balls_header->SetCssClass("numeric"); $batting_headings = new XhtmlRow(array("Batsman", "How out", $out_by_header, $bowler_header, $score_header, $balls_header)); $batting_headings->SetIsHeader(true); $batting_table->AddRow($batting_headings); $batting_data->ResetCounter(); $byes = null; $wides = null; $no_balls = null; $bonus = null; # Loop = max players + 4, because if you have a full scorecard you have to keep looping to get the 4 extras players for ($i = 1; $i <= $match->GetMaximumPlayersPerTeam() + 4; $i++) { $batting = $batting_data->MoveNext() ? $batting_data->GetItem() : null; /* @var $batting Batting */ # Grab the scores for extras players to use later if (!is_null($batting)) { switch ($batting->GetPlayer()->GetPlayerRole()) { case Player::BYES: $byes = $batting->GetRuns(); break; case Player::WIDES: $wides = $batting->GetRuns(); break; case Player::NO_BALLS: $no_balls = $batting->GetRuns(); break; case Player::BONUS_RUNS: $bonus = $batting->GetRuns(); break; } } # Don't write a table row for the last four loops, we'll do that next because they're different if ($i <= $match->GetMaximumPlayersPerTeam()) { $player = new TextBox("batName{$i}", (is_null($batting) or !$batting->GetPlayer()->GetPlayerRole() == Player::PLAYER) ? "" : $batting->GetPlayer()->GetName(), $this->IsValidSubmit()); $player->SetMaxLength(100); $player->AddAttribute("autocomplete", "off"); $player->AddCssClass("player batsman team" . $batting_team->GetId()); $how = new XhtmlSelect("batHowOut{$i}", null, $this->IsValidSubmit()); $how->SetCssClass("howOut"); $how->AddOptions(array(Batting::DID_NOT_BAT => Batting::Text(Batting::DID_NOT_BAT), Batting::NOT_OUT => Batting::Text(Batting::NOT_OUT), Batting::CAUGHT => Batting::Text(Batting::CAUGHT), Batting::BOWLED => Batting::Text(Batting::BOWLED), Batting::CAUGHT_AND_BOWLED => str_replace(" and ", "/", Batting::Text(Batting::CAUGHT_AND_BOWLED)), Batting::RUN_OUT => Batting::Text(Batting::RUN_OUT), Batting::BODY_BEFORE_WICKET => "bbw", Batting::HIT_BALL_TWICE => Batting::Text(Batting::HIT_BALL_TWICE), Batting::TIMED_OUT => Batting::Text(Batting::TIMED_OUT), Batting::RETIRED_HURT => Batting::Text(Batting::RETIRED_HURT), Batting::RETIRED => Batting::Text(Batting::RETIRED), Batting::UNKNOWN_DISMISSAL => Batting::Text(Batting::UNKNOWN_DISMISSAL)), null); if (!is_null($batting) and $batting->GetPlayer()->GetPlayerRole() == Player::PLAYER and $this->IsValidSubmit()) { $how->SelectOption($batting->GetHowOut()); } $out_by = new TextBox("batOutBy{$i}", (is_null($batting) or is_null($batting->GetDismissedBy()) or !$batting->GetDismissedBy()->GetPlayerRole() == Player::PLAYER) ? "" : $batting->GetDismissedBy()->GetName(), $this->IsValidSubmit()); $out_by->SetMaxLength(100); $out_by->AddAttribute("autocomplete", "off"); $out_by->AddCssClass("player team" . $bowling_team->GetId()); $bowled_by = new TextBox("batBowledBy{$i}", (is_null($batting) or is_null($batting->GetBowler()) or !$batting->GetBowler()->GetPlayerRole() == Player::PLAYER) ? "" : $batting->GetBowler()->GetName(), $this->IsValidSubmit()); $bowled_by->SetMaxLength(100); $bowled_by->AddAttribute("autocomplete", "off"); $bowled_by->AddCssClass("player team" . $bowling_team->GetId()); $runs = new TextBox("batRuns{$i}", (is_null($batting) or $batting->GetPlayer()->GetPlayerRole() != Player::PLAYER) ? "" : $batting->GetRuns(), $this->IsValidSubmit()); $runs->SetCssClass("numeric runs"); $runs->AddAttribute("type", "number"); $runs->AddAttribute("min", "0"); $runs->AddAttribute("autocomplete", "off"); $balls = new TextBox("batBalls{$i}", (is_null($batting) or $batting->GetPlayer()->GetPlayerRole() != Player::PLAYER) ? "" : $batting->GetBallsFaced(), $this->IsValidSubmit()); $balls->SetCssClass("numeric balls"); $balls->AddAttribute("type", "number"); $balls->AddAttribute("min", "0"); $balls->AddAttribute("autocomplete", "off"); $batting_row = new XhtmlRow(array($player, $how, $out_by, $bowled_by, $runs, $balls)); $batting_row->GetFirstCell()->SetCssClass("batsman"); $batting_table->AddRow($batting_row); } } $batting_table->AddRow($this->CreateExtrasRow("batByes", "Byes", "extras", "numeric runs", $byes)); $batting_table->AddRow($this->CreateExtrasRow("batWides", "Wides", "extras", "numeric runs", $wides)); $batting_table->AddRow($this->CreateExtrasRow("batNoBalls", "No balls", "extras", "numeric runs", $no_balls)); $batting_table->AddRow($this->CreateExtrasRow("batBonus", "Bonus or penalty runs", "extras", "numeric runs", $bonus)); $batting_table->AddRow($this->CreateExtrasRow("batTotal", "Total", "totals", "numeric", $total)); $batting_table->AddRow($this->CreateWicketsRow($match, $wickets_taken)); $this->AddControl($batting_table); $total_batsmen = new TextBox("batRows", $match->GetMaximumPlayersPerTeam(), $this->IsValidSubmit()); $total_batsmen->SetMode(TextBoxMode::Hidden()); $this->AddControl($total_batsmen); $bowling_table = new XhtmlTable(); $bowling_table->SetCaption($bowling_team->GetName() . "'s bowling, over-by-over"); $bowling_table->SetCssClass("scorecard scorecardEditor bowling-scorecard bowling"); $over_header = new XhtmlCell(true, 'Balls bowled <span class="qualifier">(excluding extras)</span>'); $over_header->SetCssClass("numeric balls"); $wides_header = new XhtmlCell(true, "Wides"); $wides_header->SetCssClass("numeric"); $no_balls_header = new XhtmlCell(true, "No balls"); $no_balls_header->SetCssClass("numeric"); $runs_header = new XhtmlCell(true, "Over total"); $runs_header->SetCssClass("numeric"); $bowling_headings = new XhtmlRow(array("Bowler", $over_header, $wides_header, $no_balls_header, $runs_header)); $bowling_headings->SetIsHeader(true); $bowling_table->AddRow($bowling_headings); $bowling_data->ResetCounter(); for ($i = 1; $i <= $match->GetOvers(); $i++) { $bowling = $bowling_data->MoveNext() ? $bowling_data->GetItem() : null; /* @var $bowling Over */ $blank_row = (is_null($bowling) or is_null($bowling->GetOverNumber())); // don't list records generated from batting card to record wickets taken $player = new TextBox("bowlerName{$i}", $blank_row ? "" : $bowling->GetPlayer()->GetName(), $this->IsValidSubmit()); $player->SetMaxLength(100); $player->AddAttribute("autocomplete", "off"); $player->AddCssClass("player team" . $bowling_team->GetId()); $balls = new TextBox("bowlerBalls{$i}", $blank_row ? "" : $bowling->GetBalls(), $this->IsValidSubmit()); $balls->AddAttribute("autocomplete", "off"); $balls->AddAttribute("type", "number"); $balls->AddAttribute("min", "0"); $balls->AddAttribute("max", "10"); $balls->SetCssClass("numeric balls"); $wides = new TextBox("bowlerWides{$i}", $blank_row ? "" : $bowling->GetWides(), $this->IsValidSubmit()); $wides->AddAttribute("autocomplete", "off"); $wides->AddAttribute("type", "number"); $wides->AddAttribute("min", "0"); $wides->SetCssClass("numeric wides"); $no_balls = new TextBox("bowlerNoBalls{$i}", $blank_row ? "" : $bowling->GetNoBalls(), $this->IsValidSubmit()); $no_balls->AddAttribute("autocomplete", "off"); $no_balls->AddAttribute("type", "number"); $no_balls->AddAttribute("min", "0"); $no_balls->SetCssClass("numeric no-balls"); $runs = new TextBox("bowlerRuns{$i}", $blank_row ? "" : $bowling->GetRunsInOver(), $this->IsValidSubmit()); $runs->AddAttribute("autocomplete", "off"); $runs->AddAttribute("type", "number"); $runs->AddAttribute("min", "0"); $runs->SetCssClass("numeric runs"); $bowling_row = new XhtmlRow(array($player, $balls, $wides, $no_balls, $runs)); $bowling_row->GetFirstCell()->SetCssClass("bowler"); $bowling_table->AddRow($bowling_row); } $this->AddControl($bowling_table); $total_overs = new TextBox("bowlerRows", $match->GetOvers(), $this->IsValidSubmit()); $total_overs->SetMode(TextBoxMode::Hidden()); $this->AddControl($total_overs); if ($match->GetLastAudit() != null) { require_once "data/audit-control.class.php"; $this->AddControl(new AuditControl($match->GetLastAudit(), "match")); } $home_batted_first = ""; if (!is_null($match->Result()->GetHomeBattedFirst())) { $home_batted_first = (int) $match->Result()->GetHomeBattedFirst(); } $teams = new TextBox("teams", $home_batted_first . ScorecardEditControl::DATA_SEPARATOR . $match->GetHomeTeamId() . ScorecardEditControl::DATA_SEPARATOR . $match->GetHomeTeam()->GetName() . ScorecardEditControl::DATA_SEPARATOR . $match->GetAwayTeamId() . ScorecardEditControl::DATA_SEPARATOR . $match->GetAwayTeam()->GetName() . ScorecardEditControl::DATA_SEPARATOR . $match->GetTitle()); $teams->SetMode(TextBoxMode::Hidden()); $this->AddControl($teams); }
function OnLoadPageData() { /* @var $o_last_match Match */ /* @var $season Season */ /* @var $team Team */ # new data manager $o_match_manager = new MatchManager($this->GetSettings(), $this->GetDataConnection()); # Collect season to add this match to, starting with the URL # get season and teams (was at this stage because editor needed teams to build its # posted data object, but that's no longer the case so probably could be later if needed) if (isset($this->i_season_id)) { $season_manager = new SeasonManager($this->GetSettings(), $this->GetDataConnection()); $season_manager->ReadById(array($this->i_season_id)); $this->season = $season_manager->GetFirst(); unset($season_manager); $this->edit->Seasons()->Add($this->season); # If there are at least 2 teams in the season, show only those teams, otherwise show all teams of the relevant player type if (count($this->season->GetTeams()) > 1) { $this->edit->SetTeams(array($this->season->GetTeams())); } else { require_once 'stoolball/team-manager.class.php'; $team_manager = new TeamManager($this->GetSettings(), $this->GetDataConnection()); $team_manager->FilterByPlayerType(array($this->season->GetCompetition()->GetPlayerType())); $team_manager->ReadTeamSummaries(); $this->edit->SetTeams(array($team_manager->GetItems())); unset($team_manager); } } # Not elseif, because when you've added a match there's a season, but we still need this to run to populate # the choices for the next match to be added if ($this->team instanceof Team) { # Otherwise it should be a team. # Get more information about the team itself require_once 'stoolball/team-manager.class.php'; $team_manager = new TeamManager($this->GetSettings(), $this->GetDataConnection()); $team_manager->ReadById(array($this->team->GetId())); $this->team = $team_manager->GetFirst(); if (!is_null($this->team)) { $this->edit->SetContextTeam($this->team); $season_ids = array(); $team_groups = array(); $a_exclude_team_ids = array(); $team_manager->FilterByActive(true); # Add the home team first $team_groups[] = array($this->team); $a_exclude_team_ids[] = $this->team->GetId(); # Get the seasons this team is in... $season_manager = new SeasonManager($this->GetSettings(), $this->GetDataConnection()); if ($this->i_match_type == MatchType::FRIENDLY) { # For a friendly, any group of teams they play with is fine $season_manager->ReadCurrentSeasonsByTeamId(array($this->team->GetId())); } else { # For anything else, get the seasons *for this type of match* $season_manager->ReadCurrentSeasonsByTeamId(array($this->team->GetId()), array($this->i_match_type)); } $seasons = $season_manager->GetItems(); unset($season_manager); $this->edit->Seasons()->Clear(); # on postback, the season just added is already there, so clear to prevent a duplicate foreach ($seasons as $season) { $this->edit->Seasons()->Add($season); $season_ids[] = $season->GetId(); } #... and their opponent teams in those seasons if (count($season_ids)) { $team_manager->FilterExceptTeams($a_exclude_team_ids); $team_manager->ReadBySeasonId($season_ids); $season_teams = $team_manager->GetItems(); if (count($season_teams)) { $team_groups['This season\'s teams'] = $season_teams; } foreach ($season_teams as $team) { $a_exclude_team_ids[] = $team->GetId(); } } # ...and if this is a friendly it could be any other team if ($this->i_match_type == MatchType::FRIENDLY) { # get any other teams they played in the last 2 years, and combine with existing results $team_manager->FilterExceptTeams($a_exclude_team_ids); $team_manager->ReadRecentOpponents(array($this->team->GetId()), 24); $recent_opponents = $team_manager->GetItems(); if (count($recent_opponents)) { $team_groups['Recent opponents'] = $recent_opponents; } foreach ($recent_opponents as $team) { $a_exclude_team_ids[] = $team->GetId(); } # get any other teams they might play, and combine with existing results $team_manager->FilterExceptTeams($a_exclude_team_ids); $team_manager->ReadAll(); $team_groups['Other teams'] = $team_manager->GetItems(); } # What if there are still no opponents to choose from? In that case select all teams. if (count($team_groups) == 1) { $team_manager->FilterExceptTeams($a_exclude_team_ids); $team_manager->ReadAll(); $team_groups[] = $team_manager->GetItems(); } # Offer those teams to select from if ($total_groups = count($team_groups)) { # If only two groups (home team + 1 group), don't group teams. Remove the only key from the array. if ($total_groups == 2) { $keys = array_keys($team_groups); $team_groups = array($team_groups[$keys[0]], $team_groups[$keys[1]]); } $this->edit->SetTeams($team_groups); } } unset($team_manager); } # Save match if ($this->IsPostback() and $this->IsValid()) { # Get posted match $this->match = $this->edit->GetDataObject(); if (!$this->IsRefresh()) { # Save match $o_match_manager->SaveFixture($this->match); $o_match_manager->SaveSeasons($this->match, true); $o_match_manager->NotifyMatchModerator($this->match->GetId()); # Update 'next 5 matches' $o_match_manager->ReadNext(); $this->a_next_matches = $o_match_manager->GetItems(); } # Reset control for new match $this->edit->SetDataObject(new Match($this->GetSettings())); } $o_match_manager->FilterByMatchType(array($this->i_match_type)); if (isset($this->i_season_id)) { # If we're adding a match to a season, get last game in season for its date $o_match_manager->ReadLastInSeason($this->season->GetId()); } else { if ($this->team instanceof Team) { # Get the last game already scheduled for the team to use its date $o_match_manager->ReadLastForTeam($this->team->GetId()); } } $o_last_match = $o_match_manager->GetFirst(); if (is_object($o_last_match)) { $current_season = Season::SeasonDates(); if (gmdate('Y', $o_last_match->GetStartTime()) < gmdate('Y', $current_season[0])) { # If the last match this team played was last season, use the time but not the date $this->edit->SetDefaultTime(gmmktime(gmdate('H', $o_last_match->GetStartTime()), gmdate('i', $o_last_match->GetStartTime()), 0, gmdate('m'), gmdate('d'), gmdate('Y'))); } else { # If the last match was this season and has a time, use it if ($o_last_match->GetIsStartTimeKnown()) { $this->edit->SetDefaultTime($o_last_match->GetStartTime()); } else { # If the last match has no time, use 6.30pm BST $this->edit->SetDefaultTime(gmmktime(17, 30, 0, gmdate('m', $o_last_match->GetStartTime()), gmdate('d', $o_last_match->GetStartTime()), gmdate('Y', $o_last_match->GetStartTime()))); } } } unset($o_match_manager); # Get grounds $o_ground_manager = new GroundManager($this->GetSettings(), $this->GetDataConnection()); $o_ground_manager->ReadAll(); $a_grounds = $o_ground_manager->GetItems(); $this->edit->SetGrounds($a_grounds); unset($o_ground_manager); }