diff --git a/config/global.ini.php b/config/global.ini.php index 00596b39ec9199168fab339486e28399de0e96d4..3d78466258ad3e6595f91827a980d083522e3233 100644 --- a/config/global.ini.php +++ b/config/global.ini.php @@ -722,6 +722,7 @@ Plugins[] = Referrers Plugins[] = UserSettings Plugins[] = DevicesDetection Plugins[] = Goals +Plugins[] = Ecommerce Plugins[] = SEO Plugins[] = Events Plugins[] = UserCountry diff --git a/plugins/CoreHome/javascripts/broadcast.js b/plugins/CoreHome/javascripts/broadcast.js index 8482cad4fbe07d925a3c434c5e264a6927b674d7..d142bc8bc9d94b4df0de58326a2d5fd56555d645 100644 --- a/plugins/CoreHome/javascripts/broadcast.js +++ b/plugins/CoreHome/javascripts/broadcast.js @@ -197,7 +197,7 @@ var broadcast = { // if the module is not 'Goals', we specifically unset the 'idGoal' parameter // this is to ensure that the URLs are clean (and that clicks on graphs work as expected - they are broken with the extra parameter) var action = broadcast.getParamValue('action', currentHashStr); - if (action != 'goalReport' && action != 'ecommerceReport') { + if (action != 'goalReport' && action != 'ecommerceReport' && action != 'ecommerceProducts') { currentHashStr = broadcast.updateParamValue('idGoal=', currentHashStr); } // unset idDashboard if use doesn't display a dashboard diff --git a/plugins/CoreHome/javascripts/menu.js b/plugins/CoreHome/javascripts/menu.js index 33cd37cb3d72fbcdc130042457ce5f722e1f5929..40dd403ad9258e0eebeb3f2441a78202a5a2b075 100644 --- a/plugins/CoreHome/javascripts/menu.js +++ b/plugins/CoreHome/javascripts/menu.js @@ -100,7 +100,7 @@ menu.prototype = getSubmenuID: function (module, id, action) { var $li = ''; // So, if module is Goals, id is present, and action is not Index, must be one of the goals - if (module == 'Goals' && id != '' && (action != 'index')) { + if ((module == 'Goals' || module == 'Ecommerce') && id != '' && (action != 'index')) { $li = $("#" + module + "_" + action + "_" + id); // if module is Dashboard and id is present, must be one of the dashboards } else if (module == 'Dashboard') { diff --git a/plugins/Ecommerce/Controller.php b/plugins/Ecommerce/Controller.php new file mode 100644 index 0000000000000000000000000000000000000000..322756eda485c1ecc472f99542ffd1433feaec03 --- /dev/null +++ b/plugins/Ecommerce/Controller.php @@ -0,0 +1,58 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik\Plugins\Ecommerce; + +use Exception; +use Piwik\DataTable; +use Piwik\FrontController; +use Piwik\Piwik; +use Piwik\View; + +class Controller extends \Piwik\Plugins\Goals\Controller +{ + public function ecommerceReport() + { + if (!\Piwik\Plugin\Manager::getInstance()->isPluginActivated('CustomVariables')) { + throw new Exception("Ecommerce Tracking requires that the plugin Custom Variables is enabled. Please enable the plugin CustomVariables (or ask your admin)."); + } + + $view = $this->getGoalReportView($idGoal = Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER); + $view->displayFullReport = false; + $view->showHeadline = true; + return $view->render(); + } + + public function getEcommerceLog($fetch = false) + { + $saveGET = $_GET; + $_GET['segment'] = urlencode('visitEcommerceStatus!=none'); + $_GET['widget'] = 1; + $output = FrontController::getInstance()->dispatch('Live', 'getVisitorLog', array($fetch)); + $_GET = $saveGET; + return $output; + } + + public function index() + { + return $this->ecommerceReport(); + } + + public function ecommerceProducts() + { + $viewOverview = $this->getGoalReportView(Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER); + $reportsByDimension = $viewOverview->goalReportsByDimension; + + $view = new View('@Ecommerce/ecommerceProducts'); + $this->setGeneralVariablesView($view); + + $view->goalReportsByDimension = $reportsByDimension; + return $view->render(); + } + +} diff --git a/plugins/Ecommerce/Ecommerce.php b/plugins/Ecommerce/Ecommerce.php new file mode 100644 index 0000000000000000000000000000000000000000..3039b452e084edddb8a0ddf1a10f70c5a3181272 --- /dev/null +++ b/plugins/Ecommerce/Ecommerce.php @@ -0,0 +1,24 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik\Plugins\Ecommerce; + +use Piwik\Piwik; + +class Ecommerce extends \Piwik\Plugin +{ + public function getInformation() + { + $suffix = Piwik::translate('SitesManager_PiwikOffersEcommerceAnalytics', + array('<a href="http://piwik.org/docs/ecommerce-analytics/" rel="noreferrer" target="_blank">', '</a>')); + $info = parent::getInformation(); + $info['description'] = $suffix; + return $info; + } + +} diff --git a/plugins/Ecommerce/Menu.php b/plugins/Ecommerce/Menu.php new file mode 100644 index 0000000000000000000000000000000000000000..c2e8230d40c791fd202ae2c0a389471ee019c8ec --- /dev/null +++ b/plugins/Ecommerce/Menu.php @@ -0,0 +1,48 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik\Plugins\Ecommerce; + +use Piwik\Common; +use Piwik\Menu\MenuReporting; +use Piwik\Menu\MenuUser; +use Piwik\Piwik; +use Piwik\Site; +use Piwik\Translate; + +/** + */ +class Menu extends \Piwik\Plugin\Menu +{ + + public function configureReportingMenu(MenuReporting $menu) + { + $idSite = Common::getRequestVar('idSite', null, 'int'); + + $site = new Site($idSite); + + if ($site->isEcommerceEnabled()) { + $ecommerceParams = array('idGoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER); + $ecommerceUrl = $this->urlForAction('ecommerceReport', $ecommerceParams); + + $menu->addItem('Goals_Ecommerce', '', $ecommerceUrl, 24); + $menu->addItem('Goals_Ecommerce', 'Goals_EcommerceOverview', $ecommerceUrl, 1); + $menu->addItem('Goals_Ecommerce', 'Goals_EcommerceLog', $this->urlForAction('getEcommerceLog'), 2); + $menu->addItem('Goals_Ecommerce', 'Goals_Products', $this->urlForAction('ecommerceProducts', $ecommerceParams), 3); + } + + } + public function configureUserMenu(MenuUser $menu) + { + $idSite = Common::getRequestVar('idSite', null, 'int'); + + if (Piwik::isUserHasAdminAccess($idSite)) { + $menu->addManageItem('Goals_GoalsManagement', $this->urlForAction('manage'), 15); + } + } +} diff --git a/plugins/Ecommerce/templates/ecommerceProducts.twig b/plugins/Ecommerce/templates/ecommerceProducts.twig new file mode 100644 index 0000000000000000000000000000000000000000..74cca9356914dde2fcdd812f827890bd3bf6c58e --- /dev/null +++ b/plugins/Ecommerce/templates/ecommerceProducts.twig @@ -0,0 +1,3 @@ +<h2 piwik-enriched-headline>{{ 'Goals_Products'|translate }}</h2> + +{{ goalReportsByDimension|raw }} diff --git a/plugins/Goals/Controller.php b/plugins/Goals/Controller.php index 787154267596945937510fe5c94af48756414f00..98d8893828b2d0ba5be8f42027683317d5466357 100644 --- a/plugins/Goals/Controller.php +++ b/plugins/Goals/Controller.php @@ -87,27 +87,6 @@ class Controller extends \Piwik\Plugin\Controller return $view->render(); } - public function ecommerceReport() - { - if (!\Piwik\Plugin\Manager::getInstance()->isPluginActivated('CustomVariables')) { - throw new Exception("Ecommerce Tracking requires that the plugin Custom Variables is enabled. Please enable the plugin CustomVariables (or ask your admin)."); - } - - $view = $this->getGoalReportView($idGoal = Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER); - $view->displayFullReport = true; - return $view->render(); - } - - public function getEcommerceLog($fetch = false) - { - $saveGET = $_GET; - $_GET['segment'] = urlencode('visitEcommerceStatus!=none'); - $_GET['widget'] = 1; - $output = FrontController::getInstance()->dispatch('Live', 'getVisitorLog', array($fetch)); - $_GET = $saveGET; - return $output; - } - protected function getGoalReportView($idGoal = false) { $view = new View('@Goals/getGoalReportView'); @@ -133,6 +112,7 @@ class Controller extends \Piwik\Plugin\Controller $view->$name = $value; } } + $view->showHeadline = false; $view->idGoal = $idGoal; $view->goalName = $goalDefinition['name']; $view->goalAllowMultipleConversionsPerVisit = $goalDefinition['allow_multiple']; @@ -169,12 +149,35 @@ class Controller extends \Piwik\Plugin\Controller } $view->goalsJSON = json_encode($goals); - $view->userCanEditGoals = Piwik::isUserHasAdminAccess($this->idSite); $view->ecommerceEnabled = $this->site->isEcommerceEnabled(); $view->displayFullReport = true; return $view->render(); } + public function manage() + { + Piwik::checkUserHasAdminAccess($this->idSite); + + $view = new View('@Goals/manageGoals'); + $this->setGeneralVariablesView($view); + + $goals = $this->goals; + $view->goals = $goals; + + // unsanitize goal names and other text data (not done in API so as not to break + // any other code/cause security issues) + + foreach ($goals as &$goal) { + $goal['name'] = Common::unsanitizeInputValue($goal['name']); + if (isset($goal['pattern'])) { + $goal['pattern'] = Common::unsanitizeInputValue($goal['pattern']); + } + } + $view->goalsJSON = json_encode($goals); + $view->ecommerceEnabled = $this->site->isEcommerceEnabled(); + return $view->render(); + } + public function widgetGoalsOverview() { $view = $this->getOverviewView(); @@ -441,9 +444,6 @@ class Controller extends \Piwik\Plugin\Controller 'Goals_EcommerceReports', 'Goals_ProductName', 'Goals.getItemsName', $ecommerceCustomParams); $goalReportsByDimension->addReport( 'Goals_EcommerceReports', 'Goals_ProductCategory', 'Goals.getItemsCategory', $ecommerceCustomParams); - - $goalReportsByDimension->addReport( - 'Goals_EcommerceReports', 'Goals_EcommerceLog', 'Goals.getEcommerceLog', array()); } if ($conversions > 0) { diff --git a/plugins/Goals/Goals.php b/plugins/Goals/Goals.php index f6b5e2f0f10b3aa4e70e281dbb45fecfd7a6b143..9e28689a8e93cc804b25737122841b58133a20e1 100644 --- a/plugins/Goals/Goals.php +++ b/plugins/Goals/Goals.php @@ -21,15 +21,6 @@ use Piwik\Translate; */ class Goals extends \Piwik\Plugin { - public function getInformation() - { - $suffix = Piwik::translate('SitesManager_PiwikOffersEcommerceAnalytics', - array('<a href="http://piwik.org/docs/ecommerce-analytics/" rel="noreferrer" target="_blank">', '</a>')); - $info = parent::getInformation(); - $info['description'] .= ' ' . $suffix; - return $info; - } - public static function getReportsWithGoalMetrics() { $dimensions = self::getAllReportsWithGoalMetrics(); diff --git a/plugins/Goals/Menu.php b/plugins/Goals/Menu.php index 46b394b06783398cf02aa02640d71f1b6f356ecf..aec2c0500e106cf24d00d216f5e8e096cc031a02 100644 --- a/plugins/Goals/Menu.php +++ b/plugins/Goals/Menu.php @@ -12,11 +12,8 @@ use Piwik\Common; use Piwik\Menu\Group; use Piwik\Menu\MenuReporting; use Piwik\Piwik; -use Piwik\Site; use Piwik\Translate; -/** - */ class Menu extends \Piwik\Plugin\Menu { @@ -24,35 +21,23 @@ class Menu extends \Piwik\Plugin\Menu { $idSite = Common::getRequestVar('idSite', null, 'int'); $goals = API::getInstance()->getGoals($idSite); - $mainGoalMenu = $this->getGoalCategoryName($idSite); - - $site = new Site($idSite); + $mainGoalMenu = 'Goals_Goals'; if (count($goals) == 0) { - $action = $site->isEcommerceEnabled() ? 'ecommerceReport' : 'addNewGoal'; + $action = 'addNewGoal'; $url = $this->urlForAction($action, array( - 'idGoal' => ($site->isEcommerceEnabled() ? Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER : null - ))); + 'idGoal' => null + )); $menu->addItem($mainGoalMenu, '', $url, 25); - - if ($site->isEcommerceEnabled()) { - $menu->addItem($mainGoalMenu, 'Goals_Ecommerce', $this->urlForAction('ecommerceReport', array('idGoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER)), 1); - } - $menu->addItem($mainGoalMenu, 'Goals_AddNewGoal', $this->urlForAction('addNewGoal')); } else { - $action = $site->isEcommerceEnabled() ? 'ecommerceReport' : 'index'; - $url = $this->urlForAction($action, array('idGoal' => ($site->isEcommerceEnabled() ? Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER : null))); + $action = 'index'; + $url = $this->urlForAction($action, array('idGoal' => null)); $menu->addItem($mainGoalMenu, '', $url, 25); - - if ($site->isEcommerceEnabled()) { - $menu->addItem($mainGoalMenu, 'Goals_Ecommerce', $this->urlForAction('ecommerceReport', array('idGoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER)), 1); - } - $menu->addItem($mainGoalMenu, 'Goals_GoalsOverview', array('module' => 'Goals', 'action' => 'index'), 2); $group = new Group(); @@ -72,11 +57,11 @@ class Menu extends \Piwik\Plugin\Menu $menu->addGroup($mainGoalMenu, 'Goals_ChooseGoal', $group, $orderId = 50, $tooltip = false); } } - } - private function getGoalCategoryName($idSite) - { - $site = new Site($idSite); - return $site->isEcommerceEnabled() ? 'Goals_EcommerceAndGoalsMenu' : 'Goals_Goals'; + if (0 !== count($goals) && Piwik::isUserHasAdminAccess($idSite)) { + $menu->addItem($mainGoalMenu, 'Goals_GoalsManagement', $this->urlForAction('manage'), 1); + } + } + } diff --git a/plugins/Goals/javascripts/goalsForm.js b/plugins/Goals/javascripts/goalsForm.js index 400f3813c273bf7053fef1239d96ec3542349262..e7de62d168bfe13cee255fefca84740d529292ff 100644 --- a/plugins/Goals/javascripts/goalsForm.js +++ b/plugins/Goals/javascripts/goalsForm.js @@ -9,14 +9,15 @@ function showAddNewGoal() { hideForms(); $(".entityAddContainer").show(); showCancel(); + hideCreateGoal(); piwikHelper.lazyScrollTo(".entityContainer", 400); return false; } function showEditGoals() { hideForms(); + showCreateGoal(); $("#entityEditContainer").show(); - showCancel(); piwikHelper.lazyScrollTo(".entityContainer", 400); return false; } @@ -31,9 +32,18 @@ function showCancel() { $('.entityCancelLink').click(function () { hideForms(); $(".entityCancel").hide(); + showEditGoals(); }); } +function showCreateGoal() { + $("a[name=linkAddNewGoal]").show(); +} + +function hideCreateGoal() { + $("a[name=linkAddNewGoal]").hide(); +} + function onMatchAttributeChange(matchAttribute) { if ('event' === matchAttribute) { @@ -173,7 +183,9 @@ function ajaxAddGoal() { var ajaxRequest = new ajaxHelper(); ajaxRequest.addParams(parameters, 'get'); ajaxRequest.setLoadingElement('#goalAjaxLoading'); - ajaxRequest.setCallback(function () { location.reload(); }); + ajaxRequest.setCallback(function () { + location.reload(); + }); ajaxRequest.send(true); } diff --git a/plugins/Goals/templates/_addEditGoal.twig b/plugins/Goals/templates/_addEditGoal.twig index 167dbba7b0ac7afec771e305bfcc28216bc357e9..6be11cf494d1862858a8544f8219154bb8ecae29 100644 --- a/plugins/Goals/templates/_addEditGoal.twig +++ b/plugins/Goals/templates/_addEditGoal.twig @@ -1,37 +1,3 @@ -{% if onlyShowAddNewGoal is defined %} - <h2 piwik-enriched-headline>{{ 'Goals_AddNewGoal'|translate }}</h2> - <p>{{ 'Goals_NewGoalIntro'|translate }}</p> - <p>{{ 'Goals_NewGoalDescription'|translate }} - {{ 'Goals_NewWhatDoYouWantUsersToDo'|translate }} - {{ 'Goals_NewGoalYouWillBeAbleTo'|translate }}</p> - <p>{{ 'Goals_LearnMoreAboutGoalTrackingDocumentation'|translate("<a href='?module=Proxy&action=redirect&url=http://piwik.org/docs/tracking-goals-web-analytics/' target='_blank'>","</a>")|raw }} - </p> -{% else %} - <div class="clear"></div> - <h2 piwik-enriched-headline>{{ 'Goals_GoalsManagement'|translate }}</h2> - <div class="entityList"> - <ul class='listCircle'> - <li><a onclick='' name='linkAddNewGoal'>{{ 'Goals_CreateNewGOal'|translate }}</a></li> - <li><a onclick='' name='linkEditGoals'>{{ 'Goals_ViewAndEditGoals'|translate }}</a></li> - <li>{{ 'Goals_LearnMoreAboutGoalTrackingDocumentation'|translate("<a href='?module=Proxy&action=redirect&url=http://piwik.org/docs/tracking-goals-web-analytics/' target='_blank'>","</a>")|raw }}</li> - - <li> - {% if not ecommerceEnabled %} - {% set websiteManageText %} - <a href='{{ linkTo({'module':'SitesManager','action':'index' }) }}'>{{ 'SitesManager_WebsitesManagement'|translate }}</a> - {% endset %} - {% set ecommerceReportText %} - <a href="http://piwik.org/docs/ecommerce-analytics/" rel="noreferrer" target="_blank">{{ 'Goals_EcommerceReports'|translate }}</a> - {% endset %} - {{ 'Goals_Optional'|translate }} {{ 'Goals_Ecommerce'|translate }}: {{ 'Goals_YouCanEnableEcommerceReports'|translate(ecommerceReportText,websiteManageText)|raw }} - {% else %} - {{ 'SitesManager_PiwikOffersEcommerceAnalytics'|translate('<a href="http://piwik.org/docs/ecommerce-analytics/" rel="noreferrer" target="_blank">',"</a>")|raw }} - {% endif %} - </li> - </ul> - </div> - <br/> -{% endif %} {% import 'ajaxMacros.twig' as ajax %} {{ ajax.errorDiv() }} @@ -49,7 +15,9 @@ {% endif %} <a id='bottom'></a> </div> + <br/><br/> + <script type="text/javascript"> var mappingMatchTypeName = { "url": "{{ 'Goals_URL'|translate }}", @@ -78,6 +46,7 @@ {% if onlyShowAddNewGoal is not defined %} piwik.goals = {{ goalsJSON|raw }}; bindListGoalEdit(); + showEditGoals(); {% else %} initAndShowAddGoalForm(); {% endif %} diff --git a/plugins/Goals/templates/_titleAndEvolutionGraph.twig b/plugins/Goals/templates/_titleAndEvolutionGraph.twig index 4fe5c66dccab79574ee9bf30d7470fb3ec222262..26f7772ebea68633bba2e02680ab389d5824d868 100644 --- a/plugins/Goals/templates/_titleAndEvolutionGraph.twig +++ b/plugins/Goals/templates/_titleAndEvolutionGraph.twig @@ -1,6 +1,6 @@ <span data-graph-id="{{ nameGraphEvolution }}"></span> -{% if displayFullReport %} +{% if displayFullReport or showHeadline %} <h2 piwik-enriched-headline>{% if goalName is defined %}{{ 'Goals_GoalX'|translate(goalName)|raw }}{% else %}{{ 'Goals_GoalsOverview'|translate }}{% endif %}</h2> {% endif %} {{ graphEvolution|raw }} diff --git a/plugins/Goals/templates/addNewGoal.twig b/plugins/Goals/templates/addNewGoal.twig index e4cbaea7876f90218bdb33841b281543e3f6befe..b3619c4aa030f25a2f60418df030f332c2f37f1f 100644 --- a/plugins/Goals/templates/addNewGoal.twig +++ b/plugins/Goals/templates/addNewGoal.twig @@ -1,4 +1,12 @@ {% if userCanEditGoals %} + <h2 piwik-enriched-headline>{{ 'Goals_AddNewGoal'|translate }}</h2> + <p>{{ 'Goals_NewGoalIntro'|translate }}</p> + <p>{{ 'Goals_NewGoalDescription'|translate }} + {{ 'Goals_NewWhatDoYouWantUsersToDo'|translate }} + {{ 'Goals_NewGoalYouWillBeAbleTo'|translate }}</p> + <p>{{ 'Goals_LearnMoreAboutGoalTrackingDocumentation'|translate("<a href='?module=Proxy&action=redirect&url=http://piwik.org/docs/tracking-goals-web-analytics/' target='_blank'>","</a>")|raw }} + </p> + {% include "@Goals/_addEditGoal.twig" %} {% else %} <h2>{{ 'Goals_CreateNewGOal'|translate }}</h2> diff --git a/plugins/Goals/templates/getOverviewView.twig b/plugins/Goals/templates/getOverviewView.twig index 13e275226b20ae9dad62a8273eab3f550927b4a8..281d65952c03258ab9b6f8177d307382b4c0eede 100644 --- a/plugins/Goals/templates/getOverviewView.twig +++ b/plugins/Goals/templates/getOverviewView.twig @@ -43,8 +43,4 @@ </h2> {{ goalReportsByDimension|raw }} {% endif %} - - {% if userCanEditGoals %} - {% include "@Goals/_addEditGoal.twig" %} - {% endif %} {% endif %} diff --git a/plugins/Goals/templates/manageGoals.twig b/plugins/Goals/templates/manageGoals.twig new file mode 100644 index 0000000000000000000000000000000000000000..a69f4d9605f964c80f501479b62729909f530193 --- /dev/null +++ b/plugins/Goals/templates/manageGoals.twig @@ -0,0 +1,29 @@ +<div class="clear"></div> +<h2 piwik-enriched-headline>{{ 'Goals_GoalsManagement'|translate }}</h2> + +<div class="entityList"> + <ul class='listCircle'> + <li>{{ 'Goals_LearnMoreAboutGoalTrackingDocumentation'|translate("<a href='?module=Proxy&action=redirect&url=http://piwik.org/docs/tracking-goals-web-analytics/' target='_blank'>","</a>")|raw }}</li> + <li> + {% if not ecommerceEnabled %} + {% set websiteManageText %} + <a href='{{ linkTo({'module':'SitesManager','action':'index' }) }}'>{{ 'SitesManager_WebsitesManagement'|translate }}</a> + {% endset %} + {% set ecommerceReportText %} + <a href="http://piwik.org/docs/ecommerce-analytics/" rel="noreferrer" target="_blank">{{ 'Goals_EcommerceReports'|translate }}</a> + {% endset %} + {{ 'Goals_Optional'|translate }} {{ 'Goals_Ecommerce'|translate }}: {{ 'Goals_YouCanEnableEcommerceReports'|translate(ecommerceReportText,websiteManageText)|raw }} + {% else %} + {{ 'SitesManager_PiwikOffersEcommerceAnalytics'|translate('<a href="http://piwik.org/docs/ecommerce-analytics/" rel="noreferrer" target="_blank">',"</a>")|raw }} + {% endif %} + </li> + </ul> +</div> +<br/> + +<div class="entityList"> + <a onclick='' name='linkAddNewGoal'>{{ 'Goals_CreateNewGOal'|translate }}</a> +</div> +<br/> + +{% include "@Goals/_addEditGoal.twig" %}