diff --git a/core/Cache/CacheDecorator.php b/core/Cache/CacheDecorator.php new file mode 100644 index 0000000000000000000000000000000000000000..f35154ba727f977858bbb9d7247c3f6dc70ee189 --- /dev/null +++ b/core/Cache/CacheDecorator.php @@ -0,0 +1,54 @@ +<?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\Cache; + +use Piwik\Tracker; +use Piwik\Translate; + +/** + * Caching class used for static caching. + */ +class CacheDecorator implements CacheInterface +{ + /** + * @var StaticCache + */ + protected $staticCache; + + public function __construct(CacheInterface $cache) + { + $this->staticCache = $cache; + } + + public function get() + { + return $this->staticCache->get(); + } + + public function has() + { + return $this->staticCache->has(); + } + + public function setCacheKey($cacheKey) + { + $this->staticCache->setCacheKey($cacheKey); + } + + public function getCacheKey() + { + return $this->staticCache->getCacheKey(); + } + + public function set($content) + { + $this->staticCache->set($content); + } + +} diff --git a/core/Cache/CacheInterface.php b/core/Cache/CacheInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..65039e5436f2b7197e56f022910e843bdc2d9e25 --- /dev/null +++ b/core/Cache/CacheInterface.php @@ -0,0 +1,29 @@ +<?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\Cache; + +use Piwik\Tracker; +use Piwik\Translate; + +/** + * Caching class used for static caching. + */ +interface CacheInterface +{ + public function get(); + + public function has(); + + public function setCacheKey($cacheKey); + + public function getCacheKey(); + + public function set($content); + +} diff --git a/core/Cache/LanguageAwareStaticCache.php b/core/Cache/LanguageAwareStaticCache.php index 95c324dcb076f8e960fd6f2ceb7d926cae213c6a..62b4773282b0a086b61696af063ea3d5bc73f006 100644 --- a/core/Cache/LanguageAwareStaticCache.php +++ b/core/Cache/LanguageAwareStaticCache.php @@ -15,7 +15,7 @@ use Piwik\Translate; * current loaded language. This prevents you from having to invalidate the cache during tests in case the loaded * language changes etc. * - * TODO convert this to a decorator... + * TODO convert this to a decorator... see {@link StaticCache} */ class LanguageAwareStaticCache extends StaticCache { diff --git a/core/Cache/PersistentCache.php b/core/Cache/PersistentCache.php index 2596b950a590f8a3b24b76a854f0e84da849db2a..3bb74fd2b13287a11d932d534275da48b47accf3 100644 --- a/core/Cache/PersistentCache.php +++ b/core/Cache/PersistentCache.php @@ -14,7 +14,16 @@ use Piwik\Piwik; use Piwik\SettingsServer; /** - * Caching class used for static caching. + * Caching class that persists all cached values between requests. Meaning whatever you cache will be stored on the + * file system. It differs from other caches such as {@link CacheFile} that it does not create a file for each cacheKey. + * Reading and writing new values does not cause multiple reads / writes on the file system and is therefore faster. + * The cache won't be invalidated after any time by default but when the tracker cache is cleared. This is usually the + * case when a new plugin is installed or an existing plugin or the core is updated. + * You should be careful when caching any data since we won't modify the cache key. So if your data depends on which + * plugins are activated or should not be available to each user than make sure to include unique names in the cache + * key such as the names of all loaded plugin names. + * If development mode is enabled in the config this cache acts as a {@link StaticCache}. Meaning it won't persist any + * data between requests. */ class PersistentCache { @@ -27,6 +36,10 @@ class PersistentCache private $cacheKey; + /** + * Initializes the cache. + * @param string $cacheKey + */ public function __construct($cacheKey) { $this->cacheKey = $cacheKey; @@ -37,21 +50,39 @@ class PersistentCache } } + /** + * Overwrites a previously set cache key. Useful if you want to reuse the same instance for different cache keys + * for performance reasons. + * @param string $cacheKey + */ public function setCacheKey($cacheKey) { $this->cacheKey = $cacheKey; } + /** + * Get the content related to the current cache key. Make sure to call the method {@link has()} to verify whether + * there is actually any content set under this cache key. + * @return mixed + */ public function get() { return self::$content[$this->cacheKey]; } + /** + * Check whether any content was actually stored for the current cache key. + * @return bool + */ public function has() { return array_key_exists($this->cacheKey, self::$content); } + /** + * Set (overwrite) any content related to the current set cache key. + * @param $content + */ public function set($content) { self::$content[$this->cacheKey] = $content; @@ -81,6 +112,9 @@ class PersistentCache Piwik::addAction($eventToPersist, array(__CLASS__, 'persistCache')); } + /** + * @ignore + */ public static function persistCache() { if (self::$isDirty) { @@ -94,6 +128,9 @@ class PersistentCache } } + /** + * @ignore + */ public static function _reset() { self::$content = array(); diff --git a/core/Cache/PluginAwareStaticCache.php b/core/Cache/PluginAwareStaticCache.php index 5d4208ede79b251896552b921dfaff5901bab0cd..1bc3a25bd5159ac042f0dde135cffff0928de571 100644 --- a/core/Cache/PluginAwareStaticCache.php +++ b/core/Cache/PluginAwareStaticCache.php @@ -16,7 +16,7 @@ use Piwik\Translate; * that are installed. This prevents you from having to invalidate the cache during tests in case the loaded plugins * changes etc. The key is language aware as well. * - * TODO convert this to a decorator... + * TODO convert this to a decorator... see {@link StaticCache} */ class PluginAwareStaticCache extends StaticCache { diff --git a/core/Cache/StaticCache.php b/core/Cache/StaticCache.php index a63c8fd796b7568a95ba4ed0c19ac1a4c768af54..b09f49ae0b0972cbcda27de10035b8da4ced6067 100644 --- a/core/Cache/StaticCache.php +++ b/core/Cache/StaticCache.php @@ -9,7 +9,8 @@ namespace Piwik\Cache; /** - * Caching class used for static caching. + * Caching class used for static caching. Any content that is set here won't be cached between requests. If you do want + * to persist any content between requests have a look at {@link PersistentCache} * * TODO the default static cache should actually not be language aware. Especially since we would end up in classes like * LanguageAwareStaticCache, PluginAwareStaticCache, PluginAwareLanguageAwareStaticCache, PluginAwareXYZStaticCache,... @@ -22,36 +23,56 @@ class StaticCache private $cacheKey; + /** + * Initializes the cache. + * @param string $cacheKey + */ public function __construct($cacheKey) { $this->setCacheKey($cacheKey); } + /** + * Overwrites a previously set cache key. Useful if you want to reuse the same instance for different cache keys + * for performance reasons. + * @param string $cacheKey + */ public function setCacheKey($cacheKey) { $this->cacheKey = $this->completeKey($cacheKey); } - public function getCacheKey() - { - return $this->cacheKey; - } - + /** + * Get the content related to the current cache key. Make sure to call the method {@link has()} to verify whether + * there is actually any content set under this cache key. + * @return mixed + */ public function get() { return self::$staticCache[$this->cacheKey]; } + /** + * Check whether any content was actually stored for the current cache key. + * @return bool + */ public function has() { return array_key_exists($this->cacheKey, self::$staticCache); } + /** + * Reset the stored content of the current cache key. + */ public function clear() { unset(self::$staticCache[$this->cacheKey]); } + /** + * Set (overwrite) any content related to the current set cache key. + * @param $content + */ public function set($content) { self::$staticCache[$this->cacheKey] = $content; diff --git a/core/Columns/Dimension.php b/core/Columns/Dimension.php index 4455480cdf52013c0f3c8b03c2e87ecba9660c5f..8f8e8a33db0457c8b476138534205fb7e3a1b3bc 100644 --- a/core/Columns/Dimension.php +++ b/core/Columns/Dimension.php @@ -20,16 +20,54 @@ use Piwik\Translate; */ abstract class Dimension { - protected $name; + // TODO that we have quite a few @ignore in public methods might show we should maybe split some code into two + // classes. + + /** + * This will be the name of the column in the database table if a $columnType is specified. + * @var string + * @api + */ protected $columnName = ''; + + /** + * If a columnType is defined, we will create a column in the MySQL table having this type. Please make sure + * MySQL understands this type. Once you change the column type the Piwik platform will notify the user to + * perform an update which can sometimes take a long time so be careful when choosing the correct column type. + * @var string + * @api + */ protected $columnType = ''; + + /** + * Holds an array of segment instances + * @var Segment[] + */ protected $segments = array(); + /** + * Overwrite this method to configure segments. To do so just create an instance of a {@link \Piwik\Plugin\Segment} + * class, configure it and call the {@link addSegment()} method. You can add one or more segments for this + * dimension. Example: + * + * ``` + $segment = new Segment(); + $segment->setSegment('exitPageUrl'); + $segment->setName('Actions_ColumnExitPageURL'); + $segment->setCategory('General_Visit'); + $this->addSegment($segment); + * ``` + */ protected function configureSegments() { - } + /** + * Check whether a dimension has overwritten a specific method. + * @param $method + * @return bool + * @ignore + */ public function hasImplementedEvent($method) { $method = new \ReflectionMethod($this, $method); @@ -38,6 +76,11 @@ abstract class Dimension return 0 === strpos($declaringClass->name, 'Piwik\Plugins'); } + /** + * Adds a new segment. The segment type will be set to 'dimension' automatically if not already set. + * @param Segment $segment + * @api + */ protected function addSegment(Segment $segment) { $type = $segment->getType(); @@ -50,7 +93,9 @@ abstract class Dimension } /** + * Get the list of configured segments. * @return Segment[] + * @ignore */ public function getSegments() { @@ -61,19 +106,38 @@ abstract class Dimension return $this->segments; } + /** + * Get the name of the dimension column. + * @return string + * @ignore + */ public function getColumnName() { return $this->columnName; } + /** + * Check whether the dimension has a column type configured + * @return bool + * @ignore + */ public function hasColumnType() { return !empty($this->columnType); } - abstract public function getName(); + /** + * Get the translated name of the dimension. Defaults to an empty string. + * @return string + * @api + */ + public function getName() + { + return ''; + } /** + * Gets an instance of all available visit, action and conversion dimension. * @return Dimension[] */ public static function getAllDimensions() diff --git a/core/Plugin/Dimension/ActionDimension.php b/core/Plugin/Dimension/ActionDimension.php index ec552e6d8e72f912034f7630aa1750fb36e69d31..0e8814726e31b6a1f70f6136f8953da316bf63e5 100644 --- a/core/Plugin/Dimension/ActionDimension.php +++ b/core/Plugin/Dimension/ActionDimension.php @@ -13,13 +13,24 @@ use Piwik\Columns\Dimension; use Piwik\Plugin\Manager as PluginManager; use Piwik\Plugin\Segment; use Piwik\Common; +use Piwik\Plugin; use Piwik\Db; use Piwik\Tracker\Action; use Piwik\Tracker\Request; use Piwik\Tracker\Visitor; use Piwik\Translate; +use Exception; /** + * Defines a new action dimension that records any information during tracking for each action. + * + * You can record any action information by implementing one of the following events: {@link onLookupAction()} and + * {@link getActionId()} or {@link onNewAction()}. By defining a {@link $columnName} and {@link $columnType} a new + * column will be created in the database (table `log_link_visit_action`) automatically and the values you return in + * the previous mentioned events will be saved in this column. + * + * You can create a new dimension using the console command `./console generate:dimension`. + * * @api * @since 2.5.0 */ @@ -27,6 +38,36 @@ abstract class ActionDimension extends Dimension { private $tableName = 'log_link_visit_action'; + /** + * Installs the action dimension in case it is not installed yet. The installation is already implemented based on + * the {@link $columnName} and {@link $columnType}. If you want to perform additional actions beside adding the + * column to the database - for instance adding an index - you can overwrite this method. We recommend to call + * this parent method to get the minimum required actions and then add further custom actions since this makes sure + * the column will be installed correctly. We also recommend to change the default install behavior only if really + * needed. FYI: We do not directly execute those alter table statements here as we group them together with several + * other alter table statements do execute those changes in one step which results in a faster installation. The + * column will be added to the `log_link_visit_action` MySQL table. + * + * Example: + * ``` + public function install() + { + $changes = parent::install(); + $changes['log_link_visit_action'][] = "ADD INDEX index_idsite_servertime ( idsite, server_time )"; + + return $changes; + } + ``` + * + * @return array An array containing the table name as key and an array of MySQL alter table statements that should + * be executed on the given table. Example: + * ``` + array( + 'log_link_visit_action' => array("ADD COLUMN `$this->columnName` $this->columnType", "ADD INDEX ...") + ); + ``` + * @api + */ public function install() { if (empty($this->columnName) || empty($this->columnType)) { @@ -38,6 +79,24 @@ abstract class ActionDimension extends Dimension ); } + /** + * Updates the action dimension in case the {@link $columnType} has changed. The update is already implemented based + * on the {@link $columnName} and {@link $columnType}. This method is intended not to overwritten by plugin + * developers as it is only supposed to make sure the column has the correct type. Adding additional custom "alter + * table" actions would not really work since they would be executed with every {@link $columnType} change. So + * adding an index here would be executed whenever the columnType changes resulting in an error if the index already + * exists. If an index needs to be added after the first version is released a plugin update class should be + * created since this makes sure it is only executed once. + * + * @return array An array containing the table name as key and an array of MySQL alter table statements that should + * be executed on the given table. Example: + * ``` + array( + 'log_link_visit_action' => array("MODIFY COLUMN `$this->columnName` $this->columnType", "DROP COLUMN ...") + ); + ``` + * @ignore + */ public function update() { if (empty($this->columnName) || empty($this->columnType)) { @@ -49,6 +108,14 @@ abstract class ActionDimension extends Dimension ); } + /** + * Uninstalls the dimension if a {@link $columnName} and {@link columnType} is set. In case you perform any custom + * actions during {@link install()} - for instance adding an index - you should make sure to undo those actions by + * overwriting this method. Make sure to call this parent method to make sure the uninstallation of the column + * will be done. + * @throws Exception + * @api + */ public function uninstall() { if (empty($this->columnName) || empty($this->columnType)) { @@ -58,32 +125,77 @@ abstract class ActionDimension extends Dimension try { $sql = "ALTER TABLE `" . Common::prefixTable($this->tableName) . "` DROP COLUMN `$this->columnName`"; Db::exec($sql); - } catch (\Exception $e) { + } catch (Exception $e) { if (!Db::get()->isErrNo($e, '1091')) { throw $e; } } } + /** + * Get the version of the dimension which is used for update checks. + * @return string + * @ignore + */ public function getVersion() { return $this->columnType; } + /** + * If the value you want to save for your dimension is something like a page title or page url, you usually do not + * want to save the raw value over and over again to save bytes in the database. Instead you want to save each value + * once in the log_action table and refer to this value by its ID in the log_link_visit_action table. You can do + * this by returning an action id in "getActionId()" and by returning a value here. If a value should be ignored + * or not persisted just return boolean false. Please note if you return a value here and you implement the event + * "onNewAction" the value will be probably overwritten by the other event. So make sure to implement only one of + * those. + * + * @param Request $request + * @param Action $action + * + * @return false|mixed + * @api + */ public function onLookupAction(Request $request, Action $action) { return false; } /** - * @return string|int - * @throws \Exception in case not implemented + * An action id. The value returned by the lookup action will be associated with this id in the log_action table. + * @return int + * @throws Exception in case not implemented */ public function getActionId() { - throw new \Exception('You need to overwrite the getActionId method in case you implement the onLookupAction method in class: ' . get_class($this)); + throw new Exception('You need to overwrite the getActionId method in case you implement the onLookupAction method in class: ' . get_class($this)); } + /** + * This event is triggered before a new action is logged to the `log_link_visit_action` table. It overwrites any + * looked up action so it makes usually no sense to implement both methods but it sometimes does. You can assign + * any value to the column or return boolan false in case you do not want to save any value. + * + * @param Request $request + * @param Visitor $visitor + * @param Action $action + * + * @return mixed|false + * @api + */ + public function onNewAction(Request $request, Visitor $visitor, Action $action) + { + return false; + } + + /** + * Adds a new segment. It automatically sets the SQL segment depending on the column name in case none is set + * already. + * @see \Piwik\Columns\Dimension::addSegment() + * @param Segment $segment + * @api + */ protected function addSegment(Segment $segment) { $sqlSegment = $segment->getSqlSegment(); @@ -94,7 +206,10 @@ abstract class ActionDimension extends Dimension parent::addSegment($segment); } - /** @return \Piwik\Plugin\Dimension\ActionDimension[] */ + /** + * Get all action dimensions that are defined by all activated plugins. + * @ignore + */ public static function getAllDimensions() { $cache = new PluginAwareStaticCache('ActionDimensions'); @@ -116,8 +231,13 @@ abstract class ActionDimension extends Dimension return $cache->get(); } - /** @return \Piwik\Plugin\Dimension\ActionDimension[] */ - public static function getDimensions(\Piwik\Plugin $plugin) + /** + * Get all action dimensions that are defined by the given plugin. + * @param Plugin $plugin + * @return ActionDimension[] + * @ignore + */ + public static function getDimensions(Plugin $plugin) { $dimensions = $plugin->findMultipleComponents('Columns', '\\Piwik\\Plugin\\Dimension\\ActionDimension'); $instances = array(); @@ -129,9 +249,4 @@ abstract class ActionDimension extends Dimension return $instances; } - public function onNewAction(Request $request, Visitor $visitor, Action $action) - { - return false; - } - } diff --git a/core/Plugin/Dimension/ConversionDimension.php b/core/Plugin/Dimension/ConversionDimension.php index 0df0a027184654ed414fb1be744b88be120c159b..4e69e5126555acc6073d3fe720f2fd55e6cb0615 100644 --- a/core/Plugin/Dimension/ConversionDimension.php +++ b/core/Plugin/Dimension/ConversionDimension.php @@ -19,8 +19,20 @@ use Piwik\Tracker\Request; use Piwik\Tracker\Visitor; use Piwik\Translate; use Piwik\Plugin\Segment; +use Piwik\Plugin; +use Exception; /** + * Defines a new conversion dimension that records any visit related information during tracking. + * + * You can record any visit information by implementing one of the following events: + * {@link onEcommerceOrderConversion()}, {@link onEcommerceCartUpdateConversion()} or {@link onGoalConversion()}. + * By defining a {@link $columnName} and {@link $columnType} a new column will be created in the database + * (table `log_conversion`) automatically and the values you return in the previous mentioned events will be saved in + * this column. + * + * You can create a new dimension using the console command `./console generate:dimension`. + * * @api * @since 2.5.0 */ @@ -28,6 +40,36 @@ abstract class ConversionDimension extends Dimension { private $tableName = 'log_conversion'; + /** + * Installs the conversion dimension in case it is not installed yet. The installation is already implemented based + * on the {@link $columnName} and {@link $columnType}. If you want to perform additional actions beside adding the + * column to the database - for instance adding an index - you can overwrite this method. We recommend to call + * this parent method to get the minimum required actions and then add further custom actions since this makes sure + * the column will be installed correctly. We also recommend to change the default install behavior only if really + * needed. FYI: We do not directly execute those alter table statements here as we group them together with several + * other alter table statements do execute those changes in one step which results in a faster installation. The + * column will be added to the `log_conversion` MySQL table. + * + * Example: + * ``` + public function install() + { + $changes = parent::install(); + $changes['log_conversion'][] = "ADD INDEX index_idsite_servertime ( idsite, server_time )"; + + return $changes; + } + ``` + * + * @return array An array containing the table name as key and an array of MySQL alter table statements that should + * be executed on the given table. Example: + * ``` + array( + 'log_conversion' => array("ADD COLUMN `$this->columnName` $this->columnType", "ADD INDEX ...") + ); + ``` + * @api + */ public function install() { if (empty($this->columnName) || empty($this->columnType)) { @@ -39,6 +81,11 @@ abstract class ConversionDimension extends Dimension ); } + /** + * @see ActionDimension::update() + * @return array + * @ignore + */ public function update() { if (empty($this->columnName) || empty($this->columnType)) { @@ -50,6 +97,14 @@ abstract class ConversionDimension extends Dimension ); } + /** + * Uninstalls the dimension if a {@link $columnName} and {@link columnType} is set. In case you perform any custom + * actions during {@link install()} - for instance adding an index - you should make sure to undo those actions by + * overwriting this method. Make sure to call this parent method to make sure the uninstallation of the column + * will be done. + * @throws Exception + * @api + */ public function uninstall() { if (empty($this->columnName) || empty($this->columnType)) { @@ -59,18 +114,31 @@ abstract class ConversionDimension extends Dimension try { $sql = "ALTER TABLE `" . Common::prefixTable($this->tableName) . "` DROP COLUMN `$this->columnName`"; Db::exec($sql); - } catch (\Exception $e) { + } catch (Exception $e) { if (!Db::get()->isErrNo($e, '1091')) { throw $e; } } } + /** + * @see ActionDimension::getVersion() + * @return string + * @ignore + */ public function getVersion() { return $this->columnType; } + /** + * Adds a new segment. It automatically sets the SQL segment depending on the column name in case none is set + * already. + * + * @see \Piwik\Columns\Dimension::addSegment() + * @param Segment $segment + * @api + */ protected function addSegment(Segment $segment) { $sqlSegment = $segment->getSqlSegment(); @@ -81,7 +149,10 @@ abstract class ConversionDimension extends Dimension parent::addSegment($segment); } - /** @return \Piwik\Plugin\Dimension\ConversionDimension[] */ + /** + * Get all conversion dimensions that are defined by all activated plugins. + * @ignore + */ public static function getAllDimensions() { $cache = new PluginAwareStaticCache('ConversionDimensions'); @@ -103,8 +174,13 @@ abstract class ConversionDimension extends Dimension return $cache->get(); } - /** @return \Piwik\Plugin\Dimension\ConversionDimension[] */ - public static function getDimensions(\Piwik\Plugin $plugin) + /** + * Get all conversion dimensions that are defined by the given plugin. + * @param Plugin $plugin + * @return ConversionDimension[] + * @ignore + */ + public static function getDimensions(Plugin $plugin) { $dimensions = $plugin->findMultipleComponents('Columns', '\\Piwik\\Plugin\\Dimension\\ConversionDimension'); $instances = array(); @@ -117,12 +193,16 @@ abstract class ConversionDimension extends Dimension } /** + * This event is triggered when an ecommerce order is converted. Any returned value will be persist in the database. + * Return boolean `false` if you do not want to change the value in some cases. + * * @param Request $request * @param Visitor $visitor * @param Action|null $action * @param GoalManager $goalManager * * @return mixed|false + * @api */ public function onEcommerceOrderConversion(Request $request, Visitor $visitor, $action, GoalManager $goalManager) { @@ -130,12 +210,16 @@ abstract class ConversionDimension extends Dimension } /** + * This event is triggered when an ecommerce cart update is converted. Any returned value will be persist in the + * database. Return boolean `false` if you do not want to change the value in some cases. + * * @param Request $request * @param Visitor $visitor * @param Action|null $action * @param GoalManager $goalManager * * @return mixed|false + * @api */ public function onEcommerceCartUpdateConversion(Request $request, Visitor $visitor, $action, GoalManager $goalManager) { @@ -143,12 +227,16 @@ abstract class ConversionDimension extends Dimension } /** + * This event is triggered when an any custom goal is converted. Any returned value will be persist in the + * database. Return boolean `false` if you do not want to change the value in some cases. + * * @param Request $request * @param Visitor $visitor * @param Action|null $action * @param GoalManager $goalManager * * @return mixed|false + * @api */ public function onGoalConversion(Request $request, Visitor $visitor, $action, GoalManager $goalManager) { diff --git a/core/Plugin/Dimension/VisitDimension.php b/core/Plugin/Dimension/VisitDimension.php index cf7204bdd5285edcabaed27d375118899ea83e8d..594791f920291aff8b4e4ca14211a58645e121ee 100644 --- a/core/Plugin/Dimension/VisitDimension.php +++ b/core/Plugin/Dimension/VisitDimension.php @@ -19,8 +19,19 @@ use Piwik\Tracker\Visitor; use Piwik\Tracker\Action; use Piwik\Tracker; use Piwik\Translate; +use Piwik\Plugin; +use Exception; /** + * Defines a new visit dimension that records any visit related information during tracking. + * + * You can record any visit information by implementing one of the following events: {@link onNewVisit()}, + * {@link onExistingVisit()}, {@link onConvertedVisit()} or {@link onAnyGoalConversion()}. By defining a + * {@link $columnName} and {@link $columnType} a new column will be created in the database (table `log_visit`) + * automatically and the values you return in the previous mentioned events will be saved in this column. + * + * You can create a new dimension using the console command `./console generate:dimension`. + * * @api * @since 2.5.0 */ @@ -28,6 +39,36 @@ abstract class VisitDimension extends Dimension { private $tableName = 'log_visit'; + /** + * Installs the visit dimension in case it is not installed yet. The installation is already implemented based on + * the {@link $columnName} and {@link $columnType}. If you want to perform additional actions beside adding the + * column to the database - for instance adding an index - you can overwrite this method. We recommend to call + * this parent method to get the minimum required actions and then add further custom actions since this makes sure + * the column will be installed correctly. We also recommend to change the default install behavior only if really + * needed. FYI: We do not directly execute those alter table statements here as we group them together with several + * other alter table statements do execute those changes in one step which results in a faster installation. The + * column will be added to the `log_visit` MySQL table. + * + * Example: + * ``` + public function install() + { + $changes = parent::install(); + $changes['log_visit'][] = "ADD INDEX index_idsite_servertime ( idsite, server_time )"; + + return $changes; + } + ``` + * + * @return array An array containing the table name as key and an array of MySQL alter table statements that should + * be executed on the given table. Example: + * ``` + array( + 'log_visit' => array("ADD COLUMN `$this->columnName` $this->columnType", "ADD INDEX ...") + ); + ``` + * @api + */ public function install() { if (!$this->columnType) { @@ -45,6 +86,12 @@ abstract class VisitDimension extends Dimension return $changes; } + /** + * @see ActionDimension::update() + * @param array $conversionColumns An array of currently installed columns in the conversion table. + * @return array + * @ignore + */ public function update($conversionColumns) { if (!$this->columnType) { @@ -69,6 +116,11 @@ abstract class VisitDimension extends Dimension return $changes; } + /** + * @see ActionDimension::getVersion() + * @return string + * @ignore + */ public function getVersion() { return $this->columnType . $this->isHandlingLogConversion(); @@ -83,6 +135,14 @@ abstract class VisitDimension extends Dimension return $this->hasImplementedEvent('onAnyGoalConversion'); } + /** + * Uninstalls the dimension if a {@link $columnName} and {@link columnType} is set. In case you perform any custom + * actions during {@link install()} - for instance adding an index - you should make sure to undo those actions by + * overwriting this method. Make sure to call this parent method to make sure the uninstallation of the column + * will be done. + * @throws Exception + * @api + */ public function uninstall() { if (empty($this->columnName) || empty($this->columnType)) { @@ -92,7 +152,7 @@ abstract class VisitDimension extends Dimension try { $sql = "ALTER TABLE `" . Common::prefixTable($this->tableName) . "` DROP COLUMN `$this->columnName`"; Db::exec($sql); - } catch (\Exception $e) { + } catch (Exception $e) { if (!Db::get()->isErrNo($e, '1091')) { throw $e; } @@ -101,13 +161,20 @@ abstract class VisitDimension extends Dimension try { $sql = "ALTER TABLE `" . Common::prefixTable('log_conversion') . "` DROP COLUMN `$this->columnName`"; Db::exec($sql); - } catch (\Exception $e) { + } catch (Exception $e) { if (!Db::get()->isErrNo($e, '1091')) { throw $e; } } } + /** + * Adds a new segment. It automatically sets the SQL segment depending on the column name in case none is set + * already. + * @see \Piwik\Columns\Dimension::addSegment() + * @param Segment $segment + * @api + */ protected function addSegment(Segment $segment) { $sqlSegment = $segment->getSqlSegment(); @@ -118,38 +185,90 @@ abstract class VisitDimension extends Dimension parent::addSegment($segment); } + /** + * Sometimes you may want to make sure another dimension is executed before your dimension so you can persist + * this dimensions' value depending on the value of other dimensions. You can do this by defining an array of + * dimension names. If you access any value of any other column within your events, you should require them here. + * Otherwise those values may not be available. + * @return array + * @api + */ public function getRequiredVisitFields() { return array(); } /** + * The `onNewVisit` method is triggered when a new visitor is detected. This means you can define an initial + * value for this user here. By returning boolean `false` no value will be saved. Once the user makes another action + * the event "onExistingVisit" is executed. Meaning for each visitor this method is executed once. + * * @param Request $request * @param Visitor $visitor * @param Action|null $action - * @return mixed + * @return mixed|false + * @api */ public function onNewVisit(Request $request, Visitor $visitor, $action) { return false; } + /** + * The `onExistingVisit` method is triggered when a visitor was recognized meaning it is not a new visitor. + * You can overwrite any previous value set by the event `onNewVisit` by implemting this event. By returning boolean + * `false` no value will be updated. + * + * @param Request $request + * @param Visitor $visitor + * @param Action|null $action + * @return mixed|false + * @api + */ public function onExistingVisit(Request $request, Visitor $visitor, $action) { return false; } + /** + * This event is executed shortly after `onNewVisit` or `onExistingVisit` in case the visitor converted a goal. + * Usually this event is not needed and you can simply remove this method therefore. An example would be for + * instance to persist the last converted action url. Return boolean `false` if you do not want to change the + * current value. + * + * @param Request $request + * @param Visitor $visitor + * @param Action|null $action + * @return mixed|false + * @api + */ public function onConvertedVisit(Request $request, Visitor $visitor, $action) { return false; } + /** + * By implementing this event you can persist a value to the `log_conversion` table in case a conversion happens. + * The persisted value will be logged along the conversion and will not be changed afterwards. This allows you to + * generate reports that shows for instance which url was called how often for a specific conversion. Once you + * implement this event and a $columnType is defined a column in the `log_conversion` MySQL table will be + * created automatically. + * + * @param Request $request + * @param Visitor $visitor + * @param Action|null $action + * @return mixed|false + * @api + */ public function onAnyGoalConversion(Request $request, Visitor $visitor, $action) { return false; } - /** @return \Piwik\Plugin\Dimension\VisitDimension[] */ + /** + * Get all visit dimensions that are defined by all activated plugins. + * @return VisitDimension[] + */ public static function getAllDimensions() { $cache = new PluginAwareStaticCache('VisitDimensions'); @@ -173,6 +292,9 @@ abstract class VisitDimension extends Dimension return $cache->get(); } + /** + * @ignore + */ public static function sortByRequiredFields($a, $b) { $fields = $a->getRequiredVisitFields(); @@ -188,8 +310,13 @@ abstract class VisitDimension extends Dimension return 0; } - /** @return \Piwik\Plugin\Dimension\VisitDimension[] */ - public static function getDimensions(\Piwik\Plugin $plugin) + /** + * Get all visit dimensions that are defined by the given plugin. + * @param Plugin $plugin + * @return VisitDimension[] + * @ignore + */ + public static function getDimensions(Plugin $plugin) { $dimensions = $plugin->findMultipleComponents('Columns', '\\Piwik\\Plugin\\Dimension\\VisitDimension'); $instances = array(); diff --git a/core/Plugin/Report.php b/core/Plugin/Report.php index 623bc42b5d3e916753dbe903621be046bc82795d..1db9b77f07c743f4b06838c822d0b084f5d6a1e4 100644 --- a/core/Plugin/Report.php +++ b/core/Plugin/Report.php @@ -21,6 +21,13 @@ use Piwik\ViewDataTable\Factory as ViewDataTableFactory; use \Exception; /** + * Defines a new report. This class contains all information a report defines except the corresponding API method which + * needs to be defined in the 'API.php'. You can define the name of the report, a documentation, the supported metrics, + * how the report should be displayed, which features the report has (eg search) and much more. + * + * You can create a new report using the console command `./console generate:report`. The generated report will guide + * you through the creation of a report. + * * @api * @since 2.5.0 */ @@ -85,16 +92,24 @@ class Report protected $menuTitle; /** - * The processed metrics this report supports, eg "average time on site" or "actions per visit". Defaults to the + * An array of supported metrics. Eg `array('nb_visits', 'nb_actions', ...)`. Defaults to the platform default + * metrics see {@link Metrics::getDefaultProcessedMetrics()}. + * @var array + * @api + */ + protected $metrics = array('nb_visits', 'nb_uniq_visitors', 'nb_actions'); + // for a little performance improvement we avoid having to call Metrics::getDefaultMetrics for each report + + /** + * The processed metrics this report supports, eg `avg_time_on_site` or `nb_actions_per_visit`. Defaults to the * platform default processed metrics, see {@link Metrics::getDefaultProcessedMetrics()}. Set it to boolean `false` - * if your report does not support any processed metrics at all. Otherwise an array of metric names and their - * translations. Eg `array('avg_time_on_site' => "Average sime on site")` + * if your report does not support any processed metrics at all. Otherwise an array of metric names. + * Eg `array('avg_time_on_site', 'nb_actions_per_visit', ...)` * @var array|false * @api */ - protected $processedMetrics = array(); - // TODO in {@link $metrics} we only want an array of metric names and not their translations. We should support - // this here as well for consistency. + protected $processedMetrics = array('nb_actions_per_visit', 'avg_time_on_site', 'bounce_rate', 'conversion_rate'); + // for a little performance improvement we avoid having to call Metrics::getDefaultProcessedMetrics for each report /** * Set this property to true in case your report supports goal metrics. In this case, the goal metrics will be @@ -104,14 +119,6 @@ class Report */ protected $hasGoalMetrics = false; - /** - * An array of supported metrics. Eg `array('nb_visits', 'nb_actions', ...)`. Defaults to the platform default - * metrics see {@link Metrics::getDefaultProcessedMetrics()}. - * @var array - * @api - */ - protected $metrics = array(); - /** * Set it to boolean `true` if your report always returns a constant count of rows, for instance always 24 rows * for 1-24 hours. @@ -138,7 +145,7 @@ class Report /** * An instance of a dimension if the report has one. You can create a new dimension using the Piwik console CLI tool * if needed. - * @var \Piwik\Plugin\Dimension\VisitDimension|\Piwik\Plugin\Dimension\ActionDimension|\Piwik\Plugin\Dimension\ConversionDimension + * @var \Piwik\Columns\Dimension */ protected $dimension; @@ -188,8 +195,6 @@ class Report $parts = explode('\\', $classname); $this->module = $parts[2]; $this->action = lcfirst($parts[4]); - $this->processedMetrics = Metrics::getDefaultProcessedMetrics(); - $this->metrics = array_keys(Metrics::getDefaultMetrics()); $this->init(); } @@ -222,9 +227,9 @@ class Report * containing a message that will be displayed to the user. You can overwrite this message in case you want to * customize the error message. Eg. * ``` - if (!$this->isEnabled()) { - throw new Exception('Setting XYZ is not enabled or the user has not enough permission'); - } + if (!$this->isEnabled()) { + throw new Exception('Setting XYZ is not enabled or the user has not enough permission'); + } * ``` * @throws \Exception * @api @@ -323,7 +328,7 @@ class Report /** * Returns an array of supported metrics and their corresponding translations. Eg `array('nb_visits' => 'Visits')`. * By default the given {@link $metrics} are used and their corresponding translations are looked up automatically. - * If your metric is not translated, you should add the default metric translation for this metric using + * If a metric is not translated, you should add the default metric translation for this metric using * the {@hook Metrics.getDefaultMetricTranslations} event. If you want to overwrite any default metric translation * you should overwrite this method, call this parent method to get all default translations and overwrite any * custom metric translations. @@ -335,6 +340,25 @@ class Report return $this->getMetricTranslations($this->metrics); } + /** + * Returns an array of supported processed metrics and their corresponding translations. Eg + * `array('nb_visits' => 'Visits')`. By default the given {@link $processedMetrics} are used and their + * corresponding translations are looked up automatically. If a metric is not translated, you should add the + * default metric translation for this metric using the {@hook Metrics.getDefaultMetricTranslations} event. If you + * want to overwrite any default metric translation you should overwrite this method, call this parent method to + * get all default translations and overwrite any custom metric translations. + * @return array + * @api + */ + public function getProcessedMetrics() + { + if (!is_array($this->processedMetrics)) { + return $this->processedMetrics; + } + + return $this->getMetricTranslations($this->processedMetrics); + } + /** * Returns an array of metric documentations and their corresponding translations. Eg * `array('nb_visits' => 'If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after...')`. @@ -425,8 +449,7 @@ class Report $report['metrics'] = $this->getMetrics(); $report['metricsDocumentation'] = $this->getMetricsDocumentation(); - - $report['processedMetrics'] = $this->processedMetrics; + $report['processedMetrics'] = $this->getProcessedMetrics(); if (!empty($this->actionToLoadSubTables)) { $report['actionToLoadSubTables'] = $this->actionToLoadSubTables; @@ -506,7 +529,7 @@ class Report } /** - * @return Dimension\ActionDimension|Dimension\ConversionDimension|Dimension\VisitDimension + * @return \Piwik\Columns\Dimension * @ignore */ public function getDimension() diff --git a/core/Plugin/Segment.php b/core/Plugin/Segment.php index 4169d1453cb337f6082a5f919d34316066c8527a..4281495a35d2b7c961b06f98002c2b1fbfe6b92e 100644 --- a/core/Plugin/Segment.php +++ b/core/Plugin/Segment.php @@ -9,12 +9,36 @@ namespace Piwik\Plugin; /** + * Creates a new segment that can be used for instance within the {@link \Piwik\Columns\Dimension::configureSegment()} + * method. Make sure to set at least the following values: {@link setName()}, {@link setSegment()}, + * {@link setSqlSegment()}, {@link setType()} and {@link setCategory()}. If you are using a segment in the context of a + * dimension the type and the SQL segment is usually set for you automatically. + * + * Example: + * ``` + $segment = new \Piwik\Plugin\Segment(); + $segment->setType(\Piwik\Plugin\Segment::TYPE_DIMENSION); + $segment->setName('General_EntryKeyword'); + $segment->setCategory('General_Visit'); + $segment->setSegment('entryKeyword'); + $segment->setSqlSegment('log_visit.entry_keyword'); + $segment->setAcceptedValues('Any keywords people search for on your website such as "help" or "imprint"'); + ``` * @api * @since 2.5.0 */ class Segment { + /** + * Segment type 'dimension'. Can be used along with {@link setType()}. + * @api + */ const TYPE_DIMENSION = 'dimension'; + + /** + * Segment type 'metric'. Can be used along with {@link setType()}. + * @api + */ const TYPE_METRIC = 'metric'; private $type; @@ -27,26 +51,42 @@ class Segment private $acceptValues; private $permission; - public function __construct() + /** + * @ignore + */ + final public function __construct() { $this->init(); } + /** + * Here you can initialize this segment and set any default values. It is called directly after the object is + * created. + * @api + */ protected function init() { } /** - * @param string $acceptValues + * Here you should explain which values are accepted/useful for your segment, for example: + * "1, 2, 3, etc." or "comcast.net, proxad.net, etc.". If the value needs any special encoding you should mention + * this as well. For example "Any URL including protocol. The URL must be URL encoded." + * + * @param string $acceptedValues + * @api */ - public function setAcceptedValues($acceptValues) + public function setAcceptedValues($acceptedValues) { - $this->acceptValues = $acceptValues; + $this->acceptValues = $acceptedValues; } /** + * Set (overwrite) the category this segment belongs to. It should be a translation key such as 'General_Actions' + * or 'General_Visit'. * @param string $category + * @api */ public function setCategory($category) { @@ -54,7 +94,10 @@ class Segment } /** + * Set (overwrite) the segment display name. This name will be visible in the API and the UI. It should be a + * translation key such as 'Actions_ColumnEntryPageTitle' or 'UserSettings_ColumnResolution'. * @param string $name + * @api */ public function setName($name) { @@ -62,7 +105,11 @@ class Segment } /** + * Set (overwrite) the name of the segment. The name should be lower case first and has to be unique. The segment + * name defined here needs to be set in the URL to actually apply this segment. Eg if the segment is 'searches' + * you need to set "&segment=searches>0" in the UI. * @param string $segment + * @api */ public function setSegment($segment) { @@ -70,7 +117,15 @@ class Segment } /** + * Sometimes you want users to set values that differ from the way they are actually stored. For instance if you + * want to allow to filter by any URL than you might have to resolve this URL to an action id. Or a country name + * maybe has to be mapped to a 2 letter country code. You can do this by specifing either a callable such as + * `array('Classname', 'methodName')` or by passing a closure. There will be four values passed to the given closure + * or callable: `string $valueToMatch`, `string $segment` (see {@link setSegment()}), `string $matchType` + * (eg SegmentExpression::MATCH_EQUAL or any other match constant of this class) and `$segmentName`. + * * @param string|\Closure $sqlFilter + * @api */ public function setSqlFilter($sqlFilter) { @@ -78,7 +133,12 @@ class Segment } /** + * Similar to {@link setSqlFilter()} you can map a given segment value to another value. For instance you could map + * "new" to 0, 'returning' to 1 and any other value to '2'. You can either define a callable or a closure. There + * will be only one value passed to the closure or callable which contains the value a user has set for this + * segment. This callback is called shortly before {@link setSqlFilter()}. * @param string|array $sqlFilterValue + * @api */ public function setSqlFilterValue($sqlFilterValue) { @@ -86,7 +146,11 @@ class Segment } /** + * Defines to which column in the MySQL database the segment belongs: 'mytablename.mycolumnname'. Eg + * 'log_visit.idsite'. When a segment is applied the given or filtered value will be compared with this column. + * * @param string $sqlSegment + * @api */ public function setSqlSegment($sqlSegment) { @@ -95,6 +159,7 @@ class Segment /** * @return string + * @ignore */ public function getSqlSegment() { @@ -102,7 +167,9 @@ class Segment } /** + * Set (overwrite) the type of this segment which is usually either a 'dimension' or a 'metric'. * @param string $type See constansts TYPE_* + * @api */ public function setType($type) { @@ -111,6 +178,7 @@ class Segment /** * @return string + * @ignore */ public function getType() { @@ -118,13 +186,21 @@ class Segment } /** + * You can restrict the access to this segment by passing a boolean `false`. For instance if you want to make + * a certain segment only available to users having super user access you could do the following: + * `$segment->setPermission(Piwik::hasUserSuperUserAccess());` * @param bool $permission + * @api */ public function setPermission($permission) { $this->permission = $permission; } + /** + * @return array + * @ignore + */ public function toArray() { $segment = array( diff --git a/core/Plugin/ViewDataTable.php b/core/Plugin/ViewDataTable.php index dbfa1a88347487b33fd650c2f121c0a99a04fb89..fe603b159d47cccb89e0f7aab5419cd0722bc7e5 100644 --- a/core/Plugin/ViewDataTable.php +++ b/core/Plugin/ViewDataTable.php @@ -200,6 +200,8 @@ abstract class ViewDataTable implements ViewInterface $this->config->subtable_controller_action = $subtable; } + $this->config->show_goals = $report->hasGoalMetrics(); + $relatedReports = $report->getRelatedReports(); if (!empty($relatedReports)) { foreach ($relatedReports as $relatedReport) { diff --git a/plugins/Actions/Columns/ServerTime.php b/plugins/Actions/Columns/ServerTime.php index 75f1f9fbcad4881ba6d6e286f4d82e9a3e8ece6d..c6707f947f3e004e431bd3023747e717385c10c3 100644 --- a/plugins/Actions/Columns/ServerTime.php +++ b/plugins/Actions/Columns/ServerTime.php @@ -29,11 +29,6 @@ class ServerTime extends ActionDimension return $changes; } - public function getName() - { - return ''; - } - public function onNewAction(Request $request, Visitor $visitor, Action $action) { $timestamp = $request->getCurrentTimestamp(); diff --git a/plugins/Actions/Columns/TimeSpentRefAction.php b/plugins/Actions/Columns/TimeSpentRefAction.php index 6b6d49d411a6bf08388966801e387087ca97ffd7..1154fd39896429a1dd75d544442f7315dd01d0c3 100644 --- a/plugins/Actions/Columns/TimeSpentRefAction.php +++ b/plugins/Actions/Columns/TimeSpentRefAction.php @@ -18,11 +18,6 @@ class TimeSpentRefAction extends ActionDimension protected $columnName = 'time_spent_ref_action'; protected $columnType = 'INTEGER(10) UNSIGNED NOT NULL'; - public function getName() - { - return ''; - } - public function onNewAction(Request $request, Visitor $visitor, Action $action) { $timeSpent = $visitor->getVisitorColumn('time_spent_ref_action'); diff --git a/plugins/Actions/Columns/VisitTotalActions.php b/plugins/Actions/Columns/VisitTotalActions.php index c65b3d3b5037284d18874fe31dfa6714d0341653..8a3592daf82025c0b559bc7ce92839b061d44907 100644 --- a/plugins/Actions/Columns/VisitTotalActions.php +++ b/plugins/Actions/Columns/VisitTotalActions.php @@ -29,11 +29,6 @@ class VisitTotalActions extends VisitDimension $this->addSegment($segment); } - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Actions/Columns/VisitTotalSearches.php b/plugins/Actions/Columns/VisitTotalSearches.php index e39f7055d782c556a910d28e46456c9772cdedbc..1b8fba9ffdd613a66cb7e2fd3b16d543e2b68c94 100644 --- a/plugins/Actions/Columns/VisitTotalSearches.php +++ b/plugins/Actions/Columns/VisitTotalSearches.php @@ -30,11 +30,6 @@ class VisitTotalSearches extends VisitDimension $this->addSegment($segment); } - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/CoreHome/Columns/IdSite.php b/plugins/CoreHome/Columns/IdSite.php index 65da72dccce3167b738d8d4dae16b8d48b390291..996cae629bc5db13e6f500adff48e172c5986829 100644 --- a/plugins/CoreHome/Columns/IdSite.php +++ b/plugins/CoreHome/Columns/IdSite.php @@ -23,11 +23,6 @@ class IdSite extends VisitDimension // INDEX(idsite, config_id, visit_last_action_time) and we maybe not be sure whether config_id already exists at // installing point (we do not know whether visit_last_action_time or idsite column would be added first). - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/CoreHome/Columns/VisitFirstActionTime.php b/plugins/CoreHome/Columns/VisitFirstActionTime.php index 6aabb991990b17ae7848f26c7e37587780777926..92b6619fed06c49034257689206d57b981dd19ce 100644 --- a/plugins/CoreHome/Columns/VisitFirstActionTime.php +++ b/plugins/CoreHome/Columns/VisitFirstActionTime.php @@ -19,11 +19,6 @@ class VisitFirstActionTime extends VisitDimension protected $columnName = 'visit_first_action_time'; protected $columnType = 'DATETIME NOT NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/CoreHome/Columns/VisitGoalBuyer.php b/plugins/CoreHome/Columns/VisitGoalBuyer.php index 447bc216f8ac91c25c133bb9997a652071ab63d5..7b9b79f50f9b0b0518f647762c2f8adca95b2766 100644 --- a/plugins/CoreHome/Columns/VisitGoalBuyer.php +++ b/plugins/CoreHome/Columns/VisitGoalBuyer.php @@ -48,11 +48,6 @@ class VisitGoalBuyer extends VisitDimension $this->addSegment($segment); } - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/CoreHome/Columns/VisitGoalConverted.php b/plugins/CoreHome/Columns/VisitGoalConverted.php index 38b7e3cbff80554600028dbc1ae095776639e846..a0d735dd967892c5433757cf4318f8503c0c976a 100644 --- a/plugins/CoreHome/Columns/VisitGoalConverted.php +++ b/plugins/CoreHome/Columns/VisitGoalConverted.php @@ -28,11 +28,6 @@ class VisitGoalConverted extends VisitDimension $this->addSegment($segment); } - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/CoreHome/Columns/VisitLastActionTime.php b/plugins/CoreHome/Columns/VisitLastActionTime.php index 25a8683331c7b0da10e7f6fddee68660965d97c9..988757301badc951576856b0a46b26eedc372b27 100644 --- a/plugins/CoreHome/Columns/VisitLastActionTime.php +++ b/plugins/CoreHome/Columns/VisitLastActionTime.php @@ -23,11 +23,6 @@ class VisitLastActionTime extends VisitDimension // INDEX(idsite, config_id, visit_last_action_time) and we maybe not be sure whether idsite already exists at // installing point (we do not know whether idsite column will be added first). - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/CoreHome/Columns/VisitTotalTime.php b/plugins/CoreHome/Columns/VisitTotalTime.php index d1bc1d735ebd5d815a0262e74b4c80e1d4c55fd6..5975d6c6f9a86c17bb760508095bbbbdb01932d2 100644 --- a/plugins/CoreHome/Columns/VisitTotalTime.php +++ b/plugins/CoreHome/Columns/VisitTotalTime.php @@ -30,11 +30,6 @@ class VisitTotalTime extends VisitDimension $this->addSegment($segment); } - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php b/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php index 91cc3d3ccfc8aee9cf0b792195d0e1c33892525b..683e5d5b3c2f8bc749490999dc92b0bb71133432 100644 --- a/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php +++ b/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php @@ -28,11 +28,6 @@ class VisitorDaysSinceFirst extends VisitDimension $this->addSegment($segment); } - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php b/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php index 65707e81d7240fdfc46878632989b85b4da130bc..f0345069f0930b287ed9f16ba2d5a9001b58d8d6 100644 --- a/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php +++ b/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php @@ -29,11 +29,6 @@ class VisitorDaysSinceOrder extends VisitDimension $this->addSegment($segment); } - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/CoreHome/Columns/VisitorReturning.php b/plugins/CoreHome/Columns/VisitorReturning.php index 57267973b2fededf261c8e7aad924e66bcb84c75..fc0ca345a74a6709dd406b785a68722bdfe2be4b 100644 --- a/plugins/CoreHome/Columns/VisitorReturning.php +++ b/plugins/CoreHome/Columns/VisitorReturning.php @@ -41,11 +41,6 @@ class VisitorReturning extends VisitDimension $this->addSegment($segment); } - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/CoreHome/Columns/VisitsCount.php b/plugins/CoreHome/Columns/VisitsCount.php index a5392972dbdbc3cbfb16c470b61d4a2010a5e603..cd0a5f9a04cb95e518e4f8b08ee8b95dec2d5063 100644 --- a/plugins/CoreHome/Columns/VisitsCount.php +++ b/plugins/CoreHome/Columns/VisitsCount.php @@ -19,11 +19,6 @@ class VisitsCount extends VisitDimension protected $columnName = 'visitor_count_visits'; protected $columnType = 'SMALLINT(5) UNSIGNED NOT NULL'; - public function getName() - { - return ''; - } - protected function configureSegments() { $segment = new Segment(); diff --git a/plugins/CustomVariables/Reports/GetCustomVariables.php b/plugins/CustomVariables/Reports/GetCustomVariables.php index 9b90c3ed0be9299d71f56be9d26f86ed91d69d78..3edc0d276c920aaf68106f92a524cbd6893c6dc7 100644 --- a/plugins/CustomVariables/Reports/GetCustomVariables.php +++ b/plugins/CustomVariables/Reports/GetCustomVariables.php @@ -31,7 +31,6 @@ class GetCustomVariables extends Base public function configureView(ViewDataTable $view) { $view->config->columns_to_display = array('label', 'nb_actions', 'nb_visits'); - $view->config->show_goals = true; $view->config->addTranslation('label', Piwik::translate('CustomVariables_ColumnCustomVariableName')); $view->requestConfig->filter_sort_column = 'nb_actions'; $view->requestConfig->filter_sort_order = 'desc'; diff --git a/plugins/ExamplePlugin/Columns/ExampleActionDimension.php b/plugins/ExamplePlugin/Columns/ExampleActionDimension.php index 9d85cde038bd92b6b40bbdf13747ce8b6204d844..87db6f4d7c90e83207242f2d0d4449f47fad7b41 100644 --- a/plugins/ExamplePlugin/Columns/ExampleActionDimension.php +++ b/plugins/ExamplePlugin/Columns/ExampleActionDimension.php @@ -21,6 +21,8 @@ use Piwik\Tracker\Action; * This example dimension recognizes a new tracking url parameter that is supposed to save the keywords that were used * on a certain page. Please note that dimension instances are usually cached during one tracking request so they * should be stateless (meaning an instance of this dimension will be reused if requested multiple times). + * + * See {@link http://developer.piwik.org/api-reference/Piwik/Plugin\Dimension\ActionDimension} for more information. */ class ExampleActionDimension extends ActionDimension { diff --git a/plugins/ExamplePlugin/Columns/ExampleConversionDimension.php b/plugins/ExamplePlugin/Columns/ExampleConversionDimension.php index 436c403bfa507f259300a1a0c6071018724a6b36..3ad3ce6bf9476cbd91c2d280dc04d0c66fbd97c7 100644 --- a/plugins/ExamplePlugin/Columns/ExampleConversionDimension.php +++ b/plugins/ExamplePlugin/Columns/ExampleConversionDimension.php @@ -23,6 +23,8 @@ use Piwik\Tracker\GoalManager; * active/valueable users. It is just an example, you can log pretty much everything and even just store any custom * request url property. Please note that dimension instances are usually cached during one tracking request so they * should be stateless (meaning an instance of this dimension will be reused if requested multiple times). + * + * See {@link http://developer.piwik.org/api-reference/Piwik/Plugin\Dimension\ConversionDimension} for more information. */ class ExampleConversionDimension extends ConversionDimension { diff --git a/plugins/ExamplePlugin/Columns/ExampleDimension.php b/plugins/ExamplePlugin/Columns/ExampleDimension.php new file mode 100644 index 0000000000000000000000000000000000000000..f4b1bd82e5e8fd716203ad36c103d91eb1755f5c --- /dev/null +++ b/plugins/ExamplePlugin/Columns/ExampleDimension.php @@ -0,0 +1,30 @@ +<?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\ExamplePlugin\Columns; + +use Piwik\Columns\Dimension; +use Piwik\Piwik; + +/** + * This example dimension only defines a name and does not track any data. It's supposed to be only used in reports. + * + * See {@link http://developer.piwik.org/api-reference/Piwik/Columns\Dimension} for more information. + */ +class ExampleDimension extends Dimension +{ + + /** + * The name of the dimension which will be visible for instance in the UI of a related report and in the mobile app. + * @return string + */ + public function getName() + { + return Piwik::translate('ExamplePlugin_DimensionName'); + } +} \ No newline at end of file diff --git a/plugins/ExamplePlugin/Columns/ExampleVisitDimension.php b/plugins/ExamplePlugin/Columns/ExampleVisitDimension.php index 58bced1d7be7a54cfb0296cbe94e4f2dbbd07784..511d30353df363ff5cfb5640b2f1187cfb953af7 100644 --- a/plugins/ExamplePlugin/Columns/ExampleVisitDimension.php +++ b/plugins/ExamplePlugin/Columns/ExampleVisitDimension.php @@ -21,6 +21,8 @@ use Piwik\Tracker\Action; * active/valueable users. It is just an example, you can log pretty much everything and even just store any custom * request url property. Please note that dimension instances are usually cached during one tracking request so they * should be stateless (meaning an instance of this dimension will be reused if requested multiple times). + * + * See {@link http://developer.piwik.org/api-reference/Piwik/Plugin\Dimension\VisitDimension} for more information. */ class ExampleVisitDimension extends VisitDimension { @@ -110,7 +112,7 @@ class ExampleVisitDimension extends VisitDimension * This event is executed shortly after "onNewVisit" or "onExistingVisit" in case the visitor converted a goal. * In this example we give the user 5 extra points for this achievement. Usually this event is not needed and you * can simply remove this method therefore. An example would be for instance to persist the last converted - * action url. Return boolean false if you do not want to change the value in some cases or just remove the value. + * action url. Return boolean false if you do not want to change the current value. * * @param Request $request * @param Visitor $visitor @@ -124,11 +126,11 @@ class ExampleVisitDimension extends VisitDimension } /** - * By implementing this event you can persist a value to the log_conversion table persisting this value for a - * specific conversion. The persisted value will be logged along the conversion and will not be changed afterwards. - * This allows you to generate reports that shows for instance which url was called how often for a speicifc + * By implementing this event you can persist a value to the log_conversion table in case a conversion happens. + * The persisted value will be logged along the conversion and will not be changed afterwards. + * This allows you to generate reports that shows for instance which url was called how often for a specific * conversion. Once you implement this event and a $columnType is defined a column in the log_conversion MySQL table - * will be automatically created. + * will be created automatically. * * @param Request $request * @param Visitor $visitor diff --git a/plugins/ExamplePlugin/Reports/GetExampleReport.php b/plugins/ExamplePlugin/Reports/GetExampleReport.php index 9fd00bd8c128104aa50c116c8201b9c5239d4914..dbb7179ed6ef5abe08e2488b4abeb18797132618 100644 --- a/plugins/ExamplePlugin/Reports/GetExampleReport.php +++ b/plugins/ExamplePlugin/Reports/GetExampleReport.php @@ -14,6 +14,11 @@ use Piwik\Plugin\ViewDataTable; use Piwik\Plugins\Actions\Columns\ExitPageUrl; use Piwik\View; +/** + * This class defines a new report. + * + * See {@link http://developer.piwik.org/api-reference/Piwik/Plugin/Report} for more information. + */ class GetExampleReport extends Base { protected function init() diff --git a/plugins/Goals/Columns/Revenue.php b/plugins/Goals/Columns/Revenue.php index 343204c932a4e29899a76f08f8a23a0323ea7019..19a2b0964d0e9034bb62e34c2643cb3cfaa57dc3 100644 --- a/plugins/Goals/Columns/Revenue.php +++ b/plugins/Goals/Columns/Revenue.php @@ -18,11 +18,6 @@ class Revenue extends BaseConversion protected $columnName = 'revenue'; protected $columnType = 'float default NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Goals/Columns/RevenueDiscount.php b/plugins/Goals/Columns/RevenueDiscount.php index d5022ed4dcde2977733fd98e0dcc70f130e82357..516bb86ca60b213b8090bb53c2e3648c0fcc62da 100644 --- a/plugins/Goals/Columns/RevenueDiscount.php +++ b/plugins/Goals/Columns/RevenueDiscount.php @@ -18,11 +18,6 @@ class RevenueDiscount extends BaseConversion protected $columnName = 'revenue_discount'; protected $columnType = 'float default NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Goals/Columns/RevenueShipping.php b/plugins/Goals/Columns/RevenueShipping.php index db68e065facbab48d08ad9196dfca33404f304ee..27a82d96c7877b3f002f879a784204c4b9fba925 100644 --- a/plugins/Goals/Columns/RevenueShipping.php +++ b/plugins/Goals/Columns/RevenueShipping.php @@ -18,11 +18,6 @@ class RevenueShipping extends BaseConversion protected $columnName = 'revenue_shipping'; protected $columnType = 'float default NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Goals/Columns/RevenueSubtotal.php b/plugins/Goals/Columns/RevenueSubtotal.php index e4e7f8c20a431b0713a9ff5d601ff6c938c37dd6..a9926238e126164d91cf1118c2ab7b6ccafc565f 100644 --- a/plugins/Goals/Columns/RevenueSubtotal.php +++ b/plugins/Goals/Columns/RevenueSubtotal.php @@ -18,11 +18,6 @@ class RevenueSubtotal extends BaseConversion protected $columnName = 'revenue_subtotal'; protected $columnType = 'float default NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Goals/Columns/RevenueTax.php b/plugins/Goals/Columns/RevenueTax.php index 3ecae31b78e39d8301a43e2b221828be73b7515b..c919103f36af630890d9b8110257b73f94b665c2 100644 --- a/plugins/Goals/Columns/RevenueTax.php +++ b/plugins/Goals/Columns/RevenueTax.php @@ -18,11 +18,6 @@ class RevenueTax extends BaseConversion protected $columnName = 'revenue_tax'; protected $columnType = 'float default NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Referrers/Columns/ReferrerName.php b/plugins/Referrers/Columns/ReferrerName.php index cf030b2ac8a7ee7137946051945ad2c588fb3c23..fbd55219dccdc55bd696f578f161fb7fe8c4f308 100644 --- a/plugins/Referrers/Columns/ReferrerName.php +++ b/plugins/Referrers/Columns/ReferrerName.php @@ -27,11 +27,6 @@ class ReferrerName extends Base $this->addSegment($segment); } - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Referrers/Columns/ReferrerUrl.php b/plugins/Referrers/Columns/ReferrerUrl.php index 0b8d779794bdad33aba20e33a5f4828444f303e1..0404a132472c9fca1e8aaadca95b2e58dd43e260 100644 --- a/plugins/Referrers/Columns/ReferrerUrl.php +++ b/plugins/Referrers/Columns/ReferrerUrl.php @@ -27,11 +27,6 @@ class ReferrerUrl extends Base $this->addSegment($segment); } - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Referrers/Columns/ReferrerVisitServerDate.php b/plugins/Referrers/Columns/ReferrerVisitServerDate.php index 3e7861756f79823d8ae71c221549578c0751d627..aa3100fed9f1b9b2a361f2f9abcad9afa28e3779 100644 --- a/plugins/Referrers/Columns/ReferrerVisitServerDate.php +++ b/plugins/Referrers/Columns/ReferrerVisitServerDate.php @@ -17,11 +17,6 @@ class ReferrerVisitServerDate extends Base protected $columnName = 'referer_visit_server_date'; protected $columnType = 'date default NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/Referrers/Reports/GetCampaigns.php b/plugins/Referrers/Reports/GetCampaigns.php index 6da820a436d6b572892a8b0908b694f3cca39882..fbc0835a3b2451ed9f5dce743811af87ff47b33a 100644 --- a/plugins/Referrers/Reports/GetCampaigns.php +++ b/plugins/Referrers/Reports/GetCampaigns.php @@ -30,7 +30,6 @@ class GetCampaigns extends Base public function configureView(ViewDataTable $view) { - $view->config->show_goals = true; $view->config->show_exclude_low_population = false; $view->config->addTranslation('label', $this->dimension->getName()); diff --git a/plugins/Referrers/Reports/GetKeywords.php b/plugins/Referrers/Reports/GetKeywords.php index 7fe5d3d82fc0f8480205ba83e2d11f78bc831bce..127f24600857d03dc73d54c134771576c99960e7 100644 --- a/plugins/Referrers/Reports/GetKeywords.php +++ b/plugins/Referrers/Reports/GetKeywords.php @@ -31,7 +31,6 @@ class GetKeywords extends Base { $view->config->show_exclude_low_population = false; $view->config->addTranslation('label', Piwik::translate('General_ColumnKeyword')); - $view->config->show_goals = true; $view->requestConfig->filter_limit = 25; diff --git a/plugins/Referrers/Reports/GetReferrerType.php b/plugins/Referrers/Reports/GetReferrerType.php index 9f1e538e16afdca2ec11ebd25d76411b869efc22..f7ed090b074112745b823e6cac4e9750d8f86fb4 100644 --- a/plugins/Referrers/Reports/GetReferrerType.php +++ b/plugins/Referrers/Reports/GetReferrerType.php @@ -60,7 +60,6 @@ class GetReferrerType extends Base } $view->config->show_search = false; - $view->config->show_goals = true; $view->config->show_offset_information = false; $view->config->show_pagination_control = false; $view->config->show_limit_control = false; diff --git a/plugins/Referrers/Reports/GetSearchEngines.php b/plugins/Referrers/Reports/GetSearchEngines.php index 17babab9a972ecc08834313c194c748cfe2c2ed8..3b66cd0784c7edb60d7e1bd846b79127e9d12567 100644 --- a/plugins/Referrers/Reports/GetSearchEngines.php +++ b/plugins/Referrers/Reports/GetSearchEngines.php @@ -31,7 +31,6 @@ class GetSearchEngines extends Base { $view->config->show_exclude_low_population = false; $view->config->show_search = false; - $view->config->show_goals = true; $view->config->addTranslation('label', $this->dimension->getName()); $view->requestConfig->filter_limit = 25; diff --git a/plugins/Referrers/Reports/GetWebsites.php b/plugins/Referrers/Reports/GetWebsites.php index ec9a4f401cbd8303bdd0f195084cb43301342dda..dab0429bfdad252fa6565a126565aee0ade13fdc 100644 --- a/plugins/Referrers/Reports/GetWebsites.php +++ b/plugins/Referrers/Reports/GetWebsites.php @@ -30,7 +30,6 @@ class GetWebsites extends Base public function configureView(ViewDataTable $view) { $view->config->show_exclude_low_population = false; - $view->config->show_goals = true; $view->config->addTranslation('label', $this->dimension->getName()); $view->requestConfig->filter_limit = 25; diff --git a/plugins/UserCountry/Columns/Provider.php b/plugins/UserCountry/Columns/Provider.php index 8bff75165968fd07944add96f38416e7fb3eefb9..d361fa18c61eba077a0b1396b5b8c1b8d11cd09e 100644 --- a/plugins/UserCountry/Columns/Provider.php +++ b/plugins/UserCountry/Columns/Provider.php @@ -18,11 +18,6 @@ class Provider extends Base { protected $columnName = 'location_provider'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/UserCountry/Reports/GetCity.php b/plugins/UserCountry/Reports/GetCity.php index c338c00e37e614f6cebb9a27b1c7ace854f965a4..ce087c3f3ce9c3d04476c6c1e7fdcd93b19b49da 100644 --- a/plugins/UserCountry/Reports/GetCity.php +++ b/plugins/UserCountry/Reports/GetCity.php @@ -30,7 +30,6 @@ class GetCity extends Base public function configureView(ViewDataTable $view) { $view->config->show_exclude_low_population = false; - $view->config->show_goals = true; $view->config->documentation = $this->documentation; $view->config->addTranslation('label', $this->dimension->getName()); diff --git a/plugins/UserCountry/Reports/GetContinent.php b/plugins/UserCountry/Reports/GetContinent.php index 28ead2c3f415c64229f303095532f6e8cb90af85..7ba6d2ca1c1f752cf525e69cf180c72725169964 100644 --- a/plugins/UserCountry/Reports/GetContinent.php +++ b/plugins/UserCountry/Reports/GetContinent.php @@ -30,7 +30,6 @@ class GetContinent extends Base public function configureView(ViewDataTable $view) { $view->config->show_exclude_low_population = false; - $view->config->show_goals = true; $view->config->show_search = false; $view->config->show_offset_information = false; $view->config->show_pagination_control = false; diff --git a/plugins/UserCountry/Reports/GetCountry.php b/plugins/UserCountry/Reports/GetCountry.php index ba9b2c63c6bf8a08513f98b4b60324c7c4f339bf..17d8e8a83ca9ddfa9ca65f3a9eaeedc01f7de7bb 100644 --- a/plugins/UserCountry/Reports/GetCountry.php +++ b/plugins/UserCountry/Reports/GetCountry.php @@ -30,7 +30,6 @@ class GetCountry extends Base public function configureView(ViewDataTable $view) { - $view->config->show_goals = true; $view->config->show_exclude_low_population = false; $view->config->addTranslation('label', $this->dimension->getName()); $view->config->documentation = $this->documentation; diff --git a/plugins/UserCountry/Reports/GetRegion.php b/plugins/UserCountry/Reports/GetRegion.php index 0ec13cb92ca9f9f430f3f6a6d9f3e45f7fbdb3cf..648b78967bbe0c78fec9ad2e26ff18ed6ce6df98 100644 --- a/plugins/UserCountry/Reports/GetRegion.php +++ b/plugins/UserCountry/Reports/GetRegion.php @@ -30,7 +30,6 @@ class GetRegion extends Base public function configureView(ViewDataTable $view) { $view->config->show_exclude_low_population = false; - $view->config->show_goals = true; $view->config->documentation = $this->documentation; $view->config->addTranslation('label', $this->dimension->getName()); diff --git a/plugins/UserSettings/Columns/PluginCookie.php b/plugins/UserSettings/Columns/PluginCookie.php index 427823c64bc40e8c01183f041c30b478f7cb4795..f8b93dbfc17186441cb823c6828e923833e9900c 100644 --- a/plugins/UserSettings/Columns/PluginCookie.php +++ b/plugins/UserSettings/Columns/PluginCookie.php @@ -19,11 +19,6 @@ class PluginCookie extends VisitDimension protected $columnName = 'config_cookie'; protected $columnType = 'TINYINT(1) NOT NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/UserSettings/Columns/PluginDirector.php b/plugins/UserSettings/Columns/PluginDirector.php index aab518109acc90e3637cb2b93d2079e6691b2ef4..20a659929502b59a65083389a9cd939482893045 100644 --- a/plugins/UserSettings/Columns/PluginDirector.php +++ b/plugins/UserSettings/Columns/PluginDirector.php @@ -19,11 +19,6 @@ class PluginDirector extends VisitDimension protected $columnName = 'config_director'; protected $columnType = 'TINYINT(1) NOT NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/UserSettings/Columns/PluginFlash.php b/plugins/UserSettings/Columns/PluginFlash.php index aa0a9e8c65967ff6285ee1f6d65e5603855a7d03..058429edbf7bde3b27ceb223c126b3a391206501 100644 --- a/plugins/UserSettings/Columns/PluginFlash.php +++ b/plugins/UserSettings/Columns/PluginFlash.php @@ -19,11 +19,6 @@ class PluginFlash extends VisitDimension protected $columnName = 'config_flash'; protected $columnType = 'TINYINT(1) NOT NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/UserSettings/Columns/PluginGears.php b/plugins/UserSettings/Columns/PluginGears.php index 9fc17e6307cda3475ed7fefb71c6416f790e431c..08161fa9feb41b5fb7bda034cfd4aa808406a11d 100644 --- a/plugins/UserSettings/Columns/PluginGears.php +++ b/plugins/UserSettings/Columns/PluginGears.php @@ -19,11 +19,6 @@ class PluginGears extends VisitDimension protected $columnName = 'config_gears'; protected $columnType = 'TINYINT(1) NOT NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/UserSettings/Columns/PluginJava.php b/plugins/UserSettings/Columns/PluginJava.php index 28542fa114bbd7bcd70177841fb5c0771b201fa3..0cc6bdcd2326de19161b48325346979cc8116f6f 100644 --- a/plugins/UserSettings/Columns/PluginJava.php +++ b/plugins/UserSettings/Columns/PluginJava.php @@ -19,11 +19,6 @@ class PluginJava extends VisitDimension protected $columnName = 'config_java'; protected $columnType = 'TINYINT(1) NOT NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/UserSettings/Columns/PluginPdf.php b/plugins/UserSettings/Columns/PluginPdf.php index 3af3d159f0920b157a8bfc05b41816fcfd36ce32..e9b1ac396bcdfac8ee1695e9106b1b4881e6a323 100644 --- a/plugins/UserSettings/Columns/PluginPdf.php +++ b/plugins/UserSettings/Columns/PluginPdf.php @@ -19,11 +19,6 @@ class PluginPdf extends VisitDimension protected $columnName = 'config_pdf'; protected $columnType = 'TINYINT(1) NOT NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/UserSettings/Columns/PluginQuickTime.php b/plugins/UserSettings/Columns/PluginQuickTime.php index e55adabff4365da32a0aff29259e0f18d3bab2ba..dae625084969973672190547171e1ceb25888517 100644 --- a/plugins/UserSettings/Columns/PluginQuickTime.php +++ b/plugins/UserSettings/Columns/PluginQuickTime.php @@ -19,11 +19,6 @@ class PluginQuickTime extends VisitDimension protected $columnName = 'config_quicktime'; protected $columnType = 'TINYINT(1) NOT NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/UserSettings/Columns/PluginRealPlayer.php b/plugins/UserSettings/Columns/PluginRealPlayer.php index 670ed70d35ec27cac2d77e6470c38f269e24abd4..d1b904e5af49bb159e2f4fc0c291155da939a1f5 100644 --- a/plugins/UserSettings/Columns/PluginRealPlayer.php +++ b/plugins/UserSettings/Columns/PluginRealPlayer.php @@ -19,11 +19,6 @@ class PluginRealPlayer extends VisitDimension protected $columnName = 'config_realplayer'; protected $columnType = 'TINYINT(1) NOT NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/UserSettings/Columns/PluginSilverlight.php b/plugins/UserSettings/Columns/PluginSilverlight.php index cc38b9aab97cefa32f91889d8608b33deaf89b8c..95c7789de2c7139bf9ce399817b3d4c90a1f75a6 100644 --- a/plugins/UserSettings/Columns/PluginSilverlight.php +++ b/plugins/UserSettings/Columns/PluginSilverlight.php @@ -19,11 +19,6 @@ class PluginSilverlight extends VisitDimension protected $columnName = 'config_silverlight'; protected $columnType = 'TINYINT(1) NOT NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor diff --git a/plugins/UserSettings/Columns/PluginWindowsMedia.php b/plugins/UserSettings/Columns/PluginWindowsMedia.php index b7826d123f7d7cbdd917fa82d33ba1b5cd80dc95..1643a553bbad242e67ecad5b9b11419a778874e4 100644 --- a/plugins/UserSettings/Columns/PluginWindowsMedia.php +++ b/plugins/UserSettings/Columns/PluginWindowsMedia.php @@ -19,11 +19,6 @@ class PluginWindowsMedia extends VisitDimension protected $columnName = 'config_windowsmedia'; protected $columnType = 'TINYINT(1) NOT NULL'; - public function getName() - { - return ''; - } - /** * @param Request $request * @param Visitor $visitor