Редактирование страниц с клиентской части сайта

Материал из Umicms
Версия от 08:54, 5 июня 2013; Mad grant (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Актуально для версии 2.9

В данной статье Добавление страниц через клиентскую часть был описан механизм добавлении объектов каталога с клиентской части сайта. А в текущей статье будет рассказано, как отредактировать объект, также с клиентской части сайта.

Добавим в файл /classes/modules/data/__custom.php метод editform(), который выведет форму редактирования объекта:

      public  function editform() {
            if(!$page_id = htmlspecialchars(getRequest('id'))) return false; 
            $hierarchy = umiHierarchy::getInstance();
            $element = $hierarchy->getElement($page_id);
            
            if($element instanceof umiHierarchyElement) {
              $object_id = $element->getObjectId();
              $permissions = permissionsCollection::getInstance();
              $cmsController = cmsController::getInstance();

              $user_id = $permissions->getUserId();
              if(!$permissions->isOwnerOfObject($object_id, $user_id)) return false;
              $data = $cmsController->getModule("data");
              return $data->getEditForm($object_id, 'default');
            }
        }

Также необходимо добавить метод, который будет отвечать за сохранение данных:

        public function saveobjectcustom() {
              
              if(!$data = getRequest('data')) return false;    
              
              $arr_key = array_keys($data);
              $object_id = (int) $arr_key[0];
              $permissions = permissionsCollection::getInstance();
              $cmsController = cmsController::getInstance();
              $user_id = $permissions->getUserId();
              if(!$permissions->isOwnerOfObject($object_id, $user_id)) return false;
              
              $objects = umiObjectsCollection::getInstance();
              $object = $objects->getObject($object_id);
              if($object instanceof umiObject){
                $cmsController = cmsController::getInstance();
                $data = $cmsController->getModule("data");
                $data->saveEditedObject($object_id);
                $object->commit();
                
                $referer_url = getServer('HTTP_REFERER');           
                $buffer = outputBuffer::current('HTTPOutputBuffer');   
                $ini = cmsController::getInstance()->getModule("content");   
                $ini->redirect($referer_url);
              }
        }

Если говорить про TPL-шаблоны, то в шаблоне \tpls\data\reflection\default.tpl блок reflection_block должен быть примерно следующий:

$FORMS['reflection_block'] = <<<END
<i>Редактирование объекта</i>
<form enctype="multipart/form-data" method="post" action="%pre_lang%/data/saveobjectcustom/">
%groups%
<input type="submit" value="Сохранить" />
</form>
END;


В административной части сайта создаем страницу контента, допустим с идентификатором 'editobject', в контенте этой страницы прописываем следующий макрос:

%data editform()%

А для объектов каталога, добавляем ссылку:

<a href="/editobject/?id=%id%">Редактировать</a>

Примечания к статье:


1. В статье происходит проверка на то, кто владеет объектом и если статью (товар) пытается отредактировать не его владелец, то макрос не отработает и будет показана пустая страница. Если же всё же требуется дать возможность редактировать и другим пользователям, то везде, где встречается следующая строка, её необходимо закомментировать:

if(!$permissions->isOwnerOfObject($object_id, $user_id)) return false;

2. Выполнив первый пункт, мы сможем только открывать объект на редактирование, но мы по прежнему не сможем сохранить изменения. Для того, чтобы можно было сохранять изменения другим пользователям, необходимо кастомизировать метод saveEditedObject. Данный метод находится в папке с модулем data в файле __client_reflection.php. Вам необходимо полностью скопировать метод и разместить его в файле __custom.php. Скопированую функцию необходимо переименовать из saveEditedObject в saveEditedObjectNew, соответственно в макросе saveobjectcustom необходимо изменить вызов функции на наш. В скопированной функции находим и комментируем код по проверке владельца объекта:

//if(!$b_force_owner && !$permissions->isOwnerOfObject($object_id)) {
//	return false;
//}

3. Если Вы не хотите давать доступ к функционалу другим пользователям, кроме супервизоров, то прописывать макросы в permissions не следует.