| @@ -32,21 +32,159 @@ | ||
| 32 | 32 | * |
| 33 | 33 | * @param CJTPackageFile |
| 34 | 34 | */ |
| 35 | 35 | public function install($package) { |
| 36 | - // Get packages definition xml factory. | |
| 37 | - $factory = new CJT_Models_Package_Xml_Factory('models/package/xml/definition/package'); | |
| 38 | - // Process the full document starting by the ROOT package tag down to the latest descendant. | |
| 39 | - $packageObject = $factory->create(null, 'package', $package->document()); // OBJECT CONSTR&UCTED HERE! | |
| 40 | - // Share vars to nodes. | |
| 41 | - $register = $packageObject->register(); | |
| 42 | - $register->offsetSet('packageParser', $package); | |
| 43 | - // Process package object. | |
| 44 | - $packageObject->transit() | |
| 45 | - // Go down the tree. | |
| 46 | - ->processInners(); | |
| 36 | + // Initialize. | |
| 37 | + $model = null; // Current model for the element under the loop! | |
| 38 | + $item = array(); // Object Item array to be inserted in the database. | |
| 39 | + $addedObjects = array('template' => array(), 'block' => array()); // All the added objects mapped by object 'TYPE'. | |
| 40 | + // Fetch package information with all readme and license tags locatted if | |
| 41 | + // bundled with external files! | |
| 42 | + $packageInfo = $package->getItem(null, array('readme' => 'readme.txt', 'license' => 'license.txt')); | |
| 43 | + // Install only if the package record if not exists. | |
| 44 | + $modelPackage = CJTModel::getInstance('package'); | |
| 45 | + if ($modelPackage->exists($packageInfo['name'])) { | |
| 46 | + // State error! | |
| 47 | + $this->state['error']['msg'] = cssJSToolbox::getText('The uploaded package is already installed!'); | |
| 48 | + // Terminate! | |
| 49 | + return $this; | |
| 50 | + } | |
| 51 | + // Map definition xml TYPE attribute to CJT Model object to handle addding | |
| 52 | + // objecs types. | |
| 53 | + $objectModels = array('template' => 'template', 'block' => 'blocks'); | |
| 54 | + // Initialize Wordpress file system object. | |
| 55 | + WP_Filesystem(); | |
| 56 | + $fileSystem =& $GLOBALS['wp_filesystem']; | |
| 57 | + // Read all objects defined by the package. | |
| 58 | + foreach ($package->document()->objects->object as $object) { | |
| 59 | + // Prepare object + getting item to be saved into database. | |
| 60 | + $item = $package->getItem($object); | |
| 61 | + // Get current object type name. | |
| 62 | + $objectType = (string) $object->attributes()->type; | |
| 63 | + // Instantiate template model if not previously instantiated. | |
| 64 | + if (!is_object($objectModels[$objectType])) { | |
| 65 | + $objectModels[$objectType] = CJTModel::getInstance($objectModels[$objectType]); | |
| 66 | + } | |
| 67 | + // Referencing the model for current object type. | |
| 68 | + $model = $objectModels[$objectType]; | |
| 69 | + $objectId = 0; // Always reset -- to don't map to package if nothing added! | |
| 70 | + // Handle different object types. | |
| 71 | + switch ($objectType) { | |
| 72 | + case 'template': | |
| 73 | + // Insert template only if not exists. | |
| 74 | + if (!$model->exists($item['name'])) { | |
| 75 | + // Import template(s) helper. | |
| 76 | + cssJSToolbox::import('includes:templates:templates.class.php'); | |
| 77 | + // Set template revision. | |
| 78 | + $model->inputs['item']['revision']['code'] = $item['code']; | |
| 79 | + unset($item['code']); | |
| 80 | + // Set template main data. | |
| 81 | + $model->inputs['item']['template'] = $item; | |
| 82 | + /** Get template Type! | |
| 83 | + * Get type from external file extension if | |
| 84 | + * the template code was linked to file. | |
| 85 | + * If the template code were inline | |
| 86 | + * then the type must be provided under | |
| 87 | + * TYPE element! | |
| 88 | + */ | |
| 89 | + // If no type specified get it from the external file extension | |
| 90 | + if (!isset($model->inputs['item']['template']['type'])) { | |
| 91 | + // @WARNING: Get locatted file! | |
| 92 | + $codeFileName = (string) $object->code->attributes()->locatted; | |
| 93 | + if ($codeFileName) { | |
| 94 | + // Get type from extension. | |
| 95 | + $fileComponent = pathinfo($codeFileName); | |
| 96 | + $model->inputs['item']['template']['type'] = CJTTemplates::getExtensionType($fileComponent['extension']); | |
| 97 | + } | |
| 98 | + } | |
| 99 | + // Add template. | |
| 100 | + $addedTemplate = $model->save(); | |
| 101 | + // Expose Object ID to be added to the addedObjects List. | |
| 102 | + $objectId = $addedTemplate->templateId; | |
| 103 | + // Copy template folders. | |
| 104 | + if ($foldersCollection = $object->folders) { | |
| 105 | + // Get absolute path to template directory! | |
| 106 | + $templateDirectory = ABSPATH . dirname($addedTemplate->file); | |
| 107 | + // Process all <folders> tags! | |
| 108 | + foreach ($foldersCollection as $folders) { | |
| 109 | + // Get <folders> tag common path. | |
| 110 | + $foldersPath = (string) $folders->attributes()->path; | |
| 111 | + // Process <folder> tag. | |
| 112 | + foreach ($folders as $folder) { | |
| 113 | + // Folder absolute path. | |
| 114 | + if ($detinationName = (string) $folder->attributes()->destination) { | |
| 115 | + $folderPath = $detinationName; | |
| 116 | + } | |
| 117 | + else { | |
| 118 | + $folderPath = $folder->attributes()->path; | |
| 119 | + } | |
| 120 | + $folderAbsPath = $package->getDirectory() . "/{$foldersPath}/{$folderPath}"; | |
| 121 | + // Create destination path. | |
| 122 | + $folderDestinationPath = "{$templateDirectory}/{$folderPath}"; | |
| 123 | + if (!file_exists($folderDestinationPath)) { | |
| 124 | + mkdir($folderDestinationPath, 0775); | |
| 125 | + } | |
| 126 | + // Copy files (FLAT)!!. | |
| 127 | + foreach (new DirectoryIterator($folderAbsPath) as $file) { | |
| 128 | + if (!$file->isDot() && $file->isFile()) { | |
| 129 | + $fileSystem->copy($file->getPathName(), "{$folderDestinationPath}/{$file->getFileName()}"); | |
| 130 | + } | |
| 131 | + } | |
| 132 | + } | |
| 133 | + } | |
| 134 | + } | |
| 135 | + } | |
| 136 | + break; | |
| 137 | + case 'block'; | |
| 138 | + // Set other block internal data. | |
| 139 | + $item['created'] = $item['lastModified'] = current_time('mysql'); | |
| 140 | + $item['owner'] = get_current_user_id(); | |
| 141 | + // Insert block into database. | |
| 142 | + $objectId = $model->add($item); | |
| 143 | + $model->save(); | |
| 144 | + // Initialize for linking templates. | |
| 145 | + $modelTemplate = $objectModels['template']; | |
| 146 | + // Link block templates. | |
| 147 | + $links = $object->links->link ? $object->links->link : array(); | |
| 148 | + foreach ($links as $link) { | |
| 149 | + // Get template object to link. | |
| 150 | + $templateToLinkAttributes = (array) $link->attributes(); | |
| 151 | + $templateToLinkAttributes = $templateToLinkAttributes['@attributes']; | |
| 152 | + $tblTemplate = CJTxTable::getInstance('template') | |
| 153 | + ->setData($templateToLinkAttributes) // Query by the given attributes. | |
| 154 | + ->load(array_keys($templateToLinkAttributes)); | |
| 155 | + if ($tblTemplate->get('id')) { | |
| 156 | + // Cache template id. | |
| 157 | + $templateId = $tblTemplate->get('id'); | |
| 158 | + // Always link as the block should be newely added | |
| 159 | + // and in the normal cases its impossible to be alread linked! | |
| 160 | + $tableBlockTemplate = CJTxTable::getInstance('block-template'); | |
| 161 | + $tableBlockTemplate->set('blockId', $objectId) | |
| 162 | + ->set('templateId', $templateId) | |
| 163 | + ->save(); | |
| 164 | + // Add only LINKED objects to the package objects map table! | |
| 165 | + if (!key_exists($templateId, $addedObjects['template'])) { | |
| 166 | + $addedObjects['template'][$templateId] = array('objectId' => $templateId, 'relType' => 'link'); | |
| 167 | + } | |
| 168 | + } | |
| 169 | + } | |
| 170 | + break; | |
| 171 | + default: | |
| 172 | + //throw new Exception('Invalid object type specified!'); | |
| 173 | + break; | |
| 174 | + } | |
| 175 | + // Support pluggable nodes that will parsed only when it really used. | |
| 176 | + $this->pluggables($object, $objectId, $package); | |
| 177 | + // Add (associate with the package) last objectId only if the object is added | |
| 178 | + // as a part of the package. | |
| 179 | + if ($objectId) { | |
| 180 | + $addedObjects[$objectType][$objectId] = array('objectId' => $objectId); | |
| 181 | + } | |
| 182 | + } | |
| 183 | + // Add package to database! | |
| 184 | + $packageId = $modelPackage->save($packageInfo, $addedObjects); | |
| 47 | 185 | // Return package Id |
| 48 | - return $register['packageId']; | |
| 186 | + return $packageId; | |
| 49 | 187 | } |
| 50 | 188 | |
| 51 | 189 | /** |
| 52 | 190 | * put your comment there... |
| @@ -69,8 +207,34 @@ | ||
| 69 | 207 | cssJSToolbox::import('framework:packages:package.class.php'); |
| 70 | 208 | $package = new CJTPackageFile($destinationDir); |
| 71 | 209 | } |
| 72 | 210 | return $package; |
| 211 | + } | |
| 212 | + | |
| 213 | + /** | |
| 214 | + * put your comment there... | |
| 215 | + * | |
| 216 | + * @param mixed $node | |
| 217 | + * @param mixed $objectId | |
| 218 | + * @param mixed $package | |
| 219 | + * @return CJTPackageFileModel | |
| 220 | + */ | |
| 221 | + public function pluggables($node, $objectId, & $package) { | |
| 222 | + // Get packages definition xml factory. | |
| 223 | + $factory = new CJT_Models_Package_Xml_Factory('models/package/xml/definition/objects'); | |
| 224 | + // Based on the object type get instance of the object | |
| 225 | + // parser with the object node passed. | |
| 226 | + // call plug method so the object would start parsing the | |
| 227 | + // and plug the child elements. | |
| 228 | + $object = $factory->create(null, (string) $node->attributes()->type, $node); // OBJECT CONSTR&UCTED HERE! | |
| 229 | + // Set object id! | |
| 230 | + $object->register()->offsetSet('id', $objectId); | |
| 231 | + $object->register()->offsetSet('packageParser', $package); | |
| 232 | + // Plug it! | |
| 233 | + $object->transit() | |
| 234 | + ->processInners(); | |
| 235 | + // Chaining. | |
| 236 | + return $this; | |
| 73 | 237 | } |
| 74 | 238 | |
| 75 | 239 | /** |
| 76 | 240 | * put your comment there... |