コード例 #1
0
 /**
  * @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 PackageInstallationPlugin::install()
  */
 public function install()
 {
     parent::install();
     if (!($xml = $this->getXML())) {
         return;
     }
     // Create an array with the data blocks (import or delete) from the xml file.
     $xml = $xml->getElementTree('data');
     require_once WCF_DIR . 'lib/data/cronjobs/CronjobEditor.class.php';
     // Loop through the array and install or uninstall cronjobs.
     foreach ($xml['children'] as $key => $block) {
         if (count($block['children'])) {
             // TODO: handle delete block first
             // Handle the import instructions
             if ($block['name'] == 'import') {
                 // Loop through items and create or update them.
                 foreach ($block['children'] as $cronjobInfo) {
                     // Extract item properties.
                     foreach ($cronjobInfo['children'] as $child) {
                         if (!isset($child['cdata'])) {
                             continue;
                         }
                         $cronjobInfo[$child['name']] = $child['cdata'];
                     }
                     // default values.
                     $classPath = $description = $startMinute = $startHour = $startDom = $startMonth = $startDow = '';
                     $execMultiple = $canBeEdited = $canBeDisabled = 0;
                     $active = 1;
                     // make xml tags-names (keys in array) to lower case
                     $this->keysToLowerCase($cronjobInfo);
                     // get values.
                     if (isset($cronjobInfo['classpath'])) {
                         $classPath = $cronjobInfo['classpath'];
                     }
                     if (isset($cronjobInfo['description'])) {
                         $description = $cronjobInfo['description'];
                     }
                     if (isset($cronjobInfo['startminute'])) {
                         $startMinute = $cronjobInfo['startminute'];
                     }
                     if (isset($cronjobInfo['starthour'])) {
                         $startHour = $cronjobInfo['starthour'];
                     }
                     if (isset($cronjobInfo['startdom'])) {
                         $startDom = $cronjobInfo['startdom'];
                     }
                     if (isset($cronjobInfo['startmonth'])) {
                         $startMonth = $cronjobInfo['startmonth'];
                     }
                     if (isset($cronjobInfo['startdow'])) {
                         $startDow = $cronjobInfo['startdow'];
                     }
                     if (isset($cronjobInfo['execmultiple'])) {
                         $execMultiple = intval($cronjobInfo['execmultiple']);
                     }
                     if (isset($cronjobInfo['active'])) {
                         $active = intval($cronjobInfo['active']);
                     }
                     if (isset($cronjobInfo['canbeedited'])) {
                         $canBeEdited = intval($cronjobInfo['canbeedited']);
                     }
                     if (isset($cronjobInfo['canbedisabled'])) {
                         $canBeDisabled = intval($cronjobInfo['canbedisabled']);
                     }
                     // validate values
                     CronjobEditor::validate($startMinute, $startHour, $startDom, $startMonth, $startDow);
                     // save cronjob
                     $sql = "INSERT INTO\twcf" . WCF_N . "_cronjobs \n\t\t\t\t\t\t\t\t\t(classPath, packageID, description, \n\t\t\t\t\t\t\t\t\tstartMinute, startHour, startDom, \n\t\t\t\t\t\t\t\t\tstartMonth, startDow, nextExec, execMultiple, \n\t\t\t\t\t\t\t\t\tactive, canBeEdited, canBeDisabled) \n\t\t\t\t\t\t\tVALUES \n\t\t\t\t\t\t\t\t\t('" . escapeString($classPath) . "', \n\t\t\t\t\t\t\t\t\t" . $this->installation->getPackageID() . ", \n\t\t\t\t\t\t\t\t\t'" . escapeString($description) . "', \n\t\t\t\t\t\t\t\t\t'" . escapeString($startMinute) . "', \n\t\t\t\t\t\t\t\t\t'" . escapeString($startHour) . "', \n\t\t\t\t\t\t\t\t\t'" . escapeString($startDom) . "', \n\t\t\t\t\t\t\t\t\t'" . escapeString($startMonth) . "', \n\t\t\t\t\t\t\t\t\t'" . escapeString($startDow) . "', \n\t\t\t\t\t\t\t\t\t" . TIME_NOW . ", \n\t\t\t\t\t\t\t\t\t" . escapeString($execMultiple) . ",\n\t\t\t\t\t\t\t\t\t" . escapeString($active) . ",\n\t\t\t\t\t\t\t\t\t" . escapeString($canBeEdited) . ", \n\t\t\t\t\t\t\t\t\t" . escapeString($canBeDisabled) . ")";
                     WCF::getDB()->sendQuery($sql);
                 }
             } else {
                 if ($block['name'] == 'delete') {
                     if ($this->installation->getAction() == 'update') {
                         // Loop through items and delete them.
                         $cronjobNames = '';
                         foreach ($block['children'] as $cronjobInfo) {
                             // check required attributes
                             if (!isset($cronjobInfo['attrs']['name'])) {
                                 throw new SystemException("Required 'name' attribute for 'cronjob'-tag is missing.", 13023);
                             }
                             // Create a string with all item names which should be deleted (comma separated).
                             if (!empty($cronjobNames)) {
                                 $cronjobNames .= ',';
                             }
                             $cronjobNames .= "'" . escapeString($cronjobInfo['attrs']['name']) . "'";
                         }
                         // Delete items.
                         if (!empty($cronjobNames)) {
                             $sql = "DELETE FROM\twcf" . WCF_N . "_cronjobs\n\t\t\t\t\t\t\t\tWHERE\t\tclassPath IN (" . $cronjobNames . ")\n\t\t\t\t\t\t\t\t\t\tAND packageID = " . $this->installation->getPackageID();
                             WCF::getDB()->sendQuery($sql);
                         }
                     }
                 }
             }
         }
     }
 }