Source for file DivisionEditor.class.php
Documentation is available at DivisionEditor.class.php
* Содержит класс DivisionEditor
* @copyright Energine 2006
//require_once('core/modules/share/components/Grid.class.php');
public function __construct($name, $module, Document $document, array $params = null) {
parent::__construct($name, $module, $document, $params);
$this->setParam('recordsPerPage', false);
//$this->setFilter(array('smap_pid'=>QAL::EMPTY_STRING));
* Метод выводит форму назначения прав
$this->setType(self::COMPONENT_TYPE_FORM);
//$this->addCrumb('TXT_SET_RIGHTS');
$id = (!empty($id))? current($id): false;
//получаем информацию о всех группах имеющихся в системе
$groups = $this->dbh->select('user_groups', array('group_id', 'group_name', 'group_default_rights'));
//название группы/перечень прав
foreach ($groups as $groupID=> $groupInfo) {
$res[] = array('right_id'=> ($this->getAction() == 'add')? $groupInfo['group_default_rights']: 0, 'group_id'=> $groupID);
$resultData = new Data();
$rightsField = $resultData->getFieldByName('right_id');
$groupsField = $resultData->getFieldByName('group_id');
//создаем переменную содержащую идентификторы групп в которые входит пользователь
$data = $this->dbh->select('share_access_level', true, array('smap_id'=> $id));
for ($i= 0; $i< $resultData->getRowCount(); $i++ ) {
//если установлены права для группы - изменяем в объекте данных
if (isset ($data[$groupsField->getRowData($i)])) {
$rightsField->setRowData($i, $data[$groupsField->getRowData($i)]['right_id']);
$groupsField->setRowProperty($i, 'group_id', $groupsField->getRowData($i));
for ($i= 0; $i< $resultData->getRowCount(); $i++ ) {
$groupsField->setRowProperty($i, 'group_id', $groupsField->getRowData($i));
$groupsField->setRowData($i, $groups[$groupsField->getRowData($i)]['group_name']);
$resultDD->addFieldDescription($fd);
$data = $this->dbh->select('user_group_rights', array('right_id', 'right_const as right_name'));
$data = array_map(create_function('$a', '$a["right_name"] = DBWorker::_translate("TXT_".$a["right_name"]); return $a;'), $data);
$data[] = array('right_id'=> 0, 'right_name'=> $this->translate('TXT_NO_RIGHTS'));
$fd->loadAvailableValues($data, 'right_id', 'right_name');
$resultDD->addFieldDescription($fd);
return $builder->getResult();
* Для setRole создаем свое описание данных
* Для поля smap_pid формируется Дерево разделов
* @return DataDescription
//для редактирования и добавления нужно сформировать "красивое дерево разделов"
$fd = $result->getFieldDescriptionByName('smap_pid');
$result->getFieldDescriptionByName('smap_name')->removeProperty('nullable');
//Для режима списка нам нужно выводить не значение а ключ
if ($this->getType() == self::COMPONENT_TYPE_LIST) {
$smapPIDFieldDescription = $result->getFieldDescriptionByName('smap_pid');
if ($smapPIDFieldDescription) {
$result->addFieldDescription($field);
* Добавляет данные об УРЛ
if($result && $this->getAction() == 'getRawData') {
//Используется GLOBALS поскольку нет другой возможности передать
//в runtime created function посторонее значение
SELECT DISTINCT t.tmpl_icon, s.smap_id FROM `share_sitemap` s
LEFT JOIN share_templates t ON t.tmpl_id=s.tmpl_id
$val["smap_segment"] = SiteMap::getInstance()->getURLByID($val["smap_id"]);
$val["tmpl_icon"] = $GLOBALS["__SMAP2ICONS"][$val["smap_id"]]["tmpl_icon"];
unset ($GLOBALS['__SMAP2ICONS']);
protected function getRawData($baseMethod = self::DEFAULT_ACTION_NAME){
$this->setParam('onlyCurrentLang', true);
$this->config->setCurrentMethod($baseMethod);
if ($data instanceof Data) {
$message['errors'][] = array('message'=> $e->getMessage(). current($e->getCustomMessage()));
$this->response->setHeader('Content-Type', 'text/javascript; charset=utf-8');
* Подменяем построитель для метода setPageRights
$field = new Field('page_rights');
$this->getData()->addField($field);
$this->dbh->selectRequest('
SELECT files.upl_id, upl_path, upl_name
FROM `share_sitemap_uploads` s2f
LEFT JOIN `share_uploads` files ON s2f.upl_id=files.upl_id
', $this->getData()->getFieldByName('smap_id')->getRowData(0))
$field = $this->getData()->getFieldByName('smap_pid');
if($field->getRowData(0) !== null) {
$field->setRowProperty($i, 'data_name', $smapName);
$field->setRowProperty($i, 'segment', $smapSegment);
$field = $this->getData()->getFieldByName('smap_pid');
$field->setRowData($i, $actionParams[0]);
$field->setRowProperty($i, 'data_name', $name);
$field->setRowProperty($i, 'segment', $smapSegment);
* Переопределенный внешний метод сохранения
* добавлено значение урла страницы
* Вызывает внутренний метод сохранения saveData(), который и производит собственно все действия
protected function save() {
$transactionStarted = $this->dbh->beginTransaction();
/*Тут пришлось пойти на извращаения для получения УРЛа страницы, поскольку новосозданная страница еще не присоединена к дереву*/
$smapPID = simplifyDBResult($this->dbh->select('share_sitemap', 'smap_pid', array('smap_id'=> $id)), 'smap_pid', true);
$transactionStarted = !($this->dbh->commit());
//Формируем JS массив ошибок который будет разбираться на клиенте
$errors = $this->saver->getErrors();
foreach ($errors as $errorFieldName) {
$message['errors'][] = array(
$JSONResponse = array_merge(array('result'=> false, 'header'=> $this->translate('TXT_SHIT_HAPPENS')), $message);
if ($transactionStarted) {
$message['errors'][] = array('message'=> $e->getMessage(). current($e->getCustomMessage()));
$JSONResponse = array_merge(array('result'=> false, 'header'=> $this->translate('TXT_SHIT_HAPPENS')), $message);
* Переопределенный метод сохранения
* Для того чтобы реализовать уникальность smap_default
if (!isset ($_POST['right_id']) || !is_array($_POST['right_id'])) {
if(isset ($_POST[$this->getTableName()]['smap_redirect_url']) && !empty($_POST[$this->getTableName()]['smap_redirect_url'])){
//Выставляем фильтр для родительского идентификатора
$rights = $_POST['right_id'];
//Удаляем все предыдущие записи в таблице прав
$this->dbh->modify(QAL::DELETE , 'share_access_level', null, array('smap_id'=> $smapID));
foreach ($rights as $groupID => $rightID) {
$this->dbh->modify(QAL::INSERT, 'share_access_level', array('smap_id'=> $smapID, 'right_id'=> $rightID, 'group_id'=> $groupID));
$this->dbh->modify(QAL::UPDATE, $this->getTableName(), array('smap_modified' => date('Y-m-d H:i:s')), array('smap_id'=> $smapID));
//Удаляем предыдущие записи из таблицы связей с дополнительными файлами
$this->dbh->modify(QAL::DELETE, 'share_sitemap_uploads', null, array('smap_id' => $smapID));
//записываем данные в таблицу share_sitemap_uploads
if(isset ($_POST['uploads']['upl_id'])){
foreach ($_POST['uploads']['upl_id'] as $uplID){
$this->dbh->modify(QAL::INSERT, 'share_sitemap_uploads', array('smap_id' => $smapID, 'upl_id' => $uplID));
protected function edit() {
$field = $this->getData()->getFieldByName('smap_redirect_url');
if($field->getRowData(0)){
* Добавлен перевод для корня дерева разделов
protected function main() {
* Не позволяет удалить раздел по умолчанию а также системные разделы
$res = $this->dbh->select('share_sitemap', array('smap_is_system', 'smap_default', 'smap_pid'), array($this->getPK()=> $id));
if ($res['smap_is_system'] || $res['smap_default']) {
* Для метода setPageRights если раздел который редактируется - системный то дизейблятся вкладки с правами
* Для метода show слешатся имена разделов
* Для формы редактирования делается неактивным переключатель smap_default
public function build() {
// вызываем родительский метод построения
$result->documentElement->appendChild($result->importNode($this->buildJS(), true));
foreach($tbs as $toolbar){
$result->documentElement->appendChild($result->importNode($toolbar->build(), true));
if ($this->getType() == self::COMPONENT_TYPE_FORM_ALTER ) {
if (($field = $this->getData()->getFieldByName('smap_default')) && ($field->getRowData(0)=== true)) {
if ($fieldDescription = $this->getDataDescription()->getFieldDescriptionByName('smap_default')) {
$result = parent::build();
/*if ($this->getType() != self::COMPONENT_TYPE_LIST )
$result->documentElement->appendChild($this->buildRightsTab());
* Метод возвращает свойства узла
$langID = $_POST['languageID'];
$this->setFilter(array('smap_id'=> $id, 'lang_id'=> $langID));
$result = $this->dbh->selectRequest(
'SELECT smap_name, smap_pid, smap_order_num, smap_is_final, smap_default, smap_is_system, tmpl_id'.
' LEFT JOIN share_sitemap_translation st ON s.smap_id = st.smap_id'.
' WHERE s.smap_id = '. $id. ' AND lang_id = '. $langID
$JSONResponse = $this->generateError($e->getCode(), $e->getMessage());
* Выводит панель управления страницей
if (!$this->config->getCurrentMethodConfig()) {
$this->getToolbar('main_toolbar')->getControlByID('editMode')->setState(1);
* Вывод релактора шаблонов
$this->templateEditor = $this->document->componentManager->createComponent('templateEditor', 'share', 'TemplateEditor', null);
* Вывод редактора переводов
$this->transEditor = $this->document->componentManager->createComponent('transEditor', 'share', 'TranslationEditor', null);
* Вывод редактора пользователей
$this->userEditor = $this->document->componentManager->createComponent('userEditor', 'user', 'UserEditor', null);
$this->roleEditor = $this->document->componentManager->createComponent('roleEditor', 'user', 'RoleEditor', null);
$this->langEditor = $this->document->componentManager->createComponent('langEditor', 'share', 'LanguageEditor', null);
* Изменяет порядок следования
if ($direction == Grid::DIR_UP) {
$order[key($order)] = ($order[key($order)] == QAL::ASC)? QAL::DESC: QAL::ASC;
$res = $this->dbh->select($this->getTableName(), array('smap_pid'), array('smap_id' => $id));
$orderFieldName = key($order);
$this->getPK(), $orderFieldName,
$orderFieldName, $direction,
$this->dbh->buildOrderCondition($order));
$result = $this->dbh->selectRequest($request);
if ($result === true || sizeof($result)< 2) {
* @todo Тут нужно что то пооптимальней придумать для того чтобы осуществить операцию переноса значений между двумя элементами массива
foreach ($data as $id2 => $value) {
$order = $value['smap_order_num'];
$this->dbh->modify(QAL::UPDATE, $this->getTableName(), array($orderFieldName=> $order), array($this->getPK()=> $id2));
$JSONResponse = $this->generateError($e->getCode(), $e->getMessage());
|