diff --git a/fid_bbi/config/vufind/config.ini b/fid_bbi/config/vufind/config.ini index d44633a48ddd96848922fe12f1d6954b74267388..e9f17a37152d3201ba21577ab4bf7ad70052df47 100644 --- a/fid_bbi/config/vufind/config.ini +++ b/fid_bbi/config/vufind/config.ini @@ -42,6 +42,8 @@ hideHoldingsTabWhenEmpty = true offcanvas = true showBookBag = true defaultLoggedInModule = Search +; enables admin mode, restricted by acces.AdminModule see permissions.ini +admin_enabled=true [Http] ; Pfad zu SSL-Zertifikaten in der docker-VM (global für CentOS konfiguriert) diff --git a/fid_bbi/config/vufind/permissions.ini b/fid_bbi/config/vufind/permissions.ini index 9fb4b2875b4826e2129f3f60b72991f0eaf03ca7..a74f682e3e69a8a6ecd072cc8607d2eca3f494b7 100644 --- a/fid_bbi/config/vufind/permissions.ini +++ b/fid_bbi/config/vufind/permissions.ini @@ -22,4 +22,9 @@ relative_path = ../../../fid/config/vufind/permissions.ini ;[default.OffCampusSourceIds] ;IpRegExFoFor = "/(141\.46.*)/" -;permission = OffCampusSourceIds \ No newline at end of file +;permission = OffCampusSourceIds + +[access.AdminModule] +role[] = loggedin +FidApiPermission[] = edit_user +permission = access.AdminModule \ No newline at end of file diff --git a/fid_bbi/languages/de.ini b/fid_bbi/languages/de.ini index 59cbed73bf899f1fb6395ff0fcc91ac5a2d0e012..d476eedf797a3fd50ae0c21f710a17173553c57b 100644 --- a/fid_bbi/languages/de.ini +++ b/fid_bbi/languages/de.ini @@ -458,7 +458,12 @@ tags_browse = "Tags aller Nutzenden durchstöbern" #17356 currently_on_list = "Zur Zeit in Liste ''%%list_name%%''" delete_from_list = "Aus Liste ''%%list_name%%'' löschen" -add_tag_description = "Helfen Sie anderen bei der Bewertung dieses Titels, indem Sie möglichst passende Tags vergeben." +add_tag_description = "Helfen Sie anderen bei der Bewertung dieses Titels, indem Sie möglichst passende Tags vergeben. Ihr Tag wird nach einer Woche öffentlich sichtbar." + +#17834 +show_tags_sorted_by_date = "Neueste zuerst anzeigen" +Be the first to tag this record = "Fügen Sie einen Tag hinzu" +add_tag_success = "Tags gespeichert. Beachten Sie, dass Tags nach einer Woche öffentlich sichtbar werden." #16903 Open Access = Kostenfrei Zugänglich diff --git a/fid_bbi/languages/en.ini b/fid_bbi/languages/en.ini index 1f383367a859ed6f50409f3356ca8eba2ee7cf2d..c8a1b7d8fa2aa3763a1c02a66c168be0884baf9a 100644 --- a/fid_bbi/languages/en.ini +++ b/fid_bbi/languages/en.ini @@ -451,7 +451,12 @@ tags_browse = "Browse all user's tags" #17356 currently_on_list = "currently on list ''%%list_name%%''" delete_from_list = "Remove from list ''%%list_name%%''" -add_tag_description = "Help others to rate this title by assigning appropriate tags." +add_tag_description = "Help others to rate this title by assigning appropriate tags. Your tag will become publicly visible after one week." + +#17834 +show_tags_sorted_by_date = "Order by date (newest first)" +Be the first to tag this record = Tag this Record +add_tag_success = "Tags saved. Please remember that tags will be publicly visible within one week." #16903 Open Access = Free Access diff --git a/module/fid_bbi/config/module.config.php b/module/fid_bbi/config/module.config.php index bb88f25d16debfa6b63c32772087f3bbedb1f7f5..cd923219347bfbaf45cd31d8c9cb21f7ecca7afe 100644 --- a/module/fid_bbi/config/module.config.php +++ b/module/fid_bbi/config/module.config.php @@ -24,7 +24,7 @@ use VuFind\Db\Table\Tags as BaseTagsTable; use fid_bbi\Db\Table\Tags as BBITagsTable; use VuFind\Db\Row\Tags as BaseTagsRow; -use VuFind\Db\Table\GatewayFactory as TableGatewayFactory; +use VuFind\Db\Table\CaseSensitiveTagsFactory; $config = [ 'forms' => [ @@ -81,14 +81,17 @@ $config = [ 'db_table' => [ 'aliases' => [ BaseTagsTable::class => BBITagsTable::class, + 'VuFind\Db\Table\ResourceTags' => 'fid_bbi\Db\Table\ResourceTags' ], 'factories' => [ - BBITagsTable::class => TableGatewayFactory::class, + BBITagsTable::class => CaseSensitiveTagsFactory::class, + 'fid_bbi\Db\Table\ResourceTags' => CaseSensitiveTagsFactory::class ] ], 'db_row' => [ 'aliases' => [ 'fid_bbi\Db\Row\Tags' => BaseTagsRow::class, + 'fid_bbi\Db\Row\ResourceTags' => 'VuFind\Db\Row\ResourceTags' ] ] ], diff --git a/module/fid_bbi/src/fid_bbi/Controller/BrowseController.php b/module/fid_bbi/src/fid_bbi/Controller/BrowseController.php index 43a0c6a29eb13bb2355d14ab277cc487c7f9a073..244d3f16579232a10521857b3e3e19560fd20f61 100644 --- a/module/fid_bbi/src/fid_bbi/Controller/BrowseController.php +++ b/module/fid_bbi/src/fid_bbi/Controller/BrowseController.php @@ -75,7 +75,10 @@ class BrowseController extends BaseController // Default case: always display tag list for non-alphabetical modes: $tagList = $tagTable->getTagList( $params['findby'], - $this->config->Browse->result_limit + $this->config->Browse->result_limit, + function ($select) { + $select->where->lessThan('resource_tags.posted',date('Y-m-d H:i:s', strtotime("-7 days"))); + } ); $resultList = []; foreach ($tagList as $i => $tag) { diff --git a/module/fid_bbi/src/fid_bbi/Db/Table/ResourceTags.php b/module/fid_bbi/src/fid_bbi/Db/Table/ResourceTags.php new file mode 100644 index 0000000000000000000000000000000000000000..40262f82c6db89d7c46c5ac06bfac45145e7ef07 --- /dev/null +++ b/module/fid_bbi/src/fid_bbi/Db/Table/ResourceTags.php @@ -0,0 +1,121 @@ +<?php +/** + * Table Definition for resource_tags + * + * PHP version 7 + * + * Copyright (C) Villanova University 2010. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category VuFind + * @package Db_Table + * @author Demian Katz <demian.katz@villanova.edu> + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link https://vufind.org Main Site + */ +namespace fid_bbi\Db\Table; + +use VuFind\Db\Table\ResourceTags as BaseTable; +use Zend\Db\Adapter\Adapter; +use Zend\Db\Sql\Expression; +use Zend\Db\Sql\Sql; + +/** + * Table Definition for resource_tags + * + * @category VuFind + * @package Db_Table + * @author Demian Katz <demian.katz@villanova.edu> + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link https://vufind.org Main Site + */ +class ResourceTags extends BaseTable +{ + use ResourceTagsTrait; + + /** + * Get Resource Tags + * + * @param string $userId ID of user + * @param string $resourceId ID of the resource + * @param string $tagId ID of the tag + * @param string $order The order in which to return the data + * @param string $page The page number to select + * @param string $limit The number of items to fetch + * + * @return \Zend\Paginator\Paginator + */ + public function getResourceTags( + $userId = null, $resourceId = null, $tagId = null, + $order = null, $page = null, $limit = 20 + ) { + $order = (null !== $order) + ? [$order] + : ["username", "tag", "title"]; + + $sql = $this->getSql(); + $select = $sql->select(); + $select = $select->columns([ + '*', + 'first_posted' => new Expression( + 'MIN(?)',['posted'], + [Expression::TYPE_IDENTIFIER] + ) + ]); + $select->join( + ['t' => 'tags'], + 'resource_tags.tag_id = t.id', + [ + 'tag' => + $this->caseSensitive ? 'tag' : new Expression('lower(tag)') + ] + ); + $select->join( + ['u' => 'user'], + 'resource_tags.user_id = u.id', + ["username" => "username"] + ); + $select->join( + ['r' => 'resource'], + 'resource_tags.resource_id = r.id', + ["title" => "title"] + ); + if (null !== $userId) { + $select->where->equalTo('resource_tags.user_id', $userId); + } + if (null !== $resourceId) { + $select->where->equalTo('resource_tags.resource_id', $resourceId); + } + if (null !== $tagId) { + $select->where->equalTo('resource_tags.tag_id', $tagId); + } + $select->order($this->formatTagOrder($order)); + + if (null !== $page) { + $select->limit($limit); + $select->offset($limit * ($page - 1)); + } + + $select->group(['tag_id']); + + $adapter = new \Zend\Paginator\Adapter\DbSelect($select, $sql); + $paginator = new \Zend\Paginator\Paginator($adapter); + $paginator->setItemCountPerPage($limit); + if (null !== $page) { + $paginator->setCurrentPageNumber($page); + } + return $paginator; + } +} diff --git a/module/fid_bbi/src/fid_bbi/Db/Table/ResourceTagsTrait.php b/module/fid_bbi/src/fid_bbi/Db/Table/ResourceTagsTrait.php new file mode 100644 index 0000000000000000000000000000000000000000..728740aad6c6760ca14b0aec68299370c52292a6 --- /dev/null +++ b/module/fid_bbi/src/fid_bbi/Db/Table/ResourceTagsTrait.php @@ -0,0 +1,50 @@ +<?php + +namespace fid_bbi\Db\Table; + +use Zend\Db\Sql\Select, + Zend\Db\Sql\Expression; + +trait ResourceTagsTrait +{ + + /** + * Get a subquery used for determining first post date of a tag. + * + * @return Select + */ + protected function getFirstPostedSubquery() + { + $sub = new Select('resource_tags'); + $sub->columns( + [ + 'tag_id', + 'first_posted' => new Expression('MIN(?)', ['posted'], [Expression::TYPE_IDENTIFIER]) + ] + ); + $sub->group(['tag_id']); + return $sub; + } + + protected function addFirstPosted($select,$olderThan=true,$age = "7 days",$resourceTagsTableName = 'rt') { + + $select->join( + ['first' => $this->getFirstPostedSubquery()], + $resourceTagsTableName.'.tag_id = first.tag_id', + [], + Select::JOIN_INNER + ); + if ($olderThan) { + $select->where->lessThan( + 'first.first_posted', + date('Y-m-d H:i:s', strtotime("-" . $age)) + ); + } else { + // otherwise we look for younger entries + $select->where->greaterThan( + 'first.first_posted', + date('Y-m-d H:i:s', strtotime("-" . $age)) + ); + } + } +} \ No newline at end of file diff --git a/module/fid_bbi/src/fid_bbi/Db/Table/Tags.php b/module/fid_bbi/src/fid_bbi/Db/Table/Tags.php index d25c455f95215a9dabd997527069c2c207ab6db4..f08117adf55e2ef557a2f1c548fe0ac092e85c9a 100644 --- a/module/fid_bbi/src/fid_bbi/Db/Table/Tags.php +++ b/module/fid_bbi/src/fid_bbi/Db/Table/Tags.php @@ -29,6 +29,7 @@ namespace fid_bbi\Db\Table; use VuFind\Db\Table\Tags as BaseTags; use Zend\Db\Sql\Expression; +use Zend\Db\Sql\Select; /** * Table Definition for tags @@ -41,6 +42,8 @@ use Zend\Db\Sql\Expression; */ class Tags extends BaseTags { + use ResourceTagsTrait; + /** * Get a list of all tags generated by the user in favorites lists. Note that * the returned list WILL NOT include tags attached to records that are not @@ -163,4 +166,91 @@ class Tags extends BaseTags }; return $this->select($callback); } + + /** + * Get tags associated with the specified resource. + * + * @param string $id Record ID to look up + * @param string $source Source of record to look up + * @param int $limit Max. number of tags to return (0 = no limit) + * @param int $list ID of list to load tags from (null for no + * restriction, true for on ANY list, false for on NO list) + * @param int $user ID of user to load tags from (null for all users) + * @param string $sort Sort type ('count' or 'tag') + * @param int $userToCheck ID of user to check for ownership (this will + * not filter the result list, but rows owned by this user will have an is_me + * column set to 1) + * + * @return Iterable + */ + public function getForResource($id, $source = DEFAULT_SEARCH_BACKEND, $limit = 0, + $list = null, $user = null, $sort = 'count', $userToCheck = null + ) { + return $this->select( + function ($select) use ( + $id, $source, $limit, $list, $user, $sort, $userToCheck + ) { + // If we're looking for ownership, create sub query to merge in + // an "is_me" flag value if the selected resource is tagged by + // the specified user. + if (!empty($userToCheck)) { + $subq = $this->getIsMeSubquery($id, $source, $userToCheck); + $select->join( + ['subq' => $subq], + 'tags.id = subq.tag_id', + [ + // is_me will either be null (not owned) or the ID + // of the tag (owned by the current user). + 'is_me' => new Expression( + 'MAX(?)', ['subq.tag_id'], + [Expression::TYPE_IDENTIFIER] + ) + ], + Select::JOIN_LEFT + ); + } + // SELECT (do not add table prefixes) + $select->columns( + [ + 'id', + 'tag' => $this->caseSensitive + ? 'tag' : new Expression('lower(tag)'), + 'cnt' => new Expression( + 'COUNT(DISTINCT(?))', ["rt.user_id"], + [Expression::TYPE_IDENTIFIER] + ) + ] + ); + $select->join( + ['rt' => 'resource_tags'], 'rt.tag_id = tags.id', [] + ); + $select->join( + ['r' => 'resource'], 'rt.resource_id = r.id', [] + ); + $select->where(['r.record_id' => $id, 'r.source' => $source]); + $select->group(['tags.id', 'tag']); + + if ($sort == 'count') { + $select->order(['cnt DESC', new Expression('lower(tags.tag)')]); + } elseif ($sort == 'tag') { + $select->order([new Expression('lower(tags.tag)')]); + } + + if ($limit > 0) { + $select->limit($limit); + } + if ($list === true) { + $select->where->isNotNull('rt.list_id'); + } elseif ($list === false) { + $select->where->isNull('rt.list_id'); + } elseif (null !== $list) { + $select->where->equalTo('rt.list_id', $list); + } + if (null !== $user) { + $select->where->equalTo('rt.user_id', $user); + } + $this->addFirstPosted($select); + } + ); + } } diff --git a/themes/fid_bbi/scss/compiled.scss b/themes/fid_bbi/scss/compiled.scss index a52d41f4c19900eadc84f4d5a5c029e4997b11b0..bcb508139d88c02b4553cdcc9765740e7a94aa68 100644 --- a/themes/fid_bbi/scss/compiled.scss +++ b/themes/fid_bbi/scss/compiled.scss @@ -111,6 +111,10 @@ body { } } +.admin.nav { + background-color: $brand-primary-light; +} + #header-collapse { flex: 1 1; @@ -691,6 +695,10 @@ tr.hline { margin-left: 1rem; } +.form-tags-list .tags-list-link { + font-size: larger; +} + .list-edit-container { fieldset.list-edit-group { border: none; diff --git a/themes/fid_bbi/templates/admin/tags/list.phtml b/themes/fid_bbi/templates/admin/tags/list.phtml new file mode 100644 index 0000000000000000000000000000000000000000..0a87032d11fea0b796806487f3633027dbfba061 --- /dev/null +++ b/themes/fid_bbi/templates/admin/tags/list.phtml @@ -0,0 +1,113 @@ +<!-- fid_bbi: admin - tags - list --> +<?php /* + this is largely copied from bootstrap3 theme + only difference is an added link for the list sorted by date + */ ?> +<?php + // Set page title. + $this->headTitle($this->translate('VuFind Administration - Tag Management')); +?> + +<h2><?=$this->translate('Tag Management')?></h2> +<div class="<?=$this->layoutClass('mainbody')?>"> + <h3><?=$this->translate('List Tags')?></h3> + + <?=$this->render("admin/tags/menu.phtml", ['active' => 'list'])?> + + <?=$this->flashmessages()?> + + <form class="form-tags-list" action="<?= $this->url('admin/tags', ['action' => 'List'])?>" method="get"> + <h3><?=$this->translate('filter_tags')?></h3> + <div class="tag-controls"> + <label for="user_id"> + <?=$this->translate('Username')?> + <select name="user_id" id="user_id" class="form-control"> + <option value="ALL"><?=$this->translate('All')?></option> + <?php foreach($this->uniqueUsers as $user):?> + <option value="<?= $user['user_id'] ?>"<?php if(isset($this->params['user_id']) && $user['user_id'] == $this->params['user_id']): ?> selected="selected"<?php endif;?>> + <?=$user['username'] ?> + </option> + <?php endforeach;?> + </select> + </label> + <label for="tag_id"> + <?=$this->translate('Tag')?> + <select name="tag_id" id="tag_id" class="form-control"> + <option value="ALL"><?=$this->translate('All')?></option> + <?php foreach($this->uniqueTags as $tag):?> + <option value="<?= $tag['tag_id'] ?>"<?php if(isset($this->params['tag_id']) && $tag['tag_id'] == $this->params['tag_id']): ?> selected="selected"<?php endif;?>> + <?=$tag['tag'] ?> + </option> + <?php endforeach;?> + </select> + </label> + <label for="resource_id"> + <?=$this->translate('Title')?> + <select name="resource_id" id="resource_id" class="form-control"> + <option value="ALL"><?=$this->translate('All')?></option> + <?php foreach($this->uniqueResources as $resource):?> + <option value="<?= $resource['resource_id']; ?>" title="<?=$resource['title'] ?>"<?php if(isset($this->params['resource_id']) && $resource['resource_id'] == $this->params['resource_id']): ?> selected="selected"<?php endif;?>> + <?=$this->truncate($resource['title'], 80) ?> (<?=$resource['resource_id'] ?>) + </option> + <?php endforeach;?> + </select> + </label> + <label for="taglistsubmit"> + <input type="submit" id="taglistsubmit" value="<?=$this->transEsc('Filter')?>" class="btn btn-primary"> + <?php if((isset($this->params['user_id']) && null !== $this->params['user_id']) || (isset($this->params['tag_id']) && null !== $this->params['tag_id']) || (isset($this->params['resource_id']) && null !== $this->params['resource_id'])):?> + <a href="<?= $this->url('admin/tags', ['action' => 'List']); ?>"><?=$this->translate('clear_tag_filter')?></a> + <?php endif;?> + </label> + </div> + <?php /* fid-bbi-specifics start */?> + <span class="tags-list-link"><a href="<?=$this->url('admin/tags', ['action' => 'List'],['query'=>['order' => 'first_posted DESC']])?>"><?=$this->transEsc('show_tags_sorted_by_date')?></a></span> + <?php /* fid-bbi-specifics end */?> + </form> + + <?php if(count($this->results) > 0):?> + <form action="<?= $this->url('admin/tags', ['action' => 'Delete'])?>" method="post"> + <input type="hidden" name="user_id" value="<?=isset($this->params['user_id']) ? $this->params['user_id'] : '' ?>" /> + <input type="hidden" name="tag_id" value="<?=isset($this->params['tag_id']) ? $this->params['tag_id'] : '' ?>" /> + <input type="hidden" name="resource_id" value="<?=isset($this->params['resource_id']) ? $this->params['resource_id'] : '' ?>" /> + <input type="hidden" name="origin" value="list" /> + + <table class="table table-striped"> + <tr> + <th><?=$this->translate('Tag')?></th> + <th><?=$this->translate('Username')?> (<?=$this->translate('User ID')?>)</th> + <th><?=$this->translate('Title')?> (<?=$this->translate('Resource ID')?>)</th> + <th><?=$this->translate('Date')?></th> + </tr> + + <?php foreach ($this->results as $tag): ?> + <tr> + <td> + <label for="<?=$this->prefix?>checkbox_<?=$tag['id']?>"> + <input id="<?=$this->prefix?>checkbox_<?=$tag['id']?>" type="checkbox" name="ids[]" value="<?=$this->escapeHtmlAttr($tag['id'])?>" class="checkbox_ui"/> + <input type="hidden" name="idsAll[]" value="<?=$this->escapeHtmlAttr($tag['id'])?>" /> + <?=$tag->tag?> (<?= $tag->tag_id?>) + </label> + </td> + <?php $arr = (array)$tag;?> + <td><?=$tag->username ?> (<?= $tag->user_id?>)</td> + <td><?=$tag->title?> (<?= $tag->resource_id?>)</td> + <td><?=$tag->first_posted?></td> + </tr> + <?php endforeach;?> + </table> + + <input type="submit" name="deleteSelected" value="<?=$this->transEsc('delete_selected')?>" class="btn btn-default"> + <input type="submit" name="deletePage" value="<?=$this->transEsc('delete_page')?>" class="btn btn-default"> + <input type="submit" name="deleteFilter" value="<?=$this->transEsc('delete_all')?>" class="btn btn-danger"> + + </form> + <?=$this->paginationControl($this->results, 'Sliding', 'Helpers/pagination.phtml', ['params' => $this->params])?> + <?php else:?> + <p><?=$this->translate('tag_filter_empty')?></p> + <?php endif;?> +</div> + +<div class="<?=$this->layoutClass('sidebar')?>"> + <?=$this->render("admin/menu.phtml")?> +</div> +<!-- fid_bbi: admin - tags - list - END --> \ No newline at end of file diff --git a/themes/fid_bbi/templates/admin/tags/menu.phtml b/themes/fid_bbi/templates/admin/tags/menu.phtml new file mode 100644 index 0000000000000000000000000000000000000000..b7c35be0fdad7609bdbd1e7939b142378c7a61ea --- /dev/null +++ b/themes/fid_bbi/templates/admin/tags/menu.phtml @@ -0,0 +1,9 @@ +<!-- fid_bbi: admin - tags - menu --> +<?php /* we only needed to copy this to add the admin class and recolor the navbar */?> +<div class="admin nav navbar"> + <ul class="nav nav-pills"> + <li<?=strtolower($this->active) == "list" ? ' class="active"' : ''?>><a href="<?=$this->url('admin/tags', ['action' => 'List'])?>"><?=$this->transEsc('List Tags')?></a></li> + <li<?=strtolower($this->active) == "manage" ? ' class="active"' : ''?>><a href="<?=$this->url('admin/tags', ['action' => 'Manage'])?>"><?=$this->transEsc('Manage Tags')?></a></li> + </ul> +</div> +<!-- fid_bbi: admin - tags - menu - END --> \ No newline at end of file diff --git a/themes/fid_bbi/templates/footer.phtml b/themes/fid_bbi/templates/footer.phtml index 32f8977132b877eeb939d80e2070f4c3a383caef..7a666c505a8d9522ec50b3e483244e62448f631f 100644 --- a/themes/fid_bbi/templates/footer.phtml +++ b/themes/fid_bbi/templates/footer.phtml @@ -29,6 +29,7 @@ <div class="footer-column"> <p><strong><?=$this->transEsc('fid::admin_section')?></strong></p> <p><a href="<?=$this->url('fid/admin/list')?>"><?=$this->transEsc('fid::permission_read_user_list')?></a></p> + <p><a href="<?=$this->url('admin/tags', ['action' => 'List'])?>"><?=$this->transEsc('Tag Management')?></a></p> </div> <?php endif; ?> </div> diff --git a/themes/fid_bbi/templates/myresearch/menu.phtml b/themes/fid_bbi/templates/myresearch/menu.phtml index d885a2f3a67ff8bb35575459f5a9d439527b6946..016abdce16c3b8936f845c44248fec586aa1bb68 100644 --- a/themes/fid_bbi/templates/myresearch/menu.phtml +++ b/themes/fid_bbi/templates/myresearch/menu.phtml @@ -102,6 +102,9 @@ <div class="myresearch-menu"> <a href="<?=$this->url('fid/admin/list')?>"><?=$this->transEsc('fid::permission_read_user_list')?></a> </div> + <div class="myresearch-menu"> + <a href="<?=$this->url('admin/tags', ['action' => 'List'])?>"><?=$this->transEsc('Tag Management')?></a> + </div> <?php endif; ?> <?php endif; ?> <!-- fid_bbi: myresearch - menu.phtml END --> \ No newline at end of file