PluginProbe
CSS & JavaScript Toolbox / 11
CSS & JavaScript Toolbox v11
trunk 0.3 0.8 10 10.1 11 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 11.9.1 12 12.0 12.0.1 12.0.3 12.0.4 12.0.5 12.0.6 12.0.7 6.0 6.0.11 All 60 releases
css-javascript-toolbox / models / blocks.php

blocks.php in CSS & JavaScript Toolbox 11, at models/blocks.php

488 lines 13.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @version $ Id; blocks.php 21-03-2012 03:22:10 Ahmed Said $
4 */
5
6 /**
7 * No direct access.
8 */
9 defined('ABSPATH') or die("Access denied");
10
11 // Blocks Database tables.
12 require_once CJTOOLBOX_TABLES_PATH . '/blocks.php';
13 require_once CJTOOLBOX_TABLES_PATH . '/block-pins.php';
14 // MYSQL Queue Driver.
15 require_once CJTOOLBOX_INCLUDE_PATH . '/db/mysql/queue-driver.inc.php';
16
17 /**
18 * Provide simple access (read or write) to all Blocks data.
19 *
20 * @author Ahmed Said
21 * @version 6
22 */
23 class CJTBlocksModel {
24
25 /**
26 *
27 */
28 const MAX_REVISIONS_PER_BLOCK = 99;
29
30 /**
31 * put your comment there...
32 *
33 * @var mixed
34 */
35 protected $dbDriver = null;
36
37 /**
38 * put your comment there...
39 *
40 */
41 public function __construct() {
42 // Initialize CTTTable MYSQL Driver.
43 $this->dbDriver = new CJTMYSQLQueueDriver($GLOBALS['wpdb']);
44 }
45
46 /**
47 * put your comment there...
48 *
49 * @param mixed $block
50 * @param mixed $forceAddCodeBlock
51 */
52 public function add($block, $forceAddCodeBlock = false) {
53 // Make sure it array and not stdClass as it has been used from various areas!
54 $block = (array) $block;
55 // Create Tables objects.
56 $blocks = new CJTBlocksTable($this->dbDriver);
57 $codeFile = new CJTBlockFilesTable($this->dbDriver);
58 // Get new id if not specified.
59 if (!isset($block['id']) || !$block['id']) {
60 $block['id'] = $blocks->getNextId();
61 }
62 // Backward compatibility for old block style
63 // that has code field inside blocks table.
64 /// if passed create master code file for the code field.
65 if ($forceAddCodeBlock || isset($block['code'])) {
66 // Cache code for MASTER file.
67 $codeFile->set('code', $block['code']);
68 unset($block['code']); // If it passed it mist be removed from blocks data(avoid field not found)
69 // Add code files.
70 $codeFile->set('blockId', $block['id'])
71 ->set('id', 1)
72 ->set('name', 'Master')
73 ->save(true, true);
74 }
75 // Add new block.
76 $blocks->insert($block);
77 // Return Newly added block id.
78 return $block['id'];
79 }
80
81 /**
82 * put your comment there...
83 *
84 * @param mixed $blockId
85 * @param mixed $activeFileId
86 */
87 public function addRevision($blockId, $activeFileId) {
88 // Create Tables objects.
89 $blocks = new CJTBlocksTable($this->dbDriver);
90 $pins = new CJTBlockPinsTable($this->dbDriver);
91 $codeFile = new CJTBlockFilesTable($this->dbDriver);
92 // We allow only up to self::MAX_REVISIONS_PER_BLOCK revisions per
93 // block code files So that a single block may has up to
94 // self::MAX_REVISIONS_PER_BLOCK * count(codeFiles)
95 $revisions['fields'] = array('id');
96 $revisions['filters'] = array('type' => 'revision', 'parent' => $blockId, 'masterFile' => $activeFileId);
97 $revisions = $blocks->get(null, $revisions['fields'], $revisions['filters']);
98 // If revisions reached self::MAX_REVISIONS_PER_BLOCK delete first one.
99 if (count($revisions) == self::MAX_REVISIONS_PER_BLOCK) {
100 $this->delete(array_shift($revisions)->id);
101 }
102 // Get block data.
103 $block['fields'] = array('id', 'lastModified', 'pinPoint', 'links', 'expressions');
104 // get() developed to return multiple blocks, fetch the first.
105 $result = $blocks->get($blockId, $block['fields']);
106 $block = reset($result);
107 // Set other fields.
108 $block->location = $block->state = '';
109 $block->parent = $blockId;
110 $block->type = 'revision';
111 $block->created = current_time('mysql');
112 $block->owner = get_current_user_id();
113 $block->masterFile = $activeFileId; // Only the revisioned code file would be exists and must be
114 // used as the masterFile!
115 $block->id = $blocks->getNextId(); // Get new id for revision rrecord.
116 // Add block data.
117 $blocks->insert($block);
118 // Get block pins and insert pins for the revision block.
119 $blockPins = $pins->get($blockId);
120 if (!empty($blockPins)) {
121 $pins->insertRaw($block->id, $blockPins);
122 }
123 // Revision current ActiveFileId code record.
124 // Simply, get a copy of it from the target block
125 // and assign the copy to the new created block revision.
126 $codeFile->set('id', $activeFileId)
127 ->set('blockId', $blockId)
128 ->load()
129 ->set('blockId', $block->id)
130 ->save(true, true);
131 }
132
133 /**
134 * Put your comments here...
135 *
136 *
137 * @return
138 */
139 public function dbDriver() {
140 return $this->dbDriver;
141 }
142
143 /**
144 * put your comment there...
145 *
146 * @param mixed $ids
147 */
148 public function delete($ids) {
149 // Allow single or multiple Ids to be passed.
150 if (!is_array($ids)) {
151 $ids = array($ids);
152 }
153 // Create Tables objects.
154 $blocks = new CJTBlocksTable($this->dbDriver);
155 $pins = new CJTBlockPinsTable($this->dbDriver);
156 $codeFile = new CJTBlockFilesTable($this->dbDriver);
157 // Get blocks revisions.
158 $revisions['fields'] = array('id');
159 $revisions['filters']['parent'] = $ids;
160 $revisions['type'] = 'revision';
161 $revisions['result'] = $blocks->get(null, $revisions['fields'], $revisions['filters']);
162 // Revisions ids used as revision key.
163 $revisions = array_keys($revisions['result']);
164 // Delete all revisions for all "DELETED" blocks
165 // only if there is at least one revision.
166 if (!empty($revisions)) {
167 $blocks->delete($revisions);
168 $pins->delete($revisions);
169 // Delete code files.
170 $this->dbDriver->delete(sprintf('DELETE FROM #__cjtoolbox_block_files WHERE blockId IN(%s)', implode(',', $revisions)));
171 }
172 // Delete linked templates.
173 $linkedOnlyTemplatesQuery = 'DELETE FROM #__cjtoolbox_block_templates WHERE blockId IN(%s)';
174 $this->dbDriver->delete(sprintf($linkedOnlyTemplatesQuery, implode(',', $ids)));
175 // Delete associated parameters.
176 $mdlParams = new CJT_Models_Parameters();
177 $mdlParams->delete($ids);
178 // Delete form.
179 $mdlForm = new CJT_Models_Forms();
180 $mdlForm->delete($ids);
181 // Delete blocks.
182 $blocks->delete($ids);
183 $pins->delete($ids);
184 // Delete code files.
185 $this->dbDriver->delete(sprintf('DELETE FROM #__cjtoolbox_block_files WHERE blockId IN(%s)', implode(',', $ids)));
186 // Chaining!
187 return $this;
188 }
189
190 /**
191 * put your comment there...
192 *
193 * @param mixed $block
194 */
195 public static function getAllAssignments($block) {
196
197 $inPages = $block->pages ? $block->pages : [];
198 $inPosts = $block->posts ? $block->posts : [];
199 $inCats = $block->categories ? $block->categories : [];
200 $inTags = $block->post_tags ? $block->post_tags : [];
201 $inLinks = ! empty( $block->links ) ? explode( "\n", $block->links ) : [];
202 $inExps = ! empty( $block->expressions ) ? explode( "\n", $block->expressions ) : [];
203 $inAux = array();
204
205 // Found selected Aux
206 $auxFlags = array(
207 CJTBlockModel::PINS_404_ERROR,
208 CJTBlockModel::PINS_ARCHIVE,
209 CJTBlockModel::PINS_ATTACHMENT,
210 CJTBlockModel::PINS_AUTHOR,
211 CJTBlockModel::PINS_BACKEND,
212 CJTBlockModel::PINS_CATEGORIES_ALL_CATEGORIES,
213 CJTBlockModel::PINS_EXPRESSIONS,
214 CJTBlockModel::PINS_FRONTEND,
215 CJTBlockModel::PINS_PAGES_ALL_PAGES,
216 CJTBlockModel::PINS_POSTS_ALL_POSTS,
217 CJTBlockModel::PINS_POSTS_BLOG_INDEX,
218 CJTBlockModel::PINS_POSTS_RECENT,
219 CJTBlockModel::PINS_SEARCH,
220 CJTBlockModel::PINS_TAG
221 );
222
223 foreach ($auxFlags as $auxFlag) {
224
225 if ($auxFlag & $block->pinPoint) {
226
227 $inAux[] = $auxFlag;
228 }
229
230 }
231
232 $allAssignment = array_merge( $inPages, $inPosts, $inCats, $inTags, $inLinks, $inExps, $inAux );
233
234 return $allAssignment;
235 }
236
237 /**
238 * put your comment there...
239 *
240 * @param mixed $id
241 * @param mixed $fields
242 */
243 public function getBlock($id, $filters = array(), $fields = array('*'), $useDefaultBackupFltr = true) {
244 $blocks = $this->getBlocks($id, $filters, $fields, OBJECT_K, array(), $useDefaultBackupFltr);
245 $block = !empty($blocks) ? reset($blocks) : null;
246 return $block;
247 }
248
249 /**
250 * put your comment there...
251 *
252 * @param mixed $ids
253 */
254 public function getBlocks($ids = array(), $filters = array(), $fields = array('*'), $returnType = OBJECT_K, $orderBy = array(), $useDefaultBackupFltr = true) {
255 // initialize.
256 $blocks = array();
257 $returnCodeFile = isset($filters['returnCodeFile']) && ($filters['returnCodeFile'] == true);
258 unset($filters['returnCodeFile']);
259 // Create Tables objects.
260 $blocksTable = new CJTBlocksTable($this->dbDriver);
261 $pinsTable = new CJTBlockPinsTable($this->dbDriver);
262 $blockFiles = new CJTBlockFilesTable($this->dbDriver);
263 // Read blocks.
264 $blocks = $blocksTable->get($ids, $fields, $filters, $returnType, $orderBy, $useDefaultBackupFltr);
265 // Get only pins for retrieved blocks.
266 $ids = array_keys($blocks);
267 $pins = empty($ids) ? array() : $pinsTable->get($ids);
268 // Push pins into blocks.
269 foreach ($pins as $pin) {
270 // Use pin name as object member.
271 // Each pin is an array.
272 // e.g blocks[ID]->pages[] = PAGE-ID.
273 $blocks[$pin->blockId]->{$pin->pin}[] = $pin->value;
274 }
275 // Get active file code.
276 // There always should be active file unless that the
277 // requested block is never switched by current author before.
278 // However we'll do that only if filters['returnCodeFile'] set to TRUE.
279 if ($returnCodeFile) {
280 foreach ($ids as $id) {
281 if(!$activeFileId = $this->getCurrentAuthorBlockActiveFileId($id)) {
282 // If first time use masterFile ID as he default.
283 $activeFileId = $blocks[$id]->masterFile;
284 }
285 // Retreive code for block code file.
286 $codeFile = (array) $blockFiles->setData(array('blockId' => $id, 'id' => $activeFileId))
287 ->load()
288 ->getData();
289 unset($codeFile['description']);
290 $blocks[$id]->file = (object) $codeFile;
291 // Also return the active file id withing the set.
292 $blocks[$id]->activeFileId = $activeFileId;
293 }
294 }
295 return $blocks;
296 }
297
298 /**
299 * put your comment there...
300 *
301 * @param mixed $blockId
302 * @param mixed $authorId
303 */
304 public function getAuthorBlockActiveFileId($blockId, $authorId = null) {
305 // Get author active file for the requested block.
306 $activeFileId = (int) get_user_meta($authorId, "cjt_block_active_file_{$blockId}", true);
307 // Query block active file.
308 return $activeFileId;
309 }
310
311 /**
312 * put your comment there...
313 *
314 * @param mixed $blockId
315 */
316 public static function getCodeFilesCount($blockId) {
317
318 global $wpdb;
319
320 $query = " SELECT count(*)
321 FROM {$wpdb->prefix}cjtoolbox_block_files f
322 WHERE f.blockId = %d;";
323
324 $query = $wpdb->prepare($query, $blockId);
325
326 $codeFilesCount = $wpdb->get_var($query);
327
328 return $codeFilesCount;
329 }
330
331 /**
332 * put your comment there...
333 *
334 * @param mixed $blockId
335 * @param mixed $authorId
336 */
337 public function getCurrentAuthorBlockActiveFileId($blockId) {
338 return $this->getAuthorBlockActiveFileId($blockId, get_current_user_id());
339 }
340
341 /**
342 * put your comment there...
343 *
344 */
345 public static function getCustomPostTypes()
346 {
347
348 static $postTypes = null;
349
350 if ( $postTypes !== null )
351 {
352 return $postTypes;
353 }
354
355
356 $postTypes = array();
357
358 // Create tabs for every custom post under the custom posts tab.
359 // Get all registered custom posts.
360 $customPosts = get_post_types( array( 'public' => 1, 'show_ui' => true, '_builtin' => false ), 'objects' );
361
362 // Add tab for every custom post
363 // Exclude 'Empty' Custom Post Types.
364 foreach ( $customPosts as $typeName => $customPost )
365 {
366 // Check if has posts.
367 $hasPosts = count( get_posts( array( 'post_type' => $typeName, 'offset' => 0, 'numberposts' => 1 ) ) );
368
369 // Add only types with at least one post exists.
370 if ( $hasPosts )
371 {
372 $postTypes[ $typeName ] = array
373 (
374 'title' => $customPost->labels->name,
375 'renderer' => 'objects-list',
376 'type' => array
377 (
378 'type' => $typeName,
379 'group' => 'posts',
380 'targetType' => 'post'
381 )
382
383 );
384
385 }
386
387 }
388
389 do_action( CJTPluggableHelper::ACTION_BLOCK_CUSTOM_POST_TYPES, $postTypes );
390
391 return $postTypes;
392 }
393
394 /**
395 * put your comment there...
396 *
397 * @param mixed $id
398 */
399 public function getInfo($id) {
400 // Info fields.
401 $infoFields = array('name', 'id', 'owner', 'created', 'lastModified');
402 // Get info fields from db.
403 $blocksTable = new CJTBlocksTable($this->dbDriver);
404 $info = $blocksTable->get($id, $infoFields);
405 // Get user object from id.
406 $info = reset($info);
407 $info->owner = get_userdata($info->owner);
408 // Set shortcode name.
409 $info->shortcode = "[cjtoolbox name='{$info->name}']";
410 return $info;
411 }
412
413 /**
414 * put your comment there...
415 *
416 */
417 public function getOrder() {
418 return get_option('meta-box-order_cjtoolbox');
419 }
420
421 /**
422 * put your comment there...
423 *
424 */
425 public function save() {
426 $this->dbDriver->processQueue();
427 }
428
429 /**
430 * put your comment there...
431 *
432 * @param mixed $order
433 */
434 public function setOrder($order) {
435 $orderOptionName = 'meta-box-order_cjtoolbox';
436 // Update user order so That jQuery sortable Plugin will display them in correct orders!
437 update_user_option(get_current_user_id(), $orderOptionName, $order, true);
438 // Update CENTRALIZED order in the options table!
439 update_option($orderOptionName, $order);
440 }
441
442 /**
443 * put your comment there...
444 *
445 * @param mixed $block
446 */
447 public function update( $block, $updatePins )
448 {
449
450 $block = ( array ) $block;
451
452 $blocks = new CJTBlocksTable( $this->dbDriver );
453 $pins = new CJTBlockPinsTable( $this->dbDriver );
454
455 // Update block pins if requested.
456 if ( $updatePins )
457 {
458 // Isolate block pins freom native block data.
459 $pinsData = array_intersect_key( $block, array_flip( array_keys( CJTBlockModel::getCustomPins() ) ) );
460
461 do_action( CJTPluggableHelper::FILTER_BLOCK_MODEL_PRE_UPDATE_BLOCK_PINS, $block, $pinsData );
462
463 $pins->update( $block[ 'id' ], $pinsData );
464
465 }
466
467 // Update code file
468 if ( isset( $block[ 'activeFileId' ] ) )
469 {
470
471 $codeFile = new CJTBlockFilesTable( $this->dbDriver );
472
473 $codeFile->set( 'blockId', $block[ 'id' ] )
474 ->set( 'id', $block[ 'activeFileId'] )
475 ->set( 'code', $block[ 'code'] )
476 ->save();
477 }
478
479 // Isolate block fields.
480 $blockData = array_intersect_key($block, $blocks->getFields());
481
482 do_action( CJTPluggableHelper::FILTER_BLOCK_MODEL_PRE_UPDATE_BLOCK, $updatePins, $blockData );
483
484 $blocks->update( $blockData );
485
486 }
487
488 } // End class.