PluginProbe
CSS & JavaScript Toolbox / 11.7
CSS & JavaScript Toolbox v11.7
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 11.7, at models/block.php

361 lines 8.0 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 // Return default values
139 $value = ( isset( $this->properties[ $property ] ) && ( $this->properties[ $property ] === null ) &&
140 ( isset( $this->propertiesMeta[ $property ][ 'default' ] ) ) ) ?
141
142 $this->propertiesMeta[ $property ][ 'default' ] :
143 ( isset( $this->properties[ $property ] ) ? $this->properties[ $property ] : null );
144
145 return $value;
146 }
147
148 /**
149 * Set block proprty value.
150 *
151 * @param string Property name.
152 * @param mixed Property value.
153 * @return void
154 */
155 public function __set($property, $value)
156 {
157 switch ( $property )
158 {
159 case 'code':
160
161 case 'links':
162
163 case 'expressions':
164
165 // New lines submitted to server as CRLF but displayed in browser as LF.
166 // PHP script and JS work on two different versions of texts.
167 // Replace CRLF with LF just as displayed in browsers.
168 $value = preg_replace( "/\x0D\x0A/", "\x0A", $value );
169
170 break;
171 }
172
173 $this->properties[ $property ] = $value;
174 }
175
176 /**
177 * put your comment there...
178 *
179 * @param mixed $blockData
180 */
181 public static function arrangePins( & $blockData )
182 {
183
184 $pinsGroupNames = array_flip( array_merge( array_keys( self::getCustomPins() ), array( 'pinPoint' ) ) );
185 $dbDriver = cssJSToolbox::getInstance()->getDBDriver();
186 $mdlBlock = new CJTBlocksModel();
187 $block = $mdlBlock->getBlock( $blockData->id, array(), array( 'id', 'pinPoint' ) );
188 $submittedPins = array_intersect_key( ( ( array ) $blockData ), $pinsGroupNames );
189 $assignedPins = array_intersect_key( ( ( array ) $block ), $pinsGroupNames );
190
191 // Transfer assigned PinPoint from "FLAGGED INTEGER" TO "ARRAY" like
192 // the other pins.
193 $assignedPins[ 'pinPoint' ] = array_keys( CJT_Models_Block_Assignmentpanel_Helpers_Auxiliary
194 ::getInstance()
195 ->getPinsArray( $assignedPins[ 'pinPoint' ] ) );
196
197 // Walk through all assigned pins.
198 // Unassigned any item with 'value=false'.
199 // Whenever an item is found on the submitted
200 // pins it should be removed from the submitted list
201 foreach ( $submittedPins as $groupName => $submittedGroup )
202 {
203 // Get assigned pins group if found
204 if ( ! isset( $assignedPins[ $groupName ] ) )
205 {
206 // Initialize new assigned group array.
207 $assignedPins[ $groupName ] = array();
208 }
209
210 $assignedGroup =& $assignedPins[ $groupName ];
211
212 // For every submitted item there is three types.
213 // 1. Already assigned :WHEN: (sync == true and value == true)
214 // 2. Unassigned :WHEN: (value == false)
215 // 3. Newly assigned :WHEN: (sync = false).
216 foreach ( $submittedGroup as $submittedPinId => $submittedPin )
217 {
218 // Unassigned pin
219 if ( ! $submittedPin[ 'value' ] )
220 {
221 // Find the submittedPinId AssignedPins index.
222 $assignedIndex = array_search( $submittedPinId, $assignedGroup );
223 // Unassigned it :REMOVE FROM ARRAY:
224 unset( $assignedGroup[ $assignedIndex ] );
225 }
226 else if ( ! $submittedPin[ 'sync' ] )
227 {
228 // Add newly assigned item.
229 $assignedGroup[] = $submittedPinId;
230 }
231
232 }
233
234 }
235
236 // Copy all assigned pins back to the block object.
237 foreach ( $assignedPins as $groupName => $finalGroupAssigns )
238 {
239 $blockData->{$groupName} = $finalGroupAssigns;
240 }
241
242 // Important for caller short-circle condition.
243 return true;
244 }
245
246 /**
247 * put your comment there...
248 *
249 * @deprecated Use calculatePinpoint
250 */
251 public static function calculateBlockPinPoint( & $block )
252 {
253
254 // Generate PinPoint Value.
255 if ( isset( $block->pinPoint ) && is_array( $block->pinPoint ) )
256 {
257 $pinPoint = 0;
258
259 // Each item is a bit flag.
260 foreach ( $block->pinPoint as $pin )
261 {
262 $pinPoint |= hexdec($pin);
263 }
264
265 }
266 else
267 {
268 // Provided as integer or not even provided!
269 if ( ! isset( $block->pinPoint ) )
270 {
271 $block->pinPoint = 0;
272 }
273
274 $pinPoint = (int) $block->pinPoint;
275 }
276
277 // Pin should be set only for not empty properties.
278 // This help us retreiving only needed blocks when querying blocks code.
279 $pins = array
280 (
281 self::PINS_LINKS => 'links',
282 self::PINS_EXPRESSIONS => 'expressions',
283 );
284
285 $customPins = self::getCustomPins();
286
287 // Add Custom Pins to pins to be calculated below
288 foreach ( $customPins as $customPinName => $customPin )
289 {
290 $pins[ $customPin[ 'pinValue' ] ] = $customPinName;
291 }
292
293 foreach ( $pins as $flag => $pin )
294 {
295 $pinPoint |= abs( ( int ) ( ! empty( $block->{$pin} ) ) ) * $flag;
296 }
297
298 $block->pinPoint = $pinPoint;
299
300 return $block;
301 }
302
303 /**
304 * put your comment there...
305 *
306 * @param mixed $block
307 * @param mixed $pins
308 */
309 public static function calculatePinPoint( $block, $pins )
310 {
311 // Add pins to Block object so that calculateBlockPinPoint can calculate PinPoint value!
312 $block = ( object ) array_merge( $block, $pins );
313
314 $pinPoint = self::calculateBlockPinPoint( $block )->pinPoint;
315
316 return $pinPoint;
317 }
318
319 /**
320 * put your comment there...
321 *
322 */
323 public static function getCustomPins()
324 {
325 static $pins = array
326 (
327 'pages' => array
328 (
329
330 'default' => array(),
331 'pinValue' => self::PINS_PAGES_CUSTOM_PAGE
332
333 ),
334
335 'posts' => array
336 (
337
338 'default' => array(),
339 'pinValue' => self::PINS_POSTS_CUSTOM_POST
340
341 ),
342
343 'categories' => array
344 (
345
346 'default' => array(),
347 'pinValue' => self::PINS_CATEGORIES_CUSTOM_CATEGORY
348
349 ),
350 );
351
352 // Cache custom pins
353 if ( ! self::$customPins )
354 {
355 self::$customPins = apply_filters( CJTPluggableHelper::FILTER_BLOCK_MODEL_CUSTOM_PINS, $pins );
356 }
357
358 return self::$customPins;
359 }
360
361 } // End class.