/** * Method to load a row from the database by primary key and bind the fields * to the JTable instance properties. * * @param mixed $keys An optional primary key value to load the row by, or an array of fields to match. If not * set the instance property value is used. * @param boolean $reset True to reset the default values before loading the new row. * * @return boolean True if successful. False if row not found or on error (internal error state set in that case). * * @link http://docs.joomla.org/JTable/load * @since 11.1 */ public function load($keys = null, $reset = true) { parent::load($keys, $reset); $this->slug = $this->id . "." . $this->alias; // Calculate funded percent if (!$this->goal) { $this->fundedPercent = 0; } else { $percentage = new Prism\Math(); $percentage->calculatePercentage($this->funded, $this->goal, 0); $this->fundedPercent = (string) $percentage; } // Calculate end date if (!empty($this->funding_days)) { $fundingStartDateValidator = new Prism\Validator\Date($this->funding_start); if (!$fundingStartDateValidator->isValid()) { $this->funding_end = "0000-00-00"; } else { $fundingStartDate = new Crowdfunding\Date($this->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($this->funding_days); $this->funding_end = $fundingEndDate->toSql(); } } // Calculate days left $today = new Crowdfunding\Date(); $this->daysLeft = $today->calculateDaysLeft($this->funding_days, $this->funding_start, $this->funding_end); return true; }
/** * Prepare some specific data. */ public function prepareData() { $this->slug = $this->id . ':' . $this->alias; $this->catslug = $this->getCatSlug(); // Calculate funded percent if (!$this->goal) { $this->fundedPercent = 0; } else { $this->fundedPercent = (string) Prism\Utilities\MathHelper::calculatePercentage($this->funded, $this->goal, 0); } // Calculate end date if ($this->funding_days > 0) { $fundingStartDateValidator = new Prism\Validator\Date($this->funding_start); if (!$fundingStartDateValidator->isValid()) { $this->funding_end = '1000-01-01'; } else { $fundingStartDate = new Crowdfunding\Date($this->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($this->funding_days); $this->funding_end = $fundingEndDate->toSql(); } } // Calculate days left $today = new Crowdfunding\Date(); $this->daysLeft = $today->calculateDaysLeft($this->funding_days, $this->funding_start, $this->funding_end); }
/** * Method to get an object. * * @param integer $id The id of the object to get. * * @return mixed Object on success, false on failure. */ public function getItem($id = 0) { if ((int) $id === 0) { $id = $this->getState($this->context . '.id'); } $storedId = $this->getStoreId($id); if (!array_key_exists($storedId, $this->item)) { $this->item[$storedId] = null; $db = $this->getDbo(); $query = $db->getQuery(true); $query->select('a.id, a.title, a.short_desc, a.image, ' . 'a.funded, a.goal, a.user_id, a.funding_type, ' . 'a.funding_start, a.funding_end, a.funding_days, ' . $query->concatenate(array('a.id', 'a.alias'), ':') . ' AS slug, ' . 'b.name AS user_name, ' . $query->concatenate(array('c.id', 'c.alias'), ':') . ' AS catslug ')->from($db->quoteName('#__crowdf_projects', 'a'))->innerJoin($db->quoteName('#__users', 'b') . ' ON a.user_id = b.id')->innerJoin($db->quoteName('#__categories', 'c') . ' ON a.catid = c.id')->where('a.id = ' . (int) $id)->where('a.published = 1')->where('a.approved = 1'); $db->setQuery($query, 0, 1); $result = $db->loadObject(); // Attempt to load the row. if ($result !== null and is_object($result)) { // Calculate funded percentage. $result->funded_percents = Prism\Utilities\MathHelper::calculatePercentage($result->funded, $result->goal, 0); // Calculate days left $today = new Crowdfunding\Date(); $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end); $this->item[$storedId] = $result; } } return $this->item[$storedId]; }
/** * Method to get an object. * * @param integer $id The id of the object to get. * * @return mixed Object on success, false on failure. */ public function getItem($id = null) { if (empty($id)) { $id = $this->getState($this->context . '.id'); } $storedId = $this->getStoreId($id); if (!isset($this->item[$storedId])) { $this->item[$storedId] = null; $db = $this->getDbo(); $query = $db->getQuery(true); $query->select("a.id, a.title, a.short_desc, a.image, " . "a.funded, a.goal, a.user_id, " . "a.funding_start, a.funding_end, a.funding_days, " . $query->concatenate(array("a.id", "a.alias"), ":") . ' AS slug, ' . "b.name AS user_name, " . $query->concatenate(array("c.id", "c.alias"), ":") . ' AS catslug ')->from($db->quoteName("#__crowdf_projects", "a"))->innerJoin($db->quoteName('#__users', 'b') . ' ON a.user_id = b.id')->innerJoin($db->quoteName('#__categories', 'c') . ' ON a.catid = c.id')->where("a.id = " . (int) $id)->where("a.published = 1")->where("a.approved = 1"); $db->setQuery($query, 0, 1); $result = $db->loadObject(); // Attempt to load the row. if (!empty($result)) { // Calculate funded percentage. $percent = new Prism\Math(); $percent->calculatePercentage($result->funded, $result->goal, 0); $result->funded_percents = (string) $percent; // Calculate days left $today = new Crowdfunding\Date(); $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end); $this->item[$storedId] = $result; } } return $this->item[$storedId]; }
/** * This method calculates start date and validate funding period. * * @param CrowdfundingTableProject $table * * @throws Exception */ protected function prepareTable(&$table) { // Calculate start and end date if the user publish a project for first time. $fundingStartDate = new Prism\Validator\Date($table->get('funding_start')); if (!$fundingStartDate->isValid()) { $app = JFactory::getApplication(); /** @var $app JApplicationSite */ $fundingStart = new JDate('now', $app->get('offset')); $table->set('funding_start', $fundingStart->toSql()); // If funding type is 'days', calculate end date. if ($table->get('funding_days')) { $fundingStartDate = new Crowdfunding\Date($table->get('funding_start')); $endDate = $fundingStartDate->calculateEndDate($table->get('funding_days')); $table->set('funding_end', $endDate->toSql()); } } // Get parameters $params = JComponentHelper::getParams('com_crowdfunding'); /** @var $params Joomla\Registry\Registry */ $minDays = $params->get('project_days_minimum', 15); $maxDays = $params->get('project_days_maximum'); // If there is an ending date, validate the period. $fundingEndDate = new Prism\Validator\Date($table->get('funding_end')); if ($fundingEndDate->isValid()) { $validatorPeriod = new Crowdfunding\Validator\Project\Period($table->get('funding_start'), $table->get('funding_end'), $minDays, $maxDays); if (!$validatorPeriod->isValid()) { if (!empty($maxDays)) { throw new RuntimeException(JText::sprintf('COM_CROWDFUNDING_ERROR_INVALID_ENDING_DATE_MIN_MAX_DAYS', $minDays, $maxDays)); } else { throw new RuntimeException(JText::sprintf('COM_CROWDFUNDING_ERROR_INVALID_ENDING_DATE_MIN_DAYS', $minDays)); } } } }
public static function prepareItems($items) { $result = array(); if (!empty($items)) { foreach ($items as $key => $item) { // Calculate funding end date if (!empty($item->funding_days)) { $fundingStartDate = new Crowdfunding\Date($item->funding_start); $endDate = $fundingStartDate->calculateEndDate($item->funding_days); $item->funding_end = $endDate->format("Y-m-d"); } // Calculate funded percentage. $percent = new Prism\Math(); $percent->calculatePercentage($item->funded, $item->goal, 0); $item->funded_percents = (string) $percent; // Calculate days left $today = new Crowdfunding\Date(); $item->days_left = $today->calculateDaysLeft($item->funding_days, $item->funding_start, $item->funding_end); $result[$key] = $item; } } return $result; }
/** * Validate user data that comes from step "Funding". * * @param array $data * @param Joomla\Registry\Registry $params * * @throws \RuntimeException * @throws \InvalidArgumentException * * @return array */ protected function validateStepFunding(&$data, &$params) { $result = array('success' => false, 'message' => ''); // Validate minimum and maximum amount. if ($this->params->get('validate_amount', 1)) { $goal = Joomla\Utilities\ArrayHelper::getValue($data, 'goal', 0, 'float'); $minAmount = (double) $params->get('project_amount_minimum', 100); $maxAmount = (double) $params->get('project_amount_maximum'); // Verify minimum amount if ($goal < $minAmount) { $result['message'] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_GOAL'); return $result; } // Verify maximum amount if ($maxAmount > 0 and $goal > $maxAmount) { $result['message'] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_GOAL'); return $result; } } // Validate funding duration - days or date. if ($this->params->get('validate_funding_duration', 1)) { $minDays = (int) $params->get('project_days_minimum', 15); $maxDays = (int) $params->get('project_days_maximum', 0); $fundingType = Joomla\Utilities\ArrayHelper::getValue($data, 'funding_duration_type'); // Validate funding type 'days' if (strcmp('days', $fundingType) === 0) { $days = Joomla\Utilities\ArrayHelper::getValue($data, 'funding_days', 0, 'integer'); if ($days < $minDays) { $result['message'] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_DAYS'); return $result; } if ($maxDays > 0 and $days > $maxDays) { $result['message'] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_DAYS'); return $result; } } else { // Validate funding type 'date' $fundingEndDate = Joomla\Utilities\ArrayHelper::getValue($data, 'funding_end'); $dateValidator = new Prism\Validator\Date($fundingEndDate); if (!$dateValidator->isValid()) { $result['message'] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_DATE'); return $result; } } } // Validate funding duration when the projects is published and approved. if ($this->params->get('validate_funding_duration_approved', 1)) { // Get item and check it for active state ( published and approved ). $itemId = Joomla\Utilities\ArrayHelper::getValue($data, 'id'); $userId = JFactory::getUser()->get('id'); $item = $this->getItem($itemId, $userId); // Validate date if user want to edit date, while the project is published. if ($item->published and $item->approved) { $minDays = (int) $params->get('project_days_minimum', 15); $maxDays = (int) $params->get('project_days_maximum', 0); $fundingType = Joomla\Utilities\ArrayHelper::getValue($data, 'funding_duration_type'); // Generate funding end date from days. if (strcmp('days', $fundingType) === 0) { // Get funding days. $days = Joomla\Utilities\ArrayHelper::getValue($data, 'funding_days', 0, 'integer'); $fundingStartDate = new Crowdfunding\Date($item->funding_start); $endDate = $fundingStartDate->calculateEndDate($days); $fundingEndDate = $endDate->format('Y-m-d'); } else { // Get funding end date from request $fundingEndDate = Joomla\Utilities\ArrayHelper::getValue($data, 'funding_end'); } // Validate the period. $dateValidator = new Crowdfunding\Validator\Project\Period($item->funding_start, $fundingEndDate, $minDays, $maxDays); if (!$dateValidator->isValid()) { $result['message'] = $maxDays > 0 ? JText::sprintf('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_ENDING_DATE_MIN_MAX_DAYS', $minDays, $maxDays) : JText::sprintf('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_ENDING_DATE_MIN_DAYS', $minDays); return $result; } } } // Validations completed successfully. $result = array('success' => true); return $result; }
/** * Method to get an object. * * @param integer $id The id of the object to get. * * @return mixed Object on success, false on failure. */ public function getItem($id = null) { if (empty($id)) { $id = $this->getState($this->context . '.id'); } $storedId = $this->getStoreId($id); if (!isset($this->item[$storedId])) { $this->item[$storedId] = null; $db = $this->getDbo(); $query = $db->getQuery(true); $query->select("a.id, a.title, a.short_desc, a.description, a.image, a.location_id, " . "a.funded, a.goal, a.pitch_video, a.pitch_image, " . "a.funding_start, a.funding_end, a.funding_days, a.funding_type, " . "a.catid, a.user_id, a.published, a.approved, a.hits, " . $query->concatenate(array("a.id", "a.alias"), ":") . ' AS slug, ' . $query->concatenate(array("b.id", "b.alias"), ":") . ' AS catslug')->from($db->quoteName("#__crowdf_projects", "a"))->innerJoin($db->quoteName("#__categories", "b") . " ON a.catid = b.id")->where("a.id = " . (int) $id); $db->setQuery($query, 0, 1); $result = $db->loadObject(); // Attempt to load the row. if (!empty($result)) { // Calculate end date if (!empty($result->funding_days)) { $fundingStartDateValidator = new Prism\Validator\Date($result->funding_start); if (!$fundingStartDateValidator->isValid()) { $result->funding_end = "0000-00-00"; } else { $fundingStartDate = new Crowdfunding\Date($result->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($result->funding_days); $result->funding_end = $fundingEndDate->format("Y-m-d"); } } // Calculate funded percentage. $math = new Prism\Math(); $math->calculatePercentage($result->funded, $result->goal, 0); $result->funded_percents = (string) $math; // Calculate days left. $today = new Crowdfunding\Date(); $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end); $this->item[$storedId] = $result; } } return $this->item[$storedId]; }
/** * Prepare and sanitise the table prior to saving. * * @param CrowdfundingTableProject $table * @param array $data * * @throws RuntimeException * * @since 1.6 */ protected function prepareTable(&$table, $data) { $durationType = Joomla\Utilities\ArrayHelper::getValue($data, "duration_type"); $fundingEnd = Joomla\Utilities\ArrayHelper::getValue($data, "funding_end"); $fundingDays = Joomla\Utilities\ArrayHelper::getValue($data, "funding_days"); switch ($durationType) { case "days": $table->funding_days = $fundingDays < 0 ? 0 : (int) $fundingDays; // Calculate end date if (!empty($table->funding_start)) { $fundingStartDate = new Crowdfunding\Date($table->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($table->funding_days); $table->funding_end = $fundingEndDate->format("Y-m-d"); } else { $table->funding_end = "0000-00-00"; } break; case "date": $dateValidator = new Prism\Validator\Date($fundingEnd); if (!$dateValidator->isValid($fundingEnd)) { throw new RuntimeException(JText::_("COM_CROWDFUNDING_ERROR_INVALID_DATE")); } $date = new JDate($fundingEnd); $table->funding_days = 0; $table->funding_end = $date->toSql(); break; default: $table->funding_days = 0; $table->funding_end = "0000-00-00"; break; } }
/** * Method to get an object. * * @param integer $id The id of the object to get. * * @return mixed Object on success, false on failure. */ public function getItem($id = 0) { if ((int) $id === 0) { $id = $this->getState($this->context . '.id'); } $storedId = $this->getStoreId($id); if (!array_key_exists($storedId, $this->item)) { $this->item[$storedId] = null; $db = $this->getDbo(); $query = $db->getQuery(true); $query->select('a.id, a.title, a.short_desc, a.description, a.image, a.location_id, ' . 'a.funded, a.goal, a.pitch_video, a.pitch_image, ' . 'a.funding_start, a.funding_end, a.funding_days, a.funding_type, ' . 'a.catid, a.user_id, a.published, a.approved, a.hits, ' . $query->concatenate(array('a.id', 'a.alias'), ':') . ' AS slug, ' . $query->concatenate(array('b.id', 'b.alias'), ':') . ' AS catslug')->from($db->quoteName('#__crowdf_projects', 'a'))->innerJoin($db->quoteName('#__categories', 'b') . ' ON a.catid = b.id')->where('a.id = ' . (int) $id); $db->setQuery($query, 0, 1); $result = $db->loadObject(); // Attempt to load the row. if ($result !== null and is_object($result)) { // Calculate end date if ((int) $result->funding_days > 0) { $fundingStartDateValidator = new Prism\Validator\Date($result->funding_start); if (!$fundingStartDateValidator->isValid()) { $result->funding_end = '0000-00-00'; } else { $fundingStartDate = new Crowdfunding\Date($result->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($result->funding_days); $result->funding_end = $fundingEndDate->format('Y-m-d'); } } // Calculate funded percentage. $result->funded_percents = Prism\Utilities\MathHelper::calculatePercentage($result->funded, $result->goal, 0); // Calculate days left. $today = new Crowdfunding\Date(); $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end); $this->item[$storedId] = $result; } } return $this->item[$storedId]; }
/** * This method calculate start date and validate funding period. * * @param CrowdfundingTableProject $table * * @throws Exception */ protected function prepareTable(&$table) { // Calculate start and end date if the user publish a project for first time. $fundingStartDate = new Prism\Validator\Date($table->funding_start); if (!$fundingStartDate->isValid($table->funding_start)) { $fundingStart = new JDate(); $table->funding_start = $fundingStart->toSql(); // If funding type is "days", calculate end date. if ($table->get("funding_days")) { $fundingStartDate = new Crowdfunding\Date($table->get("funding_start")); $endDate = $fundingStartDate->calculateEndDate($table->get("funding_days")); $table->set("funding_end", $endDate->format("Y-m-d")); } } // Get parameters $app = JFactory::getApplication(); /** @var $app JApplicationSite */ $params = $app->getParams(); /** @var $params Joomla\Registry\Registry */ $minDays = $params->get("project_days_minimum", 15); $maxDays = $params->get("project_days_maximum"); // If there is an ending date, validate the period. $fundingEndDate = new Prism\Validator\Date($table->get("funding_end")); if ($fundingEndDate->isValid()) { $validatorPeriod = new Crowdfunding\Validator\Project\Period($table->get("funding_start"), $table->get("funding_end"), $minDays, $maxDays); if (!$validatorPeriod->isValid()) { if (!empty($maxDays)) { throw new RuntimeException(JText::sprintf("COM_CROWDFUNDING_ERROR_INVALID_ENDING_DATE_MIN_MAX_DAYS", $minDays, $maxDays)); } else { throw new RuntimeException(JText::sprintf("COM_CROWDFUNDING_ERROR_INVALID_ENDING_DATE_MIN_DAYS", $minDays)); } } } }
/** * Prepare and sanitise the table prior to saving. * * @param CrowdfundingTableProject $table * @param array $data * * @throws RuntimeException * * @since 1.6 */ protected function prepareTableData($table, $data) { $durationType = Joomla\Utilities\ArrayHelper::getValue($data, 'duration_type'); $fundingEnd = Joomla\Utilities\ArrayHelper::getValue($data, 'funding_end'); $fundingDays = Joomla\Utilities\ArrayHelper::getValue($data, 'funding_days'); switch ($durationType) { case 'days': $table->funding_days = $fundingDays < 0 ? 0 : (int) $fundingDays; // Calculate end date if ((int) $table->funding_start > 0) { $fundingStartDate = new Crowdfunding\Date($table->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($table->funding_days); $table->funding_end = $fundingEndDate->format('Y-m-d'); } else { $table->funding_end = '0000-00-00'; } break; case 'date': $dateValidator = new Prism\Validator\Date($fundingEnd); if (!$dateValidator->isValid($fundingEnd)) { throw new RuntimeException(JText::_('COM_CROWDFUNDING_ERROR_INVALID_DATE')); } $date = new JDate($fundingEnd); $table->funding_days = 0; $table->funding_end = $date->toSql(); break; default: $table->funding_days = 0; $table->funding_end = '0000-00-00'; break; } }
public function prepareItems(array $items) { $result = array(); foreach ($items as $key => $item) { $result[$key] = $item; // Calculate funding end date if ((int) $item->funding_days > 0) { $fundingStartDate = new Crowdfunding\Date($item->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($item->funding_days); $result[$key]->funding_end = $fundingEndDate->format('Y-m-d'); } // Calculate funded percentage. $result[$key]->funded_percents = Prism\Utilities\MathHelper::calculatePercentage($item->funded, $item->goal, 0); // Calculate days left $today = new Crowdfunding\Date(); $result[$key]->days_left = $today->calculateDaysLeft($item->funding_days, $item->funding_start, $item->funding_end); } return $result; }
/** * Prepare and sanitise the table prior to saving. * * @param CrowdfundingTableProject $table * @param array $data * * @throws \RuntimeException * @throws \InvalidArgumentException * * @since 1.6 */ protected function prepareTableData($table, $data) { $durationType = Joomla\Utilities\ArrayHelper::getValue($data, 'duration_type'); $fundingEnd = Joomla\Utilities\ArrayHelper::getValue($data, 'funding_end'); $fundingDays = Joomla\Utilities\ArrayHelper::getValue($data, 'funding_days', 0, 'int'); switch ($durationType) { case 'days': $fundingDays = $fundingDays < 0 ? 0 : (int) $fundingDays; $table->set('funding_days', $fundingDays); // Calculate end date $startingDateValidator = new Prism\Validator\Date($table->get('funding_start')); if ($startingDateValidator->isValid()) { $fundingStartDate = new Crowdfunding\Date($table->get('funding_start')); $fundingEndDate = $fundingStartDate->calculateEndDate($table->get('funding_days')); $table->set('funding_end', $fundingEndDate->format(Prism\Constants::DATE_FORMAT_SQL_DATE)); } else { $table->set('funding_end', Prism\Constants::DATE_DEFAULT_SQL_DATE); } break; case 'date': $fundingEnd = CrowdfundingHelper::convertToSql($fundingEnd); $dateValidator = new Prism\Validator\Date($fundingEnd); if (!$dateValidator->isValid()) { throw new RuntimeException(JText::_('COM_CROWDFUNDING_ERROR_INVALID_DATE')); } $date = new JDate($fundingEnd); $table->set('funding_days', 0); $table->set('funding_end', $date->toSql()); break; default: $table->set('funding_days', 0); $table->set('funding_end', Prism\Constants::DATE_DEFAULT_SQL_DATE); break; } }
/** * Method to get an object. * * @param integer $id The id of the object to get. * * @return mixed Object on success, false on failure. */ public function getItem($id = null) { if (empty($id)) { $id = $this->getState('id'); } if (is_null($this->item)) { $db = $this->getDbo(); $query = $db->getQuery(true); $query->select("a.id, a.title, a.short_desc, a.image, " . "a.funded, a.goal, a.pitch_video, a.pitch_image, " . "a.funding_start, a.funding_end, a.funding_days, " . "a.funding_type, a.user_id, a.type_id, " . "b.name AS user_name, " . $query->concatenate(array("a.id", "a.alias"), ":") . ' AS slug, ' . $query->concatenate(array("c.id", "c.alias"), ":") . ' AS catslug')->from($db->quoteName("#__crowdf_projects", "a"))->innerJoin($db->quoteName('#__users', 'b') . ' ON a.user_id = b.id')->innerJoin($db->quoteName('#__categories', 'c') . ' ON a.catid = c.id')->where("a.id = " . (int) $id)->where("a.published = 1")->where("a.approved = 1"); $db->setQuery($query, 0, 1); $result = $db->loadObject(); // Attempt to load the row. if (!empty($result)) { // Calculate ending date by days left. if (!empty($result->funding_days)) { $fundingStartDate = new Crowdfunding\Date($result->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($result->funding_days); $result->funding_end = $fundingEndDate->format("Y-m-d"); } // Calculate funded percent $percent = new Prism\Math(); $percent->calculatePercentage($result->funded, $result->goal, 0); $result->funded_percents = (string) $percent; // Calculate days left. $today = new Crowdfunding\Date(); $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end); $this->item = $result; } } return $this->item; }
/** * Method to get an object. * * @param integer $id The id of the object to get. * * @throws \RuntimeException * @return stdClass|null Object on success, null on failure. */ public function getItem($id = 0) { if ((int) $id === 0) { $id = $this->getState('id'); } if ($this->item === null) { $db = $this->getDbo(); $query = $db->getQuery(true); $query->select('a.id, a.title, a.short_desc, a.image, ' . 'a.funded, a.goal, a.pitch_video, a.pitch_image, ' . 'a.funding_start, a.funding_end, a.funding_days, ' . 'a.funding_type, a.user_id, a.type_id, ' . 'b.name AS user_name, ' . $query->concatenate(array('a.id', 'a.alias'), ':') . ' AS slug, ' . $query->concatenate(array('c.id', 'c.alias'), ':') . ' AS catslug')->from($db->quoteName('#__crowdf_projects', 'a'))->innerJoin($db->quoteName('#__users', 'b') . ' ON a.user_id = b.id')->innerJoin($db->quoteName('#__categories', 'c') . ' ON a.catid = c.id')->where('a.id = ' . (int) $id)->where('a.published = 1')->where('a.approved = 1'); $db->setQuery($query, 0, 1); $result = $db->loadObject(); // Attempt to load the row. if (is_object($result)) { // Calculate ending date by days left. if ($result->funding_days > 0) { $fundingStartDate = new Crowdfunding\Date($result->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($result->funding_days); $result->funding_end = $fundingEndDate->format(Prism\Constants::DATE_FORMAT_SQL_DATE); } // Calculate funded percent $result->funded_percents = Prism\Utilities\MathHelper::calculatePercentage($result->funded, $result->goal, 0); // Calculate days left. $today = new Crowdfunding\Date(); $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end); $this->item = $result; } } return $this->item; }
/** * Method to change the published state of one or more records. * * @param array &$pks A list of the primary keys to change. * @param integer $value The value of the published state. * * @throws Exception * * @return boolean True on success. * * @since 12.2 */ public function publish(&$pks, $value = 0) { $table = $this->getTable(); /** @var $table CrowdfundingTableProject */ $pks = (array) $pks; // Access checks. foreach ($pks as $pk) { $table->reset(); if ($table->load($pk)) { if ($value == Prism\Constants::PUBLISHED) { // Publish a project // Validate funding period $fundingEndValidator = new Prism\Validator\Date($table->funding_end); if (!$table->funding_days and !$fundingEndValidator->isValid()) { throw new RuntimeException(JText::_("COM_CROWDFUNDING_ERROR_INVALID_DURATION_PERIOD")); } // Calculate starting date if the user publish a project for first time. $fundingStartValidator = new Prism\Validator\Date($table->funding_start); if (!$fundingStartValidator->isValid()) { $fundingStart = new JDate(); $table->funding_start = $fundingStart->toSql(); // If funding type is "days", calculate end date. if (!empty($table->funding_days)) { $fundingStartDate = new Crowdfunding\Date($table->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($table->funding_days); $table->funding_end = $fundingEndDate->toSql(); } } // Validate the period if the funding type is days $params = JComponentHelper::getParams($this->option); /** @var $params Joomla\Registry\Registry */ $minDays = $params->get("project_days_minimum", 15); $maxDays = $params->get("project_days_maximum"); $fundingStartValidator = new Prism\Validator\Date($table->funding_start); if ($fundingStartValidator->isValid()) { $dateValidator = new Crowdfunding\Validator\Project\Period($table->funding_start, $table->funding_end, $minDays, $maxDays); if (!$dateValidator->isValid()) { if (!empty($maxDays)) { throw new RuntimeException(JText::sprintf("COM_CROWDFUNDING_ERROR_INVALID_ENDING_DATE_MIN_MAX_DAYS", $minDays, $maxDays)); } else { throw new RuntimeException(JText::sprintf("COM_CROWDFUNDING_ERROR_INVALID_ENDING_DATE_MIN_DAYS", $minDays)); } } } $table->set("published", Prism\Constants::PUBLISHED); $table->store(); } else { // Set other states - unpublished, trash,... $table->publish(array($pk), $value); } } } // Trigger change state event $context = $this->option . '.' . $this->name; // Include the content plugins for the change of state event. JPluginHelper::importPlugin('content'); // Trigger the onContentChangeState event. $dispatcher = JEventDispatcher::getInstance(); $result = $dispatcher->trigger($this->event_change_state, array($context, $pks, $value)); if (in_array(false, $result, true)) { throw new Exception(JText::_("COM_CROWDFUNDING_ERROR_CHANGE_STATE")); } // Clear the component's cache $this->cleanCache(); }
/** * This method calculates start date and validate funding period. * * @param CrowdfundingTableProject $table * * @throws Exception */ protected function prepareTable(&$table) { // Calculate start and end date if the user publish a project for first time. $fundingStartDate = new Prism\Validator\Date($table->get('funding_start')); if (!$fundingStartDate->isValid()) { $app = JFactory::getApplication(); /** @var $app JApplicationSite */ $fundingStart = new JDate('now', $app->get('offset')); $table->set('funding_start', $fundingStart->toSql()); // If funding type is 'days', calculate end date. if ($table->get('funding_days')) { $fundingStartDate = new Crowdfunding\Date($table->get('funding_start')); $endDate = $fundingStartDate->calculateEndDate($table->get('funding_days')); $table->set('funding_end', $endDate->toSql()); } } }