ewinslow / elgg-evan
为Elgg提供了一些实验性的开发便利
Requires
- php: ~5.4
- composer/installers: ~1.0.8
- elgg/elgg: ~1.9
- mnapoli/php-di: ~4.4
Requires (Dev)
- phpunit/phpunit: ~4.4
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)
将按照以下顺序查找视图
- object/blog/link
- object/default/link
- 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_edit
和can_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()
进行此操作。