Skip to content
2 changes: 1 addition & 1 deletion adm/style/settings_add_edit.html
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ <h3>{{ lang('WARNING') }}</h3>
<dl>
<dt><label for="board_announcements_description">{{ lang('BOARD_ANNOUNCEMENTS_DESC') ~ lang('COLON') }}</label><br><span>{{ lang('BOARD_ANNOUNCEMENTS_DESC_EXPLAIN') }}</span></dt>
<dd>
<input name="board_announcements_description" type="text" id="board_announcements_description" size="20" maxlength="200" value="{{ BOARD_ANNOUNCEMENTS_DESC }}">
<input name="board_announcements_description" type="text" id="board_announcements_description" size="20" maxlength="255" value="{{ BOARD_ANNOUNCEMENTS_DESC }}">
</dd>
</dl>
<dl>
Expand Down
4 changes: 2 additions & 2 deletions adm/style/settings_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,9 @@ <h1>{{ lang('BOARD_ANNOUNCEMENTS_SETTINGS') }}</h1>
{{ lang('G_GUESTS') }}
{% endif %}
</td>
<td>{{ ba.CREATED_DATE ? ba.CREATED_DATE|date(constant('\\phpbb\\boardannouncements\\ext::DATE_FORMAT')) : '' }}</td>
<td>{{ ba.CREATED_DATE }}</td>
<td>{{ ba.S_ENABLED ? _self.baIcon('check', 'settings', 'YES') : _self.baIcon('times', 'delete', 'NO') }}</td>
<td>{{ ba.EXPIRY_DATE ? ba.EXPIRY_DATE|date(constant('\\phpbb\\boardannouncements\\ext::DATE_FORMAT')) : '' }}</td>
<td>{{ ba.EXPIRY_DATE }}</td>
<td>{{ ba.S_EXPIRED ? lang('YES') : lang('NO') }}</td>
<td class="actions">
<span class="up-disabled" style="display:none;">{{ ICON_MOVE_UP_DISABLED }}</span>
Expand Down
1 change: 1 addition & 0 deletions config/services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ services:
class: phpbb\boardannouncements\controller\acp_controller
arguments:
- '@phpbb.boardannouncements.manager'
- '@dbal.conn'
- '@config'
- '@controller.helper'
- '@language'
Expand Down
40 changes: 30 additions & 10 deletions controller/acp_controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
use phpbb\boardannouncements\manager\manager;
use phpbb\config\config;
use phpbb\controller\helper;
use phpbb\db\driver\driver_interface;
use phpbb\json_response;
use phpbb\language\language;
use phpbb\log\log;
use phpbb\request\request;
Expand All @@ -25,6 +27,9 @@ class acp_controller
/** @var manager */
protected $manager;

/** @var driver_interface */
protected $db;

/** @var config */
protected $config;

Expand Down Expand Up @@ -59,6 +64,7 @@ class acp_controller
* Constructor
*
* @param manager $manager
* @param driver_interface $db
* @param config $config
* @param helper $controller_helper
* @param language $language
Expand All @@ -69,9 +75,10 @@ class acp_controller
* @param $phpbb_root_path
* @param $php_ext
*/
public function __construct(manager $manager, config $config, helper $controller_helper, language $language, log $log, request $request, template $template, user $user, $phpbb_root_path, $php_ext)
public function __construct(manager $manager, driver_interface $db, config $config, helper $controller_helper, language $language, log $log, request $request, template $template, user $user, $phpbb_root_path, $php_ext)
{
$this->manager = $manager;
$this->db = $db;
$this->config = $config;
$this->controller_helper = $controller_helper;
$this->language = $language;
Expand Down Expand Up @@ -138,8 +145,8 @@ protected function list_announcements()
$this->template->assign_block_vars('announcements' , [
'DESCRIPTION' => $row['announcement_description'],
'USERS' => $row['announcement_users'],
'CREATED_DATE' => $row['announcement_timestamp'],
'EXPIRY_DATE' => $row['announcement_expiry'],
'CREATED_DATE' => $row['announcement_timestamp'] ? $this->user->format_date($row['announcement_timestamp'], ext::DATE_FORMAT) : '',
'EXPIRY_DATE' => $row['announcement_expiry'] ? $this->user->format_date($row['announcement_expiry'], ext::DATE_FORMAT) : '',
'S_EXPIRED' => $expired,
'S_ENABLED' => $enabled,
'LOCATIONS' => $this->manager->decode_json($row['announcement_locations']),
Expand Down Expand Up @@ -205,7 +212,11 @@ protected function action_add()
}

// Get new announcement values from the form
$data['announcement_timestamp'] = time();
// Preserve the original creation date when editing an announcement.
if (!$id)
{
$data['announcement_timestamp'] = time();
}
$data['announcement_text'] = $this->request->variable('board_announcements_text', '', true);
$data['announcement_description'] = $this->request->variable('board_announcements_description', '', true);
$data['announcement_bgcolor'] = $this->request->variable('board_announcements_bgcolor', '', true);
Expand All @@ -215,9 +226,11 @@ protected function action_add()
$data['announcement_dismissable'] = $this->request->variable('board_announcements_dismiss', true);
$data['announcement_expiry'] = $this->request->variable('board_announcements_expiry', '');

// Store all Unicode as ASCII character references for portability across DBMS.
$data['announcement_description'] = utf8_encode_ncr($data['announcement_description']);
if (truncate_string($data['announcement_description'], 200, 255) !== $data['announcement_description'])
// MSSQL requires all Unicode to be encoded; other DBMS only require four-byte Unicode.
$data['announcement_description'] = strpos($this->db->get_sql_layer(), 'mssql') === 0
? utf8_encode_ncr($data['announcement_description'])
: utf8_encode_ucr($data['announcement_description']);
if (utf8_strlen($data['announcement_description']) > 255)
{
$errors[] = $this->language->lang('BOARD_ANNOUNCEMENTS_DESC_TOO_LONG');
}
Expand Down Expand Up @@ -356,7 +369,7 @@ protected function action_delete()
$success = false;
}

// Only notify user on error or if not ajax
// Report the deletion result to the caller
if (!$success)
{
$this->error('BOARD_ANNOUNCEMENTS_DELETE_ERROR');
Expand All @@ -365,7 +378,12 @@ protected function action_delete()
{
$this->log_change('BOARD_ANNOUNCEMENTS_DELETED_LOG', $description);

if (!$this->request->is_ajax())
if ($this->request->is_ajax())
{
$json_response = new json_response;
$json_response->send(['success' => true]);
}
else
{
$this->success('BOARD_ANNOUNCEMENTS_DELETE_SUCCESS');
}
Expand Down Expand Up @@ -411,9 +429,11 @@ protected function action_move()

if ($this->request->is_ajax())
{
$json_response = new \phpbb\json_response;
$json_response = new json_response;
$json_response->send(['success' => true]);
}

$this->list_announcements();
}

/**
Expand Down
29 changes: 23 additions & 6 deletions event/listener.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,10 @@ public function display_board_announcements($event)

$this->get_current_location($event);

$board_announcements_data = $this->manager->get_visible_announcements($this->user->data['user_id']);
$board_announcements_data = $this->manager->get_visible_announcements(
$this->user->data['user_id'],
$this->user->data['is_registered']
);

foreach ($board_announcements_data as $data)
{
Expand Down Expand Up @@ -166,14 +169,28 @@ public function display_board_announcements($event)
*/
protected function get_current_location($event = null)
{
if ($event !== null)
if ($event === null)
{
$this->location = $this->user->page['page_name'] === "index.$this->php_ext"
? ext::INDEX_ONLY
: ($event['item'] === 'forum' ? (int) $event['item_id'] : 0);
return $this->location ?? 0;
}

return $this->location ?? 0;
if ($this->user->page['page_name'] === "index.$this->php_ext")
{
return $this->location = ext::INDEX_ONLY;
}

if ($event['item'] !== 'forum')
{
return $this->location = 0;
}

$this->location = (int) $event['item_id'];
if (!$this->location)
{
$this->location = $this->request->variable('f', 0);
}

return $this->location;
}

/**
Expand Down
13 changes: 4 additions & 9 deletions manager/manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,14 @@ public function get_announcements()
* Get all board announcements that can be seen by the user
*
* @param int $user_id A user identifier
* @param bool $is_registered Whether the user is registered
* @return array Array of announcements data, or empty array
*/
public function get_visible_announcements($user_id)
public function get_visible_announcements($user_id, $is_registered)
{
$data = $this->nestedset->where_visible($user_id)->get_all_tree_data();

if ((int) $user_id === ANONYMOUS)
if (!$is_registered)
{
return array_filter($data, [$this, 'filter_members']);
}
Expand Down Expand Up @@ -228,13 +229,7 @@ protected function filter_guests(array $row)
*/
protected function intersect_data($data)
{
$data = array_intersect_key($data, $this->announcement_columns());
if (isset($data['announcement_description']))
{
$data['announcement_description'] = utf8_encode_ncr($data['announcement_description']);
}

return $data;
return array_intersect_key($data, $this->announcement_columns());
}

/**
Expand Down
Loading