Skip to content
This repository has been archived by the owner on May 6, 2019. It is now read-only.

Commit

Permalink
feat(river): actionable river objects work again
Browse files Browse the repository at this point in the history
Admins can now define which river views should receive a detached
comment thread.
  • Loading branch information
hypeJunction committed Apr 14, 2017
1 parent a4077cf commit 6194dac
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 28 deletions.
116 changes: 92 additions & 24 deletions classes/hypeJunction/Interactions/InteractionsService.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,44 @@ public static function replaceCommentsBlock($hook, $entity_type, $return, $param
/**
* Creates a commentable object associated with river items whose object is not ElggObject
*
* @param string $event
* @param string $type
* @param ElggRiverItem $river
* @param string $event "created"
* @param string $type "river"
* @param ElggRiverItem $river River item
* @return true
*/
public static function createRiverObject($event, $type, $river) {
create_actionable_river_object($river);
return true;
}

/**
* Deletes a commentable object associated with river items whose object is not ElggObject
*
* @param string $event "delete:after"
* @param string $type "river"
* @param ElggRiverItem $river River item
* @return true
*/
public static function deleteRiverObject($event, $type, $river) {
$ia = elgg_set_ignore_access(true);

$objects = elgg_get_entities_from_metadata(array(
'types' => RiverObject::TYPE,
'subtypes' => array(RiverObject::SUBTYPE, 'hjstream'),
'metadata_name_value_pairs' => array(
'name' => 'river_id',
'value' => $river->id,
),
'limit' => 0,
'batch' => true,
));

$objects->setIncrementOffset(false);

foreach ($objects as $object) {
$object->delete();
}

elgg_set_ignore_access($ia);
}

/**
Expand All @@ -52,19 +82,23 @@ public static function createActionableRiverObject(ElggRiverItem $river) {
}

$object = $river->getObjectEntity();
if (!$object instanceof ElggObject) {
$ia = elgg_set_ignore_access(true);

$object = new RiverObject();
$object->owner_guid = $river->subject_guid;
$object->container_guid = $river->subject_guid;
$object->access_id = $river->access_id;
$object->river_id = $river->id;
$object->save();

elgg_set_ignore_access($ia);
$views = self::getActionableViews();
if (!in_array($river->view, $views)) {
return $object;
}

$ia = elgg_set_ignore_access(true);

$object = new RiverObject();
$object->owner_guid = $river->subject_guid;
$object->container_guid = $object->guid;
$object->access_id = $object->access_id;
$object->river_id = $river->id;
$object->save();

elgg_set_ignore_access($ia);

return $object;
}

Expand All @@ -82,7 +116,10 @@ public static function getRiverObject(ElggRiverItem $river) {
}

$object = $river->getObjectEntity();
if ($object instanceof ElggObject) {

$views = self::getActionableViews();

if (!in_array($river->view, $views)) {
return $object;
}

Expand All @@ -95,19 +132,22 @@ public static function getRiverObject(ElggRiverItem $river) {
'metadata_name_value_pairs' => array(
'name' => 'river_id',
'value' => $river->id,
'operand' => '='
),
'limit' => 1,
));

$guid = ($objects) ? $objects[0]->guid : false;
elgg_set_ignore_access($ia);

if (!$guid) {
$object = create_actionable_river_object($river);
$guid = $object->guid;
}

return get_entity($guid);
$object = get_entity($guid);

elgg_set_ignore_access($ia);

return $object;
}

/**
Expand Down Expand Up @@ -156,7 +196,7 @@ public static function getLinkedEntityName($entity) {
*/
public static function getCommentsSort() {
$user_setting = elgg_get_plugin_user_setting('comments_order', 0, 'hypeInteractions');
$setting = $user_setting ? : elgg_get_plugin_setting('comments_order', 'hypeInteractions');
$setting = $user_setting ?: elgg_get_plugin_setting('comments_order', 'hypeInteractions');
if ($setting == 'asc') {
$setting = 'time_created::asc';
} else if ($setting == 'desc') {
Expand All @@ -171,7 +211,7 @@ public static function getCommentsSort() {
*/
public static function getLoadStyle() {
$user_setting = elgg_get_plugin_user_setting('comments_load_style', 0, 'hypeInteractions');
return $user_setting ? : elgg_get_plugin_setting('comments_load_style', 'hypeInteractions');
return $user_setting ?: elgg_get_plugin_setting('comments_load_style', 'hypeInteractions');
}

/**
Expand All @@ -180,8 +220,9 @@ public static function getLoadStyle() {
*/
public static function getCommentsFormPosition() {
$user_setting = elgg_get_plugin_user_setting('comment_form_position', 0, 'hypeInteractions');
return $user_setting ? : elgg_get_plugin_setting('comment_form_position', 'hypeInteractions');
return $user_setting ?: elgg_get_plugin_setting('comment_form_position', 'hypeInteractions');
}

/**
* Get number of comments to show
*
Expand All @@ -191,7 +232,7 @@ public static function getCommentsFormPosition() {
public static function getLimit($partial = true) {
if ($partial) {
$limit = elgg_get_plugin_setting('comments_limit', 'hypeInteractions');
return $limit ? : 3;
return $limit ?: 3;
} else {
$limit = elgg_get_plugin_setting('comments_load_limit', 'hypeInteractions');
return $limit && $limit < 20 ? $limit : 20;
Expand All @@ -214,8 +255,7 @@ public static function calculateOffset($count, $limit, $comment = null) {
if ($comment instanceof Comment) {
$thread = new Thread($comment);
$offset = $thread->getOffset($limit, $order);
} else if (($order == 'time_created::asc' && $style == 'load_older')
|| ($order == 'time_created::desc' && $style == 'load_newer')) {
} else if (($order == 'time_created::asc' && $style == 'load_older') || ($order == 'time_created::desc' && $style == 'load_newer')) {
// show last page
$offset = $count - $limit;
if ($offset < 0) {
Expand All @@ -229,4 +269,32 @@ public static function calculateOffset($count, $limit, $comment = null) {
return (int) $offset;
}

/**
* Get views, which custom threads should be created for
* @return array
*/
public static function getActionableViews() {
static $views;
if (isset($views)) {
return $views;
}

$views = [];

$plugin = elgg_get_plugin_from_id('hypeInteractions');
$settings = $plugin->getAllSettings();
foreach ($settings as $key => $value) {
if (!$value) {
continue;
}
list ($prefix, $view) = explode(':', $key);
if ($prefix !== 'stream_object') {
continue;
}
$views[] = $view;
}

return $views;
}

}
23 changes: 22 additions & 1 deletion classes/hypeJunction/Interactions/RiverObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ class RiverObject extends ElggObject {
const TYPE = 'object';
const SUBTYPE = 'river_object';

private $_river_item;

/**
* {@inheritdoc}
*/
Expand All @@ -23,14 +25,33 @@ protected function initializeAttributes() {
* @return ElggRiverItem|false
*/
public function getRiverItem() {

if (isset($this->_river_item)) {
return $this->_river_item;
}

$id = $this->river_id;

$items = elgg_get_river(array(
'ids' => $id,
'limit' => 1,
));

return (is_array($items) && count($items)) ? $items[0] : false;
$this->_river_item = (is_array($items) && count($items)) ? $items[0] : false;
return $this->_river_item;
}

/**
* {@inheritdoc}
*/
public function getDisplayName() {
$item = $this->getRiverItem();
if (!$item) {
return elgg_echo('interactions:river_object:title');
}

$subject = $item->getSubjectEntity();
return elgg_echo('interactions:river_object:title_subject', [$subject->getDisplayName()]);
}

}
4 changes: 2 additions & 2 deletions classes/hypeJunction/Interactions/Router.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ public static function urlHandler($hook, $type, $url, $params) {
} else if ($entity instanceof RiverObject) {
return elgg_normalize_url(implode('/', array(
'activity',
'view',
$entity->river_id,
'owner',
$entity->getOwnerEntity()->username,
))) . "#item-river-$entity->guid";
}

Expand Down
12 changes: 12 additions & 0 deletions languages/en.php
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,18 @@
'interactions:like:object:default' => '%s liked %s',
'interactions:comments:no_results' => 'No comments have been made yet',
'interactions:likes:no_results' => 'This item hasn\'t been liked yet',
/**
* STREAM OBJECT
*/
'interactions:settings:actionable_stream_object' => 'Detached comment threads',
'interactions:settings:actionable_stream_object:help' => '
By default, only river items with an object can be commented on or liked.
Here you can enable commenting for specific views, which do not have a commentable object,
or where an object is a user or a group (e.g. User x has a new avatar),
or where river comments should be kept separate from main object comments.
',
'interactions:river_object:title' => 'activity',
'interactions:river_object:title_subject' => 'activity by %s',
);

add_translation("en", $english);
4 changes: 4 additions & 0 deletions start.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@

// Create an actionable river object
elgg_register_event_handler('created', 'river', [InteractionsService::class, 'createRiverObject']);
elgg_register_event_handler('delete:after', 'river', [InteractionsService::class, 'deleteRiverObject']);

// Configure permissions
elgg_register_plugin_hook_handler('permissions_check:comment', 'object', [Permissions::class, 'canComment']);
Expand All @@ -62,4 +63,7 @@
elgg_unregister_plugin_hook_handler('register', 'menu:river', 'likes_river_menu_setup');
elgg_unextend_view('elgg.css', 'likes/css');
elgg_unextend_view('elgg.js', 'likes/js');

// Actionable river items
elgg_register_plugin_hook_handler('likes:is_likable', 'object:river_object', [Elgg\Values::class, 'getTrue']);
});
25 changes: 24 additions & 1 deletion views/default/plugins/hypeInteractions/settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -124,4 +124,27 @@
1 => elgg_echo('option:yes'),
),
]);
}
}

$dbprefix = elgg_get_config('dbprefix');
$query = "SELECT DISTINCT view FROM {$dbprefix}river";
$data = get_data($query);

$view_fields = [];
foreach ($data as $row) {
$view = $row->view;
$view_fields[] = [
'#type' => 'checkbox',
'label' => $view,
'name' => "params[stream_object:$view]",
'checked' => (bool) $entity->{"stream_object:$view"},
'value' => 1,
];
}

echo elgg_view_field([
'#type' => 'fieldset',
'#label' => elgg_echo('interactions:settings:actionable_stream_object'),
'#help' => elgg_echo('interactions:settings:actionable_stream_object:help'),
'fields' => $view_fields,
]);

0 comments on commit 6194dac

Please sign in to comment.