我正在使用使用 Zend 框架的Social Engine为网站开发一个模块。我是 Zend Framework 和 Social Engine 的新手,但在 OOP 和 MVC 架构方面有经验,因此可以相对较快地掌握基础知识。
它是我正在开发的一个测试模块,所以刚刚构建了一个简单的模块,用户可以在其中创建、编辑或删除 CD 信息。然后有一个小部件可以显示在他们喜欢的地方,其中显示了 CD 信息。
我现在需要设置人们可以看到的 CD 的权限等。所以我研究了其他模块,发现 Poll 模块就是一个具体的例子。
查看其他模块,我意识到当您创建某些内容时,它们会让用户手动设置权限。
所以将此代码添加到我的表单中以创建具有相关权限的选择框:
$auth = Engine_Api::_()->authorization()->context;
$user = Engine_Api::_()->user()->getViewer();
$viewOptions = (array) Engine_Api::_()->authorization()->getAdapter('levels')->getAllowed('ryan', $user, 'auth_view');
$viewOptions = array_intersect_key($availableLabels, array_flip($viewOptions));
$privacy = null;
if( !empty($viewOptions) && count($viewOptions) >= 1 ) {
// Make a hidden field
if(count($viewOptions) == 1) {
//$this->addElement('hidden', 'auth_view', array('value' => key($viewOptions)));
$privacy = new Zend_Form_Element_Hidden('auth_view');
$privacy->setValue(key($viewOptions));
// Make select box
} else {
$privacy = new Zend_Form_Element_Select('auth_view');
$privacy->setLabel('Privacy')
->setDescription('Who may see this CD?')
->setMultiOptions($viewOptions)
->setValue(key($viewOptions));
/*$this->addElement('Select', 'auth_view', array(
'label' => 'Privacy',
'description' => 'Who may see this CD?',
'multiOptions' => $viewOptions,
'value' => key($viewOptions),
));*/
}
}
$this->addElements(array($artist, $title, $privacy, $submit));
老实说,除了明显地创建一个选择框并用指定的值填充它之外,我并不完全确定这段代码的作用。
因此,如果用户选择“所有人”,每个人都应该能够删除和编辑该 cd,依此类推。
显然,我认为控制器必须有一些代码可以处理确定用户是否有权查看每个 cd 等。
所以扫描 Poll 控制器我发现这是在控制器的 init 函数中:
public function init() {
// Get subject
$poll = null;
if( null !== ($pollIdentity = $this->_getParam('poll_id')) ) {
$poll = Engine_Api::_()->getItem('poll', $pollIdentity);
if( null !== $poll ) {
Engine_Api::_()->core()->setSubject($poll);
}
}
// Get viewer
$this->view->viewer = $viewer = Engine_Api::_()->user()->getViewer();
$this->view->viewer_id = Engine_Api::_()->user()->getViewer()->getIdentity();
// only show polls if authorized
$resource = ( $poll ? $poll : 'poll' );
$viewer = ( $viewer && $viewer->getIdentity() ? $viewer : null );
if( !$this->_helper->requireAuth()->setAuthParams($resource, $viewer, 'view')->isValid() ) {
return;
}
}
在顶部的每个操作中,它们都有一些不同的授权代码,一个这样的例子就是editAction
顶部有这个代码:
// Check auth
if( !$this->_helper->requireUser()->isValid() ) {
return;
}
if( !$this->_helper->requireSubject()->isValid() ) {
return;
}
if( !$this->_helper->requireAuth()->setAuthParams(null, null, 'edit')->isValid() ) {
return;
}
同样在同一个动作中还有其他几个我不明白他们在做什么的位,下面是editAction
Poll 控制器中的随机片段:
$auth = Engine_Api::_()->authorization()->context;
$roles = array('owner', 'owner_member', 'owner_member_member', 'owner_network', 'registered', 'everyone');
// Populate form with current settings
$form->search->setValue($poll->search);
foreach( $roles as $role ) {
if( 1 === $auth->isAllowed($poll, $role, 'view') ) {
$form->auth_view->setValue($role);
}
if( 1 === $auth->isAllowed($poll, $role, 'comment') ) {
$form->auth_comment->setValue($role);
}
}
// CREATE AUTH STUFF HERE
if( empty($values['auth_view']) ) {
$values['auth_view'] = array('everyone');
}
if( empty($values['auth_comment']) ) {
$values['auth_comment'] = array('everyone');
}
$viewMax = array_search($values['auth_view'], $roles);
$commentMax = array_search($values['auth_comment'], $roles);
我的问题是我真的不太了解上述任何一个,并且在坐了几天并且用谷歌搜索我的手指受伤之后,我仍然不知道我是否 100% 诚实。可以为我清除以上任何内容,帮助向我解释事情,如果可能的话,我如何将我想要的权限应用于我的模块。