Fork de wikipp, le moteur de wiki en c++, basé sur cppcms. Le fork ajoute la langue française
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

options.cpp 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include "options.h"
  2. #include "wiki.h"
  3. #include "options_content.h"
  4. #include <cppcms/localization.h>
  5. #include <cppcms/url_dispatcher.h>
  6. #include <cppcms/cache_interface.h>
  7. #include <cppcms/serialization.h>
  8. #define _(X) ::cppcms::locale::translate(X)
  9. namespace content {
  10. options_form::options_form()
  11. {
  12. users_only.message(_("Users Only"));
  13. contact_mail.message(_("Contact e-mail"));
  14. wiki_title.message(_("Wiki Title"));
  15. about.message(_("About Wiki"));
  16. copyright.message(_("Copyright String"));
  17. submit.value(_("Submit"));
  18. add(users_only);
  19. add(contact_mail);
  20. add(wiki_title);
  21. add(copyright);
  22. add(about);
  23. add(submit);
  24. wiki_title.non_empty();
  25. copyright.non_empty();
  26. contact_mail.non_empty();
  27. about.non_empty();
  28. about.rows(10);
  29. about.cols(40);
  30. users_only.help(_("Disable creation of new articles by visitors"));
  31. }
  32. } // namespace content
  33. namespace apps {
  34. void global_options::serialize(cppcms::archive &a)
  35. {
  36. a & users_only_edit & contact;
  37. }
  38. void locale_options::serialize(cppcms::archive &a)
  39. {
  40. a & title & about & copyright ;
  41. }
  42. options::options(wiki &w):
  43. master(w)
  44. {
  45. wi.dispatcher().assign("^/options/?$",&options::edit,this);
  46. reset();
  47. }
  48. void options::reset()
  49. {
  50. loaded=false;
  51. }
  52. std::string options::edit_url()
  53. {
  54. return wi.root()+"/options/";
  55. }
  56. void options::load()
  57. {
  58. cppdb::session sql(conn);
  59. if(loaded)
  60. return;
  61. global.users_only_edit=0;
  62. global.contact.clear();
  63. local.about.clear();
  64. local.title.clear();
  65. local.copyright.clear();
  66. if(!cache().fetch_data("global_ops",global))
  67. {
  68. cppdb::result r;
  69. r=sql<< "SELECT name,value FROM options "
  70. "WHERE lang='global' ";
  71. while(r.next()) {
  72. std::string n,v;
  73. r >> n >> v;
  74. if(n=="users_only_edit")
  75. global.users_only_edit=atoi(v.c_str());
  76. else if(n=="contact")
  77. global.contact=v;
  78. }
  79. if(global.contact.empty())
  80. global.contact="no@mail";
  81. cache().store_data("global_ops",global);
  82. }
  83. if(cache().fetch_data("local_ops:"+locale_name,local))
  84. return;
  85. cppdb::result r;
  86. r=sql<< "SELECT value,name FROM options "
  87. "WHERE lang=?" << locale_name;
  88. while(r.next()) {
  89. std::string v,n;
  90. r>>v>>n;
  91. if(n=="title")
  92. local.title=v;
  93. else if(n=="about")
  94. local.about=v;
  95. else if(n=="copyright")
  96. local.copyright=v;
  97. }
  98. if(local.title.empty())
  99. local.title=cppcms::locale::gettext("Wiki++ - CppCMS Wiki",context().locale());
  100. if(local.about.empty())
  101. local.about=
  102. cppcms::locale::gettext("## About\n"
  103. "\n"
  104. "Wiki++ is a wiki engine powered by\n"
  105. "[CppCMS](http://cppcms.sf.net/) web development framework.\n",context().locale());
  106. if(local.copyright.empty())
  107. local.copyright=cppcms::locale::gettext("(C) All Rights Reserved",context().locale());
  108. cache().store_data("local_ops:"+locale_name,local);
  109. loaded=true;
  110. }
  111. void options::save()
  112. {
  113. cppdb::session sql(conn);
  114. cppdb::transaction guard(sql);
  115. sql<< "DELETE FROM options "
  116. "WHERE lang='global' OR lang=?"
  117. << locale_name << cppdb::exec;
  118. sql<< "INSERT INTO options(value,name,lang) "
  119. "VALUES(?,'users_only_edit','global')" << global.users_only_edit << cppdb::exec;
  120. sql<< "INSERT INTO options(value,name,lang) "
  121. "VALUES(?,'contact','global')" << global.contact << cppdb::exec;
  122. sql<< "INSERT INTO options(value,name,lang) "
  123. "VALUES(?,'title',?)" << local.title << locale_name << cppdb::exec;
  124. sql<< "INSERT INTO options(value,name,lang) "
  125. "VALUES(?,'about',?)" << local.about << locale_name << cppdb::exec;
  126. sql<< "INSERT INTO options(value,name,lang) "
  127. "VALUES(?,'copyright',?)" << local.copyright << locale_name << cppdb::exec;
  128. cache().rise("global_ops");
  129. cache().rise("local_ops:"+locale_name);
  130. guard.commit();
  131. reset();
  132. }
  133. void options::edit()
  134. {
  135. if(!wi.users.auth()) {
  136. wi.users.error_forbidden();
  137. return;
  138. }
  139. content::edit_options c;
  140. if(request().request_method()=="POST") {
  141. c.form.load(context());
  142. if(c.form.validate()) {
  143. global.users_only_edit=c.form.users_only.value();
  144. global.contact=c.form.contact_mail.value();
  145. local.title=c.form.wiki_title.value();
  146. local.copyright=c.form.copyright.value();
  147. local.about=c.form.about.value();
  148. save();
  149. }
  150. }
  151. else {
  152. load();
  153. c.form.users_only.value(global.users_only_edit);
  154. c.form.wiki_title.value(local.title);
  155. c.form.copyright.value(local.copyright);
  156. c.form.about.value(local.about);
  157. c.form.contact_mail.value(global.contact);
  158. }
  159. ini(c);
  160. render("edit_options",c);
  161. }
  162. }