/** * 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 ITPrismMath(); $percentage->calculatePercentage($this->funded, $this->goal, 0); $this->fundedPercent = (string) $percentage; } // Calculate end date if (!empty($this->funding_days)) { $fundingStartDateValidator = new ITPrismValidatorDate($this->funding_start); if (!$fundingStartDateValidator->isValid()) { $this->funding_end = "0000-00-00"; } else { $fundingStartDate = new CrowdFundingDate($this->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($this->funding_days); $this->funding_end = $fundingEndDate->toSql(); } } // Calculate days left $today = new CrowdFundingDate(); $this->daysLeft = $today->calculateDaysLeft($this->funding_days, $this->funding_start, $this->funding_end); return true; }
/** * 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 ITPrismMath(); $percent->calculatePercentage($result->funded, $result->goal, 0); $result->funded_percents = (string) $percent; // Calculate days left $today = new CrowdFundingDate(); $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end); $this->item[$storedId] = $result; } } return $this->item[$storedId]; }
/** * 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 == CrowdFundingConstants::PUBLISHED) { // Publish a project // Validate funding period jimport("itprism.validator.date"); $fundingEndValidator = new ITPrismValidatorDate($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 ITPrismValidatorDate($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)) { jimport("crowdfunding.date"); $fundingStartDate = new CrowdFundingDate($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 ITPrismValidatorDate($table->funding_start); if ($fundingStartValidator->isValid()) { $dateValidator = new CrowdFundingDate($table->funding_start); if (!$dateValidator->isValidPeriod($table->funding_end, $minDays, $maxDays)) { 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", CrowdFundingConstants::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(); }
public function prepareItems($items) { $result = array(); if (!empty($items)) { foreach ($items as $key => $item) { $result[$key] = $item; // Calculate funding end date if (!empty($item->funding_days)) { $fundingStartDate = new CrowdFundingDate($item->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($item->funding_days); $result[$key]->funding_end = $fundingEndDate->format("Y-m-d"); } // Calculate funded percentage. $percent = new ITPrismMath(); $percent->calculatePercentage($item->funded, $item->goal, 0); $result[$key]->funded_percents = (string) $percent; // Calculate days left $today = new CrowdFundingDate(); $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 * * @since 1.6 */ protected function prepareTable(&$table, $data) { $durationType = JArrayHelper::getValue($data, "duration_type"); $fundingEnd = JArrayHelper::getValue($data, "funding_end"); $fundingDays = JArrayHelper::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 CrowdFundingDate($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 ITPrismValidatorDate($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; } }
/** * Load project data from database. * * <code> * $projectId = 1; * * $project = CrowdFundingProject::getInstance(JFactory::getDbo()); * $project->load($projectId); * </code> * * @param int $id * * @throws UnexpectedValueException */ public function load($id) { if (!$id) { throw new UnexpectedValueException(JText::_("LIB_CROWDFUNDING_INVALID_PROJECT")); } $query = $this->db->getQuery(true); $query->select("a.id, a.title, a.alias, a.short_desc, a.description, a.image, a.image_square, a.image_small, " . "a.location, a.goal, a.funded, a.funding_type, a.funding_start, a.funding_end, a.funding_days, " . "a.pitch_video, a.pitch_image, a.hits, a.created, a.featured, a.published, a.approved, " . "a.ordering, a.catid, a.type_id, a.user_id, " . $query->concatenate(array("a.id", "a.alias"), "-") . " AS slug, " . $query->concatenate(array("b.id", "b.alias"), "-") . " AS catslug")->from($this->db->quoteName("#__crowdf_projects", "a"))->leftJoin($this->db->quoteName("#__categories", "b") . " ON a.catid = b.id")->where("a.id = " . (int) $id); $this->db->setQuery($query); $result = $this->db->loadAssoc(); if (!$result) { $result = array(); } $this->bind($result); // Calculate funded percent if (!$this->goal) { $this->fundedPercent = 0; } else { $math = new ITPrismMath(); $math->calculatePercentage($this->funded, $this->goal, 0); $this->fundedPercent = (string) $math; } // Calculate end date if (!empty($this->funding_days)) { $fundingStartDateValidator = new ITPrismValidatorDate($this->funding_start); if (!$fundingStartDateValidator->isValid()) { $this->funding_end = "0000-00-00"; } else { $fundingStartDate = new CrowdFundingDate($this->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($this->funding_days); $this->funding_end = $fundingEndDate->format("Y-m-d"); } } // Calculate days left $today = new CrowdFundingDate(); $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 = 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, " . "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", "a.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 ITPrismValidatorDate($result->funding_start); if (!$fundingStartDateValidator->isValid()) { $result->funding_end = "0000-00-00"; } else { $fundingStartDate = new CrowdFundingDate($result->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($result->funding_days); $result->funding_end = $fundingEndDate->format("Y-m-d"); } } // Calculate funded percentage. $math = new ITPrismMath(); $math->calculatePercentage($result->funded, $result->goal, 0); $result->funded_percents = (string) $math; // Calculate days left. $today = new CrowdFundingDate(); $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end); $this->item[$storedId] = $result; } } return $this->item[$storedId]; }
/** * Validate user data that comes from step "Funding". * * @param array $data * @param Joomla\Registry\Registry $params * * @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 = JArrayHelper::getValue($data, "goal", 0, "float"); $minAmount = $params->get("project_amount_minimum", 100); $maxAmount = $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 (!empty($maxAmount) 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 = JArrayHelper::getValue($data, "funding_duration_type"); // Validate funding type "days" if (strcmp("days", $fundingType) == 0) { $days = JArrayHelper::getValue($data, "funding_days", 0, "integer"); if ($days < $minDays) { $result["message"] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_DAYS'); return $result; } if (!empty($maxDays) and $days > $maxDays) { $result["message"] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_DAYS'); return $result; } } else { // Validate funding type "date" $fundingEndDate = JArrayHelper::getValue($data, "funding_end"); $dateValidator = new ITPrismValidatorDate($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 = JArrayHelper::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 = JArrayHelper::getValue($data, "funding_duration_type"); // Generate funding end date from days. if (strcmp("days", $fundingType) == 0) { // Get funding days. $days = JArrayHelper::getValue($data, "funding_days", 0, "integer"); $fundingStartDate = new CrowdFundingDate($item->funding_start); $endDate = $fundingStartDate->calculateEndDate($days); $fundingEndDate = $endDate->format("Y-m-d"); } else { // Get funding end date from request $fundingEndDate = JArrayHelper::getValue($data, "funding_end"); } // Validate the period. $dateValidator = new CrowdFundingDate($item->funding_start); if (!$dateValidator->isValidPeriod($fundingEndDate, $minDays, $maxDays)) { $result["message"] = !empty($maxDays) ? 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; }
/** * 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 ITPrismValidatorDate($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 CrowdFundingDate($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 ITPrismValidatorDate($table->get("funding_end")); if ($fundingEndDate->isValid()) { $fundingStartDate = new CrowdFundingDate($table->get("funding_start")); if (!$fundingStartDate->isValidPeriod($table->get("funding_end"), $minDays, $maxDays)) { 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)); } } } }
/** * 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 CrowdFundingDate($result->funding_start); $fundingEndDate = $fundingStartDate->calculateEndDate($result->funding_days); $result->funding_end = $fundingEndDate->format("Y-m-d"); } // Calculate funded percent $percent = new ITPrismMath(); $percent->calculatePercentage($result->funded, $result->goal, 0); $result->funded_percents = (string) $percent; // Calculate days left. $today = new CrowdFundingDate(); $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end); $this->item = $result; } } return $this->item; }