/**
  * @see Form::validate()
  */
 public function validate()
 {
     parent::validate();
     // validate class path
     if (empty($this->classPath)) {
         throw new UserInputException('classPath');
     }
     try {
         $package = new Package($this->packageID);
         if (!@file_exists(FileUtil::getRealPath(WCF_DIR . $package->getDir() . $this->classPath))) {
             throw new UserInputException('classPath', 'doesNotExist');
         }
     } catch (SystemException $e) {
         throw new UserInputException('classPath', 'doesNotExist');
     }
     try {
         CronjobEditor::validate($this->startMinute, $this->startHour, $this->startDom, $this->startMonth, $this->startDow);
     } catch (SystemException $e) {
         // extract field name
         $fieldName = '';
         if (preg_match("/cronjob attribute '(.*)'/", $e->getMessage(), $match)) {
             $fieldName = $match[1];
         }
         throw new UserInputException($fieldName, 'notValid');
     }
 }
 /**
  * @see CacheBuilder::getData()
  */
 public function getData($cacheResource)
 {
     list($cache, $packageID, $styleID) = explode('-', $cacheResource['cache']);
     $data = array();
     // get active package
     require_once WCF_DIR . 'lib/acp/package/Package.class.php';
     $activePackage = new Package($packageID);
     $activePackageDir = FileUtil::getRealPath(WCF_DIR . $activePackage->getDir());
     // get package dirs
     $packageDirs = array();
     $sql = "SELECT\t\tDISTINCT packageDir\r\n\t\t\tFROM\t\twcf" . WCF_N . "_package_dependency dependency\r\n\t\t\tLEFT JOIN\twcf" . WCF_N . "_package package\r\n\t\t\tON\t\t(package.packageID = dependency.dependency)\r\n\t\t\tWHERE\t\tdependency.packageID = " . $packageID . "\r\n\t\t\t\t\tAND packageDir <> ''\r\n\t\t\tORDER BY\tpriority DESC";
     $result = WCF::getDB()->sendQuery($sql);
     while ($row = WCF::getDB()->fetchArray($result)) {
         $packageDirs[] = FileUtil::getRealPath(WCF_DIR . $row['packageDir']);
     }
     $packageDirs[] = WCF_DIR;
     // get style icon path
     $iconDirs = array();
     $sql = "SELECT\tvariableValue\r\n\t\t\tFROM\twcf" . WCF_N . "_style_variable\r\n\t\t\tWHERE\tstyleID = " . $styleID . "\r\n\t\t\t\tAND variableName = 'global.icons.location'";
     $row = WCF::getDB()->getFirstRow($sql);
     if (!empty($row['variableValue'])) {
         $iconDirs[] = FileUtil::addTrailingSlash($row['variableValue']);
     }
     if (!in_array('icon/', $iconDirs)) {
         $iconDirs[] = 'icon/';
     }
     // get icons
     foreach ($packageDirs as $packageDir) {
         $relativePackageDir = $activePackageDir != $packageDir ? FileUtil::getRelativePath($activePackageDir, $packageDir) : '';
         foreach ($iconDirs as $iconDir) {
             $path = FileUtil::addTrailingSlash($packageDir . $iconDir);
             $icons = self::getIconFiles($path);
             foreach ($icons as $icon) {
                 $icon = str_replace($path, '', $icon);
                 if (!isset($data[$icon])) {
                     $data[$icon] = $relativePackageDir . $iconDir . $icon;
                 }
             }
         }
     }
     return $data;
 }
 /**
  * @see Form::save()
  */
 public function save()
 {
     ACPForm::save();
     // update cronjob
     $this->cronjob->update($this->classPath, $this->packageID, $this->description, $this->execMultiple, $this->startMinute, $this->startHour, $this->startDom, $this->startMonth, $this->startDow);
     $this->saved();
     // delete old entries
     $sql = "DELETE FROM wcf" . WCF_N . "_admin_tools_function_to_cronjob\n\t\t\t\tWHERE cronjobID = " . $this->cronjobID;
     WCF::getDB()->sendQuery($sql);
     $inserts = '';
     foreach ($this->activeFunctions as $functionID) {
         if (!empty($inserts)) {
             $inserts .= ',';
         }
         $inserts .= '(' . $functionID . ', ' . $this->cronjobID . ')';
     }
     $sql = "INSERT IGNORE INTO wcf" . WCF_N . "_admin_tools_function_to_cronjob\n\t\t\t\t\t(functionID, cronjobID)\n\t\t\t\t\tVALUES " . $inserts;
     WCF::getDB()->sendQuery($sql);
     $package = new Package($this->packageID);
     $path = FileUtil::getRealPath(WCF_DIR . $package->getDir());
     $fileName = $path . 'lib/system/cronjob/AdminToolsCronjob' . $this->cronjobID . '.class.php';
     if (file_exists($fileName)) {
         unlink($fileName);
     }
     $this->writeCronjob($this->cronjobID, $fileName);
     $this->saved();
     // show success.
     WCF::getTPL()->assign(array('success' => true));
 }
 /**
  * Writes the config.inc.php for a standalone application.
  * 
  * @param	integer		$packageID
  */
 public static function writeConfigFile($packageID)
 {
     $package = new Package($packageID);
     $packageDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR . $package->getDir()));
     $file = new File($packageDir . PackageInstallation::CONFIG_FILE);
     $file->write("<?php\n");
     $currentPrefix = strtoupper($package->getAbbreviation());
     // get dependencies (only standalones)
     $sql = "SELECT\t\tpackage.*, IF(package.packageID = " . $packageID . ", 1, 0) AS sortOrder\n\t\t\tFROM\t\twcf" . WCF_N . "_package_dependency package_dependency\n\t\t\tLEFT JOIN\twcf" . WCF_N . "_package package\n\t\t\tON\t\t(package.packageID = package_dependency.dependency)\n\t\t\tWHERE\t\tpackage_dependency.packageID = " . $packageID . "\n\t\t\t\t\tAND package.standalone = 1\n\t\t\t\t\tAND package.packageDir <> ''\n\t\t\tORDER BY\tsortOrder DESC,\n\t\t\t\t\tpackage_dependency.priority DESC";
     $result = WCF::getDB()->sendQuery($sql);
     while ($row = WCF::getDB()->fetchArray($result)) {
         $dependency = new Package(null, $row);
         $dependencyDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR . $dependency->getDir()));
         $prefix = strtoupper($dependency->getAbbreviation());
         $file->write("// " . $dependency->getPackage() . " vars\n");
         $file->write("// " . strtolower($prefix) . "\n");
         $file->write("if (!defined('" . $prefix . "_DIR')) define('" . $prefix . "_DIR', " . ($dependency->getPackageID() == $package->getPackageID() ? "dirname(__FILE__).'/'" : "'" . $dependencyDir . "'") . ");\n");
         $file->write("if (!defined('RELATIVE_" . $prefix . "_DIR')) define('RELATIVE_" . $prefix . "_DIR', " . ($dependency->getPackageID() == $package->getPackageID() ? "''" : "RELATIVE_" . $currentPrefix . "_DIR.'" . FileUtil::getRelativePath($packageDir, $dependencyDir) . "'") . ");\n");
         $file->write("if (!defined('" . $prefix . "_N')) define('" . $prefix . "_N', '" . WCF_N . "_" . $dependency->getInstanceNo() . "');\n");
         $file->write("\$packageDirs[] = " . $prefix . "_DIR;\n");
         $file->write("\n");
     }
     // write general information
     $file->write("// general info\n");
     $file->write("if (!defined('RELATIVE_WCF_DIR'))\tdefine('RELATIVE_WCF_DIR', RELATIVE_" . $currentPrefix . "_DIR.'" . FileUtil::getRelativePath($packageDir, WCF_DIR) . "');\n");
     $file->write("if (!defined('PACKAGE_ID')) define('PACKAGE_ID', " . $package->getPackageID() . ");\n");
     $file->write("if (!defined('PACKAGE_NAME')) define('PACKAGE_NAME', '" . str_replace("'", "\\'", $package->getName()) . "');\n");
     $file->write("if (!defined('PACKAGE_VERSION')) define('PACKAGE_VERSION', '" . $package->getVersion() . "');\n");
     // write end
     $file->write("?>");
     $file->close();
 }