From 916848085adcc6504c9cb1757e8fc9cba3eee468 Mon Sep 17 00:00:00 2001
From: mattab <matthieu.aubry@gmail.com>
Date: Mon, 1 Jul 2013 14:08:36 +1200
Subject: [PATCH] * Enabling Twig 'strict_variables' so that we write best code
 possible, and learn early if some tpl code is not valid. Fixing few bugs that
 this uncovered * refactoring the percent column label in
 getPercentVisitColumn() * removing indexBeforeMenu and putting directly in
 parent template Refs #4019

---
 core/Metrics.php                              |  8 ++++
 core/Twig.php                                 |  3 +-
 core/Version.php                              |  2 +-
 core/View.php                                 |  1 -
 plugins/CoreAdminHome/Controller.php          |  6 +--
 .../templates/generalSettings.twig            |  2 +-
 plugins/CoreHome/templates/_dataTable.twig    |  2 +-
 .../CoreHome/templates/_dataTableActions.twig |  2 +-
 .../CoreHome/templates/_dataTableCell.twig    | 17 ++++----
 .../CoreHome/templates/_dataTableFooter.twig  |  2 +-
 plugins/CoreHome/templates/_topBar.twig       |  7 ++--
 .../CoreHome/templates/_topBarHelloMenu.twig  |  2 +-
 .../templates/_warningInvalidHost.twig        |  2 +-
 plugins/CorePluginsAdmin/Controller.php       |  4 +-
 .../Goals/templates/getGoalReportView.twig    |  2 +-
 .../ImageGraph/templates/testAllSizes.twig    |  2 +-
 .../Live/templates/getLastVisitsStart.twig    |  4 +-
 plugins/Live/templates/getVisitorLog.twig     | 14 +++----
 .../MobileMessaging/SMSProvider/Clockwork.php | 26 +++++++-----
 plugins/MultiSites/Controller.php             |  2 +-
 .../MultiSites/templates/getSitesInfo.twig    | 12 ++----
 plugins/PrivacyManager/Controller.php         |  6 +--
 plugins/SEO/templates/getRank.twig            | 12 +++---
 plugins/UserSettings/Controller.php           |  2 +-
 plugins/UserSettings/UserSettings.php         |  2 +-
 plugins/UsersManager/Controller.php           |  5 +--
 plugins/UsersManager/templates/index.twig     |  2 +-
 .../UsersManager/templates/userSettings.twig  |  2 +-
 plugins/VisitorGenerator/templates/index.twig |  2 +-
 plugins/VisitorInterest/Controller.php        |  2 +-
 plugins/VisitorInterest/VisitorInterest.php   |  2 +-
 .../Zeitgeist/templates/_indexBeforeMenu.twig | 12 ------
 .../templates/_jsGlobalVariables.twig         | 42 ++++++++-----------
 plugins/Zeitgeist/templates/admin.twig        |  6 +--
 plugins/Zeitgeist/templates/dashboard.twig    | 10 ++++-
 plugins/Zeitgeist/templates/macros.twig       |  2 +-
 36 files changed, 110 insertions(+), 121 deletions(-)
 delete mode 100644 plugins/Zeitgeist/templates/_indexBeforeMenu.twig

diff --git a/core/Metrics.php b/core/Metrics.php
index 3b10a7f377..b81999f48f 100644
--- a/core/Metrics.php
+++ b/core/Metrics.php
@@ -287,4 +287,12 @@ class Piwik_Metrics
         );
         return array_map('Piwik_Translate', $documentation);
     }
+
+
+    public static function getPercentVisitColumn()
+    {
+        $percentVisitsLabel = str_replace(' ', html_entity_decode('&nbsp;'), Piwik_Translate('General_ColumnPercentageVisits'));
+        return $percentVisitsLabel;
+    }
+
 }
\ No newline at end of file
diff --git a/core/Twig.php b/core/Twig.php
index 27f2e54fdb..167f94d568 100644
--- a/core/Twig.php
+++ b/core/Twig.php
@@ -41,6 +41,7 @@ class Piwik_Twig
         $this->twig = new Twig_Environment($chainLoader,
             array(
                  'debug' => true, // to use {{ dump(var) }} in twig templates
+                 'strict_variables' => true, // throw an exception if variables are invalid
                 //'cache' => PIWIK_DOCUMENT_ROOT . '/tmp/templates_c',
             )
         );
@@ -52,9 +53,9 @@ class Piwik_Twig
         $this->addFilter_sumTime();
         $this->addFilter_money();
         $this->addFilter_truncate();
+
         $this->twig->addFilter( new Twig_SimpleFilter('implode', 'implode'));
         /*
-        $this->load_filter('output', 'cachebuster');
         $this->load_filter('output', 'trimwhitespace');*/
 
 
diff --git a/core/Version.php b/core/Version.php
index 53ca79f9d2..eb28db44c1 100644
--- a/core/Version.php
+++ b/core/Version.php
@@ -20,5 +20,5 @@ final class Piwik_Version
      * Current Piwik version
      * @var string
      */
-    const VERSION = '1.12';
+    const VERSION = '2.0-b3';
 }
diff --git a/core/View.php b/core/View.php
index 3ce36e7306..9d9134dc18 100644
--- a/core/View.php
+++ b/core/View.php
@@ -45,7 +45,6 @@ class Piwik_View implements Piwik_View_Interface
         $this->initializeTwig();
 
         $this->piwik_version = Piwik_Version::VERSION;
-        $this->cacheBuster = md5(Piwik_Common::getSalt() . PHP_VERSION . Piwik_Version::VERSION);
         $this->piwikUrl = Piwik_Common::sanitizeInputValue(Piwik_Url::getCurrentUrlWithoutFileName());
     }
 
diff --git a/plugins/CoreAdminHome/Controller.php b/plugins/CoreAdminHome/Controller.php
index a4638beaa3..a24087c0cb 100644
--- a/plugins/CoreAdminHome/Controller.php
+++ b/plugins/CoreAdminHome/Controller.php
@@ -41,11 +41,9 @@ class Piwik_CoreAdminHome_Controller extends Piwik_Controller_Admin
             $view->todayArchiveTimeToLive = $todayArchiveTimeToLive;
             $view->enableBrowserTriggerArchiving = $enableBrowserTriggerArchiving;
 
-            $config = Piwik_Config::getInstance();
+            $view->configFileNotWritable = !Piwik_Config::getInstance()->isFileWritable();
 
-            if (!$config->isFileWritable()) {
-                $view->configFileNotWritable = true;
-            }
+            $config = Piwik_Config::getInstance();
 
             $debug = $config->Debug;
             $view->enableBetaReleaseCheck = $debug['allow_upgrades_to_beta'];
diff --git a/plugins/CoreAdminHome/templates/generalSettings.twig b/plugins/CoreAdminHome/templates/generalSettings.twig
index cbc8d1743a..a84e3f6901 100644
--- a/plugins/CoreAdminHome/templates/generalSettings.twig
+++ b/plugins/CoreAdminHome/templates/generalSettings.twig
@@ -134,7 +134,7 @@
             <tr>
                 <td><label for="mailPassword">{{ 'General_SmtpPassword'|translate }}</label><br/>
 				<span class="form-description">{{ 'General_OnlyEnterIfRequiredPassword'|translate }}<br/>
-                    {{ 'General_WarningPasswordStored'|translate("<strong>","</strong>") }}</span>
+                    {{ 'General_WarningPasswordStored'|translate("<strong>","</strong>")|raw }}</span>
                 </td>
                 <td>
                     <input type="password" id="mailPassword" value="{{ mail.password }}"/>
diff --git a/plugins/CoreHome/templates/_dataTable.twig b/plugins/CoreHome/templates/_dataTable.twig
index a295f4cd25..8bac0e8649 100644
--- a/plugins/CoreHome/templates/_dataTable.twig
+++ b/plugins/CoreHome/templates/_dataTable.twig
@@ -27,7 +27,7 @@
                             id="{{ row.idsubdatatable }}"{% endif %}{% if row.issummaryrow is defined and row.issummaryrow and properties.highlight_summary_row %} class="highlight"{% endif %}>
                             {% for column in dataTableColumns %}
                                 <td>
-                                    {% include "@CoreHome/_dataTableCell.twig" %}
+                                    {% include "@CoreHome/_dataTableCell.twig" with properties %}
                                 </td>
                             {% endfor %}
                         </tr>
diff --git a/plugins/CoreHome/templates/_dataTableActions.twig b/plugins/CoreHome/templates/_dataTableActions.twig
index cc5988e06a..996d6c3c9e 100644
--- a/plugins/CoreHome/templates/_dataTableActions.twig
+++ b/plugins/CoreHome/templates/_dataTableActions.twig
@@ -19,7 +19,7 @@
                             {% else %}class="actionsDataTable rowToProcess"{% endif %}>
                             {% for column in dataTableColumns %}
                                 <td>
-                                    {% include "@CoreHome/_dataTableCell.twig" with {'column': column, 'row': row} only %}
+                                    {% include "@CoreHome/_dataTableCell.twig" with {'column': column, 'row': row} %}
                                 </td>
                             {% endfor %}
                         </tr>
diff --git a/plugins/CoreHome/templates/_dataTableCell.twig b/plugins/CoreHome/templates/_dataTableCell.twig
index a49d830d1b..72c3f2d95f 100644
--- a/plugins/CoreHome/templates/_dataTableCell.twig
+++ b/plugins/CoreHome/templates/_dataTableCell.twig
@@ -1,24 +1,23 @@
 {% spaceless %}
 {% set tooltipIndex = column ~ '_tooltip' %}
 {% if row.metadata[tooltipIndex] is defined %}<span class="cell-tooltip" data-tooltip="{{ row.metadata[tooltipIndex] }}">{% endif %}
-{% if not row.idsubdatatable and column=='label' and row.metadata.url is not empty %}
+{% if not row.idsubdatatable and column=='label' and row.metadata.url is defined %}
     <a target="_blank" href='{% if row.metadata.url|slice(0,4) not in ['http','ftp:'] %}http://{% endif %}{{ row.metadata.url }}'>
-    {% if row.metadata.logo is empty %}
+    {% if row.metadata.logo is not defined %}
         <img class="link" width="10" height="9" src="plugins/Zeitgeist/images/link.gif"/>
     {% endif %}
 {% endif %}
 {% if column=='label' %}
     {% import 'macros.twig' as piwik %}
     {{ piwik.logoHtml(row.metadata, row.columns.label) }}
-    {% if row.metadata.html_label_prefix is not empty %}<span class='label-prefix'>{{ row.metadata.html_label_prefix | raw }}</span>{% endif %}
-    <span class='label{% if row.metadata.is_aggregate is not empty and  row.metadata.is_aggregate %} highlighted{% endif %}'
-        {% if properties.tooltip_metadata_name is not empty %}title="{{ row.metadata[properties.tooltip_metadata_name] }}"{% endif %}>
-        {# make sure there are no whitespaces inside the span #}
-    {% if row.metadata.html_label_suffix is not empty %}<span class='label-suffix'>{{ row.metadata.html_label_suffix | raw }}</span>{% endif %}
-{% endif %}
+    {% if row.metadata.html_label_prefix is defined %}<span class='label-prefix'>{{ row.metadata.html_label_prefix | raw }}&nbsp;</span>{% endif -%}
+        <span class='label{% if row.metadata.is_aggregate is defined and row.metadata.is_aggregate %} highlighted{% endif %}'
+        {% if properties is defined and properties.tooltip_metadata_name is not empty %}title="{{ row.metadata[properties.tooltip_metadata_name] }}"{% endif %}>
+        {% if row.metadata.html_label_suffix is defined %}<span class='label-suffix'>{{ row.metadata.html_label_suffix | raw }}</span>{% endif %}
+    {% endif %}
 {% if row.columns[column] is defined %}{{ row.columns[column]|raw }}{% else %}{{ defaultWhenColumnValueNotDefined }}{% endif %}
 {% if column=='label' %}</span>{% endif %}
-{% if not row.idsubdatatable and column=='label' and row.metadata.url is not empty %}
+{% if not row.idsubdatatable and column=='label' and row.metadata.url is defined %}
     </a>
 {% endif %}
 {% if row.metadata[tooltipIndex] is defined %}</span>{% endif %}
diff --git a/plugins/CoreHome/templates/_dataTableFooter.twig b/plugins/CoreHome/templates/_dataTableFooter.twig
index a9f4ea9fa9..8d6f1f1469 100644
--- a/plugins/CoreHome/templates/_dataTableFooter.twig
+++ b/plugins/CoreHome/templates/_dataTableFooter.twig
@@ -164,7 +164,7 @@
         {% endif %}
     </div>
 
-    {% if properties.show_footer_message is not empty %}
+    {% if properties.show_footer_message is defined and properties.show_footer_message is not empty %}
         <div class='datatableFooterMessage'>{{ properties.show_footer_message | raw }}</div>
     {% endif %}
 
diff --git a/plugins/CoreHome/templates/_topBar.twig b/plugins/CoreHome/templates/_topBar.twig
index 1a8e94d1ca..63d4569d3c 100644
--- a/plugins/CoreHome/templates/_topBar.twig
+++ b/plugins/CoreHome/templates/_topBar.twig
@@ -1,11 +1,12 @@
-<div id="topBars">
 
+{% if showTopMenu is not defined or showTopMenu %}
+<div id="topBars">
     {% include "@CoreHome/_topBarTopMenu.twig" %}
     {% include "@CoreHome/_topBarHelloMenu.twig" %}
-
 </div>
+{% endif %}
 
-{% if showSitesSelection %}
+{% if showSitesSelection is not defined or showSitesSelection %}
     <div class="top_bar_sites_selector">
         <label>{{ 'General_Website'|translate }}</label>
         {% include "@CoreHome/_siteSelect.twig" %}
diff --git a/plugins/CoreHome/templates/_topBarHelloMenu.twig b/plugins/CoreHome/templates/_topBarHelloMenu.twig
index 5d3fb16a12..34503d12bf 100644
--- a/plugins/CoreHome/templates/_topBarHelloMenu.twig
+++ b/plugins/CoreHome/templates/_topBarHelloMenu.twig
@@ -1,6 +1,6 @@
 <div id="topRightBar">
     {% set helloAlias %}
-        {% if userAlias %}
+        {% if userAlias is defined %}
             <strong>{{ userAlias }}</strong>
         {% else %}
             <strong>{{ userLogin }}</strong>
diff --git a/plugins/CoreHome/templates/_warningInvalidHost.twig b/plugins/CoreHome/templates/_warningInvalidHost.twig
index 58ec1b397f..7868e936d7 100644
--- a/plugins/CoreHome/templates/_warningInvalidHost.twig
+++ b/plugins/CoreHome/templates/_warningInvalidHost.twig
@@ -1,5 +1,5 @@
 {# untrusted host warning #}
-{% if (isValidHost and invalidHostMessage and isValidHost == false) %}
+{% if (isValidHost is defined and invalidHostMessage is defined and isValidHost == false) %}
     <div class="ajaxSuccess" style='clear:both;width:800px'>
         <a style="float:right" href="http://piwik.org/faq/troubleshooting/#faq_171" target="_blank"><img src="plugins/Zeitgeist/images/help_grey.png"/></a>
         <strong>{{ 'General_Warning'|translate }}:&nbsp;</strong>{{ invalidHostMessage }}
diff --git a/plugins/CorePluginsAdmin/Controller.php b/plugins/CorePluginsAdmin/Controller.php
index f4c4898332..b8495a64b4 100644
--- a/plugins/CorePluginsAdmin/Controller.php
+++ b/plugins/CorePluginsAdmin/Controller.php
@@ -55,9 +55,7 @@ class Piwik_CorePluginsAdmin_Controller extends Piwik_Controller_Admin
         $view->pluginsName = $plugins;
         $this->setBasicVariablesView($view);
         $view->menu = Piwik_GetAdminMenu();
-        if (!Piwik_Config::getInstance()->isFileWritable()) {
-            $view->configFileNotWritable = true;
-        }
+        $view->configFileNotWritable = !Piwik_Config::getInstance()->isFileWritable();
         echo $view->render();
     }
 
diff --git a/plugins/Goals/templates/getGoalReportView.twig b/plugins/Goals/templates/getGoalReportView.twig
index 8059260cb9..f11c8f0bb7 100644
--- a/plugins/Goals/templates/getGoalReportView.twig
+++ b/plugins/Goals/templates/getGoalReportView.twig
@@ -53,7 +53,7 @@
 </script>
 
 {% if displayFullReport %}
-    {% if nb_conversions > 0 or cart_nb_conversions is not empty %}
+    {% if nb_conversions > 0 or cart_nb_conversions is defined %}
         <h2 id='titleGoalsByDimension'>
             {% if idGoal is defined %}
                 {{ 'Goals_GoalConversionsBy'|translate(goalName)|raw }}
diff --git a/plugins/ImageGraph/templates/testAllSizes.twig b/plugins/ImageGraph/templates/testAllSizes.twig
index 99ff2dede4..358c8dce46 100644
--- a/plugins/ImageGraph/templates/testAllSizes.twig
+++ b/plugins/ImageGraph/templates/testAllSizes.twig
@@ -2,7 +2,7 @@
 
 {% block content %}
 {% set showSitesSelection=true %}
-<div class="top_controls_inner"></div>
+
 <div>
     <h2>{{ 'ImageGraph_ImageGraph'|translate }} ::: {{ siteName }}</h2>
 
diff --git a/plugins/Live/templates/getLastVisitsStart.twig b/plugins/Live/templates/getLastVisitsStart.twig
index 8134b7150a..678757b7d6 100644
--- a/plugins/Live/templates/getLastVisitsStart.twig
+++ b/plugins/Live/templates/getLastVisitsStart.twig
@@ -39,7 +39,7 @@
                     {% if visitor.referrerUrl is not empty %}
                         <a href="{{ visitor.referrerUrl }}" target="_blank">
                     {% endif %}
-                    {% if visitor.searchEngineIcon is not empty %}
+                    {% if visitor.searchEngineIcon is defined %}
                         <img src="{{ visitor.searchEngineIcon }}" />
                     {% endif %}
                     {{ visitor.referrerName }}
@@ -124,7 +124,7 @@
                         {% endif %}
                     {% endif %}
                 {% endfor %}
-                {% if actionDetails|length > maxPagesDisplayedByVisitor %}
+                {% if visitor.actionDetails|length > maxPagesDisplayedByVisitor %}
                     <i>({{ 'Live_MorePagesNotDisplayed'|translate }})</i>
                 {% endif %}
             </div>
diff --git a/plugins/Live/templates/getVisitorLog.twig b/plugins/Live/templates/getVisitorLog.twig
index 6b9ac00947..d350329f92 100644
--- a/plugins/Live/templates/getVisitorLog.twig
+++ b/plugins/Live/templates/getVisitorLog.twig
@@ -94,7 +94,7 @@
         {% endset %}
 
         {% set visitorRow %}
-            <tr class="label{{ cycle([odd,even], cycleIndex) }}">
+            <tr class="label{{ cycle(['odd','even'], cycleIndex) }}">
             {% set cycleIndex=cycleIndex+1 %}
                 <td style="display:none;"></td>
                 <td class="label" style="width:12%" width="12%">
@@ -116,7 +116,7 @@
                             {{ visitor.columns.providerName }}
                         </a>
                     {% endif %}
-                    {% if visitor.columns.customVariables is not empty %}
+                    {% if visitor.columns.customVariables is defined %}
                         <br/>
                         {% for id,customVariable in visitor.columns.customVariables %}
                             {% set name='customVariableName' ~ id %}
@@ -156,7 +156,7 @@
                             {% if visitor.columns.referrerKeyword is not empty %} - {{ visitor.columns.referrerKeyword }}{% endif %}
                         {% endif %}
                         {% if visitor.columns.referrerType == 'search' %}
-                            {% if visitor.columns.searchEngineIcon is not empty %}
+                            {% if visitor.columns.searchEngineIcon is defined %}
                                 <img src="{{ visitor.columns.searchEngineIcon }}" alt="{{ visitor.columns.referrerName }}"/>
                             {% endif %}
                             {{ visitor.columns.referrerName }}
@@ -193,7 +193,7 @@
                         {% set visitorHasSomeEcommerceActivity %}0{% endset %}
                         {% for action in visitor.columns.actionDetails %}
                             {% set customVariablesTooltip %}
-                                {% if action.customVariables is not empty %}
+                                {% if action.customVariables is defined %}
                                     {{ 'CustomVariables_CustomVariables'|translate }}
                                     {% for id,customVariable in action.customVariables %}
                                         {% set name = 'customVariablePageName' ~ id %}
@@ -203,7 +203,7 @@
                                 {% endif %}
                             {% endset %}
                             {% if not javascriptVariablesToSet.filterEcommerce or action.type == 'ecommerceOrder' or action.type == 'ecommerceAbandonedCart' %}
-                                <li class="{% if action.goalName is not empty %}goal{% else %}action{% endif %}"
+                                <li class="{% if action.goalName is defined %}goal{% else %}action{% endif %}"
                                     title="{{ action.serverTimePretty }}{% if action.url is not empty and action.url|trim|length %}
                                     {{ action.url }}{% endif %} {% if customVariablesTooltip|trim|length %}
 
@@ -261,12 +261,12 @@
                                                 </ul>
                                             {% endif %}
                                         </span>
-                                    {% elseif action.goalName is empty %}
+                                    {% elseif action.goalName is not defined%}
                                         {# Page view / Download / Outlink #}
                                         {% if action.pageTitle is not empty %}
                                             {{ action.pageTitle|truncate(80) }}
                                         {% endif %}
-                                        {% if action.siteSearchKeyword is not empty %}
+                                        {% if action.siteSearchKeyword is defined %}
                                             {% if action.type == 'search' %}
                                                 <img src='{{ action.icon }}' title='{{ 'Actions_SubmenuSitesearch'|translate }}'>
                                             {% endif %}
diff --git a/plugins/MobileMessaging/SMSProvider/Clockwork.php b/plugins/MobileMessaging/SMSProvider/Clockwork.php
index b7a50dfe02..faf5effbc7 100644
--- a/plugins/MobileMessaging/SMSProvider/Clockwork.php
+++ b/plugins/MobileMessaging/SMSProvider/Clockwork.php
@@ -69,17 +69,21 @@ class Piwik_MobileMessaging_SMSProvider_Clockwork extends Piwik_MobileMessaging_
 
         $timeout = self::SOCKET_TIMEOUT;
 
-        $result = Piwik_Http::sendHttpRequestBy(
-            Piwik_Http::getTransportMethod(),
-            $url,
-            $timeout,
-            $userAgent = null,
-            $destinationPath = null,
-            $file = null,
-            $followDepth = 0,
-            $acceptLanguage = false,
-            $acceptInvalidSslCertificate = true
-        );
+        try {
+            $result = Piwik_Http::sendHttpRequestBy(
+                Piwik_Http::getTransportMethod(),
+                $url,
+                $timeout,
+                $userAgent = null,
+                $destinationPath = null,
+                $file = null,
+                $followDepth = 0,
+                $acceptLanguage = false,
+                $acceptInvalidSslCertificate = true
+            );
+        } catch(Exception $e) {
+            $result = self::ERROR_STRING . " " . $e->getMessage();
+        }
 
         if (strpos($result, self::ERROR_STRING) !== false) {
             throw new Piwik_MobileMessaging_APIException(
diff --git a/plugins/MultiSites/Controller.php b/plugins/MultiSites/Controller.php
index 8c26e75f6c..46bf83848f 100644
--- a/plugins/MultiSites/Controller.php
+++ b/plugins/MultiSites/Controller.php
@@ -41,7 +41,7 @@ class Piwik_MultiSites_Controller extends Piwik_Controller
     }
 
 
-    public function getSitesInfo($isWidgetized)
+    public function getSitesInfo($isWidgetized = false)
     {
         Piwik::checkUserHasSomeViewAccess();
         $displayRevenueColumn = Piwik_Common::isGoalPluginEnabled();
diff --git a/plugins/MultiSites/templates/getSitesInfo.twig b/plugins/MultiSites/templates/getSitesInfo.twig
index f94118a270..31987ebfe4 100644
--- a/plugins/MultiSites/templates/getSitesInfo.twig
+++ b/plugins/MultiSites/templates/getSitesInfo.twig
@@ -1,4 +1,7 @@
-{% set showSitesSelection=false %}
+{% if isWidgetized %}
+    {% set showTopMenu = false %}
+    {% set showSitesSelection = false %}
+{% endif %}
 
 {% extends 'dashboard.twig' %}
 
@@ -37,13 +40,6 @@
             params['dateSparkline'] = '{{ dateSparkline }}';
         </script>
 
-        {% if not isWidgetized %}
-            <div class="top_controls_inner">
-                {% include "@CoreHome/_periodSelect.twig" %}
-                {% include "@CoreHome/_headerMessage.twig" %}
-            </div>
-        {% endif %}
-
         <div class="centerLargeDiv">
             <h2>{{ 'General_AllWebsitesDashboard'|translate }}
                 {% set nVisits %}{{ 'General_NVisits'|translate(totalVisits) }}{% endset %}
diff --git a/plugins/PrivacyManager/Controller.php b/plugins/PrivacyManager/Controller.php
index 336587eca0..6d089e42c6 100644
--- a/plugins/PrivacyManager/Controller.php
+++ b/plugins/PrivacyManager/Controller.php
@@ -118,11 +118,7 @@ class Piwik_PrivacyManager_Controller extends Piwik_Controller_Admin
             $view->dbUser = Piwik_Config::getInstance()->database['username'];
         }
         $view->language = Piwik_LanguagesManager::getLanguageCodeForCurrentUser();
-
-        if (!Piwik_Config::getInstance()->isFileWritable()) {
-            $view->configFileNotWritable = true;
-        }
-
+        $view->configFileNotWritable = !Piwik_Config::getInstance()->isFileWritable();
         $this->setBasicVariablesView($view);
         $view->menu = Piwik_GetAdminMenu();
 
diff --git a/plugins/SEO/templates/getRank.twig b/plugins/SEO/templates/getRank.twig
index eb1adf1410..17563b5619 100644
--- a/plugins/SEO/templates/getRank.twig
+++ b/plugins/SEO/templates/getRank.twig
@@ -24,21 +24,23 @@
                 <table cellspacing='2' style='margin:auto;line-height:1.5em;padding-top:10px'>
                     {% for rank in ranks %}
                         <tr>
-{% set seoLink %}{% if rank.logo_link is not empty %}<a class="linkContent" href="?module=Proxy&action=redirect&url={{ rank.logo_link|url_encode }}" target="_blank"
+{% set seoLink %}{% if rank.logo_link is defined %}<a class="linkContent" href="?module=Proxy&action=redirect&url={{ rank.logo_link|url_encode }}"
+                                                    target="_blank"
                          {% if rank.logo_tooltip is not empty %}title="{{ rank.logo_tooltip }}"{% endif %}>{% endif %}{% endset %}
                             {% set majesticLink %}{{ seoLink }}Majestic</a>{% endset %}
-                            <td>{% if rank.logo_link is not empty %}{{ seoLink|raw }}{% endif %}<img
+                            <td>{% if rank.logo_link is defined %}{{ seoLink|raw }}{% endif %}<img
                                             style='vertical-align:middle;margin-right:6px;' src='{{ rank.logo }}' border='0'
-                                            alt="{{ rank.label }}">{% if rank.logo_link is not empty %}</a>{% endif %} {{ rank.label|replace({"Majestic": majesticLink})|raw }}
+                                            alt="{{ rank.label }}">{% if rank.logo_link is defined %}</a>{% endif %} {{ rank.label|replace({"Majestic":
+                                majesticLink})|raw }}
                             </td>
                             <td>
                                 <div style='margin-left:15px'>
-                                {% if rank.logo_link is not empty %}{{ seoLink|raw }}{% endif %}
+                                {% if rank.logo_link is defined %}{{ seoLink|raw }}{% endif %}
                                     {% if rank.rank %}{{ rank.rank }}{% else %}-{% endif %}
                                     {% if rank.id=='pagerank' %} /10
                                     {% elseif rank.id=='google-index' or rank.id=='bing-index' %} {{ 'SEO_Pages'|translate }}
                                     {% endif %}
-                                {% if rank.logo_link is not empty %}</a>{% endif %}
+                                {% if rank.logo_link is defined %}</a>{% endif %}
                                 </div>
                             </td>
                         </tr>
diff --git a/plugins/UserSettings/Controller.php b/plugins/UserSettings/Controller.php
index 6f089fbb8a..f5c7893783 100644
--- a/plugins/UserSettings/Controller.php
+++ b/plugins/UserSettings/Controller.php
@@ -165,7 +165,7 @@ class Piwik_UserSettings_Controller extends Piwik_Controller
         $view->disableOffsetInformationAndPaginationControls();
         $view->setColumnsToDisplay(array('label', 'nb_visits_percentage', 'nb_visits'));
         $view->setColumnTranslation('label', Piwik_Translate('UserSettings_ColumnPlugin'));
-        $view->setColumnTranslation('nb_visits_percentage', str_replace(' ', '&nbsp;', Piwik_Translate('General_ColumnPercentageVisits')));
+        $view->setColumnTranslation('nb_visits_percentage', Piwik_Metrics::getPercentVisitColumn());
         $view->setSortedColumn('nb_visits_percentage');
         $view->setLimit(10);
         $view->setFooterMessage(Piwik_Translate('UserSettings_PluginDetectionDoesNotWorkInIE'));
diff --git a/plugins/UserSettings/UserSettings.php b/plugins/UserSettings/UserSettings.php
index 19b5252360..e1cd8c57c3 100644
--- a/plugins/UserSettings/UserSettings.php
+++ b/plugins/UserSettings/UserSettings.php
@@ -208,7 +208,7 @@ class Piwik_UserSettings extends Piwik_Plugin
             if ($apiAction == 'getPlugin') {
                 $report['metrics'] = array(
                     'nb_visits',
-                    'nb_visits_percentage' => Piwik_Translate('General_ColumnPercentageVisits')
+                    'nb_visits_percentage' => Piwik_Metrics::getPercentVisitColumn()
                 );
                 // There is no processedMetrics for this report
                 $report['processedMetrics'] = array();
diff --git a/plugins/UsersManager/Controller.php b/plugins/UsersManager/Controller.php
index adef52eaaa..57063bfbdd 100644
--- a/plugins/UsersManager/Controller.php
+++ b/plugins/UsersManager/Controller.php
@@ -126,9 +126,8 @@ class Piwik_UsersManager_Controller extends Piwik_Controller_Admin
         if (Piwik::isUserIsSuperUser()) {
             $view->userAlias = $userLogin;
             $view->userEmail = Piwik::getSuperUserEmail();
-            if (!Piwik_Config::getInstance()->isFileWritable()) {
-                $view->configFileNotWritable = true;
-            }
+            $view->configFileNotWritable = !Piwik_Config::getInstance()->isFileWritable();
+
         } else {
             $user = Piwik_UsersManager_API::getInstance()->getUser($userLogin);
             $view->userAlias = $user['alias'];
diff --git a/plugins/UsersManager/templates/index.twig b/plugins/UsersManager/templates/index.twig
index e6c8831bbd..01b3eafce0 100644
--- a/plugins/UsersManager/templates/index.twig
+++ b/plugins/UsersManager/templates/index.twig
@@ -46,7 +46,7 @@
             'siteName': defaultReportSiteName,
             'idSite':idSiteSelected,
             'allSitesItemText': applyAllSitesText,
-            'allWebsitesLinkLocation': top,
+            'allWebsitesLinkLocation': 'top',
             'siteSelectorId':"usersManagerSiteSelect",
             'switchSiteOnSelect':false
         } %}
diff --git a/plugins/UsersManager/templates/userSettings.twig b/plugins/UsersManager/templates/userSettings.twig
index dd5d3327d0..498bb530ca 100644
--- a/plugins/UsersManager/templates/userSettings.twig
+++ b/plugins/UsersManager/templates/userSettings.twig
@@ -55,7 +55,7 @@
                     'switchSiteOnSelect':false,
                     'showAllSitesItem':false,
                     'showSelectedSite':true,
-                    'siteSelectorId':defaultReportSiteSelector
+                    'siteSelectorId': 'defaultReportSiteSelector'
                 } %}
             </fieldset>
         </td>
diff --git a/plugins/VisitorGenerator/templates/index.twig b/plugins/VisitorGenerator/templates/index.twig
index 85b3006287..866bf2c448 100644
--- a/plugins/VisitorGenerator/templates/index.twig
+++ b/plugins/VisitorGenerator/templates/index.twig
@@ -11,7 +11,7 @@
             <td><label for="idSite">{{ 'General_ChooseWebsite'|translate }}</label></td>
             <td>
                 {% include "@CoreHome/_siteSelect.twig" with {
-                'showAllSitesItem':false,'showSelectedSite':true,'switchSiteOnSelect':false,'inputName':idSite } %}
+                'showAllSitesItem':false,'showSelectedSite':true,'switchSiteOnSelect':false,'inputName':'idSite' } %}
             </td>
         </tr>
         <tr>
diff --git a/plugins/VisitorInterest/Controller.php b/plugins/VisitorInterest/Controller.php
index 1ee0d7755c..e2b9936c7f 100644
--- a/plugins/VisitorInterest/Controller.php
+++ b/plugins/VisitorInterest/Controller.php
@@ -73,7 +73,7 @@ class Piwik_VisitorInterest_Controller extends Piwik_Controller
         $view->setColumnsToDisplay(array('label', 'nb_visits', 'nb_visits_percentage'));
         $view->setSortedColumn('label', 'asc');
         $view->setColumnTranslation('label', Piwik_Translate('VisitorInterest_VisitNum'));
-        $view->setColumnTranslation('nb_visits_percentage', str_replace(' ', '&nbsp;', Piwik_Translate('General_ColumnPercentageVisits')));
+        $view->setColumnTranslation('nb_visits_percentage', Piwik_Metrics::getPercentVisitColumn());
         $view->disableExcludeLowPopulation();
         $view->disableOffsetInformationAndPaginationControls();
         $view->disableShowAllViewsIcons();
diff --git a/plugins/VisitorInterest/VisitorInterest.php b/plugins/VisitorInterest/VisitorInterest.php
index c2a46f1f9e..d17750a662 100644
--- a/plugins/VisitorInterest/VisitorInterest.php
+++ b/plugins/VisitorInterest/VisitorInterest.php
@@ -80,7 +80,7 @@ class Piwik_VisitorInterest extends Piwik_Plugin
             'dimension'         => Piwik_Translate('VisitorInterest_visitsByVisitCount'),
             'metrics'           => array(
                 'nb_visits',
-                'nb_visits_percentage' => Piwik_Translate('General_ColumnPercentageVisits')
+                'nb_visits_percentage' => Piwik_Metrics::getPercentVisitColumn(),
             ),
             'processedMetrics'  => false,
             'constantRowsCount' => true,
diff --git a/plugins/Zeitgeist/templates/_indexBeforeMenu.twig b/plugins/Zeitgeist/templates/_indexBeforeMenu.twig
deleted file mode 100644
index 6293d6f930..0000000000
--- a/plugins/Zeitgeist/templates/_indexBeforeMenu.twig
+++ /dev/null
@@ -1,12 +0,0 @@
-{% include "@CoreHome/_warningInvalidHost.twig" %}
-
-{% if (showTopMenu == false or showTopMenu) %}
-    {% include "@CoreHome/_topBar.twig" %}
-{% endif %}
-{% include "@CoreHome/_topScreen.twig" %}
-
-<div class="ui-confirm" id="alert">
-    <h2></h2>
-    <input role="yes" type="button" value="{{ 'General_Ok'|translate }}"/>
-</div>
-
diff --git a/plugins/Zeitgeist/templates/_jsGlobalVariables.twig b/plugins/Zeitgeist/templates/_jsGlobalVariables.twig
index d00ea372e5..3667f2169f 100644
--- a/plugins/Zeitgeist/templates/_jsGlobalVariables.twig
+++ b/plugins/Zeitgeist/templates/_jsGlobalVariables.twig
@@ -4,38 +4,32 @@
     piwik.piwik_url = "{{ piwikUrl }}";
     {% if userLogin %}piwik.userLogin = "{{ userLogin|e('js')}}";
     {% endif %}
-    {% if idSite %}piwik.idSite = "{{ idSite }}";
+    {% if idSite is defined %}piwik.idSite = "{{ idSite }}";
     {% endif %}
-    {% if siteName %}piwik.siteName = "{{ siteName|e('js') }}";
+    {% if siteName is defined %}piwik.siteName = "{{ siteName|e('js') }}";
     {% endif %}
-    {% if siteMainUrl %}piwik.siteMainUrl = "{{ siteMainUrl|e('js') }}";
+    {% if siteMainUrl is defined %}piwik.siteMainUrl = "{{ siteMainUrl|e('js') }}";
     {% endif %}
-    {% if period %}piwik.period = "{{ period }}";
+    {% if period is defined %}piwik.period = "{{ period }}";
     {% endif %}
     {# piwik.currentDateString should not be used other than by the calendar Javascript
             (it is not set to the expected value when period=range)
         Use broadcast.getValueFromUrl('date') instead
     #}
-    piwik.currentDateString = "{% if date %}{{ date }}{% elseif endDate %}{{ endDate }}{% endif %}";
-    {% if startDate %}piwik.startDateString = "{{ startDate }}";
-    {% endif %}
-    {% if endDate %}piwik.endDateString = "{{ endDate }}";
-    {% endif %}
-    {% if minDateYear %}piwik.minDateYear = {{ minDateYear }};
-    {% endif %}
-    {% if minDateMonth %}piwik.minDateMonth = parseInt("{{ minDateMonth }}", 10);
-    {% endif %}
-    {% if minDateDay %}piwik.minDateDay = parseInt("{{ minDateDay }}", 10);
-    {% endif %}
-    {% if maxDateYear %}piwik.maxDateYear = {{ maxDateYear }};
-    {% endif %}
-    {% if maxDateMonth %}piwik.maxDateMonth = parseInt("{{ maxDateMonth }}", 10);
-    {% endif %}
-    {% if maxDateDay %}piwik.maxDateDay = parseInt("{{ maxDateDay }}", 10);
-    {% endif %}
-    {% if language %}piwik.language = "{{ language }}";
-    {% endif %}
-    {% if config_action_url_category_delimiter %}
+    piwik.currentDateString = "{{ date|default(endDate|default('')) }}";
+    {% if startDate is defined %}
+    piwik.startDateString = "{{ startDate }}";
+    piwik.endDateString = "{{ endDate }}";
+    piwik.minDateYear = {{ minDateYear }};
+    piwik.minDateMonth = parseInt("{{ minDateMonth }}", 10);
+    piwik.minDateDay = parseInt("{{ minDateDay }}", 10);
+    piwik.maxDateYear = {{ maxDateYear }};
+    piwik.maxDateMonth = parseInt("{{ maxDateMonth }}", 10);
+    piwik.maxDateDay = parseInt("{{ maxDateDay }}", 10);
+    {% endif %}
+    {% if language is defined %}piwik.language = "{{ language }}";
+    {% endif %}
+    {% if config_action_url_category_delimiter is defined %}
     piwik.config = {};
     piwik.config.action_url_category_delimiter = "{{ config_action_url_category_delimiter }}";
     {% endif %}
diff --git a/plugins/Zeitgeist/templates/admin.twig b/plugins/Zeitgeist/templates/admin.twig
index 54695934e9..29df7a369a 100644
--- a/plugins/Zeitgeist/templates/admin.twig
+++ b/plugins/Zeitgeist/templates/admin.twig
@@ -46,7 +46,7 @@
 
                     {% include "@CoreHome/_headerMessage.twig" %}
 
-                    {% if configFileNotWritable is not empty %}
+                    {% if configFileNotWritable is defined and configFileNotWritable%}
                     <div class="ajaxSuccess" style="display:inline-block">
                         {{ 'General_ConfigFileIsNotWritable'|translate("(config/config.ini.php)","<br/>")|raw }}
                     </div>
@@ -56,7 +56,7 @@
                     </div>
                     {% endif %}
 
-                    {% if statisticsNotRecorded is not empty %}
+                    {% if statisticsNotRecorded is defined and statisticsNotRecorded is not empty %}
                     <div class="ajaxSuccess" style="display:inline-block">
                         {{ 'General_StatisticsAreNotRecorded'|translate }}
                     </div>
@@ -70,7 +70,7 @@
                     {% include "@CoreHome/_warningInvalidHost.twig" %}
 
                     {# missing plugins warning #}
-                    {% if isSuperUser and missingPluginsWarning is not empty %}
+                    {% if isSuperUser and missingPluginsWarning is defined %}
                     <div class="ajaxSuccess">
                         <strong>{{ 'General_Warning'|translate }}:&nbsp;</strong>{{ missingPluginsWarning }}
                     </div>
diff --git a/plugins/Zeitgeist/templates/dashboard.twig b/plugins/Zeitgeist/templates/dashboard.twig
index 0dc2808338..6d20d94027 100644
--- a/plugins/Zeitgeist/templates/dashboard.twig
+++ b/plugins/Zeitgeist/templates/dashboard.twig
@@ -5,7 +5,7 @@
 <html><!--<![endif]-->
     <head>
         {% block head %}
-            <title>{{ siteName }} - {% if isCustomLogo == false %}Piwik &rsaquo; {% endif %} {{ 'CoreHome_WebAnalyticsReports'|translate }}</title>
+            <title>{{ siteName|raw }} - {% if isCustomLogo == false %}Piwik &rsaquo; {% endif %} {{ 'CoreHome_WebAnalyticsReports'|translate}}</title>
             <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
             <meta name="generator" content="Piwik - Open Source Web Analytics"/>
             <meta name="description" content="Web Analytics report for '{{ siteName }}' - Piwik"/>
@@ -26,7 +26,13 @@
     {% include "@CoreHome/_javaScriptDisabled.twig" %}
 
     <div id="root">
-        {% include "_indexBeforeMenu.twig" %}
+        {% include "@CoreHome/_warningInvalidHost.twig" %}
+        {% include "@CoreHome/_topBar.twig"  %}
+        {% include "@CoreHome/_topScreen.twig" %}
+        <div class="ui-confirm" id="alert">
+            <h2></h2>
+            <input role="yes" type="button" value="{{ 'General_Ok'|translate }}"/>
+        </div>
 
         {% block content %}
         {% endblock %}
diff --git a/plugins/Zeitgeist/templates/macros.twig b/plugins/Zeitgeist/templates/macros.twig
index 1429a676f1..552534e705 100644
--- a/plugins/Zeitgeist/templates/macros.twig
+++ b/plugins/Zeitgeist/templates/macros.twig
@@ -12,7 +12,7 @@
         {% if alt is not empty %}
             {% set alt %}title='{{ alt }}' alt='{{ alt }}'{% endset %}
         {% endif %}
-        <img {{ alt }} {{ width }} {{ height }} src='{{ metadata['logo'] }}' />
+        <img {{ alt }} {{ width|default('') }} {{ height|default('') }} src='{{ metadata['logo'] }}' />
     {% endif %}
 {% endmacro %}
 
-- 
GitLab