Autodoc
  • Namespace
  • Class
  • Tree

Namespaces

  • BlueTihi
    • Context
  • Brickrouge
    • Element
      • Nodes
    • Renderer
    • Widget
  • ICanBoogie
    • ActiveRecord
    • AutoConfig
    • CLDR
    • Composer
    • Core
    • Event
    • Exception
    • HTTP
      • Dispatcher
      • Request
    • I18n
      • Translator
    • Mailer
    • Modules
      • Taxonomy
        • Support
      • Thumbnailer
        • Versions
    • Object
    • Operation
      • Dispatcher
    • Prototype
    • Routes
    • Routing
      • Dispatcher
    • Session
  • Icybee
    • ActiveRecord
      • Model
    • ConfigOperation
    • Document
    • EditBlock
    • Element
      • ActionbarContextual
      • ActionbarSearch
      • ActionbarToolbar
    • FormBlock
    • Installer
    • ManageBlock
    • Modules
      • Articles
      • Cache
        • Collection
        • ManageBlock
      • Comments
        • ManageBlock
      • Contents
        • ManageBlock
      • Dashboard
      • Editor
        • Collection
      • Files
        • File
        • ManageBlock
      • Forms
        • Form
        • ManageBlock
      • I18n
      • Images
        • ManageBlock
      • Members
      • Modules
        • ManageBlock
      • Nodes
        • ManageBlock
        • Module
      • Pages
        • BreadcrumbElement
        • LanguagesElement
        • ManageBlock
        • NavigationBranchElement
        • NavigationElement
        • Page
        • PageController
      • Registry
      • Search
      • Seo
      • Sites
        • ManageBlock
      • Taxonomy
        • Terms
          • ManageBlock
        • Vocabulary
          • ManageBlock
      • Users
        • ManageBlock
        • NonceLogin
        • Roles
      • Views
        • ActiveRecordProvider
        • Collection
        • View
    • Operation
      • ActiveRecord
      • Constructor
      • Module
      • Widget
    • Rendering
  • None
  • Patron
  • PHP

Classes

  • Blueprint
  • BlueprintNode
  • BreadcrumbElement
  • Content
  • ContentModel
  • CopyOperation
  • DeleteOperation
  • EditBlock
  • ExportBlock
  • ExportOperation
  • Hooks
  • ImportOperation
  • LanguagesElement
  • ListView
  • ManageBlock
  • Model
  • Module
  • NavigationBranchElement
  • NavigationElement
  • NavigationExcludeOperation
  • NavigationIncludeOperation
  • Page
  • PageController
  • PopPage
  • PopTemplate
  • QueryOperationOperation
  • SaveOperation
  • TemplateEditorsOperation
  • UpdateTreeOperation
  1 <?php
  2 
  3 /*
  4  * This file is part of the Icybee package.
  5  *
  6  * (c) Olivier Laviale <olivier.laviale@gmail.com>
  7  *
  8  * For the full copyright and license information, please view the LICENSE
  9  * file that was distributed with this source code.
 10  */
 11 
 12 namespace Icybee\Modules\Pages;
 13 
 14 use ICanBoogie\ActiveRecord\Query;
 15 
 16 use Icybee\ManageBlock\Options;
 17 
 18 class ManageBlock extends \Icybee\Modules\Nodes\ManageBlock
 19 {
 20     static protected function add_assets(\Brickrouge\Document $document)
 21     {
 22         parent::add_assets($document);
 23 
 24         $document->css->add('manage.css');
 25         $document->js->add('manage.js');
 26     }
 27 
 28     public function __construct(Module $module, array $attributes=array())
 29     {
 30         parent::__construct
 31         (
 32             $module, $attributes + array
 33             (
 34                 self::T_COLUMNS_ORDER => array
 35                 (
 36                     'title', 'url', 'is_navigation_excluded', 'is_online', 'uid', 'updated_at'
 37                 ),
 38 
 39                 self::T_ORDER_BY => null
 40             )
 41         );
 42     }
 43 
 44     /**
 45      * Adds the following columns:
 46      *
 47      * - `title`: An instance of {@link ManageBlock\TitleColumn}.
 48      * - `url`: An instance of {@link ManageBlock\URLColumn}.
 49      * - `is_navigation_excluded`: An instance of {@link ManageBlock\IsNavigationExcluded}.
 50      */
 51     protected function get_available_columns()
 52     {
 53         return array_merge(parent::get_available_columns(), array(
 54 
 55             'title' => __CLASS__ . '\TitleColumn',
 56             'url' => __CLASS__ . '\URLColumn',
 57             'is_navigation_excluded' => __CLASS__ . '\IsNavigationExcluded'
 58         ));
 59     }
 60 
 61     /**
 62      * Adds the following jobs:
 63      *
 64      * - `copy`: Copy the selected nodes.
 65      */
 66     protected function get_available_jobs()
 67     {
 68         return array_merge(parent::get_available_jobs(), array
 69         (
 70             'copy' => 'Copier'
 71         ));
 72     }
 73 
 74     protected function render_jobs(array $jobs)
 75     {
 76         $html = parent::render_jobs($jobs);
 77 
 78         return <<<EOT
 79 $html
 80 
 81 <div data-actionbar-context="update-tree">
 82     <i class="icon-sitemap context-icon"></i><button class="btn" data-action="cancel">Annuler</button>
 83     <button class="btn btn-primary" data-action="save">Enregistrer les modifications</button>
 84 </div>
 85 
 86 EOT;
 87     }
 88 
 89     protected $mode = 'tree';
 90 
 91     protected function get_mode()
 92     {
 93         return $this->mode;
 94     }
 95 
 96     protected $expand_highlight;
 97 
 98     /**
 99      * Overrides the method to add support for expanded tree nodes.
100      *
101      * The methods adds the `expanded` option which is used to store expanded tree nodes. The
102      * option is initialized with first level pages.
103      */
104     protected function update_options(Options $options, array $modifiers)
105     {
106         $options = parent::update_options($options, $modifiers);
107 
108         if (!isset($options->expanded))
109         {
110             $options->expanded = array();
111         }
112 
113         if (isset($modifiers['expand']) || isset($modifiers['collapse']))
114         {
115             $expanded = array_flip($options->expanded);
116 
117             if (isset($modifiers['expand']))
118             {
119                 $nid = $this->expand_highlight = filter_var($modifiers['expand'], FILTER_VALIDATE_INT);
120                 $expanded[$nid] = true;
121             }
122 
123             if (isset($modifiers['collapse']))
124             {
125                 unset($expanded[filter_var($modifiers['collapse'], FILTER_VALIDATE_INT)]);
126             }
127 
128             $options->expanded = array_keys($expanded);
129         }
130 
131         if ($options->order_by == 'title')
132         {
133             $options->order_by = null;
134         }
135 
136         if ($options->filters || $options->order_by || $options->search)
137         {
138             $this->mode = 'flat';
139         }
140 
141         return $options;
142     }
143 
144     /**
145      * Fetches the records according to the query and the display mode.
146      *
147      * The method is overrode if the dispay mode is `tree` in which case the records are fetched
148      * accroding to their relashion and the _expand_ state of their parent.
149      */
150     protected function fetch_records(Query $query)
151     {
152         global $core;
153 
154         if ($this->mode !== 'tree')
155         {
156             return parent::fetch_records($query);
157         }
158 
159         $expanded = array_flip($this->options->expanded);
160 
161         return $query->model->blueprint($core->site_id)->subset(null, null, function(BlueprintNode $node) use($expanded) {
162 
163             return !(!$node->parentid || isset($expanded[$node->parentid]));
164 
165         })->ordered_records;
166     }
167 
168     /**
169      * Replaces the limiter by a simple count if the records are displayed as a tree.
170      */
171     protected function render_controls()
172     {
173         if ($this->mode !== 'tree')
174         {
175             return parent::render_controls();
176         }
177 
178         $count = $this->t(':count pages', array(':count' => $this->count));
179 
180         # A `SELECT` element is added to have the same height as the jobs element.
181 
182         return <<<EOT
183 <div class="listview-controls">
184     $count
185 </div>
186 EOT;
187     }
188 
189     protected function render_rows(array $rows)
190     {
191         $view_ids = $this->module->model('contents')
192         ->select('pageid, content')
193         ->where('contentid = "body" AND editor = "view"')
194         ->pairs;
195 
196         $rendered_rows = parent::render_rows($rows);
197         $records = array_values($this->records);
198 
199         foreach ($rendered_rows as $i => $row)
200         {
201             $row->add_class('entry');
202             $row->add_class('draggable');
203 
204             $record = $records[$i];
205             $nid = $record->nid;
206 
207             if ($this->expand_highlight && $record->parentid == $this->expand_highlight)
208             {
209                 $row->add_class('volatile-highlight');
210             }
211 
212             if (isset($view_ids[$nid]))
213             {
214                 $row->add_class('view');
215             }
216 
217             if ($record->pattern)
218             {
219                 $row->add_class('pattern');
220             }
221 
222             if ($record->locationid)
223             {
224                 $row->add_class('location');
225             }
226 
227             $row['id'] = "nid:{$nid}"; // TODO-20130627: deprecate this, or use 'data-nid' or maybe move this to manager with a data-key on the TR.
228         }
229 
230         return $rendered_rows;
231     }
232 }
233 
234 namespace Icybee\Modules\Pages\ManageBlock;
235 
236 use ICanBoogie\Routing\Pattern;
237 
238 use Brickrouge\Element;
239 use Brickrouge\Text;
240 
241 use Icybee\ManageBlock\Column;
242 use Icybee\ManageBlock\BooleanColumn;
243 
244 class TitleColumn extends \Icybee\Modules\Nodes\ManageBlock\TitleColumn
245 {
246     public function render_cell($record)
247     {
248         $rc = '';
249 
250         if ($this->manager->mode == 'tree')
251         {
252             $rc .= str_repeat('<div class="indentation">&nbsp;</div>', $record->depth);
253             $rc .= '<div class="handle"><i class="icon-move"></i></div>';
254 
255             if (0)
256             {
257                 $rc .= new Text
258                 (
259                     array
260                     (
261                         Element::LABEL => 'w',
262                         Element::LABEL_POSITION => 'before',
263                         'name' => 'weights[' . $record->nid . ']',
264                         'value' => $record->weight,
265                         'size' => 3,
266                         'style' => 'border: none; background: transparent; color: green'
267                     )
268                 );
269 
270                 $rc .= '&nbsp;';
271 
272                 $rc .= new Text
273                 (
274                     array
275                     (
276                         Element::LABEL => 'p',
277                         Element::LABEL_POSITION => 'before',
278                         'name' => 'parents[' . $record->nid . ']',
279                         'value' => $record->parentid,
280                         'size' => 3,
281                         'style' => 'border: none; background: transparent; color: green'
282                     )
283                 );
284             }
285             else
286             {
287                 /*
288                 $rc .= new Element
289                 (
290                     'input', array
291                     (
292                         'name' => 'weights[' . $entry->nid . ']',
293                         'type' => 'hidden',
294                         'value' => $entry->weight
295                     )
296                 );
297 
298                 $rc .= '&nbsp;';
299                 */
300 
301                 $rc .= new Element
302                 (
303                     'input', array
304                     (
305                         'name' => 'parents[' . $record->nid . ']',
306                         'type' => 'hidden',
307                         'value' => $record->parentid
308                     )
309                 );
310             }
311         }
312 
313         $rc .= parent::render_cell($record);
314 
315         if (0)
316         {
317             $rc .= ' <small style="color: green">:' . $record->nid . '</small>';
318         }
319 
320         if ($this->manager->mode == 'tree' && $record->has_child)
321         {
322             $expanded = in_array($record->nid, $this->manager->options->expanded);
323 
324             $rc .= ' <a class="treetoggle" href="?' . ($expanded ? 'collapse' : 'expand') . '=' . $record->nid . '">' . ($expanded ? '-' : "+{$record->descendents_count}") . '</a>';
325         }
326 
327         #
328         # updated_at
329         #
330 
331         $now = time();
332         $updated_at = strtotime($record->updated_at);
333 
334         if ($now - $updated_at < 7200)
335         {
336             $rc .= ' <sup style="vertical-align: text-top; color: red;">Récemment modifié</sup>';
337         }
338 
339         return $rc;
340     }
341 }
342 
343 /**
344  * Representation of the `url` column.
345  */
346 class URLColumn extends \Icybee\Modules\Nodes\ManageBlock\URLColumn
347 {
348     public function render_cell($record)
349     {
350         global $core;
351 
352         $t = $this->manager->t;
353         $options = $this->manager->options;
354         $pattern = $record->url_pattern;
355 
356         if ($options->search || $options->filters)
357         {
358             if (Pattern::is_pattern($pattern))
359             {
360                 return;
361             }
362 
363             $url = $record->url;
364 
365             // DIRTY-20100507
366 
367             if ($record->location)
368             {
369                 $location = $record->location;
370                 $title = $t('This page is redirected to: !title (!url)', array('!title' => $location->title, '!url' => $location->url));
371 
372                 return <<<EOT
373 <span class="small">
374 <i class="icon-mail-forward" title="$title"></i>
375 <a href="$url">$url</a>
376 </span>
377 EOT;
378             }
379 
380             return <<<EOT
381 <span class="small"><a href="$url">$url</a></span>
382 EOT;
383         }
384 
385         $rc = '';
386         $location = $record->location;
387 
388         if ($location)
389         {
390             $rc .= '<span class="icon-mail-forward" title="' . $t('This page is redirected to: !title (!url)', array('!title' => $location->title, '!url' => $location->url)) . '"></span>';
391         }
392         else if (!Pattern::is_pattern($pattern))
393         {
394             $url = ($core->site_id == $record->siteid) ? $record->url : $record->absolute_url;
395 
396             $title = $t('Go to the page: !url', array('!url' => $url));
397 
398             $rc .= '<a href="' . $url . '" title="' . $title . '" target="_blank"><i class="icon-external-link"></i></a>';
399         }
400 
401         return $rc;
402     }
403 }
404 
405 /**
406  * Representation of the `is_navigation_excluded` column.
407  */
408 class IsNavigationExcluded extends BooleanColumn
409 {
410     public function __construct(\Icybee\ManageBlock $manager, $id, array $options=array())
411     {
412         parent::__construct
413         (
414             $manager, $id, $options + array
415             (
416                 'title' => null,
417                 'filters' => array
418                 (
419                     'options' => array
420                     (
421                         '=1' => 'Excluded from navigation',
422                         '=0' => 'Included in navigation'
423                     )
424                 ),
425 
426                 'sortable' => false
427             )
428         );
429     }
430 
431     public function render_cell($record)
432     {
433         return new Element
434         (
435             'i', array
436             (
437                 'class' => 'icon-sitemap trigger ' . ($record->is_navigation_excluded ? 'on' : ''),
438                 'data-nid' => $record->nid,
439                 'title' => "Inclure ou exclure la page du menu de navigation principal"
440             )
441         );
442     }
443 }
Autodoc API documentation generated by ApiGen 2.8.0