Commit 910b1143 authored by Thorsten Griebenow's avatar Thorsten Griebenow
Browse files

Merge branch '52-bootstrapping-the-ter-detail-view' into 'develop'

Beginning "Bootstrapping the TER detail view"

See merge request !61
parents 0b618283 a373e75c
Pipeline #350 passed with stages
in 1 minute and 46 seconds
<?php
/**
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
$GLOBALS['TYPO3_CONF_VARS']['SYS']['trustedHostsPattern'] = '.*';
$GLOBALS['TYPO3_CONF_VARS']['BE']['loginSecurityLevel'] = 'normal';
\ No newline at end of file
...@@ -35,12 +35,8 @@ define('PATH_tslib', PATH_typo3 . 'sysext/cms/tslib/'); ...@@ -35,12 +35,8 @@ define('PATH_tslib', PATH_typo3 . 'sysext/cms/tslib/');
define('PATH_typo3conf', PATH_site . 'typo3conf/'); define('PATH_typo3conf', PATH_site . 'typo3conf/');
define('TYPO3_mainDir', 'typo3/'); define('TYPO3_mainDir', 'typo3/');
if (!defined('TYPO3_db')) { $serviceLocation = $_SERVER['HTTP_HOST'] . 'index.php?id=ter';
die('The configuration file was not included.'); $WSDLSource = file_get_contents('tx_ter.wsdl');
}
$serviceLocation = \TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . 'index.php?id=ter';
$WSDLSource = file_get_contents(\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('ter') . 'tx_ter.wsdl');
$WSDLSource = trim(str_replace('---SERVICE_LOCATION---', $serviceLocation, $WSDLSource)); $WSDLSource = trim(str_replace('---SERVICE_LOCATION---', $serviceLocation, $WSDLSource));
if (!headers_sent()) { if (!headers_sent()) {
...@@ -48,5 +44,3 @@ if (!headers_sent()) { ...@@ -48,5 +44,3 @@ if (!headers_sent()) {
header('Content-Length: ' . strlen($WSDLSource)); header('Content-Length: ' . strlen($WSDLSource));
} }
echo($WSDLSource); echo($WSDLSource);
?>
\ No newline at end of file
...@@ -65,7 +65,7 @@ class Tx_TerFe2_Controller_ExtensionController extends Tx_TerFe2_Controller_Abst ...@@ -65,7 +65,7 @@ class Tx_TerFe2_Controller_ExtensionController extends Tx_TerFe2_Controller_Abst
protected $persistenceManager; protected $persistenceManager;
/** /**
* @var Tx_TerFe2_Domain_Repository_UserRepository * @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
*/ */
protected $ownerRepository; protected $ownerRepository;
...@@ -85,7 +85,7 @@ class Tx_TerFe2_Controller_ExtensionController extends Tx_TerFe2_Controller_Abst ...@@ -85,7 +85,7 @@ class Tx_TerFe2_Controller_ExtensionController extends Tx_TerFe2_Controller_Abst
$this->tagRepository = $this->objectManager->get('Tx_TerFe2_Domain_Repository_TagRepository'); $this->tagRepository = $this->objectManager->get('Tx_TerFe2_Domain_Repository_TagRepository');
$this->versionRepository = $this->objectManager->get('Tx_TerFe2_Domain_Repository_VersionRepository'); $this->versionRepository = $this->objectManager->get('Tx_TerFe2_Domain_Repository_VersionRepository');
$this->authorRepository = $this->objectManager->get('Tx_TerFe2_Domain_Repository_AuthorRepository'); $this->authorRepository = $this->objectManager->get('Tx_TerFe2_Domain_Repository_AuthorRepository');
$this->ownerRepository = $this->objectManager->get(Tx_TerFe2_Domain_Repository_UserRepository::class); $this->ownerRepository = $this->objectManager->get(\TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository::class);
$this->providerManager = $this->objectManager->get('Tx_TerFe2_Provider_ProviderManager'); $this->providerManager = $this->objectManager->get('Tx_TerFe2_Provider_ProviderManager');
$this->session = $this->objectManager->get('Tx_TerFe2_Persistence_Session'); $this->session = $this->objectManager->get('Tx_TerFe2_Persistence_Session');
$this->persistenceManager = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager::class); $this->persistenceManager = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager::class);
...@@ -196,7 +196,7 @@ class Tx_TerFe2_Controller_ExtensionController extends Tx_TerFe2_Controller_Abst ...@@ -196,7 +196,7 @@ class Tx_TerFe2_Controller_ExtensionController extends Tx_TerFe2_Controller_Abst
$versionHistoryCount = (!empty($this->settings['versionHistoryCount']) ? $this->settings['versionHistoryCount'] : 5); $versionHistoryCount = (!empty($this->settings['versionHistoryCount']) ? $this->settings['versionHistoryCount'] : 5);
$skipLatestVersion = (isset($this->settings['skipLatestVersion']) ? $this->settings['skipLatestVersion'] : TRUE); $skipLatestVersion = (isset($this->settings['skipLatestVersion']) ? $this->settings['skipLatestVersion'] : TRUE);
$loggedInUser = $this->ownerRepository->findCurrent(); //$loggedInUser = $this->ownerRepository->findCurrent();
if ($extension !== NULL && if ($extension !== NULL &&
$extension instanceof Tx_TerFe2_Domain_Model_Extension && $extension instanceof Tx_TerFe2_Domain_Model_Extension &&
...@@ -212,8 +212,8 @@ class Tx_TerFe2_Controller_ExtensionController extends Tx_TerFe2_Controller_Abst ...@@ -212,8 +212,8 @@ class Tx_TerFe2_Controller_ExtensionController extends Tx_TerFe2_Controller_Abst
$this->view->assign('loggedInUser', $loggedInUser); $this->view->assign('loggedInUser', $loggedInUser);
/** @var Tx_TerFe2_Service_Documentation $documentationService */ /** @var Tx_TerFe2_Service_Documentation $documentationService */
$documentationService = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('Tx_TerFe2_Service_Documentation'); //$documentationService = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('Tx_TerFe2_Service_Documentation');
$documentationLink = $documentationService->getDocumentationLink($extension->getExtKey(), $extension->getLastVersion()->getVersionString()); //$documentationLink = $documentationService->getDocumentationLink($extension->getExtKey(), $extension->getLastVersion()->getVersionString());
$this->view->assign('documentationLink', $documentationLink); $this->view->assign('documentationLink', $documentationLink);
$GLOBALS['TSFE']->getPageRenderer()->addMetaTag('<meta name="description" content="' . htmlspecialchars($extension->getLastVersion()->getDescription()) . '" />'); $GLOBALS['TSFE']->getPageRenderer()->addMetaTag('<meta name="description" content="' . htmlspecialchars($extension->getLastVersion()->getDescription()) . '" />');
......
...@@ -42,7 +42,7 @@ class Tx_TerFe2_Controller_RegisterkeyController extends Tx_TerFe2_Controller_Ab ...@@ -42,7 +42,7 @@ class Tx_TerFe2_Controller_RegisterkeyController extends Tx_TerFe2_Controller_Ab
protected $versionRepository; protected $versionRepository;
/** /**
* @var Tx_TerFe2_Domain_Repository_UserRepository * @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
*/ */
protected $userRepository; protected $userRepository;
...@@ -100,7 +100,7 @@ class Tx_TerFe2_Controller_RegisterkeyController extends Tx_TerFe2_Controller_Ab ...@@ -100,7 +100,7 @@ class Tx_TerFe2_Controller_RegisterkeyController extends Tx_TerFe2_Controller_Ab
// Register the extension key at ter server, if successfull, add it to the extension table // Register the extension key at ter server, if successfull, add it to the extension table
if ($this->terConnection->registerExtension($extensionData)) { if ($this->terConnection->registerExtension($extensionData)) {
// Create extension model // Create extension model
$extension = $this->objectManager->create('Tx_TerFe2_Domain_Model_Extension'); $extension = $this->objectManager->get('Tx_TerFe2_Domain_Model_Extension');
$extension->setExtKey($extensionKey); $extension->setExtKey($extensionKey);
$extension->setFrontendUser($this->frontendUser['username']); $extension->setFrontendUser($this->frontendUser['username']);
...@@ -119,9 +119,9 @@ class Tx_TerFe2_Controller_RegisterkeyController extends Tx_TerFe2_Controller_Ab ...@@ -119,9 +119,9 @@ class Tx_TerFe2_Controller_RegisterkeyController extends Tx_TerFe2_Controller_Ab
$extension = $this->extensionRepository->findOneByExtKey($extensionKey); $extension = $this->extensionRepository->findOneByExtKey($extensionKey);
$message = ''; $message = '';
if ($extension instanceof Tx_TerFe2_Domain_Model_Extension && $extension->getFrontendUser()) { if ($extension instanceof Tx_TerFe2_Domain_Model_Extension && $extension->getFrontendUser()) {
/** @var Tx_Ajaxlogin_Domain_Model_User $frontendUser */ /** @var \TYPO3\CMS\Extbase\Domain\Model\FrontendUser $frontendUser */
$frontendUser = $this->userRepository->findOneByUsername($extension->getFrontendUser()); $frontendUser = $this->userRepository->findOneByUsername($extension->getFrontendUser());
if ($frontendUser instanceof Tx_Ajaxlogin_Domain_Model_User) { if ($frontendUser instanceof \TYPO3\CMS\Extbase\Domain\Model\FrontendUser) {
$message = $this->resolveWSErrorMessage( $message = $this->resolveWSErrorMessage(
$error . '.message', $error . '.message',
array( array(
...@@ -180,7 +180,7 @@ class Tx_TerFe2_Controller_RegisterkeyController extends Tx_TerFe2_Controller_Ab ...@@ -180,7 +180,7 @@ class Tx_TerFe2_Controller_RegisterkeyController extends Tx_TerFe2_Controller_Ab
// ); // );
$countSkipped++; $countSkipped++;
} else { } else {
$extensionModel = $this->objectManager->create('Tx_TerFe2_Domain_Model_Extension'); $extensionModel = $this->objectManager->get('Tx_TerFe2_Domain_Model_Extension');
$extensionModel->setExtKey($extensionKey); $extensionModel->setExtKey($extensionKey);
$extensionModel->setFrontendUser($extension['ownerusername']); $extensionModel->setFrontendUser($extension['ownerusername']);
......
...@@ -29,17 +29,11 @@ ...@@ -29,17 +29,11 @@
class Tx_TerFe2_Domain_Repository_ExtensionRepository extends Tx_TerFe2_Domain_Repository_AbstractRepository class Tx_TerFe2_Domain_Repository_ExtensionRepository extends Tx_TerFe2_Domain_Repository_AbstractRepository
{ {
/**
* @var Tx_TerFe2_Domain_Repository_SearchRepository
*/
protected $searchRepository;
/** /**
* @var boolean * @var boolean
*/ */
protected $showInsecure = TRUE; protected $showInsecure = TRUE;
/** /**
* Allow the listing of insecure extensions or not * Allow the listing of insecure extensions or not
* *
...@@ -153,29 +147,6 @@ class Tx_TerFe2_Domain_Repository_ExtensionRepository extends Tx_TerFe2_Domain_R ...@@ -153,29 +147,6 @@ class Tx_TerFe2_Domain_Repository_ExtensionRepository extends Tx_TerFe2_Domain_R
return $query->execute(); return $query->execute();
} }
/**
* Returns all extensions by an author
*
* @param Tx_TerFe2_Domain_Model_Author $author The Author to search for
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage Objects
*/
public function findByAuthor(Tx_TerFe2_Domain_Model_Author $author)
{
$uids = $this->searchRepository->findUidsByAuthor($author);
// Workaround to enable paginate
$query = $this->createQuery();
$query->getQuerySettings()->setRespectStoragePage(FALSE);
$query->getQuerySettings()->setRespectSysLanguage(FALSE);
$query->setOrderings(
array('extKey' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING)
);
$this->match($query, $query->in('uid', $uids));
return $query->execute();
}
/** /**
* *
* @param string $frontendUser * @param string $frontendUser
......
<?php <?php
class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository class \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository extends \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
{ {
/** /**
* Find an Object using the UID of the current fe_user * Find an Object using the UID of the current fe_user
* @return Tx_Ajaxlogin_Domain_Model_User the current fe_user or null if none * @return \TYPO3\CMS\Extbase\Domain\Model\FrontendUser the current fe_user or null if none
*/ */
public function findCurrent() public function findCurrent()
{ {
...@@ -23,7 +23,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma ...@@ -23,7 +23,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma
/** /**
* Find an Object using the UID of the current fe_user * Find an Object using the UID of the current fe_user
* @return Tx_Ajaxlogin_Domain_Model_User * @return \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
*/ */
public function findOneByForgotHashAndEmail($forgotHash, $email) public function findOneByForgotHashAndEmail($forgotHash, $email)
{ {
...@@ -43,7 +43,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma ...@@ -43,7 +43,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma
/** /**
* Find an Object using the UID of the current fe_user * Find an Object using the UID of the current fe_user
* @return Tx_Ajaxlogin_Domain_Model_User * @return \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
*/ */
public function findOneByVerificationHashAndEmail($verificationHash, $email) public function findOneByVerificationHashAndEmail($verificationHash, $email)
{ {
...@@ -62,7 +62,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma ...@@ -62,7 +62,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma
} }
/** /**
* @return Tx_Ajaxlogin_Domain_Model_User * @return \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
*/ */
public function findOneByEmail($email) public function findOneByEmail($email)
{ {
...@@ -80,7 +80,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma ...@@ -80,7 +80,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma
} }
/** /**
* @return Tx_Ajaxlogin_Domain_Model_User * @return \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
*/ */
public function findOneByUsername($username) public function findOneByUsername($username)
{ {
...@@ -101,7 +101,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma ...@@ -101,7 +101,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma
/** /**
* Find an Object using the UID of the current fe_user * Find an Object using the UID of the current fe_user
* @return Tx_Ajaxlogin_Domain_Model_User * @return \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
*/ */
public function findOneByEnableHash($enableHash) public function findOneByEnableHash($enableHash)
{ {
...@@ -143,7 +143,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma ...@@ -143,7 +143,7 @@ class Tx_TerFe2_Domain_Repository_UserRepository extends \TYPO3\CMS\Extbase\Doma
/** /**
* @param $uid * @param $uid
* *
* @return Tx_Ajaxlogin_Domain_Model_User * @return \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
*/ */
public function findUserByUid($uid) public function findUserByUid($uid)
{ {
......
...@@ -142,4 +142,6 @@ plugin.tx_terfe2 { ...@@ -142,4 +142,6 @@ plugin.tx_terfe2 {
# cat=TER Frontend/libraries/8010; type=string; label=Load jqPlot: Load jqPlot libraray into footer # cat=TER Frontend/libraries/8010; type=string; label=Load jqPlot: Load jqPlot libraray into footer
jqplot.load = 1 jqplot.load = 1
} }
} }
\ No newline at end of file
const.page.ter_fe = 1
...@@ -73,6 +73,11 @@ plugin.tx_terfe2 { ...@@ -73,6 +73,11 @@ plugin.tx_terfe2 {
} }
} }
} }
\TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
mapping {
tableName = fe_users
}
}
} }
} }
...@@ -121,4 +126,20 @@ page.includeJSFooterlibs.tx_terfe2 = EXT:ter_fe2/Resources/Public/Javascript/Def ...@@ -121,4 +126,20 @@ page.includeJSFooterlibs.tx_terfe2 = EXT:ter_fe2/Resources/Public/Javascript/Def
# ====================================================================== # ======================================================================
[usergroup = {$plugin.tx_ter_pi1.reviewersFrontendUsergroupUid}] || [globalVar = LIT:1 = {$plugin.tx_terfe2.settings.show.reviewForm}] [usergroup = {$plugin.tx_ter_pi1.reviewersFrontendUsergroupUid}] || [globalVar = LIT:1 = {$plugin.tx_terfe2.settings.show.reviewForm}]
plugin.tx_terfe2.settings.show.reviewForm = 1 plugin.tx_terfe2.settings.show.reviewForm = 1
[global] [global]
\ No newline at end of file
##### switch between EXT:solr and EXT:ter_fe2 #####
# EXT:solr
[page|uid = {$const.page.ter_fe}] && [globalVar = GP:tx_terfe2_pi1|action =]
tt_content.list.20.terfe2_pi1 >
tt_content.list.20.terfe2_pi1 = TEXT
tt_content.list.20.terfe2_pi1.value =
[global]
# EXT:ter_fe2
[page|uid = {$const.page.ter_fe}] && [globalString = GP:tx_terfe2_pi1|action = ?*]
tt_content.list.20.solr_pi_results >
tt_content.list.20.solr_pi_results = TEXT
tt_content.list.20.solr_pi_results.value =
[global]
{namespace terfe2=Tx_TerFe2_ViewHelpers} {namespace terfe2=Tx_TerFe2_ViewHelpers}
<div class="ter-ext-single-info ter-ext-info"> <dl class="row">
<table> <dt class="col-sm-3"><f:translate key="version" /></dt>
<tr class="ter-ext-single-info-key"> <dd class="col-sm-9">{extension.lastVersion.versionString}</dd>
<th> <dt class="col-sm-3"><f:translate key="last_updated" /></dt>
<f:translate key="extensionKey"/> <dd class="col-sm-9"><terfe2:dateTime format="{settings.dateFormat}">{extension.lastVersion.uploadDate}</terfe2:dateTime></dd>
</th> <dt class="col-sm-3"><f:translate key="first_upload" /></dt>
<td><strong>{extension.extKey}</strong></td> <dd class="col-sm-9"><terfe2:dateTime format="{settings.dateFormat}">{extension.crdate}</terfe2:dateTime></dd>
</tr> <dt class="col-sm-3"><f:translate key="downloads" /></dt>
<tr> <dd class="col-sm-9"><f:format.number decimals="0" thousandsSeparator="," decimalSeparator=".">{extension.downloads}</f:format.number></dd>
<th> <f:security.ifHasRole role="{settings.reviewerGroupUid}">
<f:translate key="version"/> <dt class="col-sm-3">Owner:</dt>
</th> <dd class="col-sm-9">Name: {owner.name}<br />Email: {owner.email}<br />Username: {owner.username}</dd>
<td>{extension.lastVersion.versionString} <span </f:security.ifHasRole>
class="ter-ext-state ter-ext-state-{extension.lastVersion.state}">{extension.lastVersion.state}</span> <dt class="col-sm-3"><f:translate key="category" /></dt>
</td> <dd class="col-sm-9">
</tr> <f:if condition="{extension.lastVersion.emCategory}">
<tr> <f:then>
<th> <f:translate key="category_{extension.lastVersion.emCategory}" />
<f:translate key="last_updated"/> </f:then>
</th> <f:else>
<td> <f:translate key="none" />
<terfe2:dateTime format="{settings.dateFormat}">{extension.lastVersion.uploadDate}</terfe2:dateTime> </f:else>
</td> </f:if>
</tr> </dd>
<tr> <dt class="col-sm-3"><f:translate key="dependencies" /></dt>
<th> <dd class="col-sm-9"><f:render partial="InlineRelationList" arguments="{relations: extension.lastVersion.dependencies}" /></dd>
<f:translate key="first_upload"/> <dt class="col-sm-3"><f:translate key="conflicts" /></dt>
</th> <dd class="col-sm-9"><f:render partial="InlineRelationList" arguments="{relations: extension.lastVersion.conflicts}" /></dd>
<td> <dt class="col-sm-3"><f:translate key="manual" /></dt>
<terfe2:dateTime format="{settings.dateFormat}">{extension.crdate}</terfe2:dateTime> <dd class="col-sm-9">
</td> <f:if condition="{documentationLink}">
</tr> <f:then>
<tr> <terfe2:raw>{documentationLink}</terfe2:raw>
<th> <f:if condition="{extension.externalManual}">
<f:translate key="downloads"/> <br />
</th> <f:link.external rel="nofollow" uri="{extension.externalManual}" target="_blank">
<td> <f:translate key="external_manual" />
<f:format.number decimals="0" thousandsSeparator="," decimalSeparator=".">{extension.downloads} </f:link.external>
</f:format.number> </f:if>
</td> </f:then>
</tr> <f:else>
<f:security.ifHasRole role="{settings.reviewerGroupUid}"> <f:if condition="{extension.externalManual}">
<tr> <f:then>
<th>Owner:</th> <f:link.external rel="nofollow" uri="{extension.externalManual}" target="_blank">
<td> Name: {owner.name} <f:translate key="extension_manual" />
<br/>Email: {owner.email} </f:link.external>
<br/>Username: {owner.username} </f:then>
</td> <f:else>
</tr> <f:translate key="extension_manual_not_available" />
</f:security.ifHasRole> </f:else>
<tr> </f:if>
<th> </f:else>
<f:translate key="category"/> </f:if>
</th> </dd>
<td> <f:if condition="{extension.forgeLink}">
<f:if condition="{extension.lastVersion.emCategory}"> <dt class="col-sm-3">
<f:then> <f:translate key="bugtracker" />
<f:translate key="category_{extension.lastVersion.emCategory}"/> </dt>
</f:then> <dd class="col-sm-9">
<f:else> <f:link.external rel="nofollow" uri="{extension.forgeLink}" target="_blank">
<f:translate key="none"/> <f:translate key="found_a_bug" />
</f:else> </f:link.external>
</f:if> </dd>
</td> </f:if>
</tr> <f:if condition="{extension.repositoryUrl}">
<tr class="ter-ext-single-info-relations"> <dt class="col-sm-3">
<th> <f:translate key="repository_url" />
<f:translate key="dependencies"/> </dt>
</th> <dd class="col-sm-9">
<td> <f:link.external rel="nofollow" uri="{extension.repositoryUrl}" target="_blank">
<f:render partial="InlineRelationList" arguments="{relations: extension.lastVersion.dependencies}"/> <f:translate key="repository_url_value" />
</td> </f:link.external>
</tr> </dd>
<tr class="ter-ext-single-info-relations"> </f:if>
<th> <f:if condition="{flattrUrl}">
<f:translate key="conflicts"/> <dt class="col-sm-3">
</th> <f:translate key="donate" />
<td> </dt>
<f:render partial="InlineRelationList" arguments="{relations: extension.lastVersion.conflicts}"/> <dd class="col-sm-9">
</td> <f:link.external uri="{flattrUrl}" target="_blank"><img
</tr> src="https://api.flattr.com/button/flattr-badge-large.png"
<tr class="ter-ext-single-info-manual"> alt="{f:translate(key:'donate')}" /></f:link.external>
<th> </dd>
<f:translate key="manual"/> </f:if>
</th> <f:if condition="{extension.paypalUrl}">
<td> <dt class="col-sm-3">
<f:if condition="{documentationLink}"> <f:translate key="like_it" />
<f:then> </dt>
<terfe2:raw>{documentationLink}</terfe2:raw> <dd class="col-sm-9">
<f:if condition="{extension.externalManual}"> <f:link.external rel="nofollow" uri="{extension.paypalUrl}" target="_blank">
<br/> <f:translate key="donate_url" />
<f:link.external rel="nofollow" uri="{extension.externalManual}" target="_blank"> </f:link.external>
<f:translate key="external_manual"/> </dd>
</f:link.external> </f:if>
</f:if> <dt class="col-sm-3"><f:translate key="author" /></dt>
</f:then> <dd class="col-sm-9">{owner.name}</dd>
<f:else> </dl>
<f:if condition="{extension.externalManual}">
<f:then>
<f:link.external rel="nofollow" uri="{extension.externalManual}" target="_blank">
<f:translate key="extension_manual"/>
</f:link.external>
</f:then>
<f:else>
<f:translate key="extension_manual_not_available"/>
</f:else>
</f:if>
</f:else>
</f:if>
</td>
</tr>
<f:if condition="{extension.forgeLink}">
<tr class="ter-ext-single-info-key">
<th>
<f:translate key="bugtracker"/>
</th>
<td>
<f:link.external rel="nofollow" uri="{extension.forgeLink}" target="_blank">
<f:translate