/** * Validate the event data. * * If errors are found, adds them to the SkeVent object. * * @param CampusUnion\Sked\SkeVent $skeVent Passed by reference. * @return bool Valid/invalid. */ protected function validateEvent(SkeVent &$skeVent) { $bValid = true; $skeVent->resetErrors(); $aData = $skeVent->toArray(); // Check required fields && valid options foreach (Sked::form()->getFieldDefinitions() as $strKey => $aDefinition) { // Required if (!isset($aData[$strKey]) && ($aDefinition['required'] ?? false) && !isset($aData['id'])) { $bValid = false; $skeVent->addError($strKey, 'The "' . $aDefinition['attribs']['label'] . '" field is required.'); // Valid option } elseif (!$this->validateOption($aData[$strKey] ?? null, $aDefinition['options'] ?? null)) { $bValid = false; $skeVent->addError($strKey, 'An invalid ' . $strKey . ' option was given.'); } } // Check reminder fields - should both be present, or neither if (isset($aData['lead_time_num']) || isset($aData['lead_time_unit'])) { // one is set if (!isset($aData['lead_time_num']) || !isset($aData['lead_time_unit'])) { // but not both $bValid = false; $skeVent->addError(isset($aData['lead_time_num']) ? 'lead_time_unit' : 'lead_time_num', 'Both Reminder fields should be filled out (or clear them both).'); } } // Check recurring-event fields if (isset($aData['ends_at'])) { if (!isset($aData['frequency'])) { $bValid = false; $skeVent->addError('frequency', 'A frequency is required for recurring events.'); } if (!isset($aData['interval']) || SkeVent::INTERVAL_ONCE === $aData['interval']) { $bValid = false; $skeVent->addError('interval', 'An interval (daily, weekly, etc.) is required for recurring events.'); } } if (isset($aData['frequency']) && !isset($aData['interval'])) { $bValid = false; $skeVent->addError('interval', 'An interval (daily, weekly, etc.) is required when a frequency is selected.'); } if (isset($aData['interval'])) { if (SkeVent::INTERVAL_DAILY === $aData['interval'] && isset($aData['weekdays'])) { $bValid = false; $skeVent->addError('weekdays', 'A day of the week cannot be selected for daily events.'); } } return $bValid; }
/** * Convert to an array of database properties. * * @param bool $bIncludeExtras Should tags & "repeats" be included? * @return array */ public function toArray(bool $bIncludeExtras = true) { // Sanitize $this->adjustDependentFields(); $aReturn = array_filter($this->aProperties, function ($mValue, $strKey) { return !empty($mValue) && '-' !== $mValue && (in_array($strKey, ['created_at', 'updated_at']) || in_array($strKey, self::WEEKDAYS) || array_key_exists($strKey, Sked::form()->getFieldDefinitions())); }, ARRAY_FILTER_USE_BOTH); if (isset($aReturn['starts_at'])) { $aReturn['starts_at'] = date('Y-m-d H:i:s', strtotime($aReturn['starts_at'])); } if (isset($aReturn['ends_at'])) { $aReturn['ends_at'] = date('Y-m-d H:i:s', strtotime($aReturn['ends_at'])); } // Include tags? if ($bIncludeExtras) { $aReturn['tags'] = $this->getTags(); $aReturn['repeats'] = self::INTERVAL_ONCE !== $aReturn['interval'] ? '1' : null; } else { unset($aReturn['repeats']); } return $aReturn; }