123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- <?php
- /**
- * \ElggWidget
- *
- * Stores metadata in private settings rather than as \ElggMetadata
- *
- * @package Elgg.Core
- * @subpackage Widgets
- *
- * @property-read string $handler internal, do not use
- * @property-read string $column internal, do not use
- * @property-read string $order internal, do not use
- * @property-read string $context internal, do not use
- */
- class ElggWidget extends \ElggObject {
- /**
- * Set subtype to widget.
- *
- * @return void
- */
- protected function initializeAttributes() {
- parent::initializeAttributes();
- $this->attributes['subtype'] = "widget";
- }
- /**
- * Get a value from attributes or private settings
- *
- * @param string $name The name of the value
- * @return mixed
- */
- public function __get($name) {
- // See if its in our base attribute
- if (array_key_exists($name, $this->attributes)) {
- return $this->attributes[$name];
- }
- // @todo clean up now that private settings return null
- // No, so see if its in the private data store.
- $meta = $this->getPrivateSetting($name);
- if ($meta) {
- return $meta;
- }
- // Can't find it, so return null
- return null;
- }
- /**
- * Override entity get and sets in order to save data to private data store.
- *
- * @param string $name Name
- * @return mixed
- * @deprecated 1.9
- */
- public function get($name) {
- elgg_deprecated_notice("Use -> instead of get()", 1.9);
- return $this->__get($name);
- }
- /**
- * Set an attribute or private setting value
- *
- * @param string $name The name of the value to set
- * @param mixed $value The value to set
- * @return void
- */
- public function __set($name, $value) {
- if (array_key_exists($name, $this->attributes)) {
- // Check that we're not trying to change the guid!
- if ((array_key_exists('guid', $this->attributes)) && ($name == 'guid')) {
- return;
- }
- $this->attributes[$name] = $value;
- } else {
- $this->setPrivateSetting($name, $value);
- }
- }
- /**
- * Override entity get and sets in order to save data to private data store.
- *
- * @param string $name Name
- * @param string $value Value
- * @return bool
- * @deprecated 1.9
- */
- public function set($name, $value) {
- elgg_deprecated_notice("Use -> instead of set()", 1.9);
- $this->__set($name, $value);
- return true;
- }
- /**
- * Set the widget context
- *
- * @param string $context The widget context
- * @return bool
- * @since 1.8.0
- */
- public function setContext($context) {
- return $this->setPrivateSetting('context', $context);
- }
- /**
- * Get the widget context
- *
- * @return string
- * @since 1.8.0
- */
- public function getContext() {
- return $this->getPrivateSetting('context');
- }
- /**
- * Get the title of the widget
- *
- * @return string
- * @since 1.8.0
- */
- public function getTitle() {
- $title = $this->title;
- if (!$title) {
- $title = _elgg_services()->widgets->getNameByType($this->handler);
- }
- return $title;
- }
- /**
- * Move the widget
- *
- * @param int $column The widget column
- * @param int $rank Zero-based rank from the top of the column
- * @return void
- * @since 1.8.0
- */
- public function move($column, $rank) {
- $options = array(
- 'type' => 'object',
- 'subtype' => 'widget',
- 'container_guid' => $this->container_guid,
- 'limit' => false,
- 'private_setting_name_value_pairs' => array(
- array('name' => 'context', 'value' => $this->getContext()),
- array('name' => 'column', 'value' => $column)
- )
- );
- $widgets = elgg_get_entities_from_private_settings($options);
- if (!$widgets) {
- $this->column = (int)$column;
- $this->order = 0;
- return;
- }
- usort($widgets, create_function('$a,$b','return (int)$a->order > (int)$b->order;'));
- // remove widgets from inactive plugins
- $widget_types = elgg_get_widget_types($this->context);
- $inactive_widgets = array();
- foreach ($widgets as $index => $widget) {
- if (!array_key_exists($widget->handler, $widget_types)) {
- $inactive_widgets[] = $widget;
- unset($widgets[$index]);
- }
- }
- $bottom_rank = count($widgets);
- if ($column == $this->column) {
- $bottom_rank--;
- }
-
- if ($rank == 0) {
- // top of the column
- $this->order = reset($widgets)->order - 10;
- } elseif ($rank == $bottom_rank) {
- // bottom of the column of active widgets
- $this->order = end($widgets)->order + 10;
- } else {
- // reorder widgets
- // remove the widget that's being moved from the array
- foreach ($widgets as $index => $widget) {
- if ($widget->guid == $this->guid) {
- unset($widgets[$index]);
- }
- }
- // split the array in two and recombine with the moved widget in middle
- $before = array_slice($widgets, 0, $rank);
- array_push($before, $this);
- $after = array_slice($widgets, $rank);
- $widgets = array_merge($before, $after);
- ksort($widgets);
- $order = 0;
- foreach ($widgets as $widget) {
- $widget->order = $order;
- $order += 10;
- }
- }
- // put inactive widgets at the bottom
- if ($inactive_widgets) {
- $bottom = 0;
- foreach ($widgets as $widget) {
- if ($widget->order > $bottom) {
- $bottom = $widget->order;
- }
- }
- $bottom += 10;
- foreach ($inactive_widgets as $widget) {
- $widget->order = $bottom;
- $bottom += 10;
- }
- }
- $this->column = $column;
- }
- /**
- * Saves the widget's settings
- *
- * Plugins can override the save mechanism using the plugin hook:
- * 'widget_settings', <widget handler identifier>. The widget and
- * the parameters are passed. The plugin hook handler should return
- * true to indicate that it has successfully saved the settings.
- *
- * @warning The values in the parameter array cannot be arrays
- *
- * @param array $params An array of name => value parameters
- *
- * @return bool
- * @since 1.8.0
- */
- public function saveSettings($params) {
- if (!$this->canEdit()) {
- return false;
- }
- // plugin hook handlers should return true to indicate the settings have
- // been saved so that default code does not run
- $hook_params = array(
- 'widget' => $this,
- 'params' => $params
- );
- if (_elgg_services()->hooks->trigger('widget_settings', $this->handler, $hook_params, false) == true) {
- return true;
- }
- if (is_array($params) && count($params) > 0) {
- foreach ($params as $name => $value) {
- if (is_array($value)) {
- // private settings cannot handle arrays
- return false;
- } else {
- $this->$name = $value;
- }
- }
- $this->save();
- }
- return true;
- }
- }
|