$name, 'file' => $file, 'filepath' => $filepath ]; } } return $templates; } /** * * * */ private function selectTemplate() { // getting templates $templates = $this->getTemplates(); $menu = function(CliMenuBuilder $builder) use ($templates) { // writing configuration $blade = new Blade(base_path().self::TEMPLATES_DIR, base_path().'/storage/cache'); $builder ->setTitle('Nginx > add') ->setGoBackButtonText('Back'); foreach($templates as $template) { $submenuCallable = $this->createConfiguration($template, $blade); $builder ->addSubMenu($template['name'], $submenuCallable); } $builder->addLineBreak('-'); }; return $menu; } /** * create Configuration, add for each template a submenu * * * @param array $template * @param Blade $blade * @return CliMenuBuilder */ private function createConfiguration($template, $blade) { $self = $this; $menu = function(CliMenuBuilder $builder) use ($template, $blade, $self) { $configuration = [ 'domain' => '', 'root' => '', 'index' => 'index.php', 'ssl' => true, 'redirect_www' => true ]; // create checkbox for ssl $checkboxSSL = new CheckboxItem('ssl', function(CliMenu $menu) use (&$configuration) { $configuration['ssl'] = $menu->getSelectedItem()->getChecked(); }); $checkboxSSL->setChecked($configuration['ssl']); // create checkbox for redirect from www $checkboxRedirect = new CheckboxItem('redirect www', function(CliMenu $menu) use (&$configuration) { $configuration['redirect_www'] = $menu->getSelectedItem()->getChecked(); }); $checkboxRedirect->setChecked($configuration['redirect_www']); $builder ->setTitle('Nginx Vhosts > add > '.$template['name']) ->addItem('domain', function(CliMenu $menu) use (&$configuration) { $result = $menu->askText()->ask(); $configuration['domain'] = $result->fetch(); $menu->getSelectedItem()->setText('domain -> '.$result->fetch()); $menu->redraw(); }) ->addItem('root', function(CliMenu $menu) use (&$configuration) { $result = $menu->askText()->ask(); $configuration['root'] = $result->fetch(); $menu->getSelectedItem()->setText('root -> '.$result->fetch()); $menu->redraw(); }) ->addItem($configuration['index'], function(CliMenu $menu) use (&$configuration) { $result = $menu->askText()->ask(); $configuration['index'] = $result->fetch(); $menu->getSelectedItem()->setText($result->fetch()); $menu->redraw(); }) ->addLineBreak('-') ->addMenuItem($checkboxSSL) ->addMenuItem($checkboxRedirect) ->addLineBreak('-') ->addItem('save', function(CliMenu $menu) use (&$configuration, $template, $blade, $self) { // render configuration $content = $blade->render($template['name'], $configuration); // create filename $filename = $configuration['domain'].'.conf'; // write configuration to file file_put_contents('/etc/nginx/sites-available/'.$filename, $content); // prepare for close current submenu and open mainmenu $parent = $menu->getParent(); $menu->closeThis(); $mainmenu = $parent->getParent(); $mainmenu = NginxVhostFactory::addVhosts($mainmenu, NginxVhost::find(), self::VHOST_INDEX); $mainmenu->open(); }) ->addLineBreak('-'); }; return $menu; } /** * let it rain * * */ public function handle() { $submenuSelectTemplate = $this->selectTemplate(); // create menu $mainmenu = $this->menu('Nginx') // add Submenu for select templates ->addSubMenu('add', $submenuSelectTemplate) ->addLineBreak('-'); $mainmenu->addLineBreak('-'); // apperance $mainmenu->setWidth($mainmenu->getTerminal()->getWidth()); $mainmenu->setMargin(2); $mainmenu = $mainmenu->build(); // adding current vhosts $mainmenu = NginxVhostFactory::addVhosts($mainmenu, NginxVhost::find(), self::VHOST_INDEX); $mainmenu->open(); } }