Переделка FAQ в instantcms 1.8

#1 13 августа 2012 в 12:32
Здравствуйте. Переделываю компонент FAQ. Столкнулся с проблемой. Вопрос может создать любой пользователь, но удалять и редактировать может только админ. Сколько бился не могу понять какие условия нужно ставить и в каких участках кода чтобы каждый пользователь мог изменять и удалять свой вопрос. Буду очень благодарен за любую информацию.
#2 13 августа 2012 в 14:06
d0th, В бд вноситься кто создал? Ставили условие на идентичность ID создавшего и ID авторизованного пользователя?.. В любом случае нужно код смотреть.
#3 13 августа 2012 в 14:44
Есть опенсорс скрипт www.question2answer.org/, есть АПИ для интеграции, возможно будет проще интегрировать его, чем перепиливать встроенный.
#4 13 августа 2012 в 16:15
googlebot, АПИ недостаточно, если планируется большой функционал под свои нужды. Если я правильно понял что пытается сделать топикстартер, то он делает тоже что и я на данный момент. Поэтому не составит труда помочь человеку.
#5 14 августа 2012 в 04:49

Есть опенсорс скрипт www.question2answer.org/, есть АПИ для интеграции, возможно будет проще интегрировать его, чем перепиливать встроенный.

googlebot
Спасибо за ответ, хочется уже доработать свой инструмент, тем более много чего сделано, включая список вопросов во вкладке на странице пользователя. Поэтому будем дорабатывать:)

d0th, В бд вноситься кто создал? Ставили условие на идентичность ID создавшего и ID авторизованного пользователя?.. В любом случае нужно код смотреть.

WALTERZ
В базе в user_id заносится id пользователя, который создал этот вопрос. В данный момент на кнопку удалить стоит следующее условие:
  1. {if $is_admin}<a href="/happy/delquest{$quest.id}.html"> [удалить]</a>{/if}
какое условие ставили вы?

И еще наверное нужно добавить условие в функции удаления, та которая во frontend.php? У меня она сейчас выглядит так:
  1. ///////////////////////////////////// DELETE QUEST ////////////////////////////////////////////////////////////////////////////////
  2.  
  3. if ($do=='delquest'){
  4.  
  5. $quest_id = $inCore->request('quest_id', 'int', 0);
  6. $user_id = $inUser->id;
  7.  
  8. $sql = "SELECT con.id, con.quest, con.category_id
  9. FROM cms_happy_quests con
  10. WHERE con.id = '$quest_id' LIMIT 1";
  11.  
  12. $result = $inDB->query($sql);
  13. $quest = $inDB->fetch_assoc($result);
  14.  
  15. if (!$user_id || !$quest_id || !$quest) { $inCore->redirectBack(); }
  16.  
  17. if ( !$inCore->inRequest('confirm') ) {
  18.  
  19. if ($inCore->$user_id){
  20. $inPage->setTitle($_LANG['DEL_QUES']);
  21. $inPage->addPathway($_LANG['DEL_QUES']);
  22. $inPage->backButton(false);
  23. $confirm['title'] = $_LANG['DELETE_QUES'];
  24. $confirm['text'] = $_LANG['YOU_REALY_DELETE_QUES'].':<br> "<a href="/happy/quest'.$quest['id'].'.html">'.$quest['quest'].'</a>"<br><br>';
  25. $confirm['action'] = $_SERVER['REQUEST_URI'];
  26. $confirm['yes_button'] = array();
  27. $confirm['yes_button']['type'] = 'submit';
  28. $confirm['yes_button']['name'] = 'confirm';
  29. $smarty = $inCore->initSmarty('components', 'action_confirm.tpl');
  30. $smarty->assign('confirm', $confirm);
  31. $smarty->display('action_confirm.tpl');
  32. } else {
  33. $inCore->redirectBack();
  34. }
  35. }
  36. if ( $inCore->inRequest('confirm') ){
  37. if ($inCore->$user_id){
  38. $model->deleteQuest($quest_id);
  39. }
  40. $inCore->redirect('/happy');
  41. }
  42. }
#6 14 августа 2012 в 09:48
d0th, возьмите за пример функцию с блога
  1. public function isUserBlogAuthor($blog_id, $post_id, $blog_user_id){
  2.  
  3. $inUser = cmsUser::getInstance();
  4.  
  5. $blog_id_sql = $this->inDB->get_field('cms_blog_posts', "id='$post_id'", 'blog_id');
  6.  
  7. $this_blog_post = ($blog_id_sql == $blog_id) ? true : false;
  8.  
  9. $is_my_blog = ($blog_user_id == $inUser->id) ? true : false;
  10.  
  11. return ($this_blog_post && $is_my_blog) ? true : false;
  12. }
И проверка
  1. if ($owner=='user'){
  2. $myblog = $model->isUserBlogAuthor($blog['id'], $post_id, $blog['user_id']);
  3. $is_author = (((!$myblog) && $inDB->get_field('cms_blog_authors', 'blog_id='.$id.' AND user_id='.$user_id, 'id')) || ($blog['forall'] && $post['user_id'] == $user_id));
  4. $is_admin = $inUser->is_admin;
  5.  
#7 14 августа 2012 в 11:05
будет интересно, пишите. Я переделывал тоже его немного. Заголовки, аватар добавлял koshkaikot.ru/faq
#8 14 августа 2012 в 12:37
RooKee, Я так понял, что автор темы взял за основу компонент FAQ и пишет свой.
#9 15 августа 2012 в 06:13


RooKee, Я так понял, что автор темы взял за основу компонент FAQ и пишет свой.

WALTERZ

Вы правы. Итак, что я сделал.

в файле model.php добавил:
  1. public function isUserHappyAuthor($happy_id, $happy_user_id){
  2. $inUser = cmsUser::getInstance();
  3. $is_my_happy = ($happy_user_id == $inUser->id) ? true : false;
  4. return ($is_my_happy) ? true : false;
  5. }
в файле frontend.php добавил:
  1. if ($owner=='user'){
  2. $myhappy = $model->isUserHappyAuthor($quest['id'], $quest['user_id']);
  3. $is_admin = $inUser->is_admin;
  4. }

в файле com_happy_red.tpl поставил условие на отображение кнопки удалить:
  1. {if $myhappy || $is_admin}<a href="/happy/delquest{$quest.id}.html"> [удалить]</a>{/if}
но кнопка удалить не появилась, где-то косяк, можете подсказать?
#10 15 августа 2012 в 11:28


RooKee, Я так понял, что автор темы взял за основу компонент FAQ и пишет свой.

WALTERZ

Кажется до меня дошло. Проконтролируйте меня пожалуйста.

1. В файле model.php добавляю в конец:
  1. public function isUserHappyAuthor($happy_id, $happy_user_id){
  2. $inUser = cmsUser::getInstance();
  3. $is_my_happy = ($happy_user_id == $inUser->id) ? true : false;
  4. return ($is_my_happy) ? true : false;
  5. }
2. в файле frontend.php вношу следующие дополнения:

в участке кода
  1. ///////////////////////////////////// READ QUESTION ////////////////////////////////////////////////////////////////////////////////
  2. if ($do=='read'){
добавляю
  1. $smarty->assign('is_user', $inUser->id);
  2. $smarty->assign('myhappy', $model->isUserHappyAuthor($quest['id'], $quest['user_id']));
далее в участке кода
  1. ///////////////////////////////////// DELETE QUEST ////////////////////////////////////////////////////////////////////////////////
  2.  
  3. if ($do=='delquest'){
где переменной $sql присваивается запрос добавляю колонку
$sql = "SELECT con.id, con.user_id, con.quest, con.category_id
FROM cms_happy_quests con
WHERE con.id = '$quest_id' LIMIT 1";

и далее изменяю условия при удалении
  1. if ($inCore->$user_id || $myhappy){
получается вот так
  1. if ($inCore->$user_id || $myhappy){
  2. $inPage->setTitle($_LANG['DEL_QUES']);
  3. $inPage->addPathway($_LANG['DEL_QUES']);
  4. $inPage->backButton(false);
  5. $confirm['title'] = $_LANG['DELETE_QUES'];
  6. $confirm['text'] = $_LANG['YOU_REALY_DELETE_QUES'].':<br> "<a href="/happy/quest'.$quest['id'].'.html">'.$quest['quest'].'</a>"<br><br>';
  7. $confirm['action'] = $_SERVER['REQUEST_URI'];
  8. $confirm['yes_button'] = array();
  9. $confirm['yes_button']['type'] = 'submit';
  10. $confirm['yes_button']['name'] = 'confirm';
  11. $smarty = $inCore->initSmarty('components', 'action_confirm.tpl');
  12. $smarty->assign('confirm', $confirm);
  13. $smarty->display('action_confirm.tpl');
  14. } else {
  15. $inCore->redirectBack();
  16. }
  17. }
  18. if ( $inCore->inRequest('confirm') ){
  19.  
  20.  
  21. if ($inCore->$user_id || $myhappy){
  22.  
  23. $model->deleteQuest($quest_id);
  24. }
  25. $inCore->redirect('/happy');
  26. }
  27.  
  28. }

3. В tpl файле условие

  1. {if ($myhappy && $is_user) || $is_admin}<a href="/happy/delquest{$quest.id}.html">
  2.  
  3. [удалить]</a>{/if}
Будут ли корректными такие изменения или это криворукое убожество? Хотя всё работает.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.