Dotclear

source: inc/core/class.dc.rs.extensions.php @ 3424:7b8434cae028

Revision 3424:7b8434cae028, 21.3 KB checked in by Jean-Christian Denis, 9 years ago (diff)

Fix HTML validation on RDF EntryPingData?, closes #2073

Line 
1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3# This file is part of Dotclear 2.
4#
5# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
6# Licensed under the GPL version 2.0 license.
7# See LICENSE file or
8# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
9#
10# -- END LICENSE BLOCK -----------------------------------------
11if (!defined('DC_RC_PATH')) { return; }
12
13/**
14@ingroup DC_CORE
15@brief Dotclear post record helpers.
16
17This class adds new methods to database post results.
18You can call them on every record comming from dcBlog::getPosts and similar
19methods.
20
21@warning You should not give the first argument (usualy $rs) of every described
22function.
23*/
24class rsExtPost
25{
26     /**
27     Returns whether post is editable.
28
29     @param    rs   Invisible parameter
30     @return   <b>boolean</b>
31     */
32     public static function isEditable($rs)
33     {
34          # If user is admin or contentadmin, true
35          if ($rs->core->auth->check('contentadmin',$rs->core->blog->id)) {
36               return true;
37          }
38
39          # No user id in result ? false
40          if (!$rs->exists('user_id')) {
41               return false;
42          }
43
44          # If user is usage and owner of the entrie
45          if ($rs->core->auth->check('usage',$rs->core->blog->id)
46          && $rs->user_id == $rs->core->auth->userID()) {
47               return true;
48          }
49
50          return false;
51     }
52
53     /**
54     Returns whether post is deletable
55
56     @param    rs   Invisible parameter
57     @return   <b>boolean</b>
58     */
59     public static function isDeletable($rs)
60     {
61          # If user is admin, or contentadmin, true
62          if ($rs->core->auth->check('contentadmin',$rs->core->blog->id)) {
63               return true;
64          }
65
66          # No user id in result ? false
67          if (!$rs->exists('user_id')) {
68               return false;
69          }
70
71          # If user has delete rights and is owner of the entrie
72          if ($rs->core->auth->check('delete',$rs->core->blog->id)
73          && $rs->user_id == $rs->core->auth->userID()) {
74               return true;
75          }
76
77          return false;
78     }
79
80     /**
81     Returns whether post is the first one of its day.
82
83     @param    rs   Invisible parameter
84     @return   <b>boolean</b>
85     */
86     public static function firstPostOfDay($rs)
87     {
88          if ($rs->isStart()) {
89               return true;
90          }
91
92          $cdate = date('Ymd',strtotime($rs->post_dt));
93          $rs->movePrev();
94          $ndate = date('Ymd',strtotime($rs->post_dt));
95          $rs->moveNext();
96          return $ndate != $cdate;
97     }
98
99     /**
100     Returns whether post is the last one of its day.
101
102     @param    rs   Invisible parameter
103     @return   <b>boolean</b>
104     */
105     public static function lastPostOfDay($rs)
106     {
107          if ($rs->isEnd()) {
108               return true;
109          }
110
111          $cdate = date('Ymd',strtotime($rs->post_dt));
112          $rs->moveNext();
113          $ndate = date('Ymd',strtotime($rs->post_dt));
114          $rs->movePrev();
115          return $ndate != $cdate;
116     }
117
118     /**
119     Returns whether comments are enabled on post.
120
121     @param    rs   Invisible parameter
122     @return   <b>boolean</b>
123     */
124     public static function commentsActive($rs)
125     {
126          return
127          $rs->core->blog->settings->system->allow_comments
128          && $rs->post_open_comment
129          && ($rs->core->blog->settings->system->comments_ttl == 0 ||
130          time()-($rs->core->blog->settings->system->comments_ttl*86400) < $rs->getTS());
131     }
132
133     /**
134     Returns whether trackbacks are enabled on post.
135
136     @param    rs   Invisible parameter
137     @return   <b>boolean</b>
138     */
139     public static function trackbacksActive($rs)
140     {
141          return
142          $rs->core->blog->settings->system->allow_trackbacks
143          && $rs->post_open_tb
144          && ($rs->core->blog->settings->system->trackbacks_ttl == 0 ||
145          time()-($rs->core->blog->settings->system->trackbacks_ttl*86400) < $rs->getTS());
146     }
147
148     /**
149     Returns whether post has at least one comment.
150
151     @param    rs   Invisible parameter
152     @return   <b>boolean</b>
153     */
154     public static function hasComments($rs)
155     {
156          return $rs->nb_comment > 0;
157     }
158
159     /**
160     Returns whether post has at least one trackbacks.
161
162     @return   <b>boolean</b>
163     */
164     public static function hasTrackbacks($rs)
165     {
166          return $rs->nb_trackback > 0;
167     }
168
169     /**
170     Returns whether post has been updated since publication.
171
172     @return <b>boolean</b>
173     */
174     public static function isRepublished($rs)
175     {
176          return ($rs->getTS('upddt') + dt::getTimeOffset($rs->post_tz)) > $rs->getTS();
177     }
178
179     /**
180     Returns full post URL.
181
182     @param    rs   Invisible parameter
183     @return   <b>string</b>
184     */
185     public static function getURL($rs)
186     {
187          return $rs->core->blog->url.$rs->core->getPostPublicURL(
188                    $rs->post_type,html::sanitizeURL($rs->post_url)
189               );
190     }
191
192     /**
193     Returns full post category URL.
194
195     @param    rs   Invisible parameter
196     @return   <b>string</b>
197     */
198     public static function getCategoryURL($rs)
199     {
200          return $rs->core->blog->url.$rs->core->url->getURLFor('category',html::sanitizeURL($rs->cat_url));
201     }
202
203     /**
204     Returns whether post has an excerpt.
205
206     @param    rs   Invisible parameter
207     @return   <b>boolean</b>
208     */
209     public static function isExtended($rs)
210     {
211          return $rs->post_excerpt_xhtml != '';
212     }
213
214     /**
215     Returns post timestamp.
216
217     @param    rs   Invisible parameter
218     @param    type <b>string</b>       (dt|upddt|creadt) defaults to post_dt
219     @return   <b>integer</b>
220     */
221     public static function getTS($rs,$type='')
222     {
223          if ($type == 'upddt') {
224               return strtotime($rs->post_upddt);
225          } elseif ($type == 'creadt') {
226               return strtotime($rs->post_creadt);
227          } else {
228               return strtotime($rs->post_dt);
229          }
230     }
231
232     /**
233     Returns post date formating according to the ISO 8601 standard.
234
235     @param    rs   Invisible parameter
236     @param    type <b>string</b>       (dt|upddt|creadt) defaults to post_dt
237     @return   <b>string</b>
238     */
239     public static function getISO8601Date($rs,$type='')
240     {
241          if ($type == 'upddt' || $type == 'creadt') {
242               return dt::iso8601($rs->getTS($type)+dt::getTimeOffset($rs->post_tz),$rs->post_tz);
243          } else {
244               return dt::iso8601($rs->getTS(),$rs->post_tz);
245          }
246     }
247
248     /**
249     Returns post date formating according to RFC 822.
250
251     @param    rs   Invisible parameter
252     @param    type <b>string</b>       (dt|upddt|creadt) defaults to post_dt
253     @return   <b>string</b>
254     */
255     public static function getRFC822Date($rs,$type='')
256     {
257          if ($type == 'upddt' || $type == 'creadt') {
258               return dt::rfc822($rs->getTS($type)+dt::getTimeOffset($rs->post_tz),$rs->post_tz);
259          } else {
260               return dt::rfc822($rs->getTS($type),$rs->post_tz);
261          }
262     }
263
264     /**
265     Returns post date with <var>$format</var> as formatting pattern. If format
266     is empty, uses <var>date_format</var> blog setting.
267
268     @param    rs   Invisible parameter
269     @param    format    <b>string</b>       Date format pattern
270     @param    type <b>string</b>       (dt|upddt|creadt) defaults to post_dt
271     @return   <b>string</b>
272     */
273     public static function getDate($rs,$format,$type='')
274     {
275          if (!$format) {
276               $format = $rs->core->blog->settings->system->date_format;
277          }
278
279          if ($type == 'upddt') {
280               return dt::dt2str($format,$rs->post_upddt,$rs->post_tz);
281          } elseif ($type == 'creadt') {
282               return dt::dt2str($format,$rs->post_creadt,$rs->post_tz);
283          } else {
284               return dt::dt2str($format,$rs->post_dt);
285          }
286     }
287
288     /**
289     Returns post time with <var>$format</var> as formatting pattern. If format
290     is empty, uses <var>time_format</var> blog setting.
291
292     @param    rs   Invisible parameter
293     @param    format    <b>string</b>       Time format pattern
294     @param    type <b>string</b>       (dt|upddt|creadt) defaults to post_dt
295     @return   <b>string</b>
296     */
297     public static function getTime($rs,$format,$type='')
298     {
299          if (!$format) {
300               $format = $rs->core->blog->settings->system->time_format;
301          }
302
303          if ($type == 'upddt') {
304               return dt::dt2str($format,$rs->post_upddt,$rs->post_tz);
305          } elseif ($type == 'creadt') {
306               return dt::dt2str($format,$rs->post_creadt,$rs->post_tz);
307          } else {
308               return dt::dt2str($format,$rs->post_dt);
309          }
310     }
311
312     /**
313     Returns author common name using user_id, user_name, user_firstname and
314     user_displayname fields.
315
316     @param    rs   Invisible parameter
317     @return   <b>string</b>
318     */
319     public static function getAuthorCN($rs)
320     {
321          return dcUtils::getUserCN($rs->user_id, $rs->user_name,
322          $rs->user_firstname, $rs->user_displayname);
323     }
324
325     /**
326     Returns author common name with a link if he specified one in its
327     preferences.
328
329     @param    rs   Invisible parameter
330     @return   <b>string</b>
331     */
332     public static function getAuthorLink($rs)
333     {
334          $res = '%1$s';
335          $url = $rs->user_url;
336          if ($url) {
337               $res = '<a href="%2$s">%1$s</a>';
338          }
339
340          return sprintf($res,html::escapeHTML($rs->getAuthorCN()),html::escapeHTML($url));
341     }
342
343     /**
344     Returns author e-mail address. If <var>$encoded</var> is true, "@" sign is
345     replaced by "%40" and "." by "%2e".
346
347     @param    rs   Invisible parameter
348     @param    encoded   <b>boolean</b>      Encode address.
349     @return   <b>string</b>
350     */
351     public static function getAuthorEmail($rs,$encoded=true)
352     {
353          if ($encoded) {
354               return strtr($rs->user_email,array('@'=>'%40','.'=>'%2e'));
355          }
356          return $rs->user_email;
357     }
358
359     /**
360     Returns post feed unique ID.
361
362     @param    rs   Invisible parameter
363     @return   <b>string</b>
364     */
365     public static function getFeedID($rs)
366     {
367          return 'urn:md5:'.md5($rs->core->blog->uid.$rs->post_id);
368
369          $url = parse_url($rs->core->blog->url);
370          $date_part = date('Y-m-d',strtotime($rs->post_creadt));
371
372          return 'tag:'.$url['host'].','.$date_part.':'.$rs->post_id;
373     }
374
375     /**
376     Returns trackback RDF information block in HTML comment.
377
378     @param    rs   Invisible parameter
379     @return   <b>string</b>
380     */
381     public static function getTrackbackData($rs,$format='html')
382     {
383          return
384          ($format == 'xml' ? "<![CDATA[>\n" : '').
385          "<!--\n".
386          '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"'."\n".
387          '  xmlns:dc="http://purl.org/dc/elements/1.1/"'."\n".
388          '  xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">'."\n".
389          "<rdf:Description\n".
390          '  rdf:about="'.$rs->getURL().'"'."\n".
391          '  dc:identifier="'.$rs->getURL().'"'."\n".
392          '  dc:title="'.htmlspecialchars($rs->post_title,ENT_COMPAT,'UTF-8').'"'."\n".
393          '  trackback:ping="'.$rs->getTrackbackLink().'" />'."\n".
394          "</rdf:RDF>\n".
395          ($format == 'xml' ? "<!]]><!--" : '').
396          "-->\n";
397     }
398
399     /**
400     Returns post trackback full URL.
401
402     @param    rs   Invisible parameter
403     @return   <b>string</b>
404     */
405     public static function getTrackbackLink($rs)
406     {
407          return $rs->core->blog->url.$rs->core->url->getURLFor('trackback',$rs->post_id);
408     }
409
410     /**
411     Returns post content. If <var>$absolute_urls</var> is true, appends full
412     blog URL to each relative post URLs.
413
414     @param    rs   Invisible parameter
415     @param    absolute_urls  <b>boolean</b>      With absolute URLs
416     @return   <b>string</b>
417     */
418     public static function getContent($rs,$absolute_urls=false)
419     {
420          if ($absolute_urls) {
421               return html::absoluteURLs($rs->post_content_xhtml,$rs->getURL());
422          } else {
423               return $rs->post_content_xhtml;
424          }
425     }
426
427     /**
428     Returns post excerpt. If <var>$absolute_urls</var> is true, appends full
429     blog URL to each relative post URLs.
430
431     @param    rs   Invisible parameter
432     @param    absolute_urls  <b>boolean</b>      With absolute URLs
433     @return   <b>string</b>
434     */
435     public static function getExcerpt($rs,$absolute_urls=false)
436     {
437          if ($absolute_urls) {
438               return html::absoluteURLs($rs->post_excerpt_xhtml,$rs->getURL());
439          } else {
440               return $rs->post_excerpt_xhtml;
441          }
442     }
443
444     /**
445     Returns post media count using a subquery.
446
447     @param    rs   Invisible parameter
448     @return   <b>integer</b>
449     */
450     public static function countMedia($rs,$link_type=null)
451     {
452          if (isset($rs->_nb_media[$rs->index()]))
453          {
454               return $rs->_nb_media[$rs->index()];
455          }
456          else
457          {
458               $strReq =
459               'SELECT count(media_id) '.
460               'FROM '.$rs->core->prefix.'post_media '.
461               'WHERE post_id = '.(integer) $rs->post_id.' ';
462               if ($link_type != null) {
463                    $strReq .= "AND link_type = '".$rs->core->con->escape($link_type)."'";
464               }
465
466               $res = (integer) $rs->core->con->select($strReq)->f(0);
467               $rs->_nb_media[$rs->index()] = $res;
468               return $res;
469          }
470     }
471}
472
473/**
474@ingroup DC_CORE
475@brief Dotclear comment record helpers.
476
477This class adds new methods to database comment results.
478You can call them on every record comming from dcBlog::getComments and similar
479methods.
480
481@warning You should not give the first argument (usualy $rs) of every described
482function.
483*/
484class rsExtComment
485{
486     /**
487     Returns comment date with <var>$format</var> as formatting pattern. If
488     format is empty, uses <var>date_format</var> blog setting.
489
490     @param    rs   Invisible parameter
491     @param    format    <b>string</b>       Date format pattern
492     @param    type <b>string</b>       (dt|upddt) defaults to comment_dt
493     @return   <b>string</b>
494     */
495     public static function getDate($rs,$format,$type='')
496     {
497          if (!$format) {
498               $format = $rs->core->blog->settings->system->date_format;
499          }
500
501          if ($type == 'upddt') {
502               return dt::dt2str($format,$rs->comment_upddt,$rs->comment_tz);
503          } else {
504               return dt::dt2str($format,$rs->comment_dt);
505          }
506     }
507
508     /**
509     Returns comment time with <var>$format</var> as formatting pattern. If
510     format is empty, uses <var>time_format</var> blog setting.
511
512     @param    rs   Invisible parameter
513     @param    format    <b>string</b>       Date format pattern
514     @param    type <b>string</b>       (dt|upddt) defaults to comment_dt
515     @return   <b>string</b>
516     */
517     public static function getTime($rs,$format,$type='')
518     {
519          if (!$format) {
520               $format = $rs->core->blog->settings->system->time_format;
521          }
522
523          if ($type == 'upddt') {
524               return dt::dt2str($format,$rs->comment_updt,$rs->comment_tz);
525          } else {
526               return dt::dt2str($format,$rs->comment_dt);
527          }
528     }
529
530     /**
531     Returns comment timestamp.
532
533     @param    rs   Invisible parameter
534     @param    type <b>string</b>       (dt|upddt) defaults to comment_dt
535     @return   <b>integer</b>
536     */
537     public static function getTS($rs,$type='')
538     {
539          if ($type == 'upddt') {
540               return strtotime($rs->comment_upddt);
541          } else {
542               return strtotime($rs->comment_dt);
543          }
544     }
545
546     /**
547     Returns comment date formating according to the ISO 8601 standard.
548
549     @param    rs   Invisible parameter
550     @param    type <b>string</b>       (dt|upddt) defaults to comment_dt
551     @return   <b>string</b>
552     */
553     public static function getISO8601Date($rs,$type='')
554     {
555          if ($type == 'upddt') {
556               return dt::iso8601($rs->getTS($type)+dt::getTimeOffset($rs->comment_tz),$rs->comment_tz);
557          } else {
558               return dt::iso8601($rs->getTS(),$rs->comment_tz);
559          }
560     }
561
562     /**
563     Returns comment date formating according to RFC 822.
564
565     @param    rs   Invisible parameter
566     @param    type <b>string</b>       (dt|upddt) defaults to comment_dt
567     @return   <b>string</b>
568     */
569     public static function getRFC822Date($rs,$type='')
570     {
571          if ($type == 'upddt') {
572               return dt::rfc822($rs->getTS($type)+dt::getTimeOffset($rs->comment_tz),$rs->comment_tz);
573          } else {
574               return dt::rfc822($rs->getTS(),$rs->comment_tz);
575          }
576     }
577
578     /**
579     Returns comment content. If <var>$absolute_urls</var> is true, appends full
580     blog URL to each relative post URLs.
581
582     @param    rs   Invisible parameter
583     @param    absolute_urls  <b>boolean</b>      With absolute URLs
584     @return   <b>string</b>
585     */
586     public static function getContent($rs,$absolute_urls=false)
587     {
588          $res = $rs->comment_content;
589
590          if ($rs->core->blog->settings->system->comments_nofollow) {
591               $res = preg_replace_callback('#<a(.*?href=".*?".*?)>#ms',array('self','noFollowURL'),$res);
592          }
593
594          if ($absolute_urls) {
595               $res = html::absoluteURLs($res,$rs->getPostURL());
596          }
597
598          return $res;
599     }
600
601     private static function noFollowURL($m)
602     {
603          if (preg_match('/rel="nofollow"/',$m[1])) {
604               return $m[0];
605          }
606
607          return '<a'.$m[1].' rel="nofollow">';
608     }
609
610     /**
611     Returns comment author link to his website if he specified one.
612
613     @param    rs   Invisible parameter
614     @return   <b>string</b>
615     */
616     public static function getAuthorURL($rs)
617     {
618          if (trim($rs->comment_site)) {
619               return trim($rs->comment_site);
620          }
621     }
622
623     /**
624     Returns comment post full URL.
625
626     @param    rs   Invisible parameter
627     @return   <b>string</b>
628     */
629     public static function getPostURL($rs)
630     {
631          return $rs->core->blog->url.$rs->core->getPostPublicURL(
632                    $rs->post_type,html::sanitizeURL($rs->post_url)
633               );
634     }
635
636     /**
637     Returns comment author name in a link to his website if he specified one.
638
639     @param    rs   Invisible parameter
640     @return   <b>string</b>
641     */
642     public static function getAuthorLink($rs)
643     {
644          $res = '%1$s';
645          $url = $rs->getAuthorURL();
646          if ($url) {
647               $res = '<a href="%2$s"%3$s>%1$s</a>';
648          }
649
650          $nofollow = '';
651          if ($rs->core->blog->settings->system->comments_nofollow) {
652               $nofollow = ' rel="nofollow"';
653          }
654
655          return sprintf($res,html::escapeHTML($rs->comment_author),html::escapeHTML($url),$nofollow);
656     }
657
658     /**
659     Returns comment author e-mail address. If <var>$encoded</var> is true,
660     "@" sign is replaced by "%40" and "." by "%2e".
661
662     @param    rs   Invisible parameter
663     @param    encoded   <b>boolean</b>      Encode address.
664     @return   <b>string</b>
665     */
666     public static function getEmail($rs,$encoded=true)
667     {
668          if ($encoded) {
669               return strtr($rs->comment_email,array('@'=>'%40','.'=>'%2e'));
670          }
671          return $rs->comment_email;
672     }
673
674     /**
675     Returns trackback site title if comment is a trackback.
676
677     @param    rs   Invisible parameter
678     @return   <b>string</b>
679     */
680     public static function getTrackbackTitle($rs)
681     {
682          if ($rs->comment_trackback == 1 &&
683          preg_match('|<p><strong>(.*?)</strong></p>|msU',$rs->comment_content,
684          $match)) {
685               return html::decodeEntities($match[1]);
686          }
687     }
688
689     /**
690     Returns trackback content if comment is a trackback.
691
692     @param    rs   Invisible parameter
693     @return   <b>string</b>
694     */
695     public static function getTrackbackContent($rs)
696     {
697          if ($rs->comment_trackback == 1) {
698               return preg_replace('|<p><strong>.*?</strong></p>|msU','',
699               $rs->comment_content);
700          }
701     }
702
703     /**
704     Returns comment feed unique ID.
705
706     @param    rs   Invisible parameter
707     @return   <b>string</b>
708     */
709     public static function getFeedID($rs)
710     {
711          return 'urn:md5:'.md5($rs->core->blog->uid.$rs->comment_id);
712
713          $url = parse_url($rs->core->blog->url);
714          $date_part = date('Y-m-d',strtotime($rs->comment_dt));
715
716          return 'tag:'.$url['host'].','.$date_part.':'.$rs->comment_id;
717     }
718
719     /**
720     Returns whether comment is from the post author.
721
722     @param    rs   Invisible parameter
723     @return   <b>boolean</b>
724     */
725     public static function isMe($rs)
726     {
727          return
728          $rs->comment_email && $rs->comment_site &&
729          $rs->comment_email == $rs->user_email &&
730          $rs->comment_site == $rs->user_url;
731     }
732}
733
734/**
735@ingroup DC_CORE
736@brief Dotclear dates record helpers.
737
738This class adds new methods to database dates results.
739You can call them on every record comming from dcBlog::getDates.
740
741@warning You should not give the first argument (usualy $rs) of every described
742function.
743*/
744class rsExtDates
745{
746     /**
747     @param    rs   Invisible parameter
748     @return   <b>integer</b>      Date timestamp
749     */
750     public static function ts($rs)
751     {
752          return strtotime($rs->dt);
753     }
754
755     /**
756     @param    rs   Invisible parameter
757     @return   <b>string</b>       Date year
758     */
759     public static function year($rs)
760     {
761          return date('Y',strtotime($rs->dt));
762     }
763
764     /**
765     @param    rs   Invisible parameter
766     @return   <b>string</b>       Date month
767     */
768     public static function month($rs)
769     {
770          return date('m',strtotime($rs->dt));
771     }
772
773     /**
774     @param    rs   Invisible parameter
775     @return   <b>integer</b>      Date day
776     */
777     public static function day($rs)
778     {
779          return date('d',strtotime($rs->dt));
780     }
781
782     /**
783     Returns date month archive full URL.
784
785     @param    rs   Invisible parameter
786     @param    core      <b>dcCore</b>       dcCore instance
787     @return   <b>integer</b>
788     */
789     public static function url($rs,$core)
790     {
791          $url = date('Y/m',strtotime($rs->dt));
792
793          return $core->blog->url.$core->url->getURLFor('archive',$url);
794     }
795
796     /**
797     Returns whether date is the first of year.
798
799     @param    rs   Invisible parameter
800     @return   <b>boolean</b>
801     */
802     public static function yearHeader($rs)
803     {
804          if ($rs->isStart()) {
805               return true;
806          }
807
808          $y = $rs->year();
809          $rs->movePrev();
810          $py = $rs->year();
811          $rs->moveNext();
812
813          return $y != $py;
814     }
815
816     /**
817     Returns whether date is the last of year.
818
819     @param    rs   Invisible parameter
820     @return   <b>boolean</b>
821     */
822     public static function yearFooter($rs)
823     {
824          if ($rs->isEnd()) {
825               return true;
826          }
827
828          $y = $rs->year();
829          if ($rs->moveNext()) {
830               $ny = $rs->year();
831               $rs->movePrev();
832               return $y != $ny;
833          }
834          return false;
835
836     }
837}
838
839/**
840@ingroup DC_CORE
841@brief Dotclear dates record helpers.
842
843This class adds new methods to database dates results.
844You can call them on every record comming from dcAuth::checkUser and
845dcCore::getUsers.
846
847@warning You should not give the first argument (usualy $rs) of every described
848function.
849*/
850class rsExtUser
851{
852     private static $sortfield;
853     private static $sortsign;
854     /**
855     Returns a user option.
856
857     @param    rs   Invisible parameter
858     @param    name      <b>string</b>       Option name
859     @return   <b>string</b>
860     */
861     public static function option($rs,$name)
862     {
863          $options = self::options($rs);
864
865          if (isset($options[$name])) {
866               return $options[$name];
867          }
868          return null;
869     }
870
871     /**
872     Returns all user options.
873
874     @param    rs   Invisible parameter
875     @return   <b>array</b>
876     */
877     public static function options($rs)
878     {
879          $options = @unserialize($rs->user_options);
880          if (is_array($options)) {
881               return $options;
882          }
883          return array();
884     }
885
886     /**
887     Converts this record to a {@link extStaticRecord} instance.
888
889     @param    rs   Invisible parameter
890      */
891     public static function toExtStatic($rs)
892     {
893          if ($rs instanceof extStaticRecord) {
894               return $rs;
895          }
896          return new extStaticRecord($rs);
897     }
898}
899
900class rsExtBlog
901{
902     private static $sortfield;
903     private static $sortsign;
904     /**
905     Converts this record to a {@link extStaticRecord} instance.
906
907     @param    rs   Invisible parameter
908      */
909     public static function toExtStatic($rs)
910     {
911          if ($rs instanceof extStaticRecord) {
912               return $rs;
913          }
914          return new extStaticRecord($rs);
915     }
916}
917
918class extStaticRecord extends staticRecord
919{
920     private $sortfield;
921     private $sortsign;
922
923     public function __construct($rs)
924     {
925          parent::__construct($rs->__data,$rs->__info);
926     }
927
928     /**
929     Lexically sort.
930
931     @param    field     <b>string<b>   sort field
932     @param  order  <b>string<b>   sort order
933      */
934     public function lexicalSort($field,$order='asc')
935     {
936          $this->sortfield = $field;
937          $this->sortsign = strtolower($order) == 'asc' ? 1 : -1;
938
939          usort($this->__data,array($this,'lexicalSortCallback'));
940
941          $this->sortfield = null;
942          $this->sortsign = null;
943     }
944     private function lexicalSortCallback($a,$b)
945     {
946          $a = $a[$this->sortfield];
947          $b = $b[$this->sortfield];
948
949          # Integer values
950          if ($a == (string) (integer) $a && $b == (string) (integer) $b) {
951               $a = (integer) $a;
952               $b = (integer) $b;
953               return ($a - $b) * $this->sortsign;
954          }
955
956          return strcoll(strtolower(dcUtils::removeDiacritics($a)),strtolower(dcUtils::removeDiacritics($b))) * $this->sortsign;
957     }
958}
Note: See TracBrowser for help on using the repository browser.

Sites map