<?php
/**
* СодеÑÐ¶Ð¸Ñ ÐºÐ»Ð°ÑÑ RoleEditor
*
* @package energine
* @author dr.Pavka
* @copyright ColoCall 2006
* @version $Id: RoleEditor.class.php,v 1.12 2007/12/17 14:16:19 pavka Exp $
*/
//require_once('core/framework/TreeBuilder.class.php');
//require_once('core/modules/share/components/Grid.class.php');
/**
* РедакÑÐ¾Ñ Ñолей
*
* @package energine
* @subpackage user
*/
class RoleEditor extends Grid {
/**
* УникалÑнÑе полÑ
* ÐÑи Ð¿Ð¾Ð»Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑолÑко Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ полÑзоваÑÐµÐ»Ñ Ð¸Ð· вÑеÑ
* @var array
* @access private
*/
private $uniqueFields = array('group_default', 'group_user_default');
/**
* ÐонÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа
*
* @return void
*/
public function __construct($name, $module, Document $document, array $params = null) {
parent::__construct($name, $module, $document, $params);
$this->setTableName('user_groups');
$this->setTitle($this->translate('TXT_ROLE_EDITOR'));
}
/**
* ÐеÑеопÑеделеннÑй меÑод
* ÐÐ»Ñ ÑоÑÐ¼Ñ ÑедакÑиÑованиÑ, еÑли ÑекбокÑÑ Ñолей по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾ÑмеÑÐµÐ½Ñ Ð´ÐµÐ»Ð°ÐµÑ Ð¸Ñ
неакÑивнÑми
*
* @return void
* @access public
*/
public function build() {
if ($this->getType() == self::COMPONENT_TYPE_FORM_ALTER ) {
foreach ($this->uniqueFields as $fieldName) {
if ($this->getData()->getFieldByName($fieldName)->getRowData(0) === true) {
$this->getDataDescription()->getFieldDescriptionByName($fieldName)->setMode(FieldDescription::FIELD_MODE_READ);
}
}
}
if ($this->getType() != self::COMPONENT_TYPE_LIST) {
//ÐобавлÑем Ð²ÐºÐ»Ð°Ð´ÐºÑ Ñ ÑÑовнем пÑав
$this->addTab($this->buildTab($this->translate('TXT_ROLE_DIV_RIGHTS')));
}
return parent::build();
}
/**
* ÐеÑеопÑеделеннÑй меÑод ÑоÑ
ÑанениÑ
*
*
* @return void
* @access protected
*/
protected function loadData() {
$result = parent::loadData();
if ($this->getAction() == 'save') {
foreach ($this->uniqueFields as $fieldName) {
if (isset($result[0][$fieldName]) && $result[0][$fieldName]) {
$this->dbh->modify(QAL::UPDATE, $this->getTableName(), array($fieldName=>null));
}
}
}
return $result;
}
/**
* ÐобавлÑеÑÑÑ fake поле user_div_rights в коÑоÑом наÑ
одÑÑÑÑ Ð´Ð°Ð½Ð½Ñе
*
* @return DataDescription
* @access protected
*/
protected function createDataDescription() {
$result = parent::createDataDescription();
if ($this->getType() != self::COMPONENT_TYPE_LIST) {
foreach ($result as $fieldDescription) {
$fieldDescription->addProperty('tabName', $this->translate('TXT_ROLE_EDITOR'));
}
$fd = new FieldDescription('group_div_rights');
$fd->setType(FieldDescription::FIELD_TYPE_CUSTOM);
$fd->addProperty('tabName', $this->translate('TXT_ROLE_DIV_RIGHTS'));
$fd->addProperty('customField', true);
$result->addFieldDescription($fd);
}
return $result;
}
/**
* Ðкладка Ñ ÑÑовнем пÑав на ÑазделÑ
*
* @return DOMNode
* @access private
*/
private function buildDivRightsData() {
$builder = new TreeBuilder();
$sitemap = Sitemap::getInstance();
$builder->setTree($sitemap->getTree());
$id = $this->getFilter();
$id = (!empty($id))?current($id):'';
$data = $sitemap->getInfo();
foreach ($data as $smapID => $value) {
$data[$smapID]['RightsId'] = $sitemap->getDocumentRights($smapID, $id);
$data[$smapID]['Id'] = $smapID;
//unset($data[$key]['smap_segment']);
}
//$d = array_map(null, $data, array_map(create_function('', 'return array(\'group_id\'=>0);'), array_fill(0,sizeof($data),'')));
$dataObject = new Data();
$dataObject->load($data);
$builder->setData($dataObject);
$dataDescriptionObject = new DataDescription();
$f = new FieldDescription('Id');
$f->setType(FieldDescription::FIELD_TYPE_INT);
$f->addProperty('key', true);
$dataDescriptionObject->addFieldDescription($f);
$f = new FieldDescription('Pid');
$f->setType(FieldDescription::FIELD_TYPE_INT);
$dataDescriptionObject->addFieldDescription($f);
$f = new FieldDescription('Name');
$f->setType(FieldDescription::FIELD_TYPE_STRING);
$dataDescriptionObject->addFieldDescription($f);
$f = new FieldDescription('RightsId');
$f->setType(FieldDescription::FIELD_TYPE_SELECT);
if ($this->getAction() == 'view') {
$f->setMode(FieldDescription::FIELD_MODE_READ);
}
$rights = $this->dbh->select('user_group_rights', array('right_id', 'right_const'));
$rights = array_merge(array(array('right_id'=>0, 'right_const'=>'NO_RIGHTS')), $rights);
foreach ($rights as $key => $value) {
$rights[$key]['right_const'] = $this->translate('TXT_'.$value['right_const']);
}
$f->loadAvailableValues($rights, 'right_id', 'right_const');
$dataDescriptionObject->addFieldDescription($f);
$builder->setData($dataObject);
$builder->setDataDescription($dataDescriptionObject);
$builder->build();
return $builder->getResult();
}
/**
* ÐÐ»Ñ Ð¼ÐµÑодов add и edit добавлÑеÑÑÑ Ð¸Ð½Ñо о Ñоли
*
* @return Data
* @access protected
*/
protected function createData() {
$result = parent::createData();
if ($this->getType() != self::COMPONENT_TYPE_LIST) {
$f = new Field('group_div_rights');
$f->setData($this->buildDivRightsData());
$result->addField($f);
}
return $result;
}
/**
* СоÑ
Ñанение даннÑÑ
о ÑÑовне пÑав на ÑазделÑ
*
* @return boolean
* @access protected
*/
protected function saveData() {
$result = parent::saveData();
$roleID = (is_int($result))?$result:current($this->getFilter());
$this->dbh->modify(QAL::DELETE, 'share_access_level', null, array('group_id'=>$roleID));
if(isset($_POST['div_right']) && is_array($_POST['div_right']))
foreach ($_POST['div_right'] as $smapID=>$rightID) {
if(!empty($rightID))
$this->dbh->modify(QAL::INSERT, 'share_access_level',array('group_id'=>$roleID, 'smap_id'=>$smapID, 'right_id'=>$rightID));
}
return $result;
}
/**
* ÐÑи Ñдалении пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿ÑовеÑка не ÑдалÑеÑÑÑ Ð»Ð¸ деÑолÑÐ½Ð°Ñ Ð³ÑÑппа
*
* @return void
* @access protected
*/
protected function deleteData($id) {
if ($this->dbh->select($this->getTableName(), 'group_id', array('group_id'=>$id, 'group_default'=>true)) !== true) {
throw new SystemException('ERR_DEFAULT_GROUP', SystemException::ERR_NOTICE);
}
parent::deleteData($id);
}
}