예제 #1
0
 /**
  * Init the doctrine entity manager.
  *
  * @return Doctrine\ORM\EntityManager
  */
 private function _initEntityManager()
 {
     // New database configuration
     $config = new Configuration();
     $driverImpl = $config->newDefaultAnnotationDriver();
     $config->setMetadataDriverImpl($driverImpl);
     $proxiesPath = $this->_application->getCacheDir() . DIRECTORY_SEPARATOR . 'Proxies';
     $config->setProxyDir($proxiesPath);
     $config->setProxyNamespace('Proxies');
     // Create EntityManager
     $em = EntityManager::create($this->_config, $config);
     if (isset($this->_config['charset'])) {
         try {
             $em->getConnection()->executeUpdate('SET SESSION character_set_client = "' . addslashes($this->_config['charset']) . '";');
             $em->getConnection()->executeUpdate('SET SESSION character_set_connection = "' . addslashes($this->_config['charset']) . '";');
             $em->getConnection()->executeUpdate('SET SESSION character_set_results = "' . addslashes($this->_config['charset']) . '";');
         } catch (\Exception $e) {
             throw new BBException(sprintf('Invalid database character set `%s`', $this->_config['charset']), BBException::INVALID_ARGUMENT, $e);
         }
     }
     if (isset($this->_config['collation'])) {
         try {
             $em->getConnection()->executeUpdate('SET SESSION collation_connection = "' . addslashes($this->_config['collation']) . '";');
         } catch (\Exception $e) {
             throw new BBException(sprintf('Invalid database collation `%s`', $this->_config['collation']), BBException::INVALID_ARGUMENT, $e);
         }
     }
     return $em;
 }
예제 #2
0
 /**
  * AImportBundle's constructor.
  *
  * @param BBApplication $application
  */
 public function __construct(BBApplication $application)
 {
     $this->_application = $application;
     $this->_config = new Config($this->_dir);
     foreach ($this->_application->getConfig()->getSection('doctrine') as $key => $db_config) {
         $this->_config->setSection($key, $db_config, true);
     }
     $this->_relations = $this->_config->getSection('relations');
     if (0 == count($this->_relations)) {
         return false;
     }
     $log_filepath = $application->getConfig()->getLoggingConfig();
     $log_filepath = $log_filepath['logfile'];
     if ('/' !== $log_filepath[0] || false === is_dir(dirname($log_filepath))) {
         $log_filepath = $application->getBaseDir() . '/log/import.log';
     } else {
         $log_filepath = dirname($log_filepath) . '/import.log';
     }
     $logger = new \BackBee\Logging\Appender\File(array('logfile' => $log_filepath));
     $this->setPhpConf($this->_config->getSection('php_ini'));
     foreach ($this->_relations as $class => $config) {
         $type = true === isset($config['type']) ? $config['type'] : 'import';
         try {
             $this->{$type . ucfirst($class)}($config);
         } catch (SkippedImportException $exc) {
             echo $exc->getMessage() . "\n";
         } catch (\Exception $e) {
             $logger->write(array('d' => date('Y/m/d H:i:s'), 'p' => '', 'm' => $e->getMessage(), 'u' => ''));
         }
     }
     return true;
 }
예제 #3
0
 /**
  * {@inheritdoc}
  */
 public function decide(TokenInterface $token, array $attributes, $object = null)
 {
     $result = parent::decide($token, $attributes, $object);
     if (false === $result && true === $this->_tryBBTokenOnDenied && null !== $this->_application && null !== $this->_application->getBBUserToken()) {
         $result = parent::decide($this->_application->getBBUserToken(), $attributes, $object);
     }
     return $result;
 }
예제 #4
0
 /**
  * Constructor.
  *
  * @param KernelInterface $kernel A KernelInterface instance
  */
 public function __construct(BBApplication $application = null)
 {
     $this->application = $application;
     parent::__construct('BackBee', BBApplication::VERSION . ($application->isDebugMode() ? '/debug' : ''));
     $this->getDefinition()->addOption(new InputOption('--env', '-e', InputOption::VALUE_REQUIRED, 'The Environment name.', $this->application->getEnvironment()));
     $this->getDefinition()->addOption(new InputOption('--app', '-a', InputOption::VALUE_REQUIRED, 'The BackBee application classname.', get_class($this->application)));
     $this->getDefinition()->addOption(new InputOption('--no-debug', null, InputOption::VALUE_NONE, 'Switches off debug mode.'));
 }
예제 #5
0
 /**
  * @param \BackBee\Event\Event $event
  */
 public function onPostLoad(Event $event)
 {
     $page = $event->getTarget();
     if (!$page instanceof Page) {
         return;
     }
     $isBbSessionActive = $this->_application->getBBUserToken() === null;
     $page->setUseUrlRedirect($isBbSessionActive);
 }
예제 #6
0
 /**
  * Class constructor.
  *
  * @param \BackBee\BBApplication $application
  * @param array                  $config
  */
 public function __construct(BBApplication $application, array $config)
 {
     $this->_application = $application;
     if (!isset($config['archive'])) {
         throw new \Exception("Configuration param 'archive' must be provided");
     }
     $this->_config = array_merge_recursive(array('extractedDir' => $application->getTemporaryDir() . '/ZipArchiveConnector/extracted/' . basename($config['archive']) . '/' . date('Y-m-d_His') . '/', 'deleteExtracted' => true), $config);
     $this->_init();
 }
 public static function build(BBApplication $application, $objectIdentity)
 {
     $matches = array();
     if (preg_match(self::$_pattern1, $objectIdentity, $matches)) {
         return new self($application->getEntityManager(), trim($matches[1]), trim($matches[2]));
     } elseif (preg_match(self::$_pattern2, $objectIdentity, $matches)) {
         return new self($application->getEntityManager(), trim($matches[2]), trim($matches[1]));
     }
     return new self($application->getEntityManager(), null, null);
 }
예제 #8
0
 /**
  *
  */
 public function __construct(BBApplication $app)
 {
     if (empty($this->bundle)) {
         foreach ($app->getBundles() as $bundle) {
             if ($bundle instanceof ThemeCore) {
                 $this->bundle = $bundle;
             }
         }
     }
     parent::__construct($app);
 }
예제 #9
0
 /**
  * Class constructor.
  *
  * @param \BackBee\BBApplication $application
  * @param array                  $config
  */
 public function __construct(BBApplication $application, array $config)
 {
     $this->_application = $application;
     $this->_config = $config;
     if (true === array_key_exists('basedir', $config)) {
         $this->_basedir = $config['basedir'];
         File::resolveFilepath($this->_basedir, null, array('include_path' => $this->_application->getRepository()));
     } else {
         $this->_basedir = $this->_application->getRepository();
     }
 }
예제 #10
0
 /**
  * {@inheritdoc}
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $force = $input->getOption('force');
     $drop = $input->getOption('drop');
     $this->bbapp = $this->getContainer()->get('bbapp');
     $this->em = $this->initConnection($input, $output);
     $this->checkBeforeUpdate();
     $this->em->getConfiguration()->getMetadataDriverImpl()->addPaths([$this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'Bundle', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'Cache' . DIRECTORY_SEPARATOR . 'DAO', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'ClassContent', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'ClassContent' . DIRECTORY_SEPARATOR . 'Indexes', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'Logging', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'NestedNode', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'Security', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'Site', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'Stream' . DIRECTORY_SEPARATOR . 'ClassWrapper', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'Util' . DIRECTORY_SEPARATOR . 'Sequence' . DIRECTORY_SEPARATOR . 'Entity', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'Workflow']);
     $this->em->getConfiguration()->getMetadataDriverImpl()->addExcludePaths([$this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'ClassContent' . DIRECTORY_SEPARATOR . 'Tests', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'NestedNode' . DIRECTORY_SEPARATOR . 'Tests', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'Security' . DIRECTORY_SEPARATOR . 'Tests', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'Util' . DIRECTORY_SEPARATOR . 'Tests', $this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'Workflow' . DIRECTORY_SEPARATOR . 'Tests']);
     if (is_dir($this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'vendor')) {
         $this->em->getConfiguration()->getMetadataDriverImpl()->addExcludePaths([$this->bbapp->getBBDir() . DIRECTORY_SEPARATOR . 'vendor']);
     }
     $sqls = $this->getUpdateQueries();
     if ($force || $drop) {
         $metadata = $this->em->getMetadataFactory()->getAllMetadata();
         $schema = new SchemaTool($this->em);
         if ($drop) {
             $sqls = array_merge($schema->getDropDatabaseSQL(), $sqls);
         }
         if ($force) {
             $output->writeln('<info>Running drop/update</info>');
             $this->em->getConnection()->executeUpdate('SET FOREIGN_KEY_CHECKS=0');
             $drop ? $schema->dropDatabase() : '';
             $schema->updateSchema($metadata, true);
             $this->em->getConnection()->executeUpdate('SET FOREIGN_KEY_CHECKS=1');
         }
     }
     $output->writeln(($force ? '<info>SQL executed: </info>' : '<info>SQL to be executed: </info>') . PHP_EOL . implode(";" . PHP_EOL, $sqls) . '');
 }
예제 #11
0
 /**
  * Dispatch postupload event.
  *
  * @param string $sourcefile
  * @param string $targetfile
  */
 private function dispatchPostUploadEvent($sourcefile, $targetfile)
 {
     if (null !== $this->_application && null !== $this->_application->getEventDispatcher()) {
         $event = new \BackBee\Event\PostUploadEvent($sourcefile, $targetfile);
         $this->_application->getEventDispatcher()->dispatch('file.postupload', $event);
     }
 }
예제 #12
0
 /**
  * Computes the URL of a page according to a scheme.
  *
  * @param array         $scheme  The scheme to apply
  * @param Page          $page    The page
  * @param  AbstractClassContent $content The optionnal main content of the page
  * @return string        The generated URL
  */
 private function doGenerate($scheme, Page $page, AbstractClassContent $content = null)
 {
     $replacement = ['$parent' => $page->isRoot() ? '' : $page->getParent()->getUrl(false), '$title' => StringUtils::urlize($page->getTitle()), '$datetime' => $page->getCreated()->format('ymdHis'), '$date' => $page->getCreated()->format('ymd'), '$time' => $page->getCreated()->format('His')];
     $matches = [];
     if (preg_match_all('/(\\$content->[a-z]+)/i', $scheme, $matches)) {
         foreach ($matches[1] as $pattern) {
             $property = explode('->', $pattern);
             $property = array_pop($property);
             try {
                 $replacement[$pattern] = StringUtils::urlize($content->{$property});
             } catch (\Exception $e) {
                 $replacement[$pattern] = '';
             }
         }
     }
     $matches = [];
     if (preg_match_all('/(\\$ancestor\\[([0-9]+)\\])/i', $scheme, $matches)) {
         foreach ($matches[2] as $level) {
             $ancestor = $this->application->getEntityManager()->getRepository('BackBee\\NestedNode\\Page')->getAncestor($page, $level);
             if (null !== $ancestor && $page->getLevel() > $level) {
                 $replacement['$ancestor[' . $level . ']'] = $ancestor->getUrl(false);
             } else {
                 $replacement['$ancestor[' . $level . ']'] = '';
             }
         }
     }
     $url = preg_replace('/\\/+/', '/', str_replace(array_keys($replacement), array_values($replacement), $scheme));
     return $this->getUniqueness($page, $url);
 }
예제 #13
0
 /**
  * Dispatcher constructor.
  *
  * @param \BackBee\BBApplication $application The current instance of BB application
  */
 public function __construct(BBApplication $application = null, Config $config = null)
 {
     $this->application = $application;
     if (null === $config && null !== $application) {
         $config = $application->getConfig();
     }
     if (null !== $config) {
         if (null !== ($events_config = $config->getRawSection('events'))) {
             $this->addListeners($events_config);
         }
     }
     if (null !== $application) {
         $this->container = $this->application->getContainer();
     }
     $this->_is_restored = false;
 }
예제 #14
0
 /**
  * Updates the content-content indexes for the scheduled AbstractClassContent.
  *
  * @param array $contents_saved
  * @param array $contents_removed
  */
 private static function _updateIdxContentContents(array $contents_saved, array $contents_removed)
 {
     if (null === self::$_application->getSite()) {
         return;
     }
     self::$_em->getRepository('BackBee\\ClassContent\\Indexes\\IdxContentContent')->replaceIdxContentContents(array_diff($contents_saved, self::$_content_content_done))->removeIdxContentContents($contents_removed);
     self::$_content_content_done = array_merge(self::$_content_content_done, $contents_saved);
 }
예제 #15
0
 private function getBundleClassMetadata()
 {
     $classes = array();
     foreach ($this->_application->getBundles() as $bundle) {
         $classes = array_merge($classes, $this->_getBundleSchema($bundle));
     }
     return $classes;
 }
예제 #16
0
 /**
  * Override Symfony\Component\Translation\Translator to lazy load every catalogs from:
  *     - BackBee\Resources\translations
  *     - PATH_TO_REPOSITORY\Resources\translations
  *     - PATH_TO_CONTEXT_REPOSITORY\Resources\translations.
  *
  * @param BBApplication $application
  * @param string        $locale
  */
 public function __construct(BBApplication $application, $locale)
 {
     parent::__construct($locale);
     // retrieve default fallback from container and set it
     $fallback = $application->getContainer()->getParameter('translator.fallback');
     $this->setFallbackLocales([$fallback]);
     // xliff is recommended by Symfony so we register its loader as default one
     $this->addLoader('xliff', new XliffFileLoader());
     // define in which directory we should looking at to find xliff files
     $dirToLookingAt = array($application->getBBDir() . DIRECTORY_SEPARATOR . 'Resources' . DIRECTORY_SEPARATOR . 'translations', $application->getRepository() . DIRECTORY_SEPARATOR . 'Resources' . DIRECTORY_SEPARATOR . 'translations');
     if ($application->getRepository() !== $application->getBaseRepository()) {
         $dirToLookingAt[] = $application->getBaseRepository() . 'Resources' . DIRECTORY_SEPARATOR . 'translations';
     }
     // loop in every directory we should looking at and load catalog from file which match to the pattern
     foreach ($dirToLookingAt as $dir) {
         if (true === is_dir($dir)) {
             foreach (scandir($dir) as $filename) {
                 preg_match('/(.+)\\.(.+)\\.xlf$/', $filename, $matches);
                 if (0 < count($matches)) {
                     $this->addResource('xliff', $dir . DIRECTORY_SEPARATOR . $filename, $matches[2], $matches[1]);
                 }
             }
         }
     }
 }
예제 #17
0
 /**
  * Create new root page
  *
  * @param  \BackBee\Site\Site       $site       Site object
  * @param  \BackBee\Site\Layout     $layout     Layout object
  *
  * @return \BackBee\NestedNode\Page
  */
 private function createRootPage($site, $layout)
 {
     $pagebuilder = $this->bbapp->getContainer()->get('pagebuilder');
     $pagebuilder->setUid(md5('root-' . $site->getLabel()))->setTitle('Home')->setLayout($layout)->setSite($site)->setUrl('/')->putOnlineAndHidden();
     $page = $pagebuilder->getPage();
     $this->entyMgr->persist($page);
     $this->entyMgr->flush($page);
     return $page;
 }
예제 #18
0
 /**
  * Returns the static folder path to use.
  *
  * @return string
  */
 protected function getStaticDir()
 {
     $staticDir = $this->app->getContainer()->getParameter('theme.static.dir');
     if (!is_dir($staticDir) && !mkdir($staticDir, 0777, true)) {
         $output->writeln("<error>Unable to read or create the folder '{$staticDir}'</error>");
         exit(1);
     }
     return $staticDir;
 }
예제 #19
0
 /**
  * Trigger a BackBee\Event\Event depending on the entity and event name.
  *
  * @access protected
  *
  * @param string    $eventName The doctrine event name
  * @param Object    $entity    The entity instance
  * @param EventArgs $eventArgs The doctrine event arguments
  */
 protected function _triggerEvent($eventName, $entity, $eventArgs)
 {
     if (null === $this->_application) {
         return;
     }
     $dispatcher = $this->_application->getEventDispatcher();
     if (null !== $dispatcher) {
         $dispatcher->triggerEvent($eventName, $entity, $eventArgs);
     }
 }
예제 #20
0
 /**
  * Create new superadmin user
  *
  * @param  string   $login         User name
  * @param  string   $password      User password
  * @param  string   $email         User email
  *
  * @return \BackBee\Security\User   The user object
  */
 private function createUser($login, $password, $email)
 {
     $encoderFactory = $this->bbapp->getContainer()->get('security.context')->getEncoderFactory();
     $adminUser = new \BackBee\Security\User($login, $password, 'SuperAdmin', 'SuperAdmin');
     $adminUser->setApiKeyEnabled(true)->setActivated(true);
     $encoder = $encoderFactory->getEncoder($adminUser);
     $adminUser->setPassword($encoder->encodePassword($password, ''))->setEmail($email)->generateRandomApiKey();
     $this->entyMgr->persist($adminUser);
     $this->entyMgr->flush($adminUser);
     return $adminUser;
 }
예제 #21
0
 /**
  * Returns the default extension for a site.
  *
  * @param \BackBee\Site\Site $site
  *
  * @return string|null
  */
 private function getDefaultExtFromSite(Site $site = null)
 {
     if (null === $site) {
         $site = $this->application->getSite();
     }
     $extension = null;
     if (null !== $site) {
         $extension = $site->getDefaultExtension();
     }
     return $extension;
 }
예제 #22
0
 protected function triggerEvent($name = 'render', $object = null, $render = null)
 {
     if (null === $this->application) {
         return;
     }
     $dispatcher = $this->application->getEventDispatcher();
     if (null !== $dispatcher) {
         $object = null !== $object ? $object : $this->getObject();
         $event = new RendererEvent($object, null === $render ? $this : array($this, $render));
         $dispatcher->triggerEvent($name, $object, null, $event);
     }
 }
예제 #23
0
 /**
  * Format the name of an event.
  *
  * @param string $event_name
  * @param object $entity
  *
  * @return string the formated event name
  */
 private function formatEventName($event_name, $entity)
 {
     if (is_object($entity)) {
         $event_name = strtolower(str_replace(NAMESPACE_SEPARATOR, '.', get_class($entity)) . '.' . $event_name);
         if ($entity instanceof \Doctrine\ORM\Proxy\Proxy) {
             $prefix = str_replace(NAMESPACE_SEPARATOR, '.', $this->application->getEntityManager()->getConfiguration()->getProxyNamespace());
             $prefix .= '.' . $entity::MARKER . '.';
             $event_name = str_replace(strtolower($prefix), '', $event_name);
         }
     } else {
         $event_name = strtolower(str_replace(NAMESPACE_SEPARATOR, '.', $entity) . '.' . $event_name);
     }
     $event_name = str_replace(array('backbee.', 'classcontent.'), array('', ''), $event_name);
     return $event_name;
 }
예제 #24
0
 /**
  * Hdandles classcontent thumbnail request, returns the right thumbnail if it exists, else the default one.
  *
  * @param string $filename
  *
  * @return Response
  */
 public function getClassContentThumbnailAction($filename)
 {
     $base_folder = $this->application->getContainer()->getParameter('classcontent_thumbnail.base_folder');
     $base_directories = array_map(function ($directory) use($base_folder) {
         return str_replace(DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR, $directory . '/' . $base_folder);
     }, $this->application->getResourceDir());
     File::resolveFilepath($filename, null, array('include_path' => $base_directories));
     if (false === file_exists($filename)) {
         $filename = $this->getDefaultClassContentThumbnailFilepath($base_directories);
     }
     if (false === file_exists($filename) || false === is_readable($filename)) {
         $request = $this->application->getRequest();
         throw new FrontControllerException(sprintf('The file `%s` can not be found (referer: %s).', $request->getHost() . '/' . $request->getPathInfo(), $request->server->get('HTTP_REFERER')), FrontControllerException::NOT_FOUND);
     }
     return $this->createResourceResponse($filename);
 }
 private function addBundleRights($bundle_def, $aclProvider, $securityIdentity)
 {
     if (false === array_key_exists('resources', $bundle_def) || false === array_key_exists('actions', $bundle_def)) {
         return null;
     }
     $actions = $this->getActions($bundle_def['actions']);
     if (0 === count($actions)) {
         $this->writeln('Notice: none actions defined on bundle' . PHP_EOL);
         return array();
     }
     if (true === is_array($bundle_def['resources'])) {
         foreach ($bundle_def['resources'] as $bundle_name) {
             if (null !== ($bundle = $this->bbapp->getBundle($bundle_name))) {
                 $this->addObjectAcl($bundle, $aclProvider, $securityIdentity, $actions);
             }
         }
     } elseif ('all' === $bundle_def['resources']) {
         foreach ($this->bbapp->getBundles() as $bundle) {
             $this->addObjectAcl($bundle, $aclProvider, $securityIdentity, $actions);
         }
     }
 }
예제 #26
0
 /**
  * Handles a media file request.
  *
  * @param string $filename The media file to provide
  *
  * @throws FrontControllerException
  *
  * @return Response
  */
 public function mediaAction($type, $filename, $includePath = array())
 {
     $includePath = array_merge($includePath, array($this->application->getStorageDir(), $this->application->getMediaDir()));
     if (null !== $this->application->getBBUserToken()) {
         $includePath[] = $this->application->getTemporaryDir();
     }
     $matches = array();
     if (preg_match('/([a-f0-9]{3})\\/([a-f0-9]{29})\\/(.*)\\.([^\\.]+)/', $filename, $matches)) {
         $filename = $matches[1] . '/' . $matches[2] . '.' . $matches[4];
     } elseif (preg_match('/([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})\\/.*\\.([^\\.]+)/', $filename, $matches)) {
         $filename = $matches[1] . $matches[2] . $matches[3] . $matches[4] . $matches[5] . $matches[6] . $matches[7] . $matches[8] . '.' . $matches[9];
         File::resolveMediapath($filename, null, array('include_path' => $includePath));
     }
     File::resolveFilepath($filename, null, array('include_path' => $includePath));
     $this->application->info(sprintf('Handling image URL `%s`.', $filename));
     if (false === file_exists($filename) || false === is_readable($filename)) {
         $request = $this->application->getRequest();
         throw new FrontControllerException(sprintf('The file `%s` can not be found (referer: %s).', $request->getHost() . '/' . $request->getPathInfo(), $request->server->get('HTTP_REFERER')), FrontControllerException::NOT_FOUND);
     }
     return $this->createMediaResponse($filename);
 }
예제 #27
0
 /**
  * Stop the current BBApplication instance.
  *
  * @{inheritdoc}
  * @return void
  */
 public function stop()
 {
     parent::stop();
     exit;
 }
예제 #28
0
 /**
  * @param BBApplication $bbapp
  */
 public function __construct($bbapp, $dsn)
 {
     if (true === $bbapp->isDebugMode()) {
         parent::__construct($dsn);
     }
 }
예제 #29
0
 public function __construct(BBApplication $application)
 {
     $this->application = $application;
     $this->renderer = $application->getRenderer();
     $this->response = new Response();
 }
예제 #30
0
 public function removeThumbnail(Layout $layout, BBApplication $app)
 {
     $thumbnailfile = $layout->getPicPath();
     if (empty($thumbnail)) {
         return true;
     }
     File::resolveFilepath($thumbnailfile, null, array('include_path' => $app->getResourceDir()));
     while (true === is_file($thumbnailfile) && true === is_writable($thumbnailfile)) {
         @unlink($thumbnailfile);
         $thumbnailfile = $layout->getPicPath();
         File::resolveFilepath($thumbnailfile, null, array('include_path' => $app->getResourceDir()));
     }
     return true;
 }