ewinslow/elgg-evan

为Elgg提供了一些实验性的开发便利

安装: 40

依赖: 2

建议者: 0

安全: 0

星级: 5

关注者: 4

分支: 4

开放性问题: 7

语言:JavaScript

类型:elgg-plugin

dev-master 2015-02-26 08:05 UTC

This package is not auto-updated.

Last update: 2024-09-10 02:26:16 UTC


README

此插件让我能够自由地尝试一些我认为对Elgg核心有用的功能。

设置

您需要使用composer安装此插件。在您的Elgg安装根目录下使用此命令。

composer require ewinslow/elgg-evan

您还需要安装Elgg 1.10-dev。

如果还在1.9-版本,您可以手动编辑核心库中的一个,并调用

require_once dirname(dirname(__DIR__)) . '/vendor/autoload.php';

这将确保所有类和依赖项都可以自动加载。

功能

使用evan_view_entity()查看实体

此函数允许您非常容易地处理实体的各种可视化。

例如,evan_view_entity('link', $blog)将按照以下顺序查找视图

  1. object/blog/link
  2. object/default/link
  3. entity/link

这允许您避免在视图中使用如此多的if/else语句,如下所示:https://github.com/Elgg/Elgg/blob/f122c12ab35f26d5b77a18cc263fc199eb2a7b01/mod/blog/views/default/object/blog.php

基于CSS的图标插入

而不是

echo elgg_view('output/url', array(
    'text' => elgg_view_icon('home') . htmlspecialchars($text),
));

这将产生如下输出

<a href="..."><span class="elgg-icon elgg-icon-home"></span>Text</a>

您可以做

echo elgg_view('output/url', array(
    'text' => $text, 
    'encode_text' => true, 
    'data-icon' => 'home',
));

这将产生如下输出

<a href="..." data-icon="home">Text</a>

并且具有相同的外观效果。希望这会使菜单配置更加插件友好--例如,如果您只想更改图标,而不是菜单项的文本,则您的插件不必与想要更改文本但不想更改图标的另一个插件冲突。

有关官方进度的详细信息,请参阅http://trac.elgg.org/ticket/3547

EvanMenu:在插件钩子中更轻松地配置菜单

在Elgg中,现在调整为菜单注册的项目是一项艰巨的工作。您在插件钩子中获得的所有内容都是一个没有任何API来操作内容的项数组。EvanMenu解决了这个问题。

您可以在插件钩子中使用EvanMenu如下。

$menu = new EvanMenu($items);

$menu->registerItem(...); // similar API to elgg_register_menu_item
$menu->unregisterItem($name); // Remove items by name.

return $menu->getItems();

网格的间距

Elgg 1.8引入了网格系统,但没有间距支持。此插件利用CSS是用PHP生成的这一事实,并基于您选择的间距宽度生成网格系统。请参阅css/elements/grid.php -- 只需编辑$gutterWidthPercent值即可更改间距。

evan_user_can($verb, $object, $target)

这是http://trac.elgg.org/ticket/4888的实验性实现。

Elgg附带了一些与权限相关的函数,如can_editcan_write_to_container。此外,还有几个权限钩子,用于控制用户可以和不能做什么。此函数统一了到Elgg权限系统的接口,并扩大了Elgg权限系统可以处理的范围。例如,从未有过询问Elgg“当前用户能否邀请用户X参加活动Y”的标准方式。现在,这个问题很容易就能问出来

elgg_user_can('invite', $user, $event);

以这种方式请求权限的另一个好处是它不依赖于数据模型。例如,如果我们正在使用注释跟踪活动邀请,并且我们决定在某个时刻切换到使用关系,则权限代码根本不需要更改。这使得一切比以前更容易维护。

示例用法

以下是一些示例,包括旧方式检查权限,以突出新系统的可读性和可维护性的改进。

检查当前用户是否可以向自己的墙发布博客

elgg_user_can('post', new ElggBlog(), $user);

检查当前用户是否可以邀请另一用户参加活动

elgg_user_can('invite', $user, $event);

检查当前用户是否能加入一个群组

elgg_user_can('join', $group);

检查当前用户是否能关注另一个用户

elgg_user_can('follow', $user);

检查当前用户是否能删除某些内容

elgg_user_can('delete', $entity);

检查当前用户是否能在照片中标记另一个用户

elgg_user_can('tag', $user, $photo);

通过钩子自定义权限

为了控制结果,只需注册插件钩子 "permission,verb",如下所示

elgg_register_plugin_hook_handler('permission', 'post', 'handler');

您的处理器将传递四个值:actor(行为者)、verb(动词)、object(对象)和target(目标)。插件开发者鼓励在使用适合其需求的活动流动词时使用activitystreams verbs

向下兼容

当然,为了使此功能有用,它需要与之前的权限模型保持向后兼容。我在适当的地方硬编码了新代码到旧代码的翻译。如果您发现有任何遗漏,请提交错误/拉取请求,我们将修复这些问题。

限制

此函数不接受非实体作为权限检查的对象或目标。例如,在Elgg 1.9之前,您不能使用此函数询问用户是否有权限在博客上发表评论,因为评论是以注释的形式建模的。正确的方法是

elgg_user_can('post', new ElggComment(), $blog);

但对象必须是ElggEntity。您可能会想这样做

elgg_user_can('comment', $blog);

但是这不被鼓励,因为这不符合活动流规范,最好是尽可能与该规范保持一致。我希望这个新的权限接口能帮助人们澄清应该是什么ElggEntity以及什么是ElggAnnotation,这样我们就不必在未来再次遇到这种情况。

Evan\Storage\MysqlDb

此类提供了一些查询实体的有用工具。例如,获取10个被禁用的用户

$db = new Evan\Storage\MysqlDb();
$db->getUsers()->where('banned', true)->getItems(10, 0); // The array of users

计算被禁用用户的数量

$db = new Evan\Storage\MysqlDb();
$db->getUsers()->where('banned', true)->getCount(); // The number of banned users

其力量来自于有一个理解用户特定字段的专用EvanUsersQuery对象。例如,我们现在可以轻松查询管理员

$db = new Evan\Storage\MysqlDb();
$db->getUsers()->where('admin', true)->getItem(0); // A single admin user

它还使一些非常方便的与管理员相关的查询变得简单

$db = new Evan\Storage\MysqlDb();
$db->getUsers()->where('validated', false)->getItems(); // 10 unvalidated users

限制

到目前为止,仅支持getEntities()getUsers()。似乎getObjects()getGroups()是下一步的逻辑步骤。

使用此API无法查询元数据。您仍然可以使用elgg_get_entities_from_metadata()进行此操作。