public function backup($writeLock, $justFetchList = false) { $backupDir = $this->parameters['backup_path']; $menuDir = $this->parameters['menu_path']; if (!@is_dir($backupDir) && !@mkdir($backupDir)) { throw new YamlMenuException($justFetchList ? Trans::__("Please make sure that there is a menueditor/backups folder or disable the backup-feature in config.yml") : $writeLock, 5); } if (false === $justFetchList && !@copy($menuDir . '/menu.yml', $backupDir . '/menu.' . time() . '.yml')) { throw new YamlMenuException($writeLock, 5); } // clean up $backupFiles = array(); foreach (new \DirectoryIterator($backupDir) as $fileInfo) { if ($fileInfo->isFile() && preg_match("~^menu\\.[0-9]{10}\\.yml\$~i", $fileInfo->getFilename())) { $backupFiles[$fileInfo->getMTime()] = $fileInfo->getFilename(); } } if ($justFetchList) { // make sure there's at least one backup file (first use...) if (count($backupFiles) == 0) { if (!@copy($menuDir . '/menu.yml', $backupDir . '/menu.' . time() . '.yml')) { throw new YamlMenuException(Trans::__("Please make sure that the menueditor/backups folder is writeable by your webserver or disable the backup-feature in config.yml")); } return $this->backup(0, true); } krsort($backupFiles); return $backupFiles; } ksort($backupFiles); foreach ($backupFiles as $timestamp => $backupFile) { if (count($backupFiles) <= (int) $this->config['keepBackups']) { break; } @unlink($this->backupDir . '/' . $backupFile); unset($backupFiles[$timestamp]); } }
/** * @param Request $request * @param $name * @return array */ public function editAction(Request $request, $name) { $admin_pool = $this->get('sonata.admin.pool'); $manager = $this->getManager(); $menu = $manager->get($name); $form = $this->createForm(new CMType(), $menu); if ($request->isXmlHttpRequest()) { try { if ($attributes = $request->get('newitem')) { if ($attributes['path'] != '') { unset($attributes['link']); } $html = $this->render('FMYamlMenuBundle:Visual:_item.twig', array('item' => $attributes)); return new JsonResponse(array('html' => $html)); } } catch (YamlMenuException $e) { return new JsonResponse(array('status' => 1, 'error' => $e->getMessage())); } try { if ($menus = $request->get('menus') && ($writeLockToken = $request->get('writeLock'))) { // don't proceed if the file was edited in the meantime if ($writeLock != $writeLockToken) { throw new YamlMenuException($writeLock, 1); } else { $dumper = new YamlDumper(); $dumper->setIndentation(2); $yaml = $dumper->dump($request->get('menus'), 9999); // clean up dump a little $yaml = preg_replace("~(-)(\n\\s+)~mi", "\$1 ", $yaml); try { $parser = new YamlParser(); $parser->parse($yaml); } catch (ParseException $e) { throw new YamlMenuException($writeLock, 2); } // create backup $manager->backup($writeLock); // save $manager->set($menu); // if (!@file_put_contents($file, $yaml)) { // throw new YamlMenuException($writeLock, 3); // } clearstatcache(true, $file); $writeLock = filemtime($file); if (count($request->get('menus')) > 1) { $message = Trans::__("Menus successfully saved"); } else { $message = Trans::__("Menu successfully saved"); } return new JsonResponse(array('writeLock' => $writeLock, 'status' => 0)); } } } catch (YamlMenuException $e) { return new JsonResponse(array('writeLock' => $e->getMessage(), 'status' => $e->getCode())); } } $name = $request->get('name'); $menus = $manager->get($name); return $this->render("FMYamlMenuBUndle:Visual:", array('menus' => $menus, 'admin_pool' => $admin_pool)); }