123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- <?php
- /**
- * Upgrade object for upgrades that need to be tracked
- * and listed in the admin area.
- *
- * @todo Expand for all upgrades to be \ElggUpgrade subclasses.
- */
- /**
- * Represents an upgrade that runs outside of the upgrade.php script.
- * These are listed in admin/upgrades and allow for ajax upgrades.
- *
- * @note The "upgrade_url" private setting originally stored the full URL, but
- * was changed to hold the relative path from the site URL for #6838
- *
- * @package Elgg.Admin
- * @access private
- */
- class ElggUpgrade extends \ElggObject {
- private $requiredProperties = array(
- 'title',
- 'description',
- 'upgrade_url',
- );
- /**
- * Do not use.
- *
- * @access private
- * @var callable
- */
- public $_callable_egefps = 'elgg_get_entities_from_private_settings';
- /**
- * Set subtype to upgrade
- *
- * @return null
- */
- public function initializeAttributes() {
- parent::initializeAttributes();
- $this->attributes['subtype'] = 'elgg_upgrade';
- // unowned
- $this->attributes['site_guid'] = 0;
- $this->attributes['container_guid'] = 0;
- $this->attributes['owner_guid'] = 0;
- $this->is_completed = 0;
- }
- /**
- * Mark this upgrade as completed
- *
- * @return bool
- */
- public function setCompleted() {
- $this->setCompletedTime();
- return $this->is_completed = true;
- }
- /**
- * Has this upgrade completed?
- *
- * @return bool
- */
- public function isCompleted() {
- return (bool) $this->is_completed;
- }
- /**
- * Sets an upgrade URL path
- *
- * @param string $path Set the URL path (without site URL) for the upgrade page
- * @return void
- * @throws InvalidArgumentException
- */
- public function setPath($path) {
- if (!$path) {
- throw new InvalidArgumentException('Invalid value for URL path.');
- }
- $path = ltrim($path, '/');
- if ($this->getUpgradeFromPath($path)) {
- throw new InvalidArgumentException('Upgrade URL paths must be unique.');
- }
- $this->upgrade_url = $path;
- }
- /**
- * Returns a normalized URL for the upgrade page.
- *
- * @return string
- */
- public function getURL() {
- return elgg_normalize_url($this->upgrade_url);
- }
- /**
- * Sets the timestamp for when the upgrade completed.
- *
- * @param int $time Timestamp when upgrade finished. Defaults to now.
- * @return bool
- */
- public function setCompletedTime($time = null) {
- if (!$time) {
- $time = time();
- }
- return $this->completed_time = $time;
- }
- /**
- * Gets the time when the upgrade completed.
- *
- * @return string
- */
- public function getCompletedTime() {
- return $this->completed_time;
- }
- /**
- * Require an upgrade page.
- *
- * @return mixed
- * @throws UnexpectedValueException
- */
- public function save() {
- foreach ($this->requiredProperties as $prop) {
- if (!$this->$prop) {
- throw new UnexpectedValueException("ElggUpgrade objects must have a value for the $prop property.");
- }
- }
- return parent::save();
- }
- /**
- * Set a value as private setting or attribute.
- *
- * Attributes include title and description.
- *
- * @param string $name Name of the attribute or private_setting
- * @param mixed $value Value to be set
- * @return void
- */
- public function __set($name, $value) {
- if (array_key_exists($name, $this->attributes)) {
- parent::__set($name, $value);
- } else {
- $this->setPrivateSetting($name, $value);
- }
- }
- /**
- * Get an attribute or private setting value
- *
- * @param string $name Name of the attribute or private setting
- * @return mixed
- */
- public function __get($name) {
- // See if its in our base attribute
- if (array_key_exists($name, $this->attributes)) {
- return parent::__get($name);
- }
- return $this->getPrivateSetting($name);
- }
- /**
- * Find an ElggUpgrade object by the unique URL path
- *
- * @param string $path The Upgrade URL path (after site URL)
- * @return ElggUpgrade|false
- */
- public function getUpgradeFromPath($path) {
- $path = ltrim($path, '/');
- if (!$path) {
- return false;
- }
- // test for full URL values (used at 1.9.0)
- $options = array(
- 'type' => 'object',
- 'subtype' => 'elgg_upgrade',
- 'private_setting_name' => 'upgrade_url',
- 'private_setting_value' => elgg_normalize_url($path),
- );
- $upgrades = call_user_func($this->_callable_egefps, $options);
- /* @var ElggUpgrade[] $upgrades */
- if ($upgrades) {
- // replace URL with path (we can't use setPath due to recursion)
- $upgrades[0]->upgrade_url = $path;
- return $upgrades[0];
- }
- $options['private_setting_value'] = $path;
- $upgrades = call_user_func($this->_callable_egefps, $options);
- if ($upgrades) {
- return $upgrades[0];
- }
- return false;
- }
- }
|