index.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * Chamilo installation
  5. *
  6. * @package chamilo.install
  7. */
  8. require_once __DIR__.'/../../vendor/autoload.php';
  9. require_once 'install.lib.php';
  10. require_once '../inc/lib/main_api.lib.php';
  11. error_reporting(-1);
  12. use Symfony\Component\Translation\Loader\YamlFileLoader;
  13. use Silex\Application;
  14. use Symfony\Component\Console\Output\Output;
  15. class BufferedOutput extends Output
  16. {
  17. public function doWrite($message, $newline)
  18. {
  19. //$this->buffer .= $message. ($newline ? PHP_EOL: '');
  20. $this->buffer .= $message. '<br />';
  21. }
  22. public function getBuffer()
  23. {
  24. return $this->buffer;
  25. }
  26. }
  27. $app = new Application();
  28. $app['root_sys'] = dirname(dirname(__DIR__)).'/';
  29. // Registering services
  30. $app['debug'] = true;
  31. $app->register(new Silex\Provider\UrlGeneratorServiceProvider());
  32. $app->register(new Silex\Provider\FormServiceProvider());
  33. $app->register(new Silex\Provider\SessionServiceProvider());
  34. $app->register(new Silex\Provider\DoctrineServiceProvider());
  35. $app->register(new Silex\Provider\TranslationServiceProvider());
  36. $app['translator'] = $app->share($app->extend('translator', function($translator, $app) {
  37. /*$translator->addLoader('yaml', new YamlFileLoader());
  38. $translator->addResource('yaml', __DIR__.'/lang/fr.yml', 'fr');
  39. $translator->addResource('yaml', __DIR__.'/lang/en.yml', 'en');
  40. $translator->addResource('yaml', __DIR__.'/lang/es.yml', 'es');*/
  41. return $translator;
  42. }));
  43. //$app->register(new Whoops\Provider\Silex\WhoopsServiceProvider);
  44. $app->register(
  45. new Silex\Provider\TwigServiceProvider(),
  46. array(
  47. 'twig.path' => array(
  48. 'templates'
  49. ),
  50. // twitter bootstrap form twig templates
  51. //'twig.form.templates' => array('form_div_layout.html.twig', '../template/default/form/form_custom_template.tpl'),
  52. 'twig.options' => array(
  53. 'debug' => $app['debug'],
  54. 'charset' => 'utf-8',
  55. 'strict_variables' => false,
  56. 'autoescape' => true,
  57. 'cache' => $app['debug'] ? false : $app['twig.cache.path'],
  58. 'optimizations' => -1, // turn on optimizations with -1
  59. )
  60. )
  61. );
  62. use Knp\Provider\ConsoleServiceProvider;
  63. $app->register(new ConsoleServiceProvider(), array(
  64. 'console.name' => 'Chamilo',
  65. 'console.version' => '1.0.0',
  66. 'console.project_directory' => __DIR__.'/..'
  67. ));
  68. function get_lang($variable) {
  69. global $app;
  70. return $app['translator']->trans($variable);
  71. }
  72. // Adding commands
  73. /** @var \Knp\Provider\ConsoleServiceProvider\ConsoleApplication $console */
  74. $console = $app['console'];
  75. $console->add(new ChamiloLMS\Command\Database\InstallCommand());
  76. $console->add(new \Doctrine\DBAL\Tools\Console\Command\RunSqlCommand());
  77. $console->add(new \Doctrine\DBAL\Tools\Console\Command\ImportCommand());
  78. $console->add(new \Doctrine\DBAL\Migrations\Tools\Console\Command\MigrateCommand());
  79. // Controllers
  80. $app->match('/', function() use($app) {
  81. $languages = array(
  82. 'english' => 'english',
  83. 'spanish' => 'spanish',
  84. 'french' => 'french'
  85. );
  86. $request = $app['request'];
  87. $form = $app['form.factory']->createBuilder('form')
  88. ->add('languages', 'choice', array(
  89. 'choices' => $languages,
  90. 'required' => true,
  91. ))
  92. ->add('send', 'submit')
  93. ->getForm();
  94. if ('POST' == $request->getMethod()) {
  95. $url = $app['url_generator']->generate('requirements');
  96. return $app->redirect($url);
  97. }
  98. return $app['twig']->render('index.tpl', array('form' => $form->createView()));
  99. })->bind('welcome');
  100. $app->match('/requirements', function() use($app) {
  101. $request = $app['request'];
  102. $form = $app['form.factory']->createBuilder('form')
  103. ->add('send', 'submit')
  104. ->getForm();
  105. $req = display_requirements($app, 'new');
  106. if ('POST' == $request->getMethod()) {
  107. $url = $app['url_generator']->generate('check-database');
  108. return $app->redirect($url);
  109. }
  110. return $app['twig']->render(
  111. 'requirements.tpl',
  112. array(
  113. 'form' => $form->createView(),
  114. 'requirements' => $req
  115. )
  116. );
  117. })->bind('requirements');
  118. $app->match('/check-database', function() use($app) {
  119. $request = $app['request'];
  120. $command = $app['console']->get('chamilo:install');
  121. $data = $command->getDatabaseSettingsParams();
  122. $builder = $app['form.factory']->createBuilder('form');
  123. foreach ($data as $key => $value) {
  124. $value['attributes'] = isset($value['attributes']) && is_array($value['attributes']) ? $value['attributes'] : array();
  125. $builder->add($key, $value['type'], $value['attributes']);
  126. }
  127. $builder->add('send', 'submit');
  128. $form = $builder->getForm();
  129. if ('POST' == $request->getMethod()) {
  130. $form->bind($request);
  131. if ($form->isValid()) {
  132. $parameters = $form->getData();
  133. $config = new \Doctrine\DBAL\Configuration();
  134. $conn = \Doctrine\DBAL\DriverManager::getConnection($parameters, $config);
  135. try {
  136. $connect = $conn->connect();
  137. $sm = $conn->getSchemaManager();
  138. $databases = $sm->listDatabases();
  139. if (in_array($parameters['database'], $databases)) {
  140. $app['session']->getFlashBag()->add('warning', 'The database is %s being used');
  141. }
  142. $app['session']->getFlashBag()->add('success', 'Connection ok!');
  143. $app['session']->set('database_settings', $parameters);
  144. $url = $app['url_generator']->generate('portal-settings');
  145. return $app->redirect($url);
  146. } catch (Exception $e) {
  147. $app['session']->getFlashBag()->add('success', 'Connection error !'.$e->getMessage());
  148. }
  149. // do something with the data
  150. // redirect somewhere
  151. //return $app->redirect('...');
  152. }
  153. }
  154. return $app['twig']->render('check-database.tpl', array('form' => $form->createView()));
  155. })->bind('check-database');
  156. $app->match('/portal-settings', function() use($app) {
  157. /** @var Request $request */
  158. $request = $app['request'];
  159. /** @var \ChamiloLMS\Command\Database\InstallCommand $command */
  160. $command = $app['console']->get('chamilo:install');
  161. $builder = $app['form.factory']->createBuilder('form');
  162. $data = $command->getPortalSettingsParams();
  163. $data['institution_url']['attributes']['data'] = str_replace('main/install/', '', $request->getUriForPath('/'));
  164. $permissionNewDir = $app['session']->get('permissions_for_new_directories');
  165. if ($permissionNewDir) {
  166. $data['permissions_for_new_directories']['attributes']['data'] = $permissionNewDir;
  167. }
  168. $permissionNewFiles = $app['session']->get('permissions_for_new_files');
  169. if ($permissionNewFiles) {
  170. $data['permissions_for_new_files']['attributes']['data'] = $permissionNewFiles;
  171. }
  172. foreach ($data as $key => $value) {
  173. $value['attributes'] = isset($value['attributes']) && is_array($value['attributes']) ? $value['attributes'] : array();
  174. $builder->add($key, $value['type'], $value['attributes']);
  175. }
  176. $builder->add('send', 'submit');
  177. $form = $builder->getForm();
  178. if ('POST' == $request->getMethod()) {
  179. $form->bind($request);
  180. if ($form->isValid()) {
  181. $data = $form->getData();
  182. $app['session']->set('portal_settings', $data);
  183. $url = $app['url_generator']->generate('admin-settings');
  184. return $app->redirect($url);
  185. }
  186. }
  187. return $app['twig']->render('settings.tpl', array('form' => $form->createView()));
  188. })->bind('portal-settings');
  189. $app->match('/admin-settings', function() use($app) {
  190. $request = $app['request'];
  191. /** @var \ChamiloLMS\Command\Database\InstallCommand $command */
  192. $command = $app['console']->get('chamilo:install');
  193. $data = $command->getAdminSettingsParams();
  194. $builder = $app['form.factory']->createBuilder('form', $data);
  195. foreach ($data as $key => $value) {
  196. $builder->add($key, $value['type'], $value['attributes']);
  197. }
  198. $builder->add('send', 'submit');
  199. $form = $builder->getForm();
  200. if ('POST' == $request->getMethod()) {
  201. $form->bind($request);
  202. if ($form->isValid()) {
  203. $data = $form->getData();
  204. $app['session']->set('admin_settings', $data);
  205. $url = $app['url_generator']->generate('resume');
  206. return $app->redirect($url);
  207. }
  208. }
  209. return $app['twig']->render('settings.tpl', array('form' => $form->createView()));
  210. })->bind('admin-settings');
  211. $app->match('/resume', function() use($app) {
  212. $request = $app['request'];
  213. $data = array();
  214. $portalSettings = $app['session']->get('portal_settings');
  215. $databaseSettings = $app['session']->get('database_settings');
  216. $adminSettings = $app['session']->get('admin_settings');
  217. if (!empty($portalSettings) && !empty($databaseSettings) && !empty($adminSettings)) {
  218. $form = $app['form.factory']->createBuilder('form', $data)
  219. ->add('send', 'submit', array('label' => 'Continue'))
  220. ->getForm();
  221. if ('POST' == $request->getMethod()) {
  222. $url = $app['url_generator']->generate('installing');
  223. return $app->redirect($url);
  224. }
  225. return $app['twig']->render(
  226. 'resume.tpl',
  227. array(
  228. 'form' => $form->createView(),
  229. 'portal_settings' => $portalSettings,
  230. 'database_settings' => $databaseSettings,
  231. 'admin_settings' => $adminSettings
  232. )
  233. );
  234. } else {
  235. $url = $app['url_generator']->generate('check-database');
  236. return $app->redirect($url);
  237. }
  238. })->bind('resume');
  239. $app->match('/installing', function() use($app) {
  240. $portalSettings = $app['session']->get('portal_settings');
  241. $adminSettings = $app['session']->get('admin_settings');
  242. $databaseSettings = $app['session']->get('database_settings');
  243. /** @var \ChamiloLMS\Command\Database\InstallCommand $command */
  244. $command = $app['console']->get('chamilo:install');
  245. $def = $command->getDefinition();
  246. $input = new Symfony\Component\Console\Input\ArrayInput(
  247. array(
  248. 'name',
  249. 'path' => realpath(__DIR__.'/../../').'/',
  250. 'version' => '1.10.0'
  251. ),
  252. $def
  253. );
  254. $output = new BufferedOutput();
  255. $command->setPortalSettings($portalSettings);
  256. $command->setDatabaseSettings($databaseSettings);
  257. $command->setAdminSettings($adminSettings);
  258. $result = $command->run($input, $output);
  259. if ($result == 0) {
  260. $output = $output->getBuffer();
  261. $app['session']->getFlashBag()->add('success', 'Installation finished');
  262. $app['session']->set('output', $output);
  263. $url = $app['url_generator']->generate('finish');
  264. return $app->redirect($url);
  265. } else {
  266. $app['session']->getFlashBag()->add('error', 'There was an error during installation');
  267. $url = $app['url_generator']->generate('check-database');
  268. return $app->redirect($url);
  269. }
  270. })->bind('installing');
  271. $app->get('/finish', function() use($app) {
  272. $output = $app['session']->get('output');
  273. return $app['twig']->render('finish.tpl', array('output' => $output));
  274. })->bind('finish');
  275. $app->error(function (\Exception $e, $code) {
  276. switch ($code) {
  277. case 404:
  278. $message = 'The requested page could not be found.';
  279. break;
  280. default:
  281. $message = 'We are sorry, but something went terribly wrong.';
  282. }
  283. return new Response($message);
  284. });
  285. if (PHP_SAPI == 'cli') {
  286. $console->run();
  287. } else {
  288. $app->run();
  289. }