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));
 }