Как дать отдельный доступ пользователю

#1 28 апреля 2016 в 01:54
Доброго времени суток друзья, я создал компонент, вот такой вопрос.
Есть форма заполнения на сайте и ее могут заполнять пользователи и админ, но редактировать только может админ
Нужно сделать так что бы пользователь который добавил данные только он может изменять эти данные, другие пользователи нет
Таблица базы данных одна.
Как сделать так что бы при добавление формы это числилось на счет уникального пользователя.

Мне нужно так что бы пользователь который создал форму, он мог ее сам редактировать, а там много пользователей они не должны редактировать чужие формы только свои.


Вот model.php


  1. <?php
  2.  
  3. class modelStreetball extends cmsModel {
  4.  
  5. public function addBattle($battle){
  6.  
  7. return $this->insert('photobattles', $battle,);
  8.  
  9. }
  10.  
  11. public function updateBattle($id, $battle){
  12.  
  13. return $this->update('photobattles', $id, $battle);
  14.  
  15. }
  16.  
  17. public function deleteBattle($id){
  18.  
  19. $config = cmsConfig::getInstance();
  20.  
  21. $battle = $this->getBattle($id);
  22.  
  23. $logos = self::yamlToArray($battle['logo']);
  24. if (is_array($logos)){
  25. foreach($logos as $path){
  26. unlink( $config->upload_path . $path);
  27. }
  28. }
  29.  
  30.  
  31.  
  32.  
  33. return $this->delete('photobattles', $id);
  34.  
  35. }
  36.  
  37. public function getBattle($id){
  38.  
  39. return $this->getItemById('photobattles', $id);
  40.  
  41. }
  42.  
  43. public function getBattles(){
  44.  
  45. return $this->get('photobattles');
  46.  
  47. }
  48.  
  49. public function getBattlesCount(){
  50.  
  51. return $this->getCount('photobattles');
  52.  
  53. }
  54.  
  55. }

Вот action/add.php


  1. <?php
  2.  
  3. [code=php]class actionStreetballAdd extends cmsAction {
  4.  
  5. public function run(){
  6.  
  7. $errors = false;
  8.  
  9. $form = $this->getForm('battle');
  10.  
  11. $is_submitted = $this->request->has('submit');
  12.  
  13. $battle = $form->parse($this->request, $is_submitted);
  14.  
  15. $user = cmsUser::getInstance();
  16.  
  17. if ($is_submitted){
  18.  
  19. $errors = $form->validate($this, $battle);
  20.  
  21. if (!$errors){
  22. $battle_id = $this->model->addBattle($battle);
  23. $this->redirectToAction('battle', array($battle_id));
  24. $battle['user_id'] = $user->id;
  25. }
  26.  
  27. if ($errors){
  28. cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
  29. }
  30.  
  31. }
  32.  
  33. $template = cmsTemplate::getInstance();
  34.  
  35. $template->render('form_battle', array(
  36. 'do' => 'add',
  37. 'form' => $form,
  38. 'errors' => $errors,
  39. 'battle' => $battle
  40. ));
  41.  
  42. }
  43.  
  44. }[/code]
  45.  
  46.  
Вот action/edit.php

  1.  
  2. <?php
  3.  
  4. class actionStreetballEdit extends cmsAction {
  5. public function run($id=false){
  6. if (!$id) { cmsCore::error404(); }
  7. if (!cmsUser::isAdmin()) { cmsCore::error404(); }
  8. $battle = $this->model->getBattle($id);
  9. if (!$battle) { cmsCore::error404(); }
  10. $errors = false;
  11. $form = $this->getForm('battle');
  12. $is_submitted = $this->request->has('submit');
  13. if ($is_submitted){
  14. $battle = $form->parse($this->request, $is_submitted);
  15. $errors = $form->validate($this, $battle);
  16. if (!$errors){
  17. $this->model->updateBattle($id, $battle);
  18. $this->redirectToAction('battle', array($id));
  19. }
  20. if ($errors){
  21. cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
  22. }
  23. }
  24. $template = cmsTemplate::getInstance();
  25. $template->render('form_battle', array(
  26. 'do' => 'edit',
  27. 'form' => $form,
  28. 'errors' => $errors,
  29. 'battle' => $battle
  30. ));
  31. }
  32.  
  33. }
[spoiler]
#2 28 апреля 2016 в 09:16
Нико, вам надо добавить в свой компонент настройки управления правами docs.instantcms.ru/dev/controllers/backend/perms
Тогда вы сможете задавать, какие группы и что могут делать с записями: редактировать свои, или все, или вообще не смогут редактировать ничего.
#3 28 апреля 2016 в 09:56


Нико, вам надо добавить в свой компонент настройки управления правами docs.instantcms.ru/dev/controllers/backend/perms
Тогда вы сможете задавать, какие группы и что могут делать с записями: редактировать свои, или все, или вообще не смогут редактировать ничего.

Zau4man

Да, но я создаю компонент и мне надо сделать так что бы пользователь который создал форму попадала в базу что именно этот пользователь создал форму $user_id
#4 28 апреля 2016 в 10:07



Нико, вам надо добавить в свой компонент настройки управления правами docs.instantcms.ru/dev/controllers/backend/perms
Тогда вы сможете задавать, какие группы и что могут делать с записями: редактировать свои, или все, или вообще не смогут редактировать ничего.

Zau4man

Да, но я создаю компонент и мне надо сделать так что бы пользователь который создал форму попадала в базу что именно этот пользователь создал форму $user_id

Нико


Вот и сам код добавления формы. Мне нужно так что бы пользователь который создал форму, он мог ее сам редактировать, а там много пользователей они не должны редактировать чужие формы только свои.

  1. <?php
  2. class actionStreetballAdd extends cmsAction {
  3. public function run(){
  4. $errors = false;
  5. $form = $this->getForm('battle');
  6. $is_submitted = $this->request->has('submit');
  7. $battle = $form->parse($this->request, $is_submitted);
  8. if ($is_submitted){
  9. $errors = $form->validate($this, $battle);
  10. if (!$errors){
  11. $battle_id = $this->model->addBattle($battle);
  12. $this->redirectToAction('battle', array($battle_id));
  13. }
  14.  
  15. if ($errors){
  16. cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
  17. }
  18. }
  19.  
  20. $template = cmsTemplate::getInstance();
  21. $template->render('form_battle', array(
  22. 'do' => 'add',
  23. 'form' => $form,
  24. 'errors' => $errors,
  25. 'battle' => $battle
  26. ));
  27. }
  28. }
#5 28 апреля 2016 в 10:35
Вот model.php


  1. <?php
  2.  
  3. class modelStreetball extends cmsModel {
  4.  
  5. public function addBattle($battle){
  6.  
  7. return $this->insert('photobattles', $battle,);
  8.  
  9. }
  10.  
  11. public function updateBattle($id, $battle){
  12.  
  13. return $this->update('photobattles', $id, $battle);
  14.  
  15. }
  16.  
  17. public function deleteBattle($id){
  18.  
  19. $config = cmsConfig::getInstance();
  20.  
  21. $battle = $this->getBattle($id);
  22.  
  23. $logos = self::yamlToArray($battle['logo']);
  24. if (is_array($logos)){
  25. foreach($logos as $path){
  26. unlink( $config->upload_path . $path);
  27. }
  28. }
  29.  
  30.  
  31.  
  32.  
  33. return $this->delete('photobattles', $id);
  34.  
  35. }
  36.  
  37. public function getBattle($id){
  38.  
  39. return $this->getItemById('photobattles', $id);
  40.  
  41. }
  42.  
  43. public function getBattles(){
  44.  
  45. return $this->get('photobattles');
  46.  
  47. }
  48.  
  49. public function getBattlesCount(){
  50.  
  51. return $this->getCount('photobattles');
  52.  
  53. }
  54.  
  55. }

Вот action/add.php


  1. <?php
  2.  
  3. [code=php]class actionStreetballAdd extends cmsAction {
  4.  
  5. public function run(){
  6.  
  7. $errors = false;
  8.  
  9. $form = $this->getForm('battle');
  10.  
  11. $is_submitted = $this->request->has('submit');
  12.  
  13. $battle = $form->parse($this->request, $is_submitted);
  14.  
  15. $user = cmsUser::getInstance();
  16.  
  17. if ($is_submitted){
  18.  
  19. $errors = $form->validate($this, $battle);
  20.  
  21. if (!$errors){
  22. $battle_id = $this->model->addBattle($battle);
  23. $this->redirectToAction('battle', array($battle_id));
  24. $battle['user_id'] = $user->id;
  25. }
  26.  
  27. if ($errors){
  28. cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
  29. }
  30.  
  31. }
  32.  
  33. $template = cmsTemplate::getInstance();
  34.  
  35. $template->render('form_battle', array(
  36. 'do' => 'add',
  37. 'form' => $form,
  38. 'errors' => $errors,
  39. 'battle' => $battle
  40. ));
  41.  
  42. }
  43.  
  44. }[/code]
  45.  
  46.  
Вот action/edit.php

  1.  
  2. <?php
  3.  
  4. class actionStreetballEdit extends cmsAction {
  5. public function run($id=false){
  6. if (!$id) { cmsCore::error404(); }
  7. if (!cmsUser::isAdmin()) { cmsCore::error404(); }
  8. $battle = $this->model->getBattle($id);
  9. if (!$battle) { cmsCore::error404(); }
  10. $errors = false;
  11. $form = $this->getForm('battle');
  12. $is_submitted = $this->request->has('submit');
  13. if ($is_submitted){
  14. $battle = $form->parse($this->request, $is_submitted);
  15. $errors = $form->validate($this, $battle);
  16. if (!$errors){
  17. $this->model->updateBattle($id, $battle);
  18. $this->redirectToAction('battle', array($id));
  19. }
  20. if ($errors){
  21. cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
  22. }
  23. }
  24. $template = cmsTemplate::getInstance();
  25. $template->render('form_battle', array(
  26. 'do' => 'edit',
  27. 'form' => $form,
  28. 'errors' => $errors,
  29. 'battle' => $battle
  30. ));
  31. }
  32.  
  33. }
[spoiler]
#6 28 апреля 2016 в 20:24
Нико, Zau4man вам ответил как нужно делать)) описываю краткую последовательность действий (подробно читайте по ссылке выше)

1. В БД добавляете две записи в таблицу cms_perms_rules (cms — ваш префикс):
controller — streetball, name — add, type — flag
controller — streetball, name — edit, type — list, options — own,all

2. Тут зависит от ваших потребностей, но для простоты в action/add.php дописываете после 19 строки:
  1. $errors = $form->validate($this, $battle);
  2. $errors = $errors && !cmsUser::isAllowed('streetball', 'add');
или можно реализовать логику до if ($is_submitted){...} делать проверку

также прописываем в action/edit.php вместо
  1. if (!cmsUser::isAdmin()) { cmsCore::error404(); }
строки
  1. $user = cmsUser::getInstance();
  2. $is_edit = $user->is_admin || cmsUser::isAllowed('streetball', 'edit', 'all') ||
  3. ( cmsUser::isAllowed('streetball', 'edit', 'own') && $battle['user_id']==$user->id );
  4.  
  5. if (!$is_edit) { cmsCore::error404(); }
$battle = ... и if (!$battle) {...} ставим перед $is_edit

3. Прописываете необходимые языковые константы. Если админка для компонента не активирована — включаете ее (is_backend = 1). Прочие тонкости читайте в приведённой ссылке и настраивайте под себя.
При тестировании не забудьте установить разрешения в админке кому что можно))

После этого добавлять заполнять формы смогут только те группы пользователей которым вы это разрешите, редактировать уже созданные формы также можно будет только по установкам из админки (обычно это — "только свои" для рядовых пользователей и "все" для модераторов и администраторов).
#7 28 апреля 2016 в 20:38
Val, спасибо. Не было времени расписать подробнее.
ТС советую посмотреть видео уроки docs.instantcms.ru/dev/video
Потратите часа 3 времени, но зато там все подробно разобрано на примере работающего компонента Фотоальбомы.

Я учился по этим видео.
#8 28 апреля 2016 в 20:43
Zau4man, поддерживаю! Также изучил видео предоставленное r2 и начал потихоньку кодить)) В видео момент с правами пользователей также описывается и показывается.

Нико, удачи!
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.

Похожие темы

Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.