PluginProbe
CSS & JavaScript Toolbox / 8.3.1
CSS & JavaScript Toolbox v8.3.1
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 / block.php

block.php in CSS & JavaScript Toolbox 8.3.1, at models/block.php

362 lines 8.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @version $ Id; block-ajax.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 /**
12 * Model base class.
13 */
14 require_once CJTOOLBOX_MVC_FRAMEWOK . '/model.inc.php';
15
16 /**
17 * Represent single block object.
18 *
19 * Provide simple access read or write to block properties.
20 *
21 * @author Ahmed Said
22 * @version 6
23 */
24 class CJTBlockModel extends CJTModel {
25
26 /**
27 * Global scope pins
28 */
29 const PINS_FRONTEND = 0x01;
30 const PINS_BACKEND = 0x02;
31
32 /**
33 * Pages Pins.
34 */
35 const PINS_PAGES_ALL_PAGES = 0x10;
36 const PINS_PAGES_CUSTOM_PAGE = 0x20;
37 const PINS_PAGES_FRONT_PAGE = 0x40;
38
39 /**
40 * Posts Pins.
41 */
42 const PINS_POSTS_ALL_POSTS = 0x100;
43 const PINS_POSTS_CUSTOM_POST = 0x200;
44 const PINS_POSTS_RECENT = 0x400;
45 const PINS_POSTS_BLOG_INDEX = 0x800;
46
47 /**
48 * Categories Pins.
49 */
50 const PINS_CATEGORIES_ALL_CATEGORIES = 0x1000;
51 const PINS_CATEGORIES_CUSTOM_CATEGORY = 0x2000;
52
53 /**
54 * Other general pages pins.
55 */
56 const PINS_SEARCH = 0x10000;
57 const PINS_ARCHIVE = 0x20000;
58 const PINS_TAG = 0x40000;
59 const PINS_AUTHOR = 0x80000;
60 const PINS_ATTACHMENT = 0x100000;
61 const PINS_404_ERROR = 0x200000;
62
63 /**
64 *
65 */
66 const PINS_LINKS = 0x1000000;
67 const PINS_EXPRESSIONS = 0x2000000;
68
69 /**
70 *
71 */
72 const PINS_LINK_EXPRESSION = 0x3000000;
73
74 /**
75 * put your comment there...
76 *
77 * @var mixed
78 */
79 private static $customPins;
80
81 /**
82 * put your comment there...
83 *
84 * @var mixed
85 */
86 private $propertiesMeta = array
87 (
88 'name' => array(),
89 'pinPoint' => array(),
90 'state' => array(),
91 'location' => array(),
92 'code' => array(),
93 'links' => array(),
94 'expressions' => array(),
95 'id' => array(),
96 );
97
98 /**
99 * Create block object.
100 *
101 * @param integer Block id.
102 * @param array Block data array or null to use default data.
103 * @return void
104 */
105 public function __construct( $values = array() )
106 {
107 // Allow pluggable custom pins
108 $customPins = self::getCustomPins();
109
110 // Allow pluggable fields
111 $this->propertiesMeta = apply_filters( CJTPluggableHelper::FILTER_BLOCK_MODEL_PROPERTIES_META, $this->propertiesMeta );
112
113 // Merge prpperties meta wioth custom pins to create one full propertiesMeta objetc
114 // that hold both fields and custom pins fields
115 $this->propertiesMeta = array_merge( $this->propertiesMeta, $customPins );
116
117 // Properties backward compatibolity to hold all available properties
118 $this->properties = array_combine(
119
120 array_keys( $this->propertiesMeta ),
121
122 array_fill( 0, count( $this->propertiesMeta ), null )
123
124 );
125
126 // Set block properties.
127 $this->setValues( $values );
128 }
129
130 /**
131 * Get block property value.
132 *
133 * @param string Property name.
134 * @return mixed Property value.
135 */
136 public function __get( $property )
137 {
138
139 // Return default values
140 $value = ( ( $this->properties[ $property ] === null ) &&
141 ( isset( $this->propertiesMeta[ $property ][ 'default' ] ) ) ) ?
142
143 $this->propertiesMeta[ $property ][ 'default' ] :
144 $this->properties[ $property ];
145
146 return $value;
147 }
148
149 /**
150 * Set block proprty value.
151 *
152 * @param string Property name.
153 * @param mixed Property value.
154 * @return void
155 */
156 public function __set($property, $value)
157 {
158 switch ( $property )
159 {
160 case 'code':
161
162 case 'links':
163
164 case 'expressions':
165
166 // New lines submitted to server as CRLF but displayed in browser as LF.
167 // PHP script and JS work on two different versions of texts.
168 // Replace CRLF with LF just as displayed in browsers.
169 $value = preg_replace( "/\x0D\x0A/", "\x0A", $value );
170
171 break;
172 }
173
174 $this->properties[ $property ] = $value;
175 }
176
177 /**
178 * put your comment there...
179 *
180 * @param mixed $blockData
181 */
182 public static function arrangePins( & $blockData )
183 {
184
185 $pinsGroupNames = array_flip( array_merge( array_keys( self::getCustomPins() ), array( 'pinPoint' ) ) );
186 $dbDriver = cssJSToolbox::getInstance()->getDBDriver();
187 $mdlBlock = new CJTBlocksModel();
188 $block = $mdlBlock->getBlock( $blockData->id, array(), array( 'id', 'pinPoint' ) );
189 $submittedPins = array_intersect_key( ( ( array ) $blockData ), $pinsGroupNames );
190 $assignedPins = array_intersect_key( ( ( array ) $block ), $pinsGroupNames );
191
192 // Transfer assigned PinPoint from "FLAGGED INTEGER" TO "ARRAY" like
193 // the other pins.
194 $assignedPins[ 'pinPoint' ] = array_keys( CJT_Models_Block_Assignmentpanel_Helpers_Auxiliary
195 ::getInstance()
196 ->getPinsArray( $assignedPins[ 'pinPoint' ] ) );
197
198 // Walk through all assigned pins.
199 // Unassigned any item with 'value=false'.
200 // Whenever an item is found on the submitted
201 // pins it should be removed from the submitted list
202 foreach ( $submittedPins as $groupName => $submittedGroup )
203 {
204 // Get assigned pins group if found
205 if ( ! isset( $assignedPins[ $groupName ] ) )
206 {
207 // Initialize new assigned group array.
208 $assignedPins[ $groupName ] = array();
209 }
210
211 $assignedGroup =& $assignedPins[ $groupName ];
212
213 // For every submitted item there is three types.
214 // 1. Already assigned :WHEN: (sync == true and value == true)
215 // 2. Unassigned :WHEN: (value == false)
216 // 3. Newly assigned :WHEN: (sync = false).
217 foreach ( $submittedGroup as $submittedPinId => $submittedPin )
218 {
219 // Unassigned pin
220 if ( ! $submittedPin[ 'value' ] )
221 {
222 // Find the submittedPinId AssignedPins index.
223 $assignedIndex = array_search( $submittedPinId, $assignedGroup );
224 // Unassigned it :REMOVE FROM ARRAY:
225 unset( $assignedGroup[ $assignedIndex ] );
226 }
227 else if ( ! $submittedPin[ 'sync' ] )
228 {
229 // Add newly assigned item.
230 $assignedGroup[] = $submittedPinId;
231 }
232
233 }
234
235 }
236
237 // Copy all assigned pins back to the block object.
238 foreach ( $assignedPins as $groupName => $finalGroupAssigns )
239 {
240 $blockData->{$groupName} = $finalGroupAssigns;
241 }
242
243 // Important for caller short-circle condition.
244 return true;
245 }
246
247 /**
248 * put your comment there...
249 *
250 * @deprecated Use calculatePinpoint
251 */
252 public static function calculateBlockPinPoint( & $block )
253 {
254
255 // Generate PinPoint Value.
256 if ( isset( $block->pinPoint ) && is_array( $block->pinPoint ) )
257 {
258 $pinPoint = 0;
259
260 // Each item is a bit flag.
261 foreach ( $block->pinPoint as $pin )
262 {
263 $pinPoint |= hexdec($pin);
264 }
265
266 }
267 else
268 {
269 // Provided as integer or not even provided!
270 if ( ! isset( $block->pinPoint ) )
271 {
272 $block->pinPoint = 0;
273 }
274
275 $pinPoint = (int) $block->pinPoint;
276 }
277
278 // Pin should be set only for not empty properties.
279 // This help us retreiving only needed blocks when querying blocks code.
280 $pins = array
281 (
282 self::PINS_LINKS => 'links',
283 self::PINS_EXPRESSIONS => 'expressions',
284 );
285
286 $customPins = self::getCustomPins();
287
288 // Add Custom Pins to pins to be calculated below
289 foreach ( $customPins as $customPinName => $customPin )
290 {
291 $pins[ $customPin[ 'pinValue' ] ] = $customPinName;
292 }
293
294 foreach ( $pins as $flag => $pin )
295 {
296 $pinPoint |= abs( ( int ) ( ! empty( $block->{$pin} ) ) ) * $flag;
297 }
298
299 $block->pinPoint = $pinPoint;
300
301 return $block;
302 }
303
304 /**
305 * put your comment there...
306 *
307 * @param mixed $block
308 * @param mixed $pins
309 */
310 public static function calculatePinPoint( $block, $pins )
311 {
312 // Add pins to Block object so that calculateBlockPinPoint can calculate PinPoint value!
313 $block = ( object ) array_merge( $block, $pins );
314
315 $pinPoint = self::calculateBlockPinPoint( $block )->pinPoint;
316
317 return $pinPoint;
318 }
319
320 /**
321 * put your comment there...
322 *
323 */
324 public static function getCustomPins()
325 {
326 static $pins = array
327 (
328 'pages' => array
329 (
330
331 'default' => array(),
332 'pinValue' => self::PINS_PAGES_CUSTOM_PAGE
333
334 ),
335
336 'posts' => array
337 (
338
339 'default' => array(),
340 'pinValue' => self::PINS_POSTS_CUSTOM_POST
341
342 ),
343
344 'categories' => array
345 (
346
347 'default' => array(),
348 'pinValue' => self::PINS_CATEGORIES_CUSTOM_CATEGORY
349
350 ),
351 );
352
353 // Cache custom pins
354 if ( ! self::$customPins )
355 {
356 self::$customPins = apply_filters( CJTPluggableHelper::FILTER_BLOCK_MODEL_CUSTOM_PINS, $pins );
357 }
358
359 return self::$customPins;
360 }
361
362 } // End class.