我遵循了关于如何将ACL添加到我的自定义组件的Joomla Docs教程。虽然我成功地添加了组件范围的权限管理,但我正在努力使项目级别的ACL工作。
我正在尝试为表books实现一个ACL。如本教程所述,我在那里添加了一个asset_id列。我在book.xml中添加了一个文件admin/models/forms/ --内容如下:
<?xml version="1.0" encoding="utf-8"?>
<form>
<field name="asset_id" type="hidden" filter="unset" />
<field name="rules"
type="rules"
label="JFIELD_RULES_LABEL"
translate_label="false"
filter="rules"
validate="rules"
class="inputbox"
component="com_mytest"
section="book"
/>
</form>这就是我的access.xml的样子:
<?xml version="1.0" encoding="utf-8" ?>
<access component="com_mytest">
<section name="component">
<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
<action name="core.edit" title="JACTION_EDIT_BOOK" description="COM_MYTEST_ACCESS_EDIT_BOOK_DESC" />
<action name="core.delete" title="JACTION_DELETE_BOOK" description="COM_MYTEST_ACCESS_DELETE_BOOK_DESC" />
</section>
<section name="book">
<action name="core.edit" title="JACTION_EDIT_BOOK" description="COM_MYTEST_ACCESS_EDIT_BOOK_DESC" />
<action name="core.delete" title="JACTION_DELETE_BOOK" description="COM_MYTEST_ACCESS_DELETE_BOOK_DESC" />
</section>
</access>在我的JTable变体admin/tables/mytest_books.php中,我添加了以下方法:
public function bind($array, $ignore = '')
{
if (isset($array['jform']) && isset($array['jform']['rules']) && is_array($array['jform']['rules']))
{
$rules = new JAccessRules($array['jform']['rules']);
$this->setRules($rules);
}
return parent::bind($array, $ignore);
}
protected function _getAssetName()
{
return 'com_mytest.book.'.(int) $this->id;
}
protected function _getAssetTitle()
{
return $this->name;
}
protected function _getAssetParentId()
{
$asset = JTable::getInstance('Asset');
$asset->loadByName('com_mytest');
return $asset->id;
}正如您可能注意到的,在上面的bind()方法中,我必须从rules数组中提取jform数组。在我看到的所有教程中,它们只是引用$array['rules']而不是$array['jform']['rules']。
,也许这就是我的问题?
这是我的书“模型admin/models/book.php”
public function getForm($data = array(), $loadData = true)
{
$form = $this->loadForm('com_mytest.book', 'book', array('control' => 'jform', 'load_data' => $loadData));
if (empty($form)){
return false;
}
return $form;
}
protected function loadFormData()
{
$data = JFactory::getApplication()->getUserState('com_mytest.edit.book.data', array());
if (empty($data))
{
$data = $this->getItem($this->_id);
}
return $data;
}下面是我在图书编辑屏幕admin/views/book/tmpl/default.php底部添加的内容
<?php echo JHtml::_('sliders.start', 'permissions-sliders-'.$this->row->id, array('useCookie'=>1)); ?>
<?php echo JHtml::_('sliders.panel', JText::_('COM_MYTEST_FIELDSET_RULES'), 'access-rules'); ?>
<fieldset class="panelform">
<?php echo $this->form->getLabel('rules'); ?>
<?php echo $this->form->getInput('rules'); ?>
</fieldset>
<?php echo JHtml::_('sliders.end'); ?>,以下是起作用的东西:
编辑完组的书级ACL后,当我保存一本书时,设置将正确保存。我的资产表看起来不错,显示的条目如下:
id _ {“1”:0,"6":1,"7":1,"2":0,"3":0,"4":1,"5":0,"10":0,"12":0,"8":0},"core.delete":{"1":0,"6":1,"7":0,“2”"3":0,"4":0,"5":0,"10":0,"12":0,“8”:0}
是的,ID 2的书在asset_id列中有198。
这里是我的问题
当我通过为管理员用户组设置“允许的所有操作”来保存图书ACL时,对话框将显示权限旁边的冲突。将所有设置为“拒绝”不会显示此消息。
For case(和)
当我使用第二个浏览器作为管理员用户组用户登录时,此条件总是返回false (是的,$row->id确实包含有效的ID):
$canEdit =JFactory::getUser()->authorise(‘core.dit’,'com_mytest.book.'.$row->id);
你能帮我解决这个难题吗?
,非常感谢!
发布于 2014-07-08 01:55:56
您的图书资产是否在资产表中获得正确的父id?任何时候,当你使用ACL时,当你不使用类别时,你需要非常小心地对待养育。通常,您希望确保这些项将组件作为父级。这在类中有点混乱,但是您可以查看com_modules,看看它如何工作。当组在项和分支的开始之间有一个很难拒绝的位置时,就会出现冲突情况。通常,这在组件上可能被拒绝,但作为一个例子,允许该组件的类别。如果你的养育方式做得不正确,你就会陷入冲突的境地。
https://stackoverflow.com/questions/24493346
复制相似问题