/** * Same as mkdir but correctly implements directory recursion. * At its core, it will use the php MKDIR function. * This method does no special error handling. If you want to use special error handlers, * be sure to set that up BEFORE calling MakeDirectory. * * @param string $strPath actual path of the directoy you want created * @param integer $intMode optional mode * * @return boolean the return flag from mkdir */ public static function MakeDirectory($strPath, $intMode = null) { if (is_dir($strPath)) { // Directory Already Exists return true; } // Check to make sure the parent(s) exist, or create if not if (!self::MakeDirectory(dirname($strPath), $intMode)) { return false; } if (PHP_OS != "Linux") { // Create the current node/directory, and return its result $blnReturn = mkdir($strPath); if ($blnReturn && !is_null($intMode)) { // Manually CHMOD to $intMode (if applicable) // mkdir doesn't do it for mac, and this will error on windows // Therefore, ignore any errors that creep up QApplication::SetErrorHandler(null); chmod($strPath, $intMode); QApplication::RestoreErrorHandler(); } } else { $blnReturn = mkdir($strPath, $intMode); } return $blnReturn; }
public function __construct($mixValue = null, DateTimeZone $objTimeZone = null) { // Cloning from another QDateTime object if ($mixValue instanceof QDateTime) { if ($objTimeZone) { throw new QCallerException('QDateTime cloning cannot take in a DateTimeZone parameter'); } parent::__construct($mixValue->format(DateTime::ISO8601)); $this->blnDateNull = $mixValue->IsDateNull(); $this->blnTimeNull = $mixValue->IsTimeNull(); // Subclassing from a PHP DateTime object } else { if ($mixValue instanceof DateTime) { if ($objTimeZone) { throw new QCallerException('QDateTime subclassing of a DateTime object cannot take in a DateTimeZone parameter'); } parent::__construct($mixValue->format(DateTime::ISO8601)); // By definition, a DateTime object doesn't have anything nulled $this->blnDateNull = false; $this->blnTimeNull = false; // Using "Now" constant } else { if (strtolower($mixValue) == QDateTime::Now) { if ($objTimeZone) { parent::__construct('now', $objTimeZone); } else { parent::__construct('now'); } $this->blnDateNull = false; $this->blnTimeNull = false; // Null or No Value } else { if (!$mixValue) { // Set to "null date" // And Do Nothing Else -- Default Values are already set to Nulled out if ($objTimeZone) { parent::__construct('2000-01-01 00:00:00', $objTimeZone); } else { parent::__construct('2000-01-01 00:00:00'); } // Parse the Value string } else { $intTimestamp = null; $blnValid = false; QApplication::SetErrorHandler('QDateTimeErrorHandler'); try { if ($objTimeZone) { $blnValid = parent::__construct($mixValue, $objTimeZone); } else { $blnValid = parent::__construct($mixValue); } } catch (Exception $objExc) { } if ($blnValid !== false) { $intTimestamp = parent::format('U'); } QApplication::RestoreErrorHandler(); // Valid Value String if ($intTimestamp) { // To deal with "Tues" and date skipping bug in PHP 5.2 parent::__construct(date('Y-m-d H:i:s', parent::format('U'))); // We MUST assume that Date isn't null $this->blnDateNull = false; // Update Time Null Value if Time was Specified if (strpos($mixValue, ':') !== false) { $this->blnTimeNull = false; } // Timestamp-based Value string } else { if (is_numeric($mixValue)) { if ($objTimeZone) { parent::__construct(date('Y-m-d H:i:s', $mixValue), $objTimeZone); } else { parent::__construct(date('Y-m-d H:i:s', $mixValue)); } $this->blnTimeNull = false; $this->blnDateNull = false; // Null Date } else { // Set to "null date" // And Do Nothing Else -- Default Values are already set to Nulled out if ($objTimeZone) { parent::__construct('2000-01-01 00:00:00', $objTimeZone); } else { parent::__construct('2000-01-01 00:00:00'); } } } } } } } }
/** * Enter description here... * * @param string $strModuleName * @param string $strFilename * @param boolean $blnOverrideFlag whether we are using the _core template, or using a custom one * @param mixed[] $mixArgumentArray * @param boolean $blnSave wheather or not to actually perform the save * @return mixed returns the evaluated template or boolean save success. */ public function GenerateFile($strModuleName, $strFilename, $blnOverrideFlag, $mixArgumentArray, $blnSave = true) { // Figure out the actual TemplateFilePath if ($blnOverrideFlag) { $strTemplateFilePath = __QCODO__ . QCodeGen::TemplatesPathCustom . $strModuleName . '/' . $strFilename; } else { $strTemplateFilePath = __QCODO_CORE__ . QCodeGen::TemplatesPath . $strModuleName . '/' . $strFilename; } // Setup Debug/Exception Message if (QCodeGen::DebugMode) { _p("Evaluating {$strTemplateFilePath}<br/>", false); } $strError = 'Template\'s first line must be <template OverwriteFlag="boolean" DocrootFlag="boolean" TargetDirectory="string" DirectorySuffix="string" TargetFileName="string"/>: ' . $strTemplateFilePath; // Check to see if the template file exists, and if it does, Load It if (!file_exists($strTemplateFilePath)) { throw new QCallerException('Template File Not Found: ' . $strTemplateFilePath); } $strTemplate = file_get_contents($strTemplateFilePath); // Evaluate the Template $strTemplate = $this->EvaluateTemplate($strTemplate, $strModuleName, $mixArgumentArray); // Parse out the first line (which contains path and overwriting information) $intPosition = strpos($strTemplate, "\n"); if ($intPosition === false) { throw new Exception($strError); } $strFirstLine = trim(substr($strTemplate, 0, $intPosition)); $strTemplate = substr($strTemplate, $intPosition + 1); $objTemplateXml = null; // Attempt to Parse the First Line as XML try { @($objTemplateXml = new SimpleXMLElement($strFirstLine)); } catch (Exception $objExc) { } if (is_null($objTemplateXml) || !$objTemplateXml instanceof SimpleXMLElement) { throw new Exception($strError); } $blnOverwriteFlag = QType::Cast($objTemplateXml['OverwriteFlag'], QType::Boolean); $blnDocrootFlag = QType::Cast($objTemplateXml['DocrootFlag'], QType::Boolean); $strTargetDirectory = QType::Cast($objTemplateXml['TargetDirectory'], QType::String); $strDirectorySuffix = QType::Cast($objTemplateXml['DirectorySuffix'], QType::String); $strTargetFileName = QType::Cast($objTemplateXml['TargetFileName'], QType::String); if (is_null($blnOverwriteFlag) || is_null($strTargetFileName) || is_null($strTargetDirectory) || is_null($strDirectorySuffix) || is_null($blnDocrootFlag)) { throw new Exception($strError); } if ($blnSave && $strTargetDirectory) { // Figure out the REAL target directory if ($blnDocrootFlag) { $strTargetDirectory = __DOCROOT__ . $strTargetDirectory . $strDirectorySuffix; } else { $strTargetDirectory = $strTargetDirectory . $strDirectorySuffix; } // Create Directory (if needed) if (!is_dir($strTargetDirectory)) { if (!QApplication::MakeDirectory($strTargetDirectory, 0777)) { throw new Exception('Unable to mkdir ' . $strTargetDirectory); } } // Save to Disk $strFilePath = sprintf('%s/%s', $strTargetDirectory, $strTargetFileName); if ($blnOverwriteFlag || !file_exists($strFilePath)) { $intBytesSaved = file_put_contents($strFilePath, $strTemplate); // CHMOD to full read/write permissions (applicable only to nonwindows) // Need to ignore error handling for this call just in case QApplication::SetErrorHandler(null); chmod($strFilePath, 0666); QApplication::RestoreErrorHandler(); return $intBytesSaved == strlen($strTemplate); } else { // Becuase we are not supposed to overwrite, we should return "true" by default return true; } } // Why Did We Not Save? if ($blnSave) { // We WANT to Save, but Qcodo Configuration says that this functionality/feature should no longer be generated // By definition, we should return "true" return true; } else { // Running GenerateFile() specifically asking it not to save -- so return the evaluated template instead return $strTemplate; } }
public function __construct($mixValue = null, DateTimeZone $objTimeZone = null, $intType = QDateTime::UnknownType) { switch ($intType) { case QDateTime::DateOnlyType: if ($objTimeZone) { parent::__construct($mixValue, $objTimeZone); } else { parent::__construct($mixValue); } $this->blnTimeNull = true; $this->blnDateNull = false; $this->ReinforceNullProperties(); return; case QDateTime::TimeOnlyType: if ($objTimeZone) { parent::__construct($mixValue, $objTimeZone); } else { parent::__construct($mixValue); } $this->blnTimeNull = false; $this->blnDateNull = true; $this->ReinforceNullProperties(); return; case QDateTime::DateAndTimeType: if ($objTimeZone) { parent::__construct($mixValue, $objTimeZone); } else { parent::__construct($mixValue); } $this->blnTimeNull = false; $this->blnDateNull = false; return; default: break; } // Cloning from another QDateTime object if ($mixValue instanceof QDateTime) { if ($objTimeZone) { throw new QCallerException('QDateTime cloning cannot take in a DateTimeZone parameter'); } if ($mixValue->GetTimeZone()->GetName() == date_default_timezone_get()) { parent::__construct($mixValue->format('Y-m-d H:i:s')); } else { parent::__construct($mixValue->format(DateTime::ISO8601)); } $this->blnDateNull = $mixValue->IsDateNull(); $this->blnTimeNull = $mixValue->IsTimeNull(); // Subclassing from a PHP DateTime object } else { if ($mixValue instanceof DateTime) { if ($objTimeZone) { throw new QCallerException('QDateTime subclassing of a DateTime object cannot take in a DateTimeZone parameter'); } parent::__construct($mixValue->format(DateTime::ISO8601)); // By definition, a DateTime object doesn't have anything nulled $this->blnDateNull = false; $this->blnTimeNull = false; // Using "Now" constant } else { if (strtolower($mixValue) == QDateTime::Now) { if ($objTimeZone) { parent::__construct('now', $objTimeZone); } else { parent::__construct('now'); } $this->blnDateNull = false; $this->blnTimeNull = false; // Null or No Value } else { if (!$mixValue) { // Set to "null date" // And Do Nothing Else -- Default Values are already set to Nulled out if ($objTimeZone) { parent::__construct('2000-01-01 00:00:00', $objTimeZone); } else { parent::__construct('2000-01-01 00:00:00'); } // Parse the Value string } else { $strTimeISO8601 = null; $blnValid = false; QApplication::SetErrorHandler('QDateTimeErrorHandler'); try { if ($objTimeZone) { $blnValid = parent::__construct($mixValue, $objTimeZone); } else { $blnValid = parent::__construct($mixValue); } } catch (Exception $objExc) { } if ($blnValid !== false) { $strTimeISO8601 = parent::format(DateTime::ISO8601); } QApplication::RestoreErrorHandler(); // Valid Value String if ($strTimeISO8601) { // To deal with "Tues" and date skipping bug in PHP 5.2 if ($strTimeISO8601 != $mixValue) { parent::__construct($strTimeISO8601); } // Set DateNull and TimeNull according to the value of $mixValue $objDateTime = (object) date_parse($mixValue); $this->blnDateNull = !$objDateTime->year && !$objDateTime->month && !$objDateTime->day; $this->blnTimeNull = $objDateTime->hour === false || $objDateTime->minute === false || $objDateTime->second === false; // Timestamp-based Value string } else { if (is_numeric($mixValue)) { if ($objTimeZone) { parent::__construct(date('Y-m-d H:i:s', $mixValue), $objTimeZone); } else { parent::__construct(date('Y-m-d H:i:s', $mixValue)); } $this->blnTimeNull = false; $this->blnDateNull = false; // Null Date } else { // Set to "null date" // And Do Nothing Else -- Default Values are already set to Nulled out if ($objTimeZone) { parent::__construct('2000-01-01 00:00:00', $objTimeZone); } else { parent::__construct('2000-01-01 00:00:00'); } } } } } } } $this->ReinforceNullProperties(); }
/** * Sets the file permissions (Linux only) for a file generated by the Code Generator * @param string $strFilePath Path of the generated file * * @throws QCallerException */ protected function setGeneratedFilePermissions($strFilePath) { // CHMOD to full read/write permissions (applicable only to nonwindows) // Need to ignore error handling for this call just in case if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { QApplication::SetErrorHandler(null); chmod($strFilePath, 0666); QApplication::RestoreErrorHandler(); } }