From fa2a7201052c22376256e0af4b4ebb2cf03a8033 Mon Sep 17 00:00:00 2001 From: Neo <321592+Neo-Desktop@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:12:27 -0800 Subject: [PATCH] Version 5.0.0 beta 6 --- applications/blog/data/javascript.xml | 4 +- applications/blog/data/lang.xml | 2 +- applications/blog/data/versions.json | 3 +- applications/blog/setup/upg_5000032/data.json | 22 + .../blog/setup/upg_5000032/themeeditor.json | 14 + .../blog/sources/Category/Category.php | 11 +- applications/calendar/data/javascript.xml | 24 +- applications/calendar/data/lang.xml | 2 +- applications/calendar/data/theme.xml | 11 +- applications/calendar/data/versions.json | 3 +- .../calendar/modules/front/calendar/view.php | 100 +--- .../calendar/setup/upg_5000032/data.json | 22 + .../setup/upg_5000032/javascript.json | 14 + .../calendar/setup/upg_5000032/theme.json | 21 + applications/calendar/sources/Event/Event.php | 10 +- applications/cms/data/cms_theme.xml | 75 +-- applications/cms/data/javascript.xml | 38 +- applications/cms/data/lang.xml | 2 +- applications/cms/data/versions.json | 3 +- .../cms/setup/upg_107720/queries.json | 20 + applications/cms/setup/upg_5000032/data.json | 22 + applications/cms/sources/Records/Records.php | 43 +- applications/convert/data/javascript.xml | 4 +- applications/convert/data/lang.xml | 2 +- applications/convert/data/versions.json | 3 +- .../convert/setup/upg_5000032/data.json | 22 + applications/core/data/javascript.xml | 536 +++++++++--------- applications/core/data/lang.xml | 9 +- applications/core/data/schema.json | 42 +- applications/core/data/theme.xml | 326 ++++++----- applications/core/data/versions.json | 3 +- .../MemberACPProfileBlocks/ProfileData.php | 27 +- .../core/ModeratorPermissions/General.php | 1 + .../core/modules/admin/applications/menu.php | 2 +- .../core/modules/admin/editor/emoticons.php | 12 +- .../admin/promotion/advertisements.php | 2 +- .../core/modules/admin/promotion/seo.php | 2 +- .../modules/admin/stats/membersactivity.php | 2 +- .../core/modules/front/discover/tag.php | 79 +-- .../core/modules/front/system/register.php | 2 +- .../core/modules/front/system/themeeditor.php | 2 +- .../core/setup/upg_107018/upgrade.php | 2 +- .../core/setup/upg_107300/upgrade.php | 2 +- .../core/setup/upg_5000015/upgrade.php | 4 +- applications/core/setup/upg_5000032/data.json | 22 + .../core/setup/upg_5000032/javascript.json | 16 + applications/core/setup/upg_5000032/lang.json | 18 + .../core/setup/upg_5000032/theme.json | 41 ++ .../core/setup/upg_5000032/themeeditor.json | 116 ++++ applications/core/sources/Stream/Stream.php | 2 +- applications/downloads/data/javascript.xml | 18 +- applications/downloads/data/lang.xml | 2 +- applications/downloads/data/theme.xml | 14 +- applications/downloads/data/versions.json | 3 +- .../downloads/setup/upg_5000032/data.json | 22 + .../downloads/setup/upg_5000032/theme.json | 19 + .../setup/upg_5000032/themeeditor.json | 14 + applications/forums/data/acpsearch.json | 11 - applications/forums/data/build.xml | 1 - applications/forums/data/javascript.xml | 20 +- applications/forums/data/lang.xml | 2 +- applications/forums/data/theme.xml | 2 +- applications/forums/data/versions.json | 3 +- .../setup/upg_5000032/acpSearchKeywords.json | 7 + .../forums/setup/upg_5000032/data.json | 22 + .../forums/setup/upg_5000032/theme.json | 19 + .../forums/setup/upg_5000032/themeeditor.json | 17 + applications/forums/sources/Forum/Forum.php | 62 +- applications/forums/sources/Topic/Post.php | 21 +- applications/forums/sources/Topic/Topic.php | 12 + applications/gallery/data/javascript.xml | 24 +- applications/gallery/data/lang.xml | 2 +- applications/gallery/data/versions.json | 3 +- .../gallery/setup/upg_5000032/data.json | 22 + .../gallery/sources/Category/Category.php | 14 +- applications/gallery/sources/Image/Image.php | 1 + applications/nexus/data/javascript.xml | 38 +- applications/nexus/data/lang.xml | 4 +- applications/nexus/data/theme.xml | 4 +- applications/nexus/data/versions.json | 3 +- .../nexus/setup/upg_107002/upgrade.php | 2 +- .../nexus/setup/upg_5000032/data.json | 22 + .../nexus/setup/upg_5000032/lang.json | 14 + .../nexus/setup/upg_5000032/theme.json | 19 + .../nexus/setup/upg_5000032/themeeditor.json | 14 + init.php | 4 +- static/css/calendar_front_calendar.css | 2 +- static/css/core_front_core.css | 2 +- .../css/core_global_framework_framework.css | 2 +- static/js/calendar/front_front_overview.js | 2 +- static/js/core/front_front_core.js | 6 +- static/js/global/root_framework.js | 2 +- static/templates/calendar_front_view.php | 14 +- static/templates/core_front_forms.php | 87 ++- static/templates/core_front_global.php | 257 +++++---- static/templates/core_global_forms.php | 2 +- static/templates/downloads_front_view.php | 16 +- static/templates/forums_front_forums.php | 8 + static/templates/nexus_admin_customers.php | 4 +- system/Content/Comment.php | 64 +-- system/Content/Content.php | 20 +- system/Content/Controller.php | 32 +- system/Content/Followable.php | 60 +- system/Content/Item.php | 18 +- system/Content/Review.php | 11 - system/Content/Search/Index.php | 13 +- system/Content/Search/Query.php | 10 +- system/Content/Taggable.php | 9 +- system/Helpers/Menu/Link.php | 11 +- system/Helpers/Menu/Menu.php | 14 +- system/Member/Member.php | 18 +- system/Member/UserMenu.php | 2 +- system/Node/Model.php | 18 + system/Output/Output.php | 11 +- system/Platform/Bridge.php | 7 + 115 files changed, 1823 insertions(+), 1147 deletions(-) create mode 100644 applications/blog/setup/upg_5000032/data.json create mode 100644 applications/blog/setup/upg_5000032/themeeditor.json create mode 100644 applications/calendar/setup/upg_5000032/data.json create mode 100644 applications/calendar/setup/upg_5000032/javascript.json create mode 100644 applications/calendar/setup/upg_5000032/theme.json create mode 100644 applications/cms/setup/upg_107720/queries.json create mode 100644 applications/cms/setup/upg_5000032/data.json create mode 100644 applications/convert/setup/upg_5000032/data.json create mode 100644 applications/core/setup/upg_5000032/data.json create mode 100644 applications/core/setup/upg_5000032/javascript.json create mode 100644 applications/core/setup/upg_5000032/lang.json create mode 100644 applications/core/setup/upg_5000032/theme.json create mode 100644 applications/core/setup/upg_5000032/themeeditor.json create mode 100644 applications/downloads/setup/upg_5000032/data.json create mode 100644 applications/downloads/setup/upg_5000032/theme.json create mode 100644 applications/downloads/setup/upg_5000032/themeeditor.json create mode 100644 applications/forums/setup/upg_5000032/acpSearchKeywords.json create mode 100644 applications/forums/setup/upg_5000032/data.json create mode 100644 applications/forums/setup/upg_5000032/theme.json create mode 100644 applications/forums/setup/upg_5000032/themeeditor.json create mode 100644 applications/gallery/setup/upg_5000032/data.json create mode 100644 applications/nexus/setup/upg_5000032/data.json create mode 100644 applications/nexus/setup/upg_5000032/lang.json create mode 100644 applications/nexus/setup/upg_5000032/theme.json create mode 100644 applications/nexus/setup/upg_5000032/themeeditor.json diff --git a/applications/blog/data/javascript.xml b/applications/blog/data/javascript.xml index 8942fa70..9071a8f0 100644 --- a/applications/blog/data/javascript.xml +++ b/applications/blog/data/javascript.xml @@ -1,6 +1,6 @@ - - \ "); diff --git a/applications/blog/data/lang.xml b/applications/blog/data/lang.xml index d279506f..fc615fd3 100644 --- a/applications/blog/data/lang.xml +++ b/applications/blog/data/lang.xml @@ -1,6 +1,6 @@ - + Blogs Blogs a comment on a blog entry diff --git a/applications/blog/data/versions.json b/applications/blog/data/versions.json index cd12cedb..2c69c0f9 100644 --- a/applications/blog/data/versions.json +++ b/applications/blog/data/versions.json @@ -280,5 +280,6 @@ "5000028": "5.0.0 Beta 2", "5000029": "5.0.0 Beta 3", "5000030": "5.0.0 Beta 4", - "5000031": "5.0.0 Beta 5" + "5000031": "5.0.0 Beta 5", + "5000032": "5.0.0 Beta 6" } \ No newline at end of file diff --git a/applications/blog/setup/upg_5000032/data.json b/applications/blog/setup/upg_5000032/data.json new file mode 100644 index 00000000..08854d11 --- /dev/null +++ b/applications/blog/setup/upg_5000032/data.json @@ -0,0 +1,22 @@ +{ + "id": 5000032, + "name": "5.0.0 Beta 6", + "steps": { + "queries": false, + "lang": false, + "theme": false, + "themeeditor": true, + "javascript": false, + "emailTemplates": false, + "acpSearchKeywords": false, + "settings": false, + "tasks": false, + "modules": false, + "widgets": false, + "customOptions": false, + "customRoutines": false + }, + "forceMainUpgrader": false, + "forceManualDownloadNoCiC": false, + "forceManualDownloadCiC": false +} \ No newline at end of file diff --git a/applications/blog/setup/upg_5000032/themeeditor.json b/applications/blog/setup/upg_5000032/themeeditor.json new file mode 100644 index 00000000..6493d217 --- /dev/null +++ b/applications/blog/setup/upg_5000032/themeeditor.json @@ -0,0 +1,14 @@ +{ + "categories": { + "added": [], + "edited": [], + "removed": [] + }, + "settings": { + "added": [], + "edited": [ + "layout_blog_view" + ], + "removed": [] + } +} \ No newline at end of file diff --git a/applications/blog/sources/Category/Category.php b/applications/blog/sources/Category/Category.php index 23270a69..5a5593e7 100644 --- a/applications/blog/sources/Category/Category.php +++ b/applications/blog/sources/Category/Category.php @@ -162,7 +162,12 @@ class Category extends Model $class = get_called_class(); - $form->add( new Node( 'category_parent', $this->id ? $this->parent : 0, TRUE, array( 'class' => 'IPS\blog\Category', 'subnodes' => FALSE, 'zeroVal' => 'no_parent', 'permissionCheck' => function( $node ) use ( $class ) + $form->add( new Node( 'category_parent', $this->id ? $this->parent : 0, TRUE, [ + 'class' => Category::class, + 'subnodes' => FALSE, + 'zeroVal' => 'no_parent', + 'disableCopy' => true, + 'permissionCheck' => function( $node ) use ( $class ) { if( isset( $class::$subnodeClass ) AND $class::$subnodeClass AND $node instanceof $class::$subnodeClass ) { @@ -170,7 +175,9 @@ class Category extends Model } return !isset( Request::i()->id ) or ( $node->id != Request::i()->id and !$node->isChildOf( $node::load( Request::i()->id ) ) ); - } ) ) ); + } + ] + ) ); parent::form( $form ); } diff --git a/applications/calendar/data/javascript.xml b/applications/calendar/data/javascript.xml index 8190ec10..11b891ee 100644 --- a/applications/calendar/data/javascript.xml +++ b/applications/calendar/data/javascript.xml @@ -1,6 +1,6 @@ - - - - - - - - - /** + /** * Invision Community * (c) Invision Power Services, Inc. - https://www.invisioncommunity.com * @@ -2113,7 +2113,7 @@ var PER_PAGE = 16; }); }(jQuery, _)); - \ ");]]> -
diff --git a/applications/calendar/data/lang.xml b/applications/calendar/data/lang.xml index f458e127..df3964a4 100644 --- a/applications/calendar/data/lang.xml +++ b/applications/calendar/data/lang.xml @@ -1,6 +1,6 @@ - + Events Events a comment on an event diff --git a/applications/calendar/data/theme.xml b/applications/calendar/data/theme.xml index 0879f28d..1bced61e 100644 --- a/applications/calendar/data/theme.xml +++ b/applications/calendar/data/theme.xml @@ -1797,7 +1797,7 @@ {$comment->html()|raw} {{endforeach}} {{else}} -

{lang="no_comments"}

+

{lang="no_comments"}

{{endif}} {template="commentMultimod" app="core" group="global" params="$event"} @@ -1807,7 +1807,7 @@ {$event->commentPagination( array( 'tab' ) )|raw} {{endif}} {{if $event->commentForm() || $event->locked() || \IPS\Member::loggedIn()->restrict_post || \IPS\Member::loggedIn()->members_bitoptions['unacknowledged_warnings'] || !\IPS\Member::loggedIn()->checkPostsPerDay()}} -
+
{{if $event->commentForm()}} {{if $event->locked()}}

{lang="event_locked_can_comment"}

@@ -3059,13 +3059,12 @@ tr td:not(:first-child):not(.cCalendar_firstDay) .cEvents_ranged .cEvents_event: /* Listing */ .cEvent__onlineLogo{ - inset: auto; - bottom: 5px; - inset-inline-end: 5px; + place-self: end; + margin: 5px; background: var(--i-background_1); padding: 8px 12px; pointer-events: none; - border-start-start-radius: var(--i-box--bo-ra); + border-radius: inherit; } .cEvent__onlineLogo svg{ diff --git a/applications/calendar/data/versions.json b/applications/calendar/data/versions.json index cd12cedb..2c69c0f9 100644 --- a/applications/calendar/data/versions.json +++ b/applications/calendar/data/versions.json @@ -280,5 +280,6 @@ "5000028": "5.0.0 Beta 2", "5000029": "5.0.0 Beta 3", "5000030": "5.0.0 Beta 4", - "5000031": "5.0.0 Beta 5" + "5000031": "5.0.0 Beta 5", + "5000032": "5.0.0 Beta 6" } \ No newline at end of file diff --git a/applications/calendar/modules/front/calendar/view.php b/applications/calendar/modules/front/calendar/view.php index 1209a56f..2cbd5e8b 100644 --- a/applications/calendar/modules/front/calendar/view.php +++ b/applications/calendar/modules/front/calendar/view.php @@ -754,9 +754,7 @@ class view extends Controller $select = 'calendar_events.*, core_clubs.name'; $sort = 'event_start_date asc'; $location = NULL; - $having = []; $where = []; - $where[] = ['event_approved=?', 1]; $searchNearLocation = FALSE; // Should results be limited to near the provided location only? If not, we'll just use location to allow sorting. if( $values = $form->values() ) @@ -840,93 +838,14 @@ class view extends Controller $startDate = Date::dateTimeToCalendarDate( $values['date']['start'] ?: $today ); $endDate = $values['date']['end'] ? Date::dateTimeToCalendarDate( $values['date']['end'] ) : NULL; - /* Get timezone adjusted versions of start/end time */ - $startDateTimezone = Date::parseTime( $startDate->mysqlDatetime(), TRUE ); - $endDateTimezone = ( $endDate !== NULL ) ? Date::parseTime( $endDate->mysqlDatetime() ) : NULL; - - if ( $member->timezone ) - { - $startDateTimezone->setTimezone( new DateTimeZone( 'UTC' ) ); - - if( $endDateTimezone !== NULL ) - { - $endDateTimezone->setTimezone( new DateTimeZone( 'UTC' ) ); - } - } - - if( $endDate !== NULL AND $startDate == $endDate ) - { - $where[] = array( - '( - ( event_end_date IS NULL AND DATE( event_start_date ) = ? AND event_all_day=1 ) - OR - ( event_end_date IS NOT NULL AND DATE( event_start_date ) <= ? AND DATE( event_end_date ) >= ? AND event_all_day=1 ) - OR - ( event_end_date IS NULL AND event_start_date >= ? AND event_start_date <= ? AND event_all_day=0 ) - OR - ( event_end_date IS NOT NULL AND event_start_date <= ? AND event_end_date >= ? AND event_all_day=0 ) - )', - $startDate->mysqlDatetime( FALSE ), - $endDate->mysqlDatetime( FALSE ), - $startDate->mysqlDatetime( FALSE ), - $startDateTimezone->mysqlDatetime(), - $startDateTimezone->adjust('+1 day')->mysqlDatetime(), - $endDateTimezone->adjust('+1 day')->mysqlDatetime(), - $startDateTimezone->mysqlDatetime() - ); - } - elseif( $endDate !== NULL ) - { - $where[] = array( - '( - ( event_end_date IS NULL AND DATE( event_start_date ) >= ? AND DATE( event_start_date ) <= ? AND event_all_day=1 ) - OR - ( event_end_date IS NOT NULL AND DATE( event_start_date ) <= ? AND DATE( event_end_date ) >= ? AND event_all_day=1 ) - OR - ( event_end_date IS NULL AND event_start_date >= ? AND event_start_date <= ? AND event_all_day=0 ) - OR - ( event_end_date IS NOT NULL AND event_start_date <= ? AND event_end_date >= ? AND event_all_day=0 ) - )', - $startDate->mysqlDatetime( FALSE ), - $endDate->mysqlDatetime( FALSE ), - $endDate->mysqlDatetime( FALSE ), - $startDate->mysqlDatetime( FALSE ), - $startDateTimezone->mysqlDatetime(), - $endDateTimezone->mysqlDatetime(), - $endDateTimezone->mysqlDatetime(), - $startDateTimezone->mysqlDatetime() - ); - } - else - { - $where[] = array( - "( - ( DATE( event_start_date ) >= ? AND event_all_day=1 ) - OR - ( event_start_date >= ? AND event_all_day=0 ) - OR - ( event_end_date IS NOT NULL AND DATE( event_start_date ) <= ? AND DATE( event_end_date ) >= ? AND event_all_day=1 ) - OR - ( event_end_date IS NOT NULL AND event_start_date <= ? AND event_end_date >= ? AND event_all_day=0 ) - )", - $startDate->mysqlDatetime( FALSE ), - $startDateTimezone->mysqlDatetime(), - $startDate->mysqlDatetime( FALSE ), - $startDate->mysqlDatetime( FALSE ), - $startDateTimezone->adjust('+1 day')->mysqlDatetime(), - $startDateTimezone->mysqlDatetime() - ); - } - - $offset = isset( Request::i()->offset ) ? intval( Request::i()->offset ) : 0; - $limit = isset( Request::i()->limit ) ? min( array( intval( Request::i()->limit ), 50 ) ) : 20; - $query = Db::i()->select( $select, 'calendar_events', $where, $sort, array( $offset, $limit ), NULL, implode( " OR ", $having ) ); - $query->join( 'calendar_calendars', "event_calendar_id = cal_id" ); - $query->join( 'core_clubs', "cal_club_id = id" ); - - $results = new ActiveRecordIterator( $query, '\IPS\calendar\Event' ); + $results = Event::retrieveEvents( $startDate, $endDate, null, null, false, null, null, false, $location, null, $where ); } + $totalCount = count( $results ); + $offset = isset( Request::i()->offset ) ? intval( Request::i()->offset ) : 0; + $limit = isset( Request::i()->limit ) ? min( array( intval( Request::i()->limit ), 50 ) ) : 20; + $results = array_slice( $results, $offset, $limit, true ); + $mapMarkers = array(); foreach ( $results as $event ) { @@ -938,18 +857,15 @@ class view extends Controller if( Request::i()->isAjax() ) { - $countQuery = Db::i()->select( $select, 'calendar_events', $where, NULL, array(), NULL, is_array( $having ) ? implode( " OR ", $having ) : NULL ); - $countQuery->join( 'calendar_calendars', "event_calendar_id = cal_id" ); - $countQuery->join( 'core_clubs', "cal_club_id = id" ); - $output = Theme::i()->getTemplate( 'events' )->searchResults( $results ); Member::loggedIn()->language()->parseOutputForDisplay( $output ); $toReturn = array( - 'totalCount' => $countQuery->count(), + 'totalCount' => $totalCount, 'count' => count( $results ), 'content' => $output, 'markers' => $mapMarkers, + 'markerCount' => count( $mapMarkers ), 'blurb' => '', // @todo 'online' => ( Request::i()->show == 'online' ) ); diff --git a/applications/calendar/setup/upg_5000032/data.json b/applications/calendar/setup/upg_5000032/data.json new file mode 100644 index 00000000..ae3f1513 --- /dev/null +++ b/applications/calendar/setup/upg_5000032/data.json @@ -0,0 +1,22 @@ +{ + "id": 5000032, + "name": "5.0.0 Beta 6", + "steps": { + "queries": false, + "lang": false, + "theme": true, + "themeeditor": false, + "javascript": true, + "emailTemplates": false, + "acpSearchKeywords": false, + "settings": false, + "tasks": false, + "modules": false, + "widgets": false, + "customOptions": false, + "customRoutines": false + }, + "forceMainUpgrader": false, + "forceManualDownloadNoCiC": false, + "forceManualDownloadCiC": false +} \ No newline at end of file diff --git a/applications/calendar/setup/upg_5000032/javascript.json b/applications/calendar/setup/upg_5000032/javascript.json new file mode 100644 index 00000000..0e2484ae --- /dev/null +++ b/applications/calendar/setup/upg_5000032/javascript.json @@ -0,0 +1,14 @@ +{ + "files": { + "added": [], + "edited": [ + "calendar\/front\/controllers\/overview\/ips.overview.search.js" + ], + "removed": [] + }, + "orders": { + "added": [], + "edited": [], + "removed": [] + } +} \ No newline at end of file diff --git a/applications/calendar/setup/upg_5000032/theme.json b/applications/calendar/setup/upg_5000032/theme.json new file mode 100644 index 00000000..8cf4ff50 --- /dev/null +++ b/applications/calendar/setup/upg_5000032/theme.json @@ -0,0 +1,21 @@ +{ + "html": { + "added": [], + "edited": [ + "front\/view\/comments" + ], + "removed": [] + }, + "css": { + "added": [], + "edited": [ + "front\/calendar.css" + ], + "removed": [] + }, + "resources": { + "added": [], + "edited": [], + "removed": [] + } +} \ No newline at end of file diff --git a/applications/calendar/sources/Event/Event.php b/applications/calendar/sources/Event/Event.php index 7827cdc7..5ffec07a 100644 --- a/applications/calendar/sources/Event/Event.php +++ b/applications/calendar/sources/Event/Event.php @@ -2004,10 +2004,11 @@ class Event extends Item implements Embeddable, /** * Create Notification * - * @param string|NULL $extra Additional data + * @param mixed $extra Additional data + * @param Comment|null $comment * @return Notification */ - protected function createNotification( ?string $extra=NULL ) : Notification + public function createNotification( mixed $extra=NULL, ?Comment $comment=null ): Notification { // New content is sent with itself as the item as we deliberately do not group notifications about new content items. Unlike comments where you're going to read them all - you might scan the notifications list for topic titles you're interested in return new Notification( Application::load( 'calendar' ), 'new_content', $this, array( $this ) ); @@ -2080,12 +2081,13 @@ class Event extends Item implements Embeddable, * @param bool $skipPermissions Skip permission checks (used by REST API to fetch all events which are filtered on later) * @param array|null $location Array of item lat and long * @param int|null $online Online events? + * @param array|null $where Additional where clause * @return ActiveRecordIterator|array * @see \IPS\Content\_Item::getItemsWithPermission() */ - public static function retrieveEvents( Date $startDate, Date $endDate=NULL, Calendar|array $calendar=NULL, int $limit=NULL, bool $formatEvents=TRUE, Member $member=NULL, Venue $venue=NULL, bool $skipPermissions=FALSE, array $location = NULL, ?int $online = NULL ): ActiveRecordIterator|array + public static function retrieveEvents( Date $startDate, Date $endDate=NULL, Calendar|array $calendar=NULL, int $limit=NULL, bool $formatEvents=TRUE, Member $member=NULL, Venue $venue=NULL, bool $skipPermissions=FALSE, array $location = NULL, ?int $online = NULL, ?array $where=null ): ActiveRecordIterator|array { - $where = array(); + $where = is_array( $where ) ? $where : array(); if ( $calendar !== NULL ) { diff --git a/applications/cms/data/cms_theme.xml b/applications/cms/data/cms_theme.xml index d62d693c..bb4eff07 100644 --- a/applications/cms/data/cms_theme.xml +++ b/applications/cms/data/cms_theme.xml @@ -816,36 +816,36 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi ]]> -