Completed
Push — master ( 544e34...6465ee )
by Jonathan
06:11
created
src/Webtrees/Module/GeoDispersionModule.php 1 patch
Indentation   +59 added lines, -59 removed lines patch added patch discarded remove patch
@@ -24,88 +24,88 @@
 block discarded – undo
24 24
 class GeoDispersionModule extends AbstractModule implements ModuleConfigInterface, DependentInterface {
25 25
     
26 26
 	// How to update the database schema for this module
27
-    const SCHEMA_TARGET_VERSION   = 1;
28
-    const SCHEMA_SETTING_NAME     = 'MAJ_GEODISP_SCHEMA_VERSION';
29
-    const SCHEMA_MIGRATION_PREFIX = '\MyArtJaub\Webtrees\Module\GeoDispersion\Schema';
27
+	const SCHEMA_TARGET_VERSION   = 1;
28
+	const SCHEMA_SETTING_NAME     = 'MAJ_GEODISP_SCHEMA_VERSION';
29
+	const SCHEMA_MIGRATION_PREFIX = '\MyArtJaub\Webtrees\Module\GeoDispersion\Schema';
30 30
     
31
-    /** @var string For custom modules - link for support, upgrades, etc. */
32
-    const CUSTOM_WEBSITE = 'https://github.com/jon48/webtrees-lib';
31
+	/** @var string For custom modules - link for support, upgrades, etc. */
32
+	const CUSTOM_WEBSITE = 'https://github.com/jon48/webtrees-lib';
33 33
         
34
-    /**
35
-     * GeoDispersion analysis provider
36
-     * @var \MyArtJaub\Webtrees\Module\GeoDispersion\Model\GeoAnalysisProvider $provider
37
-     */
38
-    protected $provider;
34
+	/**
35
+	 * GeoDispersion analysis provider
36
+	 * @var \MyArtJaub\Webtrees\Module\GeoDispersion\Model\GeoAnalysisProvider $provider
37
+	 */
38
+	protected $provider;
39 39
     
40
-    /**
41
-     * {@inhericDoc}
42
-     */
43
-    public function getTitle() {
44
-        return /* I18N: Name of the “Hooks” module */ I18N::translate('Geographical Dispersion');
45
-    }
40
+	/**
41
+	 * {@inhericDoc}
42
+	 */
43
+	public function getTitle() {
44
+		return /* I18N: Name of the “Hooks” module */ I18N::translate('Geographical Dispersion');
45
+	}
46 46
     
47
-    /**
48
-     * {@inhericDoc}
49
-     */
50
-    public function getDescription() {
51
-        return /* I18N: Description of the “Hooks” module */ I18N::translate('Display the geographical dispersion of the root person’s Sosa ancestors.');
52
-    }
47
+	/**
48
+	 * {@inhericDoc}
49
+	 */
50
+	public function getDescription() {
51
+		return /* I18N: Description of the “Hooks” module */ I18N::translate('Display the geographical dispersion of the root person’s Sosa ancestors.');
52
+	}
53 53
     
54
-    /**
55
-     * {@inhericDoc}
56
-     */
57
-    public function modAction($mod_action) {
58
-        Database::updateSchema(self::SCHEMA_MIGRATION_PREFIX, self::SCHEMA_SETTING_NAME, self::SCHEMA_TARGET_VERSION);
54
+	/**
55
+	 * {@inhericDoc}
56
+	 */
57
+	public function modAction($mod_action) {
58
+		Database::updateSchema(self::SCHEMA_MIGRATION_PREFIX, self::SCHEMA_SETTING_NAME, self::SCHEMA_TARGET_VERSION);
59 59
         
60
-        \MyArtJaub\Webtrees\Mvc\Dispatcher::getInstance()->handle($this, $mod_action);
61
-    }
60
+		\MyArtJaub\Webtrees\Mvc\Dispatcher::getInstance()->handle($this, $mod_action);
61
+	}
62 62
     
63
-    /**
64
-     * {@inhericDoc}
65
-     * @see \Fisharebest\Webtrees\Module\ModuleConfigInterface::getConfigLink()
66
-     */
67
-    public function getConfigLink() {
68
-        Database::updateSchema(self::SCHEMA_MIGRATION_PREFIX, self::SCHEMA_SETTING_NAME, self::SCHEMA_TARGET_VERSION);
63
+	/**
64
+	 * {@inhericDoc}
65
+	 * @see \Fisharebest\Webtrees\Module\ModuleConfigInterface::getConfigLink()
66
+	 */
67
+	public function getConfigLink() {
68
+		Database::updateSchema(self::SCHEMA_MIGRATION_PREFIX, self::SCHEMA_SETTING_NAME, self::SCHEMA_TARGET_VERSION);
69 69
         
70
-        return 'module.php?mod=' . $this->getName() . '&mod_action=AdminConfig';
71
-    }
70
+		return 'module.php?mod=' . $this->getName() . '&mod_action=AdminConfig';
71
+	}
72 72
     
73
-    /**
74
-     * {@inhericDoc}
75
-     * @see \MyArtJaub\Webtrees\Module\DependentInterface::validatePrerequisites()
76
-     */
77
-    public function validatePrerequisites() {
78
-        try {
79
-            Database::updateSchema(self::SCHEMA_MIGRATION_PREFIX, self::SCHEMA_SETTING_NAME, self::SCHEMA_TARGET_VERSION);
73
+	/**
74
+	 * {@inhericDoc}
75
+	 * @see \MyArtJaub\Webtrees\Module\DependentInterface::validatePrerequisites()
76
+	 */
77
+	public function validatePrerequisites() {
78
+		try {
79
+			Database::updateSchema(self::SCHEMA_MIGRATION_PREFIX, self::SCHEMA_SETTING_NAME, self::SCHEMA_TARGET_VERSION);
80 80
             
81
-            return !is_null(Module::getModuleByName(Constants::MODULE_MAJ_SOSA_NAME));
82
-        }
83
-        catch (\Exception $ex) {  }
84
-        return false;
85
-    }
81
+			return !is_null(Module::getModuleByName(Constants::MODULE_MAJ_SOSA_NAME));
82
+		}
83
+		catch (\Exception $ex) {  }
84
+		return false;
85
+	}
86 86
     
87 87
 	/**
88 88
 	 * Get the GeoAnalysis Provider (initialise it if not done yet).
89 89
 	 *
90 90
 	 * @return \MyArtJaub\Webtrees\Module\GeoDispersion\Model\GeoAnalysisProvider
91 91
 	 */
92
-    public function getProvider() {
93
-        global $WT_TREE;
92
+	public function getProvider() {
93
+		global $WT_TREE;
94 94
         
95
-        if(!$this->provider) {
96
-            $this->provider = new GeoAnalysisProvider($WT_TREE);
97
-        }
98
-        return $this->provider;
99
-    }
95
+		if(!$this->provider) {
96
+			$this->provider = new GeoAnalysisProvider($WT_TREE);
97
+		}
98
+		return $this->provider;
99
+	}
100 100
 	
101 101
 	/**
102 102
 	 * Set the GeoAnalysis Provider.
103 103
 	 *
104 104
 	 * @return \MyArtJaub\Webtrees\Module\GeoDispersion\Model\GeoAnalysisProvider
105 105
 	 */
106
-    public function setProvider(GeoAnalysisProvider $provider) {
107
-        $this->provider = $provider;
108
-    }
106
+	public function setProvider(GeoAnalysisProvider $provider) {
107
+		$this->provider = $provider;
108
+	}
109 109
     
110 110
 
111 111
 }
Please login to merge, or discard this patch.
src/Webtrees/Module/Sosa/SosaStatsController.php 1 patch
Indentation   +180 added lines, -180 removed lines patch added patch discarded remove patch
@@ -25,218 +25,218 @@
 block discarded – undo
25 25
  */
26 26
 class SosaStatsController extends MvcController
27 27
 {
28
-    /**
29
-     * Sosa Provider for the controller
30
-     * @var SosaProvider $sosa_provider
31
-     */
32
-    protected $sosa_provider;
28
+	/**
29
+	 * Sosa Provider for the controller
30
+	 * @var SosaProvider $sosa_provider
31
+	 */
32
+	protected $sosa_provider;
33 33
     
34
-    /**
35
-     * Constructor for SosaStatsController
36
-     * @param AbstractModule $module
37
-     */
38
-    public function __construct(AbstractModule $module) {
39
-        global $WT_TREE;
34
+	/**
35
+	 * Constructor for SosaStatsController
36
+	 * @param AbstractModule $module
37
+	 */
38
+	public function __construct(AbstractModule $module) {
39
+		global $WT_TREE;
40 40
         
41
-        parent::__construct($module);
41
+		parent::__construct($module);
42 42
         
43
-        $this->sosa_provider = new SosaProvider($WT_TREE, Auth::user());
44
-    }
43
+		$this->sosa_provider = new SosaProvider($WT_TREE, Auth::user());
44
+	}
45 45
     
46
-    /**
47
-     * Pages
48
-     */
46
+	/**
47
+	 * Pages
48
+	 */
49 49
     
50
-    /**
51
-     * SosaStats@index
52
-     */
53
-    public function index() {
54
-        global $WT_TREE;
50
+	/**
51
+	 * SosaStats@index
52
+	 */
53
+	public function index() {
54
+		global $WT_TREE;
55 55
         
56
-        $controller = new PageController();
57
-        $controller
58
-            ->setPageTitle(I18N::translate('Sosa Statistics'))
59
-            ->addInlineJavascript('$(".help_tooltip").tooltip();')
60
-        ;
56
+		$controller = new PageController();
57
+		$controller
58
+			->setPageTitle(I18N::translate('Sosa Statistics'))
59
+			->addInlineJavascript('$(".help_tooltip").tooltip();')
60
+		;
61 61
 
62
-        $view_bag = new ViewBag();
63
-        $view_bag->set('title', $controller->getPageTitle());
64
-        $view_bag->set('is_setup', false);
62
+		$view_bag = new ViewBag();
63
+		$view_bag->set('title', $controller->getPageTitle());
64
+		$view_bag->set('is_setup', false);
65 65
         
66
-        if($this->sosa_provider->isSetup()) {
67
-            $view_bag->set('is_setup', true);
66
+		if($this->sosa_provider->isSetup()) {
67
+			$view_bag->set('is_setup', true);
68 68
             
69
-            $view_bag->set('root_indi', $this->sosa_provider->getRootIndi());
69
+			$view_bag->set('root_indi', $this->sosa_provider->getRootIndi());
70 70
             
71
-            $sosaCount = $this->sosa_provider->getSosaCount();
72
-            $diffSosaCount = $this->sosa_provider->getDifferentSosaCount();
71
+			$sosaCount = $this->sosa_provider->getSosaCount();
72
+			$diffSosaCount = $this->sosa_provider->getDifferentSosaCount();
73 73
             
74
-            $general_stats = array(
75
-                'sosa_count' => $sosaCount,
76
-                'distinct_count' => $diffSosaCount,
77
-                'sosa_rate' => Functions::safeDivision($diffSosaCount, $this->sosa_provider->getTotalIndividuals()),
78
-                'pedi_collapse' => 1 - Functions::safeDivision($diffSosaCount, $sosaCount),
79
-                'mean_gen_time' => $this->sosa_provider->getMeanGenerationTime()
80
-            );
81
-            $view_bag->set('general_stats', $general_stats);
74
+			$general_stats = array(
75
+				'sosa_count' => $sosaCount,
76
+				'distinct_count' => $diffSosaCount,
77
+				'sosa_rate' => Functions::safeDivision($diffSosaCount, $this->sosa_provider->getTotalIndividuals()),
78
+				'pedi_collapse' => 1 - Functions::safeDivision($diffSosaCount, $sosaCount),
79
+				'mean_gen_time' => $this->sosa_provider->getMeanGenerationTime()
80
+			);
81
+			$view_bag->set('general_stats', $general_stats);
82 82
             
83
-            $stats_gen = $this->sosa_provider->getStatisticsByGeneration();
84
-            $view_bag->set('missinganc_url', 'module.php?mod='.$this->module->getName().'&mod_action=SosaList@missing&ged='.$WT_TREE->getNameUrl().'&gen=');
85
-            $view_bag->set('sosaanc_url', 'module.php?mod='.$this->module->getName().'&mod_action=SosaList&ged='.$WT_TREE->getNameUrl().'&gen=');
83
+			$stats_gen = $this->sosa_provider->getStatisticsByGeneration();
84
+			$view_bag->set('missinganc_url', 'module.php?mod='.$this->module->getName().'&mod_action=SosaList@missing&ged='.$WT_TREE->getNameUrl().'&gen=');
85
+			$view_bag->set('sosaanc_url', 'module.php?mod='.$this->module->getName().'&mod_action=SosaList&ged='.$WT_TREE->getNameUrl().'&gen=');
86 86
             
87
-            $gen_theoretical=1;
88
-            $total_theoretical=0;
89
-            $prev_diff=0;
90
-            $prev_known=0.5;
91
-            $gen_equiv=0;            
92
-            $generation_stats = array();
87
+			$gen_theoretical=1;
88
+			$total_theoretical=0;
89
+			$prev_diff=0;
90
+			$prev_known=0.5;
91
+			$gen_equiv=0;            
92
+			$generation_stats = array();
93 93
             
94
-            foreach($stats_gen as $gen => $tab){
95
-                $genY1= I18N::translate('-');
96
-                $genY2= I18N::translate('-');
97
-                if($tab['firstBirth']>0) $genY1=$tab['firstBirth'];
98
-                if($tab['lastBirth']>0) $genY2=$tab['lastBirth'];
99
-                $total_theoretical += $gen_theoretical;
100
-                $perc_sosa_count_theor = Functions::safeDivision($tab['sosaCount'], $gen_theoretical);
101
-                $gen_equiv += $perc_sosa_count_theor;
102
-                $missing=2*$prev_known - $tab['sosaCount'];
103
-                $gen_diff=$tab['diffSosaTotalCount']-$prev_diff;
94
+			foreach($stats_gen as $gen => $tab){
95
+				$genY1= I18N::translate('-');
96
+				$genY2= I18N::translate('-');
97
+				if($tab['firstBirth']>0) $genY1=$tab['firstBirth'];
98
+				if($tab['lastBirth']>0) $genY2=$tab['lastBirth'];
99
+				$total_theoretical += $gen_theoretical;
100
+				$perc_sosa_count_theor = Functions::safeDivision($tab['sosaCount'], $gen_theoretical);
101
+				$gen_equiv += $perc_sosa_count_theor;
102
+				$missing=2*$prev_known - $tab['sosaCount'];
103
+				$gen_diff=$tab['diffSosaTotalCount']-$prev_diff;
104 104
                 
105
-                $generation_stats[$gen] = array(
106
-                    'gen_min_birth' => $genY1,
107
-                    'gen_max_birth' => $genY2,
108
-                    'theoretical' => $gen_theoretical,
109
-                    'known' => $tab['sosaCount'],
110
-                    'perc_known' => $perc_sosa_count_theor,
111
-                    'missing' => $missing,
112
-                    'perc_missing' => 1-Functions::safeDivision($tab['sosaCount'], 2*$prev_known),
113
-                    'total_known' => $tab['sosaTotalCount'],
114
-                    'perc_total_known' => Functions::safeDivision($tab['sosaTotalCount'], $total_theoretical),
115
-                    'different' => $gen_diff,
116
-                    'perc_different' => Functions::safeDivision($gen_diff, $tab['sosaCount']),
117
-                    'total_different' => $tab['diffSosaTotalCount'],
118
-                    'pedi_collapse' => 1 - Functions::safeDivision($tab['diffSosaTotalCount'], $tab['sosaTotalCount'])
119
-                );
105
+				$generation_stats[$gen] = array(
106
+					'gen_min_birth' => $genY1,
107
+					'gen_max_birth' => $genY2,
108
+					'theoretical' => $gen_theoretical,
109
+					'known' => $tab['sosaCount'],
110
+					'perc_known' => $perc_sosa_count_theor,
111
+					'missing' => $missing,
112
+					'perc_missing' => 1-Functions::safeDivision($tab['sosaCount'], 2*$prev_known),
113
+					'total_known' => $tab['sosaTotalCount'],
114
+					'perc_total_known' => Functions::safeDivision($tab['sosaTotalCount'], $total_theoretical),
115
+					'different' => $gen_diff,
116
+					'perc_different' => Functions::safeDivision($gen_diff, $tab['sosaCount']),
117
+					'total_different' => $tab['diffSosaTotalCount'],
118
+					'pedi_collapse' => 1 - Functions::safeDivision($tab['diffSosaTotalCount'], $tab['sosaTotalCount'])
119
+				);
120 120
                 
121
-                $gen_theoretical = $gen_theoretical * 2;
122
-                $prev_known=$tab['sosaCount'];
123
-                $prev_diff=$tab['diffSosaTotalCount'];
124
-            }
121
+				$gen_theoretical = $gen_theoretical * 2;
122
+				$prev_known=$tab['sosaCount'];
123
+				$prev_diff=$tab['diffSosaTotalCount'];
124
+			}
125 125
             
126
-            $view_bag->set('generation_stats', $generation_stats);
127
-            $view_bag->set('equivalent_gen', $gen_equiv);
126
+			$view_bag->set('generation_stats', $generation_stats);
127
+			$view_bag->set('equivalent_gen', $gen_equiv);
128 128
                         
129
-            $view_bag->set('chart_img_g2', $this->htmlAncestorDispersionG2());
130
-            $view_bag->set('chart_img_g3', $this->htmlAncestorDispersionG3());
129
+			$view_bag->set('chart_img_g2', $this->htmlAncestorDispersionG2());
130
+			$view_bag->set('chart_img_g3', $this->htmlAncestorDispersionG3());
131 131
             
132
-        }
132
+		}
133 133
         
134
-        ViewFactory::make('SosaStats', $this, $controller, $view_bag)->render();   
135
-    }
134
+		ViewFactory::make('SosaStats', $this, $controller, $view_bag)->render();   
135
+	}
136 136
     
137
-    /**
138
-     * Returns HTML code for a graph showing the dispersion of ancestors across father & mother
139
-     * @return string HTML code
140
-     */
141
-     private function htmlAncestorDispersionG2()
142
-    {
143
-        $ancestorsDispGen2 = $this->sosa_provider->getAncestorDispersionForGen(2);
144
-        if(count($ancestorsDispGen2) == 0) return;
137
+	/**
138
+	 * Returns HTML code for a graph showing the dispersion of ancestors across father & mother
139
+	 * @return string HTML code
140
+	 */
141
+	 private function htmlAncestorDispersionG2()
142
+	{
143
+		$ancestorsDispGen2 = $this->sosa_provider->getAncestorDispersionForGen(2);
144
+		if(count($ancestorsDispGen2) == 0) return;
145 145
         
146
-        $size = '600x300';
146
+		$size = '600x300';
147 147
         
148
-        $total = array_sum($ancestorsDispGen2);
149
-        $father_count = array_key_exists(1, $ancestorsDispGen2) ? $ancestorsDispGen2[1] : 0;
150
-        $father = array (
151
-            'color' => '84beff', 
152
-            'count' => $father_count, 
153
-            'perc' => Functions::safeDivision($father_count, $total), 
154
-            'name' => \Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('fat')            
155
-        );
156
-        $mother_count = array_key_exists(2, $ancestorsDispGen2) ? $ancestorsDispGen2[2] : 0;
157
-        $mother = array (
158
-            'color' => 'ffd1dc', 
159
-            'count' => $mother_count, 
160
-            'perc' => Functions::safeDivision($mother_count, $total),
161
-            'name' => \Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('mot')
162
-        );
163
-        $shared_count = array_key_exists(-1, $ancestorsDispGen2) ? $ancestorsDispGen2[-1] : 0;
164
-        $shared = array (
165
-            'color' => '777777', 
166
-            'count' => $shared_count, 
167
-            'perc' => Functions::safeDivision($shared_count, $total),
168
-            'name' => I18N::translate('Shared')
169
-        );
148
+		$total = array_sum($ancestorsDispGen2);
149
+		$father_count = array_key_exists(1, $ancestorsDispGen2) ? $ancestorsDispGen2[1] : 0;
150
+		$father = array (
151
+			'color' => '84beff', 
152
+			'count' => $father_count, 
153
+			'perc' => Functions::safeDivision($father_count, $total), 
154
+			'name' => \Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('fat')            
155
+		);
156
+		$mother_count = array_key_exists(2, $ancestorsDispGen2) ? $ancestorsDispGen2[2] : 0;
157
+		$mother = array (
158
+			'color' => 'ffd1dc', 
159
+			'count' => $mother_count, 
160
+			'perc' => Functions::safeDivision($mother_count, $total),
161
+			'name' => \Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('mot')
162
+		);
163
+		$shared_count = array_key_exists(-1, $ancestorsDispGen2) ? $ancestorsDispGen2[-1] : 0;
164
+		$shared = array (
165
+			'color' => '777777', 
166
+			'count' => $shared_count, 
167
+			'perc' => Functions::safeDivision($shared_count, $total),
168
+			'name' => I18N::translate('Shared')
169
+		);
170 170
         
171
-        $chd = $this->arrayToExtendedEncoding(array(4095 * $father['perc'], 4095 * $shared['perc'], 4095 * $mother['perc']));
172
-        $chart_title = I18N::translate('Known Sosa ancestors\' dispersion');
173
-        $chl = 
174
-             $father['name'] . ' - ' . I18N::percentage($father['perc'], 1) . '|' .
175
-             $shared['name'] . ' - ' . I18N::percentage($shared['perc'], 1) . '|' .
176
-             $mother['name'] . ' - ' . I18N::percentage($mother['perc'], 1);
177
-        return "<img src=\"https://chart.googleapis.com/chart?cht=p&chp=1.5708&amp;chd=e:{$chd}&amp;chs={$size}&amp;chco={$father['color']},{$shared['color']},{$mother['color']}&amp;chf=bg,s,ffffff00&amp;chl={$chl}\" alt=\"" . $chart_title . "\" title=\"" . $chart_title . "\" />";
178
-    }
171
+		$chd = $this->arrayToExtendedEncoding(array(4095 * $father['perc'], 4095 * $shared['perc'], 4095 * $mother['perc']));
172
+		$chart_title = I18N::translate('Known Sosa ancestors\' dispersion');
173
+		$chl = 
174
+			 $father['name'] . ' - ' . I18N::percentage($father['perc'], 1) . '|' .
175
+			 $shared['name'] . ' - ' . I18N::percentage($shared['perc'], 1) . '|' .
176
+			 $mother['name'] . ' - ' . I18N::percentage($mother['perc'], 1);
177
+		return "<img src=\"https://chart.googleapis.com/chart?cht=p&chp=1.5708&amp;chd=e:{$chd}&amp;chs={$size}&amp;chco={$father['color']},{$shared['color']},{$mother['color']}&amp;chf=bg,s,ffffff00&amp;chl={$chl}\" alt=\"" . $chart_title . "\" title=\"" . $chart_title . "\" />";
178
+	}
179 179
     
180
-    /**
181
-     * Returns HTML code for a graph showing the dispersion of ancestors across grand-parents
182
-     * @return string HTML code
183
-     */
184
-    private function htmlAncestorDispersionG3()
185
-    {
186
-        $ancestorsDispGen2 = $this->sosa_provider->getAncestorDispersionForGen(3);
180
+	/**
181
+	 * Returns HTML code for a graph showing the dispersion of ancestors across grand-parents
182
+	 * @return string HTML code
183
+	 */
184
+	private function htmlAncestorDispersionG3()
185
+	{
186
+		$ancestorsDispGen2 = $this->sosa_provider->getAncestorDispersionForGen(3);
187 187
         
188
-        $size = '700x300';
188
+		$size = '700x300';
189 189
         
190
-        $color_motmot = 'ffd1dc';
191
-        $color_motfat = 'b998a0';
192
-        $color_fatfat = '577292';
193
-        $color_fatmot = '84beff';
194
-        $color_shared = '777777';
190
+		$color_motmot = 'ffd1dc';
191
+		$color_motfat = 'b998a0';
192
+		$color_fatfat = '577292';
193
+		$color_fatmot = '84beff';
194
+		$color_shared = '777777';
195 195
     
196
-        $total_fatfat = array_key_exists(1, $ancestorsDispGen2) ? $ancestorsDispGen2[1] : 0;
197
-        $total_fatmot = array_key_exists(2, $ancestorsDispGen2) ? $ancestorsDispGen2[2] : 0;
198
-        $total_motfat = array_key_exists(4, $ancestorsDispGen2) ? $ancestorsDispGen2[4] : 0;
199
-        $total_motmot = array_key_exists(8, $ancestorsDispGen2) ? $ancestorsDispGen2[8] : 0;
200
-        $total_sha = array_key_exists(-1, $ancestorsDispGen2) ? $ancestorsDispGen2[-1] : 0;
201
-        $total = $total_fatfat + $total_fatmot + $total_motfat+ $total_motmot + $total_sha;
196
+		$total_fatfat = array_key_exists(1, $ancestorsDispGen2) ? $ancestorsDispGen2[1] : 0;
197
+		$total_fatmot = array_key_exists(2, $ancestorsDispGen2) ? $ancestorsDispGen2[2] : 0;
198
+		$total_motfat = array_key_exists(4, $ancestorsDispGen2) ? $ancestorsDispGen2[4] : 0;
199
+		$total_motmot = array_key_exists(8, $ancestorsDispGen2) ? $ancestorsDispGen2[8] : 0;
200
+		$total_sha = array_key_exists(-1, $ancestorsDispGen2) ? $ancestorsDispGen2[-1] : 0;
201
+		$total = $total_fatfat + $total_fatmot + $total_motfat+ $total_motmot + $total_sha;
202 202
     
203
-        $chd = $this->arrayToExtendedEncoding(array(
204
-	    4095 * Functions::safeDivision($total_fatfat, $total), 
205
-            4095 * Functions::safeDivision($total_fatmot, $total),
206
-            4095 * Functions::safeDivision($total_sha, $total), 
207
-            4095 * Functions::safeDivision($total_motfat, $total),
208
-            4095 * Functions::safeDivision($total_motmot, $total)          
209
-        ));
210
-        $chart_title = I18N::translate('Known Sosa ancestors\' dispersion - G3');
211
-        $chl =
212
-            \Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('fatfat') . ' - ' . I18N::percentage(Functions::safeDivision($total_fatfat, $total), 1) . '|' .
213
-            \Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('fatmot') . ' - ' . I18N::percentage(Functions::safeDivision($total_fatmot, $total), 1) . '|' .
214
-            I18N::translate('Shared') . ' - ' . I18N::percentage(Functions::safeDivision($total_sha, $total), 1) . '|' .
215
-            \Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('motfat') . ' - ' . I18N::percentage(Functions::safeDivision($total_motfat, $total), 1) . '|' .
216
-            \Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('motmot') . ' - ' . I18N::percentage(Functions::safeDivision($total_motmot, $total), 1);
217
-         return "<img src=\"https://chart.googleapis.com/chart?cht=p&chp=1.5708&amp;chd=e:{$chd}&amp;chs={$size}&amp;chco={$color_fatfat},{$color_fatmot},{$color_shared},{$color_motfat},{$color_motmot}&amp;chf=bg,s,ffffff00&amp;chl={$chl}\" alt=\"" . $chart_title . "\" title=\"" . $chart_title . "\" />";
218
-    }
203
+		$chd = $this->arrayToExtendedEncoding(array(
204
+		4095 * Functions::safeDivision($total_fatfat, $total), 
205
+			4095 * Functions::safeDivision($total_fatmot, $total),
206
+			4095 * Functions::safeDivision($total_sha, $total), 
207
+			4095 * Functions::safeDivision($total_motfat, $total),
208
+			4095 * Functions::safeDivision($total_motmot, $total)          
209
+		));
210
+		$chart_title = I18N::translate('Known Sosa ancestors\' dispersion - G3');
211
+		$chl =
212
+			\Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('fatfat') . ' - ' . I18N::percentage(Functions::safeDivision($total_fatfat, $total), 1) . '|' .
213
+			\Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('fatmot') . ' - ' . I18N::percentage(Functions::safeDivision($total_fatmot, $total), 1) . '|' .
214
+			I18N::translate('Shared') . ' - ' . I18N::percentage(Functions::safeDivision($total_sha, $total), 1) . '|' .
215
+			\Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('motfat') . ' - ' . I18N::percentage(Functions::safeDivision($total_motfat, $total), 1) . '|' .
216
+			\Fisharebest\Webtrees\Functions\Functions::getRelationshipNameFromPath('motmot') . ' - ' . I18N::percentage(Functions::safeDivision($total_motmot, $total), 1);
217
+		 return "<img src=\"https://chart.googleapis.com/chart?cht=p&chp=1.5708&amp;chd=e:{$chd}&amp;chs={$size}&amp;chco={$color_fatfat},{$color_fatmot},{$color_shared},{$color_motfat},{$color_motmot}&amp;chf=bg,s,ffffff00&amp;chl={$chl}\" alt=\"" . $chart_title . "\" title=\"" . $chart_title . "\" />";
218
+	}
219 219
 
220
-    /**
221
-     * Convert an array to Google Chart encoding
222
-     * @param arrat $a Array to encode
223
-     * @return string
224
-     */
225
-    private function arrayToExtendedEncoding($a) {
226
-        $xencoding = WT_GOOGLE_CHART_ENCODING;
220
+	/**
221
+	 * Convert an array to Google Chart encoding
222
+	 * @param arrat $a Array to encode
223
+	 * @return string
224
+	 */
225
+	private function arrayToExtendedEncoding($a) {
226
+		$xencoding = WT_GOOGLE_CHART_ENCODING;
227 227
     
228
-        $encoding = '';
229
-        foreach ($a as $value) {
230
-            if ($value < 0) {
231
-                $value = 0;
232
-            }
233
-            $first  = (int) ($value / 64);
234
-            $second = $value % 64;
235
-            $encoding .= $xencoding[(int) $first] . $xencoding[(int) $second];
236
-        }
228
+		$encoding = '';
229
+		foreach ($a as $value) {
230
+			if ($value < 0) {
231
+				$value = 0;
232
+			}
233
+			$first  = (int) ($value / 64);
234
+			$second = $value % 64;
235
+			$encoding .= $xencoding[(int) $first] . $xencoding[(int) $second];
236
+		}
237 237
     
238
-        return $encoding;
239
-    }
238
+		return $encoding;
239
+	}
240 240
     
241 241
     
242 242
 }
243 243
\ No newline at end of file
Please login to merge, or discard this patch.
src/Webtrees/Module/Sosa/Model/SosaProvider.php 1 patch
Indentation   +560 added lines, -560 removed lines patch added patch discarded remove patch
@@ -22,389 +22,389 @@  discard block
 block discarded – undo
22 22
  */
23 23
 class SosaProvider {
24 24
     
25
-    /**
26
-     * Maximum number of generation the database is able to hold.
27
-     * @var int MAX_DB_GENERATIONS
28
-     */
29
-    const MAX_DB_GENERATIONS = 64;
30
-    
31
-    /**
32
-     * System's default user (ID -1 in the database
33
-     * @var User $default_user
34
-     */
35
-    protected static $default_user;
36
-    
37
-    /**
38
-     * Reference user
39
-     * @var User $user
40
-     */
41
-    protected $user;
42
-    
43
-    /**
44
-     * Reference tree
45
-     * @var Tree $tree
46
-     */
47
-    protected $tree;
48
-    
49
-    /**
50
-     * Cached list of Sosa Individuals by generation
51
-     * Format: key = generation, value = array ( sosa => Individual ID)
52
-     * @var array $sosa_list_by_gen
53
-     */
54
-    protected $sosa_list_by_gen;
55
-    
56
-    /**
57
-     * Cached list of Sosa Families by generation
58
-     * Format: key = generation, value = array ( sosa => Family ID)
59
-     * @var unknown $sosa_fam_list_by_gen
60
-     */
61
-    protected $sosa_fam_list_by_gen;
62
-    
63
-    /**
64
-     * Cached array of statistics by generation
65
-     * Format:  key = generation, 
66
-     *          value = array(
67
-     *              sosaCount, sosaTotalCount, diffSosaTotalCount, firstBirth, lastBirth, avgBirth
68
-     *           )
69
-     * @var array $statistics_tab
70
-     */
71
-    protected $statistics_tab;
72
-    
73
-    /**
74
-     * Has the provider's initialisation completed
75
-     * @var bool $is_setup
76
-     */
77
-    protected $is_setup;
78
-    
79
-    /**
80
-     * Constructor for Sosa Provider.
81
-     * A provider is defined in relation to a specific tree and reference user.
82
-     * 
83
-     * @param Tree $tree
84
-     * @param User $user
85
-     */
86
-    public function __construct(Tree $tree, User $user = null) {
87
-        if(self::$default_user === null) 
88
-            self::$default_user = User::find(-1);
25
+	/**
26
+	 * Maximum number of generation the database is able to hold.
27
+	 * @var int MAX_DB_GENERATIONS
28
+	 */
29
+	const MAX_DB_GENERATIONS = 64;
30
+    
31
+	/**
32
+	 * System's default user (ID -1 in the database
33
+	 * @var User $default_user
34
+	 */
35
+	protected static $default_user;
36
+    
37
+	/**
38
+	 * Reference user
39
+	 * @var User $user
40
+	 */
41
+	protected $user;
42
+    
43
+	/**
44
+	 * Reference tree
45
+	 * @var Tree $tree
46
+	 */
47
+	protected $tree;
48
+    
49
+	/**
50
+	 * Cached list of Sosa Individuals by generation
51
+	 * Format: key = generation, value = array ( sosa => Individual ID)
52
+	 * @var array $sosa_list_by_gen
53
+	 */
54
+	protected $sosa_list_by_gen;
55
+    
56
+	/**
57
+	 * Cached list of Sosa Families by generation
58
+	 * Format: key = generation, value = array ( sosa => Family ID)
59
+	 * @var unknown $sosa_fam_list_by_gen
60
+	 */
61
+	protected $sosa_fam_list_by_gen;
62
+    
63
+	/**
64
+	 * Cached array of statistics by generation
65
+	 * Format:  key = generation, 
66
+	 *          value = array(
67
+	 *              sosaCount, sosaTotalCount, diffSosaTotalCount, firstBirth, lastBirth, avgBirth
68
+	 *           )
69
+	 * @var array $statistics_tab
70
+	 */
71
+	protected $statistics_tab;
72
+    
73
+	/**
74
+	 * Has the provider's initialisation completed
75
+	 * @var bool $is_setup
76
+	 */
77
+	protected $is_setup;
78
+    
79
+	/**
80
+	 * Constructor for Sosa Provider.
81
+	 * A provider is defined in relation to a specific tree and reference user.
82
+	 * 
83
+	 * @param Tree $tree
84
+	 * @param User $user
85
+	 */
86
+	public function __construct(Tree $tree, User $user = null) {
87
+		if(self::$default_user === null) 
88
+			self::$default_user = User::find(-1);
89 89
         
90
-        $this->tree = $tree;
91
-        $this->user = $user;
92
-        $this->is_setup = true;
93
-        if($this->user === null) $this->user = Auth::user();
94
-        if(strlen($this->user->getUserId()) == 0) $this->user = self::$default_user;
90
+		$this->tree = $tree;
91
+		$this->user = $user;
92
+		$this->is_setup = true;
93
+		if($this->user === null) $this->user = Auth::user();
94
+		if(strlen($this->user->getUserId()) == 0) $this->user = self::$default_user;
95 95
         
96
-        // Check if the user, or the default user, has a root already setup;
97
-        if(empty($this->getRootIndiId())) {
98
-            if($this->user == self::$default_user) {  // If the default user is not setup
99
-                $this->is_setup = false;
100
-            }
101
-            else {
102
-                $this->user = self::$default_user;
103
-                $this->is_setup = $this->getRootIndiId() === null;
104
-            }            
105
-        }
106
-    }
107
-    
108
-    /**
109
-     * Returns is the Provider has been successfully set up
110
-     * @return bool
111
-     */
112
-    public function isSetup() {
113
-        return $this->is_setup;
114
-    }
115
-    
116
-    /**
117
-     * Return the root individual ID for the reference tree and user.
118
-     * @return string Individual ID
119
-     */
120
-    public function getRootIndiId() {
121
-        return $this->tree->getUserPreference($this->user, 'MAJ_SOSA_ROOT_ID');
122
-    }
123
-    
124
-    /**
125
-     * Return the root individual for the reference tree and user.
126
-     * @return Individual Individual
127
-     */
128
-    public function getRootIndi() {
129
-        $root_indi_id = $this->getRootIndiId();
130
-        if(!empty($root_indi_id)) {
131
-            return Individual::getInstance($root_indi_id, $this->tree);
132
-        }
133
-        return null;
134
-    }
96
+		// Check if the user, or the default user, has a root already setup;
97
+		if(empty($this->getRootIndiId())) {
98
+			if($this->user == self::$default_user) {  // If the default user is not setup
99
+				$this->is_setup = false;
100
+			}
101
+			else {
102
+				$this->user = self::$default_user;
103
+				$this->is_setup = $this->getRootIndiId() === null;
104
+			}            
105
+		}
106
+	}
107
+    
108
+	/**
109
+	 * Returns is the Provider has been successfully set up
110
+	 * @return bool
111
+	 */
112
+	public function isSetup() {
113
+		return $this->is_setup;
114
+	}
115
+    
116
+	/**
117
+	 * Return the root individual ID for the reference tree and user.
118
+	 * @return string Individual ID
119
+	 */
120
+	public function getRootIndiId() {
121
+		return $this->tree->getUserPreference($this->user, 'MAJ_SOSA_ROOT_ID');
122
+	}
123
+    
124
+	/**
125
+	 * Return the root individual for the reference tree and user.
126
+	 * @return Individual Individual
127
+	 */
128
+	public function getRootIndi() {
129
+		$root_indi_id = $this->getRootIndiId();
130
+		if(!empty($root_indi_id)) {
131
+			return Individual::getInstance($root_indi_id, $this->tree);
132
+		}
133
+		return null;
134
+	}
135 135
        
136
-    /*****************
136
+	/*****************
137 137
      * DATA CRUD LAYER
138 138
      *****************/
139 139
     
140
-    /**
141
-     * Remove all Sosa entries related to the gedcom file and user
142
-     */
143
-    public function deleteAll() {
144
-        if(!$this->is_setup) return;
145
-        Database::prepare(
146
-            'DELETE FROM `##maj_sosa`'.
147
-            ' WHERE majs_gedcom_id= :tree_id and majs_user_id = :user_id ')
148
-            ->execute(array(
149
-                'tree_id' => $this->tree->getTreeId(), 
150
-                'user_id' => $this->user->getUserId()                
151
-            ));
152
-    }
153
-    
154
-    /**
155
-     * Remove all ancestors of a sosa number
156
-     * 
157
-     * @param int $sosa
158
-     */
159
-    public function deleteAncestors($sosa) {
160
-        if(!$this->is_setup) return;
161
-        $gen = Functions::getGeneration($sosa);
162
-        Database::prepare(
163
-            'DELETE FROM `##maj_sosa`'.
164
-            ' WHERE majs_gedcom_id=:tree_id and majs_user_id = :user_id' .
165
-            ' AND majs_gen >= :gen' .
166
-            ' AND FLOOR(majs_sosa / (POW(2, (majs_gen - :gen)))) = :sosa'
167
-        )->execute(array(
168
-            'tree_id' => $this->tree->getTreeId(), 
169
-            'user_id' => $this->user->getUserId(),
170
-            'gen' => $gen,
171
-            'sosa' => $sosa
172
-        ));
173
-    }    
174
-    
175
-    /**
176
-     * Insert (or update if already existing) a list of Sosa individuals
177
-     * @param array $sosa_records
178
-     */
179
-    public function insertOrUpdate($sosa_records) {
180
-        if(!$this->is_setup) return;
140
+	/**
141
+	 * Remove all Sosa entries related to the gedcom file and user
142
+	 */
143
+	public function deleteAll() {
144
+		if(!$this->is_setup) return;
145
+		Database::prepare(
146
+			'DELETE FROM `##maj_sosa`'.
147
+			' WHERE majs_gedcom_id= :tree_id and majs_user_id = :user_id ')
148
+			->execute(array(
149
+				'tree_id' => $this->tree->getTreeId(), 
150
+				'user_id' => $this->user->getUserId()                
151
+			));
152
+	}
153
+    
154
+	/**
155
+	 * Remove all ancestors of a sosa number
156
+	 * 
157
+	 * @param int $sosa
158
+	 */
159
+	public function deleteAncestors($sosa) {
160
+		if(!$this->is_setup) return;
161
+		$gen = Functions::getGeneration($sosa);
162
+		Database::prepare(
163
+			'DELETE FROM `##maj_sosa`'.
164
+			' WHERE majs_gedcom_id=:tree_id and majs_user_id = :user_id' .
165
+			' AND majs_gen >= :gen' .
166
+			' AND FLOOR(majs_sosa / (POW(2, (majs_gen - :gen)))) = :sosa'
167
+		)->execute(array(
168
+			'tree_id' => $this->tree->getTreeId(), 
169
+			'user_id' => $this->user->getUserId(),
170
+			'gen' => $gen,
171
+			'sosa' => $sosa
172
+		));
173
+	}    
174
+    
175
+	/**
176
+	 * Insert (or update if already existing) a list of Sosa individuals
177
+	 * @param array $sosa_records
178
+	 */
179
+	public function insertOrUpdate($sosa_records) {
180
+		if(!$this->is_setup) return;
181 181
         
182
-        $treeid = $this->tree->getTreeId();
183
-        $userid = $this->user->getUserId();
184
-        $questionmarks_table = array();
185
-        $values_table = array();
182
+		$treeid = $this->tree->getTreeId();
183
+		$userid = $this->user->getUserId();
184
+		$questionmarks_table = array();
185
+		$values_table = array();
186 186
         
187
-        $i = 0;
188
-        foreach  ($sosa_records as $row) {
189
-            $gen = Functions::getGeneration($row['sosa']);
190
-            if($gen <= self::MAX_DB_GENERATIONS) {
191
-                $questionmarks_table[] = 
192
-                    '(:tree_id'.$i.', :user_id'.$i.', :sosa'.$i.', :indi_id'.$i.', :gen'.$i.', :byear'.$i.', :dyear'.$i.')';
193
-                $values_table = array_merge(
194
-                    $values_table, 
195
-                    array(
196
-                        'tree_id'.$i => $treeid, 
197
-                        'user_id'.$i => $userid, 
198
-                        'sosa'.$i => $row['sosa'], 
199
-                        'indi_id'.$i => $row['indi'], 
200
-                        'gen'.$i => Functions::getGeneration($row['sosa']),
201
-                        'byear'.$i => $row['birth_year'],
202
-                        'dyear'.$i => $row['death_year']
203
-                    )
204
-                );
205
-            }
206
-            $i++;
207
-        }
187
+		$i = 0;
188
+		foreach  ($sosa_records as $row) {
189
+			$gen = Functions::getGeneration($row['sosa']);
190
+			if($gen <= self::MAX_DB_GENERATIONS) {
191
+				$questionmarks_table[] = 
192
+					'(:tree_id'.$i.', :user_id'.$i.', :sosa'.$i.', :indi_id'.$i.', :gen'.$i.', :byear'.$i.', :dyear'.$i.')';
193
+				$values_table = array_merge(
194
+					$values_table, 
195
+					array(
196
+						'tree_id'.$i => $treeid, 
197
+						'user_id'.$i => $userid, 
198
+						'sosa'.$i => $row['sosa'], 
199
+						'indi_id'.$i => $row['indi'], 
200
+						'gen'.$i => Functions::getGeneration($row['sosa']),
201
+						'byear'.$i => $row['birth_year'],
202
+						'dyear'.$i => $row['death_year']
203
+					)
204
+				);
205
+			}
206
+			$i++;
207
+		}
208 208
         
209
-        $sql = 'REPLACE INTO `##maj_sosa`' .
210
-            ' (majs_gedcom_id, majs_user_id, majs_sosa, majs_i_id, majs_gen, majs_birth_year, majs_death_year)' .
211
-            ' VALUES '. implode(',', $questionmarks_table);
212
-        Database::prepare($sql)->execute($values_table);
213
-    }
209
+		$sql = 'REPLACE INTO `##maj_sosa`' .
210
+			' (majs_gedcom_id, majs_user_id, majs_sosa, majs_i_id, majs_gen, majs_birth_year, majs_death_year)' .
211
+			' VALUES '. implode(',', $questionmarks_table);
212
+		Database::prepare($sql)->execute($values_table);
213
+	}
214 214
     
215
-    /****************
215
+	/****************
216 216
      * SIMPLE QUERIES
217 217
      ****************/
218 218
     
219
-    /**
220
-     * Returns the list of Sosa numbers to which an individual is related.
221
-     * Format: key = sosa number, value = generation for the Sosa number
222
-     * 
223
-     * @param Individual $indi
224
-     * @return array Array of sosa numbers
225
-     */
226
-    public function getSosaNumbers(Individual $indi) {
227
-        if(!$this->is_setup) return array();
228
-        return Database::prepare(
229
-                'SELECT majs_sosa, majs_gen FROM `##maj_sosa`'.
230
-                ' WHERE majs_i_id=:indi_id AND majs_gedcom_id=:tree_id AND majs_user_id=:user_id'
231
-            )->execute(array(
232
-                'indi_id' => $indi->getXref(), 
233
-                'tree_id' => $this->tree->getTreeId(), 
234
-                'user_id' => $this->user->getUserId()
235
-            ))->fetchAssoc();
236
-    }
237
-    
238
-    /**
239
-     * Get the last generation of Sosa ancestors
240
-     *
241
-     * @return number Last generation if found, 1 otherwise
242
-     */
243
-    public function getLastGeneration() {
244
-        if(!$this->is_setup) return;
245
-        return Database::prepare(
246
-                'SELECT MAX(majs_gen) FROM `##maj_sosa`'.
247
-                ' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'
248
-            )->execute(array(
249
-                'tree_id' => $this->tree->getTreeId(), 
250
-                'user_id' => $this->user->getUserId()                
251
-            ))->fetchOne() ?: 1;
252
-    }
253
-    
254
-    /*************
219
+	/**
220
+	 * Returns the list of Sosa numbers to which an individual is related.
221
+	 * Format: key = sosa number, value = generation for the Sosa number
222
+	 * 
223
+	 * @param Individual $indi
224
+	 * @return array Array of sosa numbers
225
+	 */
226
+	public function getSosaNumbers(Individual $indi) {
227
+		if(!$this->is_setup) return array();
228
+		return Database::prepare(
229
+				'SELECT majs_sosa, majs_gen FROM `##maj_sosa`'.
230
+				' WHERE majs_i_id=:indi_id AND majs_gedcom_id=:tree_id AND majs_user_id=:user_id'
231
+			)->execute(array(
232
+				'indi_id' => $indi->getXref(), 
233
+				'tree_id' => $this->tree->getTreeId(), 
234
+				'user_id' => $this->user->getUserId()
235
+			))->fetchAssoc();
236
+	}
237
+    
238
+	/**
239
+	 * Get the last generation of Sosa ancestors
240
+	 *
241
+	 * @return number Last generation if found, 1 otherwise
242
+	 */
243
+	public function getLastGeneration() {
244
+		if(!$this->is_setup) return;
245
+		return Database::prepare(
246
+				'SELECT MAX(majs_gen) FROM `##maj_sosa`'.
247
+				' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'
248
+			)->execute(array(
249
+				'tree_id' => $this->tree->getTreeId(), 
250
+				'user_id' => $this->user->getUserId()                
251
+			))->fetchOne() ?: 1;
252
+	}
253
+    
254
+	/*************
255 255
      * SOSA LISTS
256 256
      *************/
257 257
     
258
-    /**
259
-     * Return the list of all sosas, with the generations it belongs to
260
-     *
261
-     * @return array Associative array of Sosa ancestors, with their generation, comma separated
262
-     */
263
-    public function getAllSosaWithGenerations(){
264
-        if(!$this->is_setup) return array();
265
-        return Database::prepare(
266
-            'SELECT majs_i_id AS indi,' .
267
-            ' GROUP_CONCAT(DISTINCT majs_gen ORDER BY majs_gen ASC SEPARATOR ",") AS generations' .
268
-            ' FROM `##maj_sosa`' .
269
-            ' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id' .
270
-            ' GROUP BY majs_i_id'
271
-        )->execute(array(
272
-            'tree_id' => $this->tree->getTreeId(),
273
-            'user_id' => $this->user->getUserId()
274
-        ))->fetchAssoc();
275
-    }
276
-    
277
-    /**
278
-     * Get an associative array of Sosa individuals in generation G. Keys are Sosa numbers, values individuals.
279
-     *
280
-     * @param number $gen Generation
281
-     * @return array Array of Sosa individuals
282
-     */
283
-    public function getSosaListAtGeneration($gen){
284
-        if(!$this->is_setup) return array();
285
-        if(!$this->sosa_list_by_gen)
286
-            $this->sosa_list_by_gen = array();
258
+	/**
259
+	 * Return the list of all sosas, with the generations it belongs to
260
+	 *
261
+	 * @return array Associative array of Sosa ancestors, with their generation, comma separated
262
+	 */
263
+	public function getAllSosaWithGenerations(){
264
+		if(!$this->is_setup) return array();
265
+		return Database::prepare(
266
+			'SELECT majs_i_id AS indi,' .
267
+			' GROUP_CONCAT(DISTINCT majs_gen ORDER BY majs_gen ASC SEPARATOR ",") AS generations' .
268
+			' FROM `##maj_sosa`' .
269
+			' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id' .
270
+			' GROUP BY majs_i_id'
271
+		)->execute(array(
272
+			'tree_id' => $this->tree->getTreeId(),
273
+			'user_id' => $this->user->getUserId()
274
+		))->fetchAssoc();
275
+	}
276
+    
277
+	/**
278
+	 * Get an associative array of Sosa individuals in generation G. Keys are Sosa numbers, values individuals.
279
+	 *
280
+	 * @param number $gen Generation
281
+	 * @return array Array of Sosa individuals
282
+	 */
283
+	public function getSosaListAtGeneration($gen){
284
+		if(!$this->is_setup) return array();
285
+		if(!$this->sosa_list_by_gen)
286
+			$this->sosa_list_by_gen = array();
287 287
         
288
-        if($gen){
289
-            if(!isset($this->sosa_list_by_gen[$gen])){
290
-                $this->sosa_list_by_gen[$gen] = Database::prepare(
291
-                    'SELECT majs_sosa AS sosa, majs_i_id AS indi'.
292
-                    ' FROM `##maj_sosa`'.
293
-                    ' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'.
294
-                    ' AND majs_gen = :gen'.
295
-                    ' ORDER BY majs_sosa ASC')
296
-                ->execute(array(
297
-                    'tree_id' => $this->tree->getTreeId(),
298
-                    'user_id' => $this->user->getUserId(),
299
-                    'gen' => $gen
300
-                ))
301
-                ->fetchAssoc();
302
-            }
303
-            return $this->sosa_list_by_gen[$gen];
304
-        }
305
-        return array();
306
-    }
307
-    
308
-    /**
309
-     * Get an associative array of Sosa families in generation G. Keys are Sosa numbers for the husband, values families.
310
-     *
311
-     * @param number $gen Generation
312
-     * @return array Array of Sosa families
313
-     */
314
-    public function getFamilySosaListAtGeneration($gen){
315
-        if(!$this->is_setup) return array();
316
-        if(!$this->sosa_fam_list_by_gen)
317
-            $this->sosa_fam_list_by_gen = array();
288
+		if($gen){
289
+			if(!isset($this->sosa_list_by_gen[$gen])){
290
+				$this->sosa_list_by_gen[$gen] = Database::prepare(
291
+					'SELECT majs_sosa AS sosa, majs_i_id AS indi'.
292
+					' FROM `##maj_sosa`'.
293
+					' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'.
294
+					' AND majs_gen = :gen'.
295
+					' ORDER BY majs_sosa ASC')
296
+				->execute(array(
297
+					'tree_id' => $this->tree->getTreeId(),
298
+					'user_id' => $this->user->getUserId(),
299
+					'gen' => $gen
300
+				))
301
+				->fetchAssoc();
302
+			}
303
+			return $this->sosa_list_by_gen[$gen];
304
+		}
305
+		return array();
306
+	}
307
+    
308
+	/**
309
+	 * Get an associative array of Sosa families in generation G. Keys are Sosa numbers for the husband, values families.
310
+	 *
311
+	 * @param number $gen Generation
312
+	 * @return array Array of Sosa families
313
+	 */
314
+	public function getFamilySosaListAtGeneration($gen){
315
+		if(!$this->is_setup) return array();
316
+		if(!$this->sosa_fam_list_by_gen)
317
+			$this->sosa_fam_list_by_gen = array();
318 318
         
319
-        if($gen){
320
-            if(!isset($this->sosa_fam_list_by_gen[$gen])){
321
-                $this->sosa_fam_list_by_gen[$gen] = Database::prepare(
322
-                    'SELECT s1.majs_sosa AS sosa, f_id AS fam'.
323
-                    ' FROM `##families`'.
324
-                    ' INNER JOIN `##maj_sosa` AS s1 ON (`##families`.f_husb = s1.majs_i_id AND `##families`.f_file = s1.majs_gedcom_id)'.
325
-                    ' INNER JOIN `##maj_sosa` AS s2 ON (`##families`.f_wife = s2.majs_i_id AND `##families`.f_file = s2.majs_gedcom_id)'.
326
-                    ' WHERE s1.majs_sosa + 1 = s2.majs_sosa'.
327
-                    ' AND s1.majs_gedcom_id= :tree_id AND s1.majs_user_id=:user_id'.
328
-                    ' AND s2.majs_gedcom_id= :tree_id AND s2.majs_user_id=:user_id'.
329
-                    ' AND s1.majs_gen = :gen'.
330
-                    ' ORDER BY s1.majs_sosa ASC'
331
-                    )
332
-                    ->execute(array(
333
-                        'tree_id' => $this->tree->getTreeId(),
334
-                        'user_id' => $this->user->getUserId(),
335
-                        'gen' => $gen
336
-                    ))
337
-                    ->fetchAssoc();
338
-            }
339
-            return $this->sosa_fam_list_by_gen[$gen];
340
-        }
341
-        return array();
342
-    }
343
-    
344
-    /**
345
-     * Get an associative array of Sosa individuals in generation G who are missing parents. Keys are Sosa numbers, values individuals.
346
-     *
347
-     * @param number $gen Generation
348
-     * @return array Array of Sosa individuals
349
-     */
350
-    public function getMissingSosaListAtGeneration($gen){
351
-        if(!$this->is_setup) return array();    
352
-        if($gen){
353
-            return $this->sosa_list_by_gen[$gen] = Database::prepare(
354
-                'SELECT schild.majs_sosa sosa, schild.majs_i_id indi, sfat.majs_sosa IS NOT NULL has_father, smot.majs_sosa IS NOT NULL has_mother'.
355
-                ' FROM `##maj_sosa` schild'.
356
-                ' LEFT JOIN `##maj_sosa` sfat ON ((schild.majs_sosa * 2) = sfat.majs_sosa AND schild.majs_gedcom_id = sfat.majs_gedcom_id AND schild.majs_user_id = sfat.majs_user_id)'.
357
-                ' LEFT JOIN `##maj_sosa` smot ON ((schild.majs_sosa * 2 + 1) = smot.majs_sosa AND schild.majs_gedcom_id = smot.majs_gedcom_id AND schild.majs_user_id = smot.majs_user_id)'.
358
-                ' WHERE schild.majs_gedcom_id = :tree_id AND schild.majs_user_id = :user_id'.
359
-                ' AND schild.majs_gen = :gen'.
360
-                ' AND (sfat.majs_sosa IS NULL OR smot.majs_sosa IS NULL)'.
361
-                ' ORDER BY schild.majs_sosa ASC')
362
-                ->execute(array(
363
-                    'tree_id' => $this->tree->getTreeId(),
364
-                    'user_id' => $this->user->getUserId(),
365
-                    'gen' => $gen - 1
366
-                ))->fetchAll(\PDO::FETCH_ASSOC);
367
-        }
368
-        return array();
369
-    }
370
-    
371
-    
372
-    
373
-    /*************
319
+		if($gen){
320
+			if(!isset($this->sosa_fam_list_by_gen[$gen])){
321
+				$this->sosa_fam_list_by_gen[$gen] = Database::prepare(
322
+					'SELECT s1.majs_sosa AS sosa, f_id AS fam'.
323
+					' FROM `##families`'.
324
+					' INNER JOIN `##maj_sosa` AS s1 ON (`##families`.f_husb = s1.majs_i_id AND `##families`.f_file = s1.majs_gedcom_id)'.
325
+					' INNER JOIN `##maj_sosa` AS s2 ON (`##families`.f_wife = s2.majs_i_id AND `##families`.f_file = s2.majs_gedcom_id)'.
326
+					' WHERE s1.majs_sosa + 1 = s2.majs_sosa'.
327
+					' AND s1.majs_gedcom_id= :tree_id AND s1.majs_user_id=:user_id'.
328
+					' AND s2.majs_gedcom_id= :tree_id AND s2.majs_user_id=:user_id'.
329
+					' AND s1.majs_gen = :gen'.
330
+					' ORDER BY s1.majs_sosa ASC'
331
+					)
332
+					->execute(array(
333
+						'tree_id' => $this->tree->getTreeId(),
334
+						'user_id' => $this->user->getUserId(),
335
+						'gen' => $gen
336
+					))
337
+					->fetchAssoc();
338
+			}
339
+			return $this->sosa_fam_list_by_gen[$gen];
340
+		}
341
+		return array();
342
+	}
343
+    
344
+	/**
345
+	 * Get an associative array of Sosa individuals in generation G who are missing parents. Keys are Sosa numbers, values individuals.
346
+	 *
347
+	 * @param number $gen Generation
348
+	 * @return array Array of Sosa individuals
349
+	 */
350
+	public function getMissingSosaListAtGeneration($gen){
351
+		if(!$this->is_setup) return array();    
352
+		if($gen){
353
+			return $this->sosa_list_by_gen[$gen] = Database::prepare(
354
+				'SELECT schild.majs_sosa sosa, schild.majs_i_id indi, sfat.majs_sosa IS NOT NULL has_father, smot.majs_sosa IS NOT NULL has_mother'.
355
+				' FROM `##maj_sosa` schild'.
356
+				' LEFT JOIN `##maj_sosa` sfat ON ((schild.majs_sosa * 2) = sfat.majs_sosa AND schild.majs_gedcom_id = sfat.majs_gedcom_id AND schild.majs_user_id = sfat.majs_user_id)'.
357
+				' LEFT JOIN `##maj_sosa` smot ON ((schild.majs_sosa * 2 + 1) = smot.majs_sosa AND schild.majs_gedcom_id = smot.majs_gedcom_id AND schild.majs_user_id = smot.majs_user_id)'.
358
+				' WHERE schild.majs_gedcom_id = :tree_id AND schild.majs_user_id = :user_id'.
359
+				' AND schild.majs_gen = :gen'.
360
+				' AND (sfat.majs_sosa IS NULL OR smot.majs_sosa IS NULL)'.
361
+				' ORDER BY schild.majs_sosa ASC')
362
+				->execute(array(
363
+					'tree_id' => $this->tree->getTreeId(),
364
+					'user_id' => $this->user->getUserId(),
365
+					'gen' => $gen - 1
366
+				))->fetchAll(\PDO::FETCH_ASSOC);
367
+		}
368
+		return array();
369
+	}
370
+    
371
+    
372
+    
373
+	/*************
374 374
      * STATISTICS
375 375
      *************/
376
-    /**
377
-     * Get the statistic array detailed by generation.
378
-     * Statistics for each generation are:
379
-     * 	- The number of Sosa in generation
380
-     * 	- The number of Sosa up to generation
381
-     *  - The number of distinct Sosa up to generation
382
-     *  - The year of the first birth in generation
383
-     *  - The year of the last birth in generation
384
-     *  - The average year of birth in generation
385
-     *
386
-     * @return array Statistics array
387
-     */
388
-    public function getStatisticsByGeneration() {
389
-        if(!$this->is_setup) return array();
390
-        if(!$this->statistics_tab) {
391
-            $this->statistics_tab = array();
392
-            if($maxGeneration = $this->getLastGeneration()) {
393
-                for ($gen = 1; $gen <= $maxGeneration; $gen++) {
394
-                    $birthStats = $this->getStatsBirthYearInGeneration($gen);
395
-                    $this->statistics_tab[$gen] = array(
396
-                        'sosaCount'				=>	$this->getSosaCountAtGeneration($gen),
397
-                        'sosaTotalCount'		=>	$this->getSosaCountUpToGeneration($gen),
398
-                        'diffSosaTotalCount'	=>	$this->getDifferentSosaCountUpToGeneration($gen),
399
-                        'firstBirth'			=>	$birthStats['first'],
400
-                        'lastBirth'				=>	$birthStats['last'],
401
-                        'avgBirth'				=>	$birthStats['avg']
402
-                    );
403
-                }
404
-            }
405
-        }
406
-        return $this->statistics_tab;        
407
-    }
376
+	/**
377
+	 * Get the statistic array detailed by generation.
378
+	 * Statistics for each generation are:
379
+	 * 	- The number of Sosa in generation
380
+	 * 	- The number of Sosa up to generation
381
+	 *  - The number of distinct Sosa up to generation
382
+	 *  - The year of the first birth in generation
383
+	 *  - The year of the last birth in generation
384
+	 *  - The average year of birth in generation
385
+	 *
386
+	 * @return array Statistics array
387
+	 */
388
+	public function getStatisticsByGeneration() {
389
+		if(!$this->is_setup) return array();
390
+		if(!$this->statistics_tab) {
391
+			$this->statistics_tab = array();
392
+			if($maxGeneration = $this->getLastGeneration()) {
393
+				for ($gen = 1; $gen <= $maxGeneration; $gen++) {
394
+					$birthStats = $this->getStatsBirthYearInGeneration($gen);
395
+					$this->statistics_tab[$gen] = array(
396
+						'sosaCount'				=>	$this->getSosaCountAtGeneration($gen),
397
+						'sosaTotalCount'		=>	$this->getSosaCountUpToGeneration($gen),
398
+						'diffSosaTotalCount'	=>	$this->getDifferentSosaCountUpToGeneration($gen),
399
+						'firstBirth'			=>	$birthStats['first'],
400
+						'lastBirth'				=>	$birthStats['last'],
401
+						'avgBirth'				=>	$birthStats['avg']
402
+					);
403
+				}
404
+			}
405
+		}
406
+		return $this->statistics_tab;        
407
+	}
408 408
     
409 409
 	/**
410 410
 	 * How many individuals exist in the tree.
@@ -412,205 +412,205 @@  discard block
 block discarded – undo
412 412
 	 * @return int
413 413
 	 */
414 414
 	public function getTotalIndividuals() {
415
-	    if(!$this->is_setup) return 0;
416
-	    return Database::prepare(
417
-	        'SELECT SQL_CACHE COUNT(*) FROM `##individuals`' .
418
-	        ' WHERE i_file = :tree_id')
419
-	        ->execute(array('tree_id' => $this->tree->getTreeId()))
420
-	        ->fetchOne() ?: 0;
415
+		if(!$this->is_setup) return 0;
416
+		return Database::prepare(
417
+			'SELECT SQL_CACHE COUNT(*) FROM `##individuals`' .
418
+			' WHERE i_file = :tree_id')
419
+			->execute(array('tree_id' => $this->tree->getTreeId()))
420
+			->fetchOne() ?: 0;
421 421
 	}
422 422
     
423
-    /**
424
-     * Get the total Sosa count for all generations
425
-     *
426
-     * @return number Number of Sosas
427
-     */
428
-    public function getSosaCount(){
429
-        if(!$this->is_setup) return 0;
430
-        return Database::prepare(
431
-            'SELECT SQL_CACHE COUNT(majs_sosa) FROM `##maj_sosa`' .
432
-            ' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id')
433
-            ->execute(array(
434
-                'tree_id' => $this->tree->getTreeId(), 
435
-                'user_id' => $this->user->getUserId() 
436
-            ))->fetchOne() ?: 0;
437
-    }
438
-    
439
-    /**
440
-     * Get the number of Sosa in a specific generation.
441
-     *
442
-     * @param number $gen Generation
443
-     * @return number Number of Sosas in generation
444
-     */
445
-    public function getSosaCountAtGeneration($gen){
446
-        if(!$this->is_setup) return 0;
447
-        return Database::prepare(
448
-            'SELECT SQL_CACHE COUNT(majs_sosa) FROM `##maj_sosa`' .
449
-            ' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'.
450
-            ' AND majs_gen= :gen')
451
-        ->execute(array(
452
-                'tree_id' => $this->tree->getTreeId(), 
453
-                'user_id' => $this->user->getUserId(),
454
-                'gen' => $gen            
455
-        ))->fetchOne() ?: 0;
456
-    }
457
-    
458
-    /**
459
-     * Get the total number of Sosa up to a specific generation.
460
-     *
461
-     * @param number $gen Generation
462
-     * @return number Total number of Sosas up to generation
463
-     */
464
-    public function getSosaCountUpToGeneration($gen){
465
-        if(!$this->is_setup) return 0;
466
-        return Database::prepare(
467
-            'SELECT SQL_CACHE COUNT(majs_sosa) FROM `##maj_sosa`' .
468
-            ' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'.
469
-            ' AND majs_gen <= :gen')
470
-        ->execute(array(
471
-                'tree_id' => $this->tree->getTreeId(), 
472
-                'user_id' => $this->user->getUserId(),
473
-                'gen' => $gen 
474
-        ))->fetchOne() ?: 0;
475
-    }
476
-    
477
-    /**
478
-     * Get the total number of distinct Sosa individual for all generations.
479
-     *
480
-     * @return number Total number of distinct individual
481
-     */
482
-    public function getDifferentSosaCount(){
483
-        if(!$this->is_setup) return 0;
484
-        return Database::prepare(
485
-            'SELECT SQL_CACHE COUNT(DISTINCT majs_i_id) FROM `##maj_sosa`' .
486
-            ' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id')
487
-        ->execute(array(
488
-                'tree_id' => $this->tree->getTreeId(), 
489
-                'user_id' => $this->user->getUserId()
490
-        ))->fetchOne() ?: 0;
491
-    }
492
-    
493
-    /**
494
-     * Get the number of distinct Sosa individual up to a specific generation.
495
-     *
496
-     * @param number $gen Generation
497
-     * @return number Number of distinct Sosa individuals up to generation
498
-     */
499
-    public function getDifferentSosaCountUpToGeneration($gen){
500
-        if(!$this->is_setup) return 0;
501
-        return Database::prepare(
502
-            'SELECT SQL_CACHE COUNT(DISTINCT majs_i_id) FROM `##maj_sosa`' .
503
-            ' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'.
504
-            ' AND majs_gen <= :gen')
505
-        ->execute(array(
506
-                'tree_id' => $this->tree->getTreeId(), 
507
-                'user_id' => $this->user->getUserId(),
508
-                'gen' => $gen 
509
-        ))->fetchOne() ?: 0;
510
-    }
511
-    
512
-    /**
513
-     * Get an array of birth statistics for a specific generation
514
-     * Statistics are :
515
-     * 	- first : First birth year in generation
516
-     *  - last : Last birth year in generation
517
-     *  - avg : Average birth year
518
-     *
519
-     * @param number $gen Generation
520
-     * @return array Birth statistics array
521
-     */
522
-    public function getStatsBirthYearInGeneration($gen){
523
-        if(!$this->is_setup) return array('first' => 0, 'avg' => 0, 'last' => 0);
524
-        return Database::prepare(
525
-            'SELECT MIN(majs_birth_year) AS first, AVG(majs_birth_year) AS avg, MAX(majs_birth_year) AS last'.
526
-            ' FROM `##maj_sosa`' .
527
-            ' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'.
528
-            ' AND majs_gen=:gen AND NOT majs_birth_year = :birth_year')
529
-            ->execute(array(
530
-                'tree_id' => $this->tree->getTreeId(), 
531
-                'user_id' => $this->user->getUserId(),
532
-                'gen' => $gen,
533
-                'birth_year' => 0))
534
-            ->fetchOneRow(\PDO::FETCH_ASSOC) ?: array('first' => 0, 'avg' => 0, 'last' => 0);
535
-    }
536
-    
537
-    /**
538
-     * Get the mean generation time, based on a linear regression of birth years and generations
539
-     *
540
-     * @return number|NULL Mean generation time
541
-     */
542
-    public function getMeanGenerationTime(){
543
-        if(!$this->is_setup) return;
544
-        if(!$this->statistics_tab){
545
-            $this->getStatisticsByGeneration();
546
-        }
547
-        //Linear regression on x=generation and y=birthdate
548
-        $sum_xy = 0;
549
-        $sum_x=0;
550
-        $sum_y=0;
551
-        $sum_x2=0;
552
-        $n=count($this->statistics_tab);
553
-        foreach($this->statistics_tab as $gen=>$stats){
554
-            $sum_xy+=$gen*$stats['avgBirth'];
555
-            $sum_x+=$gen;
556
-            $sum_y+=$stats['avgBirth'];
557
-            $sum_x2+=$gen*$gen;
558
-        }
559
-        $denom=($n*$sum_x2)-($sum_x*$sum_x);
560
-        if($denom!=0){
561
-            return -(($n*$sum_xy)-($sum_x*$sum_y))/($denom);
562
-        }
563
-        return null;
564
-    }
565
-    
566
-    /**
567
-     * Return a computed array of statistics about the dispersion of ancestors across the ancestors
568
-     * at a specified generation.
569
-     * This statistics cannot be used for generations above 11, as it would cause a out of range in MySQL
570
-     * 
571
-     * Format: 
572
-     *  - key : a base-2 representation of the ancestor at generation G for which exclusive ancestors have been found,
573
-     *          -1 is used for shared ancestors
574
-     *          For instance base2(0100) = base10(4) represent the maternal grand father
575
-     *  - values: number of ancestors exclusively in the ancestors of the ancestor in key
576
-     *  
577
-     *  For instance a result at generation 3 could be :
578
-     *      array (   -1        =>  12      -> 12 ancestors are shared by the grand-parents
579
-     *                base10(1) =>  32      -> 32 ancestors are exclusive to the paternal grand-father
580
-     *                base10(2) =>  25      -> 25 ancestors are exclusive to the paternal grand-mother
581
-     *                base10(4) =>  12      -> 12 ancestors are exclusive to the maternal grand-father
582
-     *                base10(8) =>  30      -> 30 ancestors are exclusive to the maternal grand-mother
583
-     *            )
584
-     *  
585
-     * @param int $gen Reference generation
586
-     * @return array
587
-     */
588
-    public function getAncestorDispersionForGen($gen) {
589
-        if(!$this->is_setup || $gen > 11) return array();  // Going further than 11 gen will be out of range in the query
590
-        return Database::prepare(
591
-            'SELECT branches, count(i_id)'.
592
-            ' FROM ('.
593
-            '   SELECT i_id,'.
594
-            '       CASE'.
595
-            '           WHEN CEIL(LOG2(SUM(branch))) = LOG2(SUM(branch)) THEN SUM(branch)'.
596
-            '           ELSE -1'.   // We put all ancestors shared between some branches in the same bucket
597
-            '       END branches'.
598
-            '   FROM ('.
599
-            '       SELECT DISTINCT majs_i_id i_id,'.
600
-            '           POW(2, FLOOR(majs_sosa / POW(2, (majs_gen - :gen))) - POW(2, :gen -1)) branch'.
601
-            '       FROM `##maj_sosa`'.
602
-            '       WHERE majs_gedcom_id = :tree_id AND majs_user_id = :user_id'.
603
-            '           AND majs_gen >= :gen'.
604
-            '   ) indistat'.
605
-            '   GROUP BY i_id'.
606
-            ') grouped'.
607
-            ' GROUP BY branches')
608
-            ->execute(array(
609
-                'tree_id' => $this->tree->getTreeId(), 
610
-                'user_id' => $this->user->getUserId(),
611
-                'gen' => $gen
612
-            ))->fetchAssoc() ?: array();
613
-    }
423
+	/**
424
+	 * Get the total Sosa count for all generations
425
+	 *
426
+	 * @return number Number of Sosas
427
+	 */
428
+	public function getSosaCount(){
429
+		if(!$this->is_setup) return 0;
430
+		return Database::prepare(
431
+			'SELECT SQL_CACHE COUNT(majs_sosa) FROM `##maj_sosa`' .
432
+			' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id')
433
+			->execute(array(
434
+				'tree_id' => $this->tree->getTreeId(), 
435
+				'user_id' => $this->user->getUserId() 
436
+			))->fetchOne() ?: 0;
437
+	}
438
+    
439
+	/**
440
+	 * Get the number of Sosa in a specific generation.
441
+	 *
442
+	 * @param number $gen Generation
443
+	 * @return number Number of Sosas in generation
444
+	 */
445
+	public function getSosaCountAtGeneration($gen){
446
+		if(!$this->is_setup) return 0;
447
+		return Database::prepare(
448
+			'SELECT SQL_CACHE COUNT(majs_sosa) FROM `##maj_sosa`' .
449
+			' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'.
450
+			' AND majs_gen= :gen')
451
+		->execute(array(
452
+				'tree_id' => $this->tree->getTreeId(), 
453
+				'user_id' => $this->user->getUserId(),
454
+				'gen' => $gen            
455
+		))->fetchOne() ?: 0;
456
+	}
457
+    
458
+	/**
459
+	 * Get the total number of Sosa up to a specific generation.
460
+	 *
461
+	 * @param number $gen Generation
462
+	 * @return number Total number of Sosas up to generation
463
+	 */
464
+	public function getSosaCountUpToGeneration($gen){
465
+		if(!$this->is_setup) return 0;
466
+		return Database::prepare(
467
+			'SELECT SQL_CACHE COUNT(majs_sosa) FROM `##maj_sosa`' .
468
+			' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'.
469
+			' AND majs_gen <= :gen')
470
+		->execute(array(
471
+				'tree_id' => $this->tree->getTreeId(), 
472
+				'user_id' => $this->user->getUserId(),
473
+				'gen' => $gen 
474
+		))->fetchOne() ?: 0;
475
+	}
476
+    
477
+	/**
478
+	 * Get the total number of distinct Sosa individual for all generations.
479
+	 *
480
+	 * @return number Total number of distinct individual
481
+	 */
482
+	public function getDifferentSosaCount(){
483
+		if(!$this->is_setup) return 0;
484
+		return Database::prepare(
485
+			'SELECT SQL_CACHE COUNT(DISTINCT majs_i_id) FROM `##maj_sosa`' .
486
+			' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id')
487
+		->execute(array(
488
+				'tree_id' => $this->tree->getTreeId(), 
489
+				'user_id' => $this->user->getUserId()
490
+		))->fetchOne() ?: 0;
491
+	}
492
+    
493
+	/**
494
+	 * Get the number of distinct Sosa individual up to a specific generation.
495
+	 *
496
+	 * @param number $gen Generation
497
+	 * @return number Number of distinct Sosa individuals up to generation
498
+	 */
499
+	public function getDifferentSosaCountUpToGeneration($gen){
500
+		if(!$this->is_setup) return 0;
501
+		return Database::prepare(
502
+			'SELECT SQL_CACHE COUNT(DISTINCT majs_i_id) FROM `##maj_sosa`' .
503
+			' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'.
504
+			' AND majs_gen <= :gen')
505
+		->execute(array(
506
+				'tree_id' => $this->tree->getTreeId(), 
507
+				'user_id' => $this->user->getUserId(),
508
+				'gen' => $gen 
509
+		))->fetchOne() ?: 0;
510
+	}
511
+    
512
+	/**
513
+	 * Get an array of birth statistics for a specific generation
514
+	 * Statistics are :
515
+	 * 	- first : First birth year in generation
516
+	 *  - last : Last birth year in generation
517
+	 *  - avg : Average birth year
518
+	 *
519
+	 * @param number $gen Generation
520
+	 * @return array Birth statistics array
521
+	 */
522
+	public function getStatsBirthYearInGeneration($gen){
523
+		if(!$this->is_setup) return array('first' => 0, 'avg' => 0, 'last' => 0);
524
+		return Database::prepare(
525
+			'SELECT MIN(majs_birth_year) AS first, AVG(majs_birth_year) AS avg, MAX(majs_birth_year) AS last'.
526
+			' FROM `##maj_sosa`' .
527
+			' WHERE majs_gedcom_id=:tree_id AND majs_user_id=:user_id'.
528
+			' AND majs_gen=:gen AND NOT majs_birth_year = :birth_year')
529
+			->execute(array(
530
+				'tree_id' => $this->tree->getTreeId(), 
531
+				'user_id' => $this->user->getUserId(),
532
+				'gen' => $gen,
533
+				'birth_year' => 0))
534
+			->fetchOneRow(\PDO::FETCH_ASSOC) ?: array('first' => 0, 'avg' => 0, 'last' => 0);
535
+	}
536
+    
537
+	/**
538
+	 * Get the mean generation time, based on a linear regression of birth years and generations
539
+	 *
540
+	 * @return number|NULL Mean generation time
541
+	 */
542
+	public function getMeanGenerationTime(){
543
+		if(!$this->is_setup) return;
544
+		if(!$this->statistics_tab){
545
+			$this->getStatisticsByGeneration();
546
+		}
547
+		//Linear regression on x=generation and y=birthdate
548
+		$sum_xy = 0;
549
+		$sum_x=0;
550
+		$sum_y=0;
551
+		$sum_x2=0;
552
+		$n=count($this->statistics_tab);
553
+		foreach($this->statistics_tab as $gen=>$stats){
554
+			$sum_xy+=$gen*$stats['avgBirth'];
555
+			$sum_x+=$gen;
556
+			$sum_y+=$stats['avgBirth'];
557
+			$sum_x2+=$gen*$gen;
558
+		}
559
+		$denom=($n*$sum_x2)-($sum_x*$sum_x);
560
+		if($denom!=0){
561
+			return -(($n*$sum_xy)-($sum_x*$sum_y))/($denom);
562
+		}
563
+		return null;
564
+	}
565
+    
566
+	/**
567
+	 * Return a computed array of statistics about the dispersion of ancestors across the ancestors
568
+	 * at a specified generation.
569
+	 * This statistics cannot be used for generations above 11, as it would cause a out of range in MySQL
570
+	 * 
571
+	 * Format: 
572
+	 *  - key : a base-2 representation of the ancestor at generation G for which exclusive ancestors have been found,
573
+	 *          -1 is used for shared ancestors
574
+	 *          For instance base2(0100) = base10(4) represent the maternal grand father
575
+	 *  - values: number of ancestors exclusively in the ancestors of the ancestor in key
576
+	 *  
577
+	 *  For instance a result at generation 3 could be :
578
+	 *      array (   -1        =>  12      -> 12 ancestors are shared by the grand-parents
579
+	 *                base10(1) =>  32      -> 32 ancestors are exclusive to the paternal grand-father
580
+	 *                base10(2) =>  25      -> 25 ancestors are exclusive to the paternal grand-mother
581
+	 *                base10(4) =>  12      -> 12 ancestors are exclusive to the maternal grand-father
582
+	 *                base10(8) =>  30      -> 30 ancestors are exclusive to the maternal grand-mother
583
+	 *            )
584
+	 *  
585
+	 * @param int $gen Reference generation
586
+	 * @return array
587
+	 */
588
+	public function getAncestorDispersionForGen($gen) {
589
+		if(!$this->is_setup || $gen > 11) return array();  // Going further than 11 gen will be out of range in the query
590
+		return Database::prepare(
591
+			'SELECT branches, count(i_id)'.
592
+			' FROM ('.
593
+			'   SELECT i_id,'.
594
+			'       CASE'.
595
+			'           WHEN CEIL(LOG2(SUM(branch))) = LOG2(SUM(branch)) THEN SUM(branch)'.
596
+			'           ELSE -1'.   // We put all ancestors shared between some branches in the same bucket
597
+			'       END branches'.
598
+			'   FROM ('.
599
+			'       SELECT DISTINCT majs_i_id i_id,'.
600
+			'           POW(2, FLOOR(majs_sosa / POW(2, (majs_gen - :gen))) - POW(2, :gen -1)) branch'.
601
+			'       FROM `##maj_sosa`'.
602
+			'       WHERE majs_gedcom_id = :tree_id AND majs_user_id = :user_id'.
603
+			'           AND majs_gen >= :gen'.
604
+			'   ) indistat'.
605
+			'   GROUP BY i_id'.
606
+			') grouped'.
607
+			' GROUP BY branches')
608
+			->execute(array(
609
+				'tree_id' => $this->tree->getTreeId(), 
610
+				'user_id' => $this->user->getUserId(),
611
+				'gen' => $gen
612
+			))->fetchAssoc() ?: array();
613
+	}
614 614
     
615 615
                
616 616
 }
Please login to merge, or discard this patch.
src/Webtrees/Module/Sosa/Views/SosaConfigView.php 1 patch
Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -24,9 +24,9 @@  discard block
 block discarded – undo
24 24
 	 * {@inhericDoc}
25 25
 	 * @see \MyArtJaub\Webtrees\Mvc\View\AbstractView::renderContent()
26 26
 	 */
27
-    protected function renderContent() {
27
+	protected function renderContent() {
28 28
         
29
-        ?>        
29
+		?>        
30 30
         
31 31
         <div id="maj-sosa-config-page">
32 32
 			<h2><?php echo $this->data->get('title'); ?></h2>
@@ -46,9 +46,9 @@  discard block
 block discarded – undo
46 46
         			</div>
47 47
         			<div class="value">
48 48
         				<?php 
49
-        				    $users = $this->data->get('users_settings');
50
-        				    if(count($users) == 1) {
51
-        				        $root_indi = $users[0]['rootid'];  ?>
49
+							$users = $this->data->get('users_settings');
50
+							if(count($users) == 1) {
51
+								$root_indi = $users[0]['rootid'];  ?>
52 52
         					<label>
53 53
         						<input id="maj_sosa_input_userid" type="hidden" name="userid" value="<?php echo $users[0]['user']->getUserId(); ?>" />
54 54
         						<?php echo $users[0]['user']->getRealNameHtml() ?>
@@ -56,8 +56,8 @@  discard block
 block discarded – undo
56 56
         				<?php  } else if(count($users) > 1) { ?>
57 57
         					<select id='maj-sosa-config-select' name="userid">
58 58
         					<?php 
59
-        					   $root_indi = $users[0]['rootid'];
60
-        					   foreach ($this->data->get('users_settings') as $user) { ?>
59
+							   $root_indi = $users[0]['rootid'];
60
+							   foreach ($this->data->get('users_settings') as $user) { ?>
61 61
         						<option value="<?php echo $user['user']->getUserId(); ?>"><?php echo $user['user']->getRealNameHtml() ?></option>
62 62
         					<?php  } ?>
63 63
         					</select>
@@ -80,7 +80,7 @@  discard block
 block discarded – undo
80 80
 			</form>	
81 81
 		
82 82
 		<?php        
83
-    }
83
+	}
84 84
     
85 85
 }
86 86
  
87 87
\ No newline at end of file
Please login to merge, or discard this patch.
src/Webtrees/Module/SosaModule.php 1 patch
Indentation   +163 added lines, -163 removed lines patch added patch discarded remove patch
@@ -31,116 +31,116 @@  discard block
 block discarded – undo
31 31
  * Sosa Module.
32 32
  */
33 33
 class SosaModule 
34
-    extends AbstractModule 
35
-    implements  ModuleMenuInterface, 
36
-                ModuleConfigInterface,
37
-                HookSubscriberInterface,
38
-                IndividualHeaderExtenderInterface,
39
-                RecordNameTextExtenderInterface
34
+	extends AbstractModule 
35
+	implements  ModuleMenuInterface, 
36
+				ModuleConfigInterface,
37
+				HookSubscriberInterface,
38
+				IndividualHeaderExtenderInterface,
39
+				RecordNameTextExtenderInterface
40 40
 {
41
-    // How to update the database schema for this module
42
-    const SCHEMA_TARGET_VERSION   = 1;
43
-    const SCHEMA_SETTING_NAME     = 'MAJ_SOSA_SCHEMA_VERSION';
44
-    const SCHEMA_MIGRATION_PREFIX = '\MyArtJaub\Webtrees\Module\Sosa\Schema';
41
+	// How to update the database schema for this module
42
+	const SCHEMA_TARGET_VERSION   = 1;
43
+	const SCHEMA_SETTING_NAME     = 'MAJ_SOSA_SCHEMA_VERSION';
44
+	const SCHEMA_MIGRATION_PREFIX = '\MyArtJaub\Webtrees\Module\Sosa\Schema';
45 45
 
46
-    /** @var string For custom modules - link for support, upgrades, etc. */
47
-    const CUSTOM_WEBSITE = 'https://github.com/jon48/webtrees-lib';
48
-    
49
-    /**
50
-     * {@inhericDoc}
51
-     */
52
-    public function getTitle() {
53
-        return /* I18N: Name of the “Sosa” module */ I18N::translate('Sosa');
54
-    }
55
-    
56
-    /**
57
-     * {@inhericDoc}
58
-     */
59
-    public function getDescription() {
60
-        return /* I18N: Description of the “Sosa” module */ I18N::translate('Calculate and display Sosa ancestors of the root person.');
61
-    }
62
-    
63
-    /**
64
-     * {@inhericDoc}
65
-     */
66
-    public function modAction($mod_action) {
67
-        Database::updateSchema(self::SCHEMA_MIGRATION_PREFIX, self::SCHEMA_SETTING_NAME, self::SCHEMA_TARGET_VERSION);
46
+	/** @var string For custom modules - link for support, upgrades, etc. */
47
+	const CUSTOM_WEBSITE = 'https://github.com/jon48/webtrees-lib';
48
+    
49
+	/**
50
+	 * {@inhericDoc}
51
+	 */
52
+	public function getTitle() {
53
+		return /* I18N: Name of the “Sosa” module */ I18N::translate('Sosa');
54
+	}
55
+    
56
+	/**
57
+	 * {@inhericDoc}
58
+	 */
59
+	public function getDescription() {
60
+		return /* I18N: Description of the “Sosa” module */ I18N::translate('Calculate and display Sosa ancestors of the root person.');
61
+	}
62
+    
63
+	/**
64
+	 * {@inhericDoc}
65
+	 */
66
+	public function modAction($mod_action) {
67
+		Database::updateSchema(self::SCHEMA_MIGRATION_PREFIX, self::SCHEMA_SETTING_NAME, self::SCHEMA_TARGET_VERSION);
68 68
         
69
-        \MyArtJaub\Webtrees\Mvc\Dispatcher::getInstance()->handle($this, $mod_action);
70
-    }
69
+		\MyArtJaub\Webtrees\Mvc\Dispatcher::getInstance()->handle($this, $mod_action);
70
+	}
71 71
     
72
-    /**********
72
+	/**********
73 73
      * ModuleConfigInterface
74 74
      **********/
75 75
     
76
-    /**
77
-     * {@inhericDoc}
78
-     * @see \Fisharebest\Webtrees\Module\ModuleConfigInterface::getConfigLink()
79
-     */
80
-    public function getConfigLink() {
81
-        Database::updateSchema(self::SCHEMA_MIGRATION_PREFIX, self::SCHEMA_SETTING_NAME, self::SCHEMA_TARGET_VERSION);
76
+	/**
77
+	 * {@inhericDoc}
78
+	 * @see \Fisharebest\Webtrees\Module\ModuleConfigInterface::getConfigLink()
79
+	 */
80
+	public function getConfigLink() {
81
+		Database::updateSchema(self::SCHEMA_MIGRATION_PREFIX, self::SCHEMA_SETTING_NAME, self::SCHEMA_TARGET_VERSION);
82 82
         
83
-        return 'module.php?mod=' . $this->getName() . '&amp;mod_action=SosaConfig';
84
-    }
83
+		return 'module.php?mod=' . $this->getName() . '&amp;mod_action=SosaConfig';
84
+	}
85 85
     
86
-    /**********
86
+	/**********
87 87
      * ModuleMenuInterface
88 88
      **********/
89 89
     
90
-    /**
91
-     * {@inhericDoc}
92
-     * @see \Fisharebest\Webtrees\Module\ModuleMenuInterface::defaultMenuOrder()
93
-     */
94
-    public function defaultMenuOrder() {
95
-        return 5;
96
-    }
97
-    
98
-    /**
99
-     * {@inhericDoc}
100
-     * @see \Fisharebest\Webtrees\Module\ModuleMenuInterface::getMenu()
101
-     */
102
-    public function getMenu() { 
103
-        global $WT_TREE, $controller;
90
+	/**
91
+	 * {@inhericDoc}
92
+	 * @see \Fisharebest\Webtrees\Module\ModuleMenuInterface::defaultMenuOrder()
93
+	 */
94
+	public function defaultMenuOrder() {
95
+		return 5;
96
+	}
97
+    
98
+	/**
99
+	 * {@inhericDoc}
100
+	 * @see \Fisharebest\Webtrees\Module\ModuleMenuInterface::getMenu()
101
+	 */
102
+	public function getMenu() { 
103
+		global $WT_TREE, $controller;
104 104
         
105
-        $menu = null;
106
-        if(ModuleManager::getInstance()->isOperational($this->getName())) {
105
+		$menu = null;
106
+		if(ModuleManager::getInstance()->isOperational($this->getName())) {
107 107
             
108
-            $root_url = 'module.php?mod=' . $this->getName() . '&ged=' . $WT_TREE->getNameUrl() . '&';
109
-            $sosa_stat_menu = new Menu(I18N::translate('Sosa Statistics'), $root_url . 'mod_action=SosaStats', 'menu-maj-sosa-stats');
108
+			$root_url = 'module.php?mod=' . $this->getName() . '&ged=' . $WT_TREE->getNameUrl() . '&';
109
+			$sosa_stat_menu = new Menu(I18N::translate('Sosa Statistics'), $root_url . 'mod_action=SosaStats', 'menu-maj-sosa-stats');
110 110
             
111
-            $menu = clone $sosa_stat_menu;
112
-            $menu->setClass('menu-maj-sosa');
111
+			$menu = clone $sosa_stat_menu;
112
+			$menu->setClass('menu-maj-sosa');
113 113
             
114
-            $submenus = array_filter(array(
115
-                new Menu(I18N::translate('Sosa Ancestors'), $root_url . 'mod_action=SosaList', 'menu-maj-sosa-list', array('rel' => 'nofollow')),
116
-                new Menu(I18N::translate('Missing Ancestors'), $root_url . 'mod_action=SosaList@missing', 'menu-maj-sosa-missing', array('rel' => 'nofollow')),
117
-                $sosa_stat_menu                
118
-            ));
114
+			$submenus = array_filter(array(
115
+				new Menu(I18N::translate('Sosa Ancestors'), $root_url . 'mod_action=SosaList', 'menu-maj-sosa-list', array('rel' => 'nofollow')),
116
+				new Menu(I18N::translate('Missing Ancestors'), $root_url . 'mod_action=SosaList@missing', 'menu-maj-sosa-missing', array('rel' => 'nofollow')),
117
+				$sosa_stat_menu                
118
+			));
119 119
             
120 120
 
121
-            if (ModuleManager::getInstance()->isOperational(Constants::MODULE_MAJ_GEODISP_NAME)
122
-                && $ga_list = Module::getModuleByName(Constants::MODULE_MAJ_GEODISP_NAME)->getProvider()->getGeoAnalysisList()
123
-                )
124
-            {
125
-                if(count($ga_list) > 0) {
126
-                    $submenus[] = new Menu(I18N::translate('Geographical Dispersion'), 'module.php?mod=' . Constants::MODULE_MAJ_GEODISP_NAME . '&ged=' . $WT_TREE->getNameUrl() . '&mod_action=GeoAnalysis@listAll', 'menu-maj-sosa-geodispersion');
127
-                }
128
-            }
121
+			if (ModuleManager::getInstance()->isOperational(Constants::MODULE_MAJ_GEODISP_NAME)
122
+				&& $ga_list = Module::getModuleByName(Constants::MODULE_MAJ_GEODISP_NAME)->getProvider()->getGeoAnalysisList()
123
+				)
124
+			{
125
+				if(count($ga_list) > 0) {
126
+					$submenus[] = new Menu(I18N::translate('Geographical Dispersion'), 'module.php?mod=' . Constants::MODULE_MAJ_GEODISP_NAME . '&ged=' . $WT_TREE->getNameUrl() . '&mod_action=GeoAnalysis@listAll', 'menu-maj-sosa-geodispersion');
127
+				}
128
+			}
129 129
             
130
-            if(Auth::check()) {
131
-                $submenus[] = new Menu(
132
-                    I18N::translate('Sosa Configuration'),
133
-                    $this->getConfigLink(),
134
-                    'menu-maj-sosa-configuration',
135
-                    array('rel' => 'nofollow'));
136
-            }
130
+			if(Auth::check()) {
131
+				$submenus[] = new Menu(
132
+					I18N::translate('Sosa Configuration'),
133
+					$this->getConfigLink(),
134
+					'menu-maj-sosa-configuration',
135
+					array('rel' => 'nofollow'));
136
+			}
137 137
                         
138
-            //-- recompute Sosa submenu
139
-            if (!empty($controller) && $controller instanceof IndividualController 
140
-                && Auth::check() && $WT_TREE->getUserPreference(Auth::user(), 'MAJ_SOSA_ROOT_ID')
141
-                ) {
142
-                $controller
143
-                    ->addInlineJavascript('
138
+			//-- recompute Sosa submenu
139
+			if (!empty($controller) && $controller instanceof IndividualController 
140
+				&& Auth::check() && $WT_TREE->getUserPreference(Auth::user(), 'MAJ_SOSA_ROOT_ID')
141
+				) {
142
+				$controller
143
+					->addInlineJavascript('
144 144
                         function majComputeSosaFromIndi(){
145 145
                             if($("#computesosadlg").length == 0) {
146 146
                                 $("body").append("<div id=\"computesosadlg\" title=\"'. I18N::translate('Sosas computation') .'\"><div id=\"sosaloadingarea\"></div></div>");
@@ -163,87 +163,87 @@  discard block
 block discarded – undo
163 163
 	                         });	
164 164
                         }');
165 165
                 	
166
-                $submenus[] = new Menu(
167
-                    I18N::translate('Complete Sosas'), 
168
-                    '#', 
169
-                    'menu-maj-sosa-recompute', 
170
-                    array(
171
-                        'rel' => 'nofollow',
172
-                        'onclick' => 'return majComputeSosaFromIndi();'
173
-                    ));
174
-            }
166
+				$submenus[] = new Menu(
167
+					I18N::translate('Complete Sosas'), 
168
+					'#', 
169
+					'menu-maj-sosa-recompute', 
170
+					array(
171
+						'rel' => 'nofollow',
172
+						'onclick' => 'return majComputeSosaFromIndi();'
173
+					));
174
+			}
175 175
             
176
-        }
176
+		}
177 177
         
178
-        $menu->setSubmenus($submenus);
178
+		$menu->setSubmenus($submenus);
179 179
         
180
-        return $menu;
180
+		return $menu;
181 181
         
182
-    }
182
+	}
183 183
     
184
-    /**********
184
+	/**********
185 185
      * Hooks
186 186
      **********/
187 187
     
188
-    /**
189
-     * {@inhericDoc}
190
-     * @see \MyArtJaub\Webtrees\Hook\HookSubscriberInterface::getSubscribedHooks()
191
-     */    
192
-    public function getSubscribedHooks() {
193
-        return array(
194
-            'hExtendIndiHeaderIcons' => 20,
195
-            'hExtendIndiHeaderRight' => 20,
196
-            'hRecordNameAppend' => 20
197
-        );
198
-    }
199
-    
200
-    /**
201
-     * {@inhericDoc}
202
-     * @see \MyArtJaub\Webtrees\Hook\HookInterfaces\IndividualHeaderExtenderInterface::hExtendIndiHeaderIcons()
203
-     */
204
-    public function hExtendIndiHeaderIcons(IndividualController $ctrlIndi) {
205
-        if($ctrlIndi){
206
-            $dindi = new Individual($ctrlIndi->getSignificantIndividual());
207
-            return FunctionsPrint::formatSosaNumbers($dindi->getSosaNumbers(), 1, 'large');
208
-        }
209
-        return '';
210
-    }
211
-    
212
-    /**
213
-     * {@inhericDoc}
214
-     * @see \MyArtJaub\Webtrees\Hook\HookInterfaces\IndividualHeaderExtenderInterface::hExtendIndiHeaderLeft()
215
-     */
216
-    public function hExtendIndiHeaderLeft(IndividualController $ctrlIndi) { }
217
-    
218
-    /**
219
-     * {@inhericDoc}
220
-     * @see \MyArtJaub\Webtrees\Hook\HookInterfaces\IndividualHeaderExtenderInterface::hExtendIndiHeaderRight()
221
-     */
222
-    public function hExtendIndiHeaderRight(IndividualController $ctrlIndi) {
223
-        if($ctrlIndi){
224
-            $dindi = new Individual($ctrlIndi->getSignificantIndividual());
225
-            return array('indi-header-sosa',  FunctionsPrint::formatSosaNumbers($dindi->getSosaNumbers(), 2, 'normal'));
226
-        }
227
-        return '';
228
-    }
229
-    
230
-    /**
231
-     * {@inhericDoc}
232
-     * @see \MyArtJaub\Webtrees\Hook\HookInterfaces\RecordNameTextExtenderInterface::hRecordNameAppend()
233
-     */
234
-    public function hRecordNameAppend(GedcomRecord $grec) {
235
-        if($grec instanceof \Fisharebest\Webtrees\Individual){ // Only apply to individuals
236
-            $dindi = new Individual($grec);
237
-            return FunctionsPrint::formatSosaNumbers($dindi->getSosaNumbers(), 1, 'small');
238
-        }
239
-        return '';
240
-    }
241
-    
242
-    /**
243
-     * {@inhericDoc}
244
-     * @see \MyArtJaub\Webtrees\Hook\HookInterfaces\RecordNameTextExtenderInterface::hRecordNamePrepend()
245
-     */
246
-    public function hRecordNamePrepend(GedcomRecord $grec) {}
188
+	/**
189
+	 * {@inhericDoc}
190
+	 * @see \MyArtJaub\Webtrees\Hook\HookSubscriberInterface::getSubscribedHooks()
191
+	 */    
192
+	public function getSubscribedHooks() {
193
+		return array(
194
+			'hExtendIndiHeaderIcons' => 20,
195
+			'hExtendIndiHeaderRight' => 20,
196
+			'hRecordNameAppend' => 20
197
+		);
198
+	}
199
+    
200
+	/**
201
+	 * {@inhericDoc}
202
+	 * @see \MyArtJaub\Webtrees\Hook\HookInterfaces\IndividualHeaderExtenderInterface::hExtendIndiHeaderIcons()
203
+	 */
204
+	public function hExtendIndiHeaderIcons(IndividualController $ctrlIndi) {
205
+		if($ctrlIndi){
206
+			$dindi = new Individual($ctrlIndi->getSignificantIndividual());
207
+			return FunctionsPrint::formatSosaNumbers($dindi->getSosaNumbers(), 1, 'large');
208
+		}
209
+		return '';
210
+	}
211
+    
212
+	/**
213
+	 * {@inhericDoc}
214
+	 * @see \MyArtJaub\Webtrees\Hook\HookInterfaces\IndividualHeaderExtenderInterface::hExtendIndiHeaderLeft()
215
+	 */
216
+	public function hExtendIndiHeaderLeft(IndividualController $ctrlIndi) { }
217
+    
218
+	/**
219
+	 * {@inhericDoc}
220
+	 * @see \MyArtJaub\Webtrees\Hook\HookInterfaces\IndividualHeaderExtenderInterface::hExtendIndiHeaderRight()
221
+	 */
222
+	public function hExtendIndiHeaderRight(IndividualController $ctrlIndi) {
223
+		if($ctrlIndi){
224
+			$dindi = new Individual($ctrlIndi->getSignificantIndividual());
225
+			return array('indi-header-sosa',  FunctionsPrint::formatSosaNumbers($dindi->getSosaNumbers(), 2, 'normal'));
226
+		}
227
+		return '';
228
+	}
229
+    
230
+	/**
231
+	 * {@inhericDoc}
232
+	 * @see \MyArtJaub\Webtrees\Hook\HookInterfaces\RecordNameTextExtenderInterface::hRecordNameAppend()
233
+	 */
234
+	public function hRecordNameAppend(GedcomRecord $grec) {
235
+		if($grec instanceof \Fisharebest\Webtrees\Individual){ // Only apply to individuals
236
+			$dindi = new Individual($grec);
237
+			return FunctionsPrint::formatSosaNumbers($dindi->getSosaNumbers(), 1, 'small');
238
+		}
239
+		return '';
240
+	}
241
+    
242
+	/**
243
+	 * {@inhericDoc}
244
+	 * @see \MyArtJaub\Webtrees\Hook\HookInterfaces\RecordNameTextExtenderInterface::hRecordNamePrepend()
245
+	 */
246
+	public function hRecordNamePrepend(GedcomRecord $grec) {}
247 247
     
248 248
     
249 249
     
Please login to merge, or discard this patch.
src/Webtrees/Hook/HookProvider.php 1 patch
Indentation   +42 added lines, -42 removed lines patch added patch discarded remove patch
@@ -43,11 +43,11 @@  discard block
 block discarded – undo
43 43
 	 */
44 44
 	public static function getInstance()
45 45
 	{
46
-	    if (null === static::$instance) {
47
-	        static::$instance = new static();
48
-	    }
46
+		if (null === static::$instance) {
47
+			static::$instance = new static();
48
+		}
49 49
 	
50
-	    return static::$instance;
50
+		return static::$instance;
51 51
 	}
52 52
 	
53 53
 	/**
@@ -55,7 +55,7 @@  discard block
 block discarded – undo
55 55
 	 * @see \MyArtJaub\Webtrees\Hook\HookProviderInterface::get()
56 56
 	 */
57 57
 	public function get($hook_function, $hook_context = null) {
58
-	    return new Hook($hook_function, $hook_context);
58
+		return new Hook($hook_function, $hook_context);
59 59
 	}
60 60
 	
61 61
 	/**
@@ -73,20 +73,20 @@  discard block
 block discarded – undo
73 73
 	public function getPossibleHooks() {
74 74
 		static $hooks=null;
75 75
 		if ($hooks === null) {
76
-		    $hooks = array();
76
+			$hooks = array();
77 77
 		    
78
-		    // Cannot use the same logic as the core Module loading,
79
-		    // as this forces a new include of the module.php file.
80
-		    // This causes issue when classes are defined in this file.
81
-		    // Cannot use Module::getActiveModules as well, as this is private.
82
-		    $module_names = Database::prepare(
83
-		        'SELECT SQL_CACHE module_name FROM `##module`'
84
-		    )->fetchOneColumn();
78
+			// Cannot use the same logic as the core Module loading,
79
+			// as this forces a new include of the module.php file.
80
+			// This causes issue when classes are defined in this file.
81
+			// Cannot use Module::getActiveModules as well, as this is private.
82
+			$module_names = Database::prepare(
83
+				'SELECT SQL_CACHE module_name FROM `##module`'
84
+			)->fetchOneColumn();
85 85
 		    
86
-		    foreach($module_names as $module_name) {
87
-		        $module = Module::getModuleByName($module_name);
86
+			foreach($module_names as $module_name) {
87
+				$module = Module::getModuleByName($module_name);
88 88
 		        
89
-		        if($module instanceof HookSubscriberInterface){
89
+				if($module instanceof HookSubscriberInterface){
90 90
 					$subscribedhooks = $module->getSubscribedHooks();
91 91
 					if(is_array($subscribedhooks)){
92 92
 						foreach($subscribedhooks as $key => $value){
@@ -111,7 +111,7 @@  discard block
 block discarded – undo
111 111
 							}
112 112
 						}
113 113
 					}
114
-		        }
114
+				}
115 115
 			}
116 116
 		}
117 117
 		return $hooks;
@@ -153,33 +153,33 @@  discard block
 block discarded – undo
153 153
 	 */
154 154
 	public function updateHooks() {
155 155
 	    
156
-	    if(Auth::isAdmin()){
157
-	        $ihooks = self::getInstalledHooks();
158
-	        $phooks = self::getPossibleHooks();
156
+		if(Auth::isAdmin()){
157
+			$ihooks = self::getInstalledHooks();
158
+			$phooks = self::getPossibleHooks();
159 159
 	        	
160
-	        // Insert hooks not existing yet in the DB
161
-	        if($phooks !== null){
162
-	            foreach($phooks as $phook => $priority){
163
-	                $array_hook = explode('#', $phook);
164
-	                if($ihooks === null || !array_key_exists($phook, $ihooks)){
165
-	                    $chook = new Hook($array_hook[1], $array_hook[2]);
166
-	                    $chook->subscribe($array_hook[0]);
167
-	                    $chook->setPriority($array_hook[0], $priority);
168
-	                }
169
-	            }
170
-	        }
160
+			// Insert hooks not existing yet in the DB
161
+			if($phooks !== null){
162
+				foreach($phooks as $phook => $priority){
163
+					$array_hook = explode('#', $phook);
164
+					if($ihooks === null || !array_key_exists($phook, $ihooks)){
165
+						$chook = new Hook($array_hook[1], $array_hook[2]);
166
+						$chook->subscribe($array_hook[0]);
167
+						$chook->setPriority($array_hook[0], $priority);
168
+					}
169
+				}
170
+			}
171 171
 	        	
172
-	        //Remove hooks not existing any more in the file system
173
-	        if($ihooks !== null){
174
-	            foreach(array_keys($ihooks) as $ihook){
175
-	                $array_hook = explode('#', $ihook);
176
-	                if($phooks === null || !array_key_exists($ihook, $phooks)){
177
-	                    $chook = new Hook($array_hook[1], $array_hook[2]);
178
-	                    $chook->remove($array_hook[0]);
179
-	                }
180
-	            }
181
-	        }
182
-	    }
172
+			//Remove hooks not existing any more in the file system
173
+			if($ihooks !== null){
174
+				foreach(array_keys($ihooks) as $ihook){
175
+					$array_hook = explode('#', $ihook);
176
+					if($phooks === null || !array_key_exists($ihook, $phooks)){
177
+						$chook = new Hook($array_hook[1], $array_hook[2]);
178
+						$chook->remove($array_hook[0]);
179
+					}
180
+				}
181
+			}
182
+		}
183 183
 	}
184 184
 	
185 185
 }
186 186
\ No newline at end of file
Please login to merge, or discard this patch.
src/Webtrees/Controller/JsonController.php 1 patch
Indentation   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -18,50 +18,50 @@
 block discarded – undo
18 18
  */
19 19
 class JsonController extends BaseController {
20 20
     
21
-    /**
22
-     * {@inheritDoc}
23
-     * @see \Fisharebest\Webtrees\Controller\BaseController::pageHeader()
24
-     */
25
-    public function pageHeader() {        
26
-        header('Content-Type: application/json');
27
-        header('Cache-Control: no-cache, must-revalidate');
28
-        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
29
-        // We've displayed the header - display the footer automatically
30
-        register_shutdown_function(array($this, 'pageFooter'));
21
+	/**
22
+	 * {@inheritDoc}
23
+	 * @see \Fisharebest\Webtrees\Controller\BaseController::pageHeader()
24
+	 */
25
+	public function pageHeader() {        
26
+		header('Content-Type: application/json');
27
+		header('Cache-Control: no-cache, must-revalidate');
28
+		header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
29
+		// We've displayed the header - display the footer automatically
30
+		register_shutdown_function(array($this, 'pageFooter'));
31 31
         
32
-        return $this;
33
-    }
32
+		return $this;
33
+	}
34 34
     
35
-    /**
36
-     * {@inheritDoc}
37
-     * @see \Fisharebest\Webtrees\Controller\BaseController::pageFooter()
38
-     */
39
-    public function pageFooter() {
40
-        return $this;
41
-    }
35
+	/**
36
+	 * {@inheritDoc}
37
+	 * @see \Fisharebest\Webtrees\Controller\BaseController::pageFooter()
38
+	 */
39
+	public function pageFooter() {
40
+		return $this;
41
+	}
42 42
     
43
-    /**
44
-     * Restrict access.
45
-     *
46
-     * @param bool $condition
47
-     *
48
-     * @return $this
49
-     */
50
-    public function restrictAccess($condition) {
51
-        if ($condition !== true) {
52
-            throw new MvcException(403);
53
-        }
43
+	/**
44
+	 * Restrict access.
45
+	 *
46
+	 * @param bool $condition
47
+	 *
48
+	 * @return $this
49
+	 */
50
+	public function restrictAccess($condition) {
51
+		if ($condition !== true) {
52
+			throw new MvcException(403);
53
+		}
54 54
     
55
-        return $this;
56
-    }
55
+		return $this;
56
+	}
57 57
     
58
-    /**
59
-     * Encode the data to JSON format.
60
-     * 
61
-     * @param array $data Data to encode
62
-     * @param number $options JSON options mask. See http://php.net/manual/fr/json.constants.php
63
-     */
64
-    public function encode(array $data, $options = 0) {
65
-        echo json_encode($data, $options);
66
-    }
58
+	/**
59
+	 * Encode the data to JSON format.
60
+	 * 
61
+	 * @param array $data Data to encode
62
+	 * @param number $options JSON options mask. See http://php.net/manual/fr/json.constants.php
63
+	 */
64
+	public function encode(array $data, $options = 0) {
65
+		echo json_encode($data, $options);
66
+	}
67 67
 }
Please login to merge, or discard this patch.
src/Webtrees/Module/GeoDispersion/AdminConfigController.php 1 patch
Indentation   +216 added lines, -216 removed lines patch added patch discarded remove patch
@@ -35,59 +35,59 @@  discard block
 block discarded – undo
35 35
  */
36 36
 class AdminConfigController extends MvcController
37 37
 {    
38
-    /**
39
-     * GeoAnalysis Provider
40
-     * @var GeoAnalysisProvider $provider
41
-     */
42
-    protected $provider;    
38
+	/**
39
+	 * GeoAnalysis Provider
40
+	 * @var GeoAnalysisProvider $provider
41
+	 */
42
+	protected $provider;    
43 43
     
44
-    /**
45
-     * Constructor for Admin Config controller
46
-     * @param AbstractModule $module
47
-     */
48
-    public function __construct(AbstractModule $module) {
49
-        parent::__construct($module);
44
+	/**
45
+	 * Constructor for Admin Config controller
46
+	 * @param AbstractModule $module
47
+	 */
48
+	public function __construct(AbstractModule $module) {
49
+		parent::__construct($module);
50 50
         
51
-        $this->provider = $this->module->getProvider();
52
-    }    
51
+		$this->provider = $this->module->getProvider();
52
+	}    
53 53
     
54
-    /**
55
-     * Pages
56
-     */
54
+	/**
55
+	 * Pages
56
+	 */
57 57
         
58
-    /**
59
-     * AdminConfig@index
60
-     */
61
-    public function index() {
62
-        global $WT_TREE;
58
+	/**
59
+	 * AdminConfig@index
60
+	 */
61
+	public function index() {
62
+		global $WT_TREE;
63 63
         
64
-        Theme::theme(new AdministrationTheme)->init($WT_TREE);
65
-        $controller = new PageController();
66
-        $controller
67
-            ->restrictAccess(Auth::isManager($WT_TREE))
68
-            ->setPageTitle($this->module->getTitle());
64
+		Theme::theme(new AdministrationTheme)->init($WT_TREE);
65
+		$controller = new PageController();
66
+		$controller
67
+			->restrictAccess(Auth::isManager($WT_TREE))
68
+			->setPageTitle($this->module->getTitle());
69 69
         
70
-        $data = new ViewBag();
71
-        $data->set('title', $controller->getPageTitle());
72
-        $data->set('tree', $WT_TREE);
70
+		$data = new ViewBag();
71
+		$data->set('title', $controller->getPageTitle());
72
+		$data->set('tree', $WT_TREE);
73 73
         
74
-        $data->set('root_url', 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig');
74
+		$data->set('root_url', 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig');
75 75
                 
76
-        $table_id = 'table-geoanalysis-' . Uuid::uuid4();
77
-        $data->set('table_id', $table_id);
76
+		$table_id = 'table-geoanalysis-' . Uuid::uuid4();
77
+		$data->set('table_id', $table_id);
78 78
         
79
-        $other_trees = array();
80
-        foreach (Tree::getAll() as $tree) {
81
-            if($tree->getTreeId() != $WT_TREE->getTreeId()) $other_trees[] = $tree;
82
-        }      
83
-        $data->set('other_trees', $other_trees);
79
+		$other_trees = array();
80
+		foreach (Tree::getAll() as $tree) {
81
+			if($tree->getTreeId() != $WT_TREE->getTreeId()) $other_trees[] = $tree;
82
+		}      
83
+		$data->set('other_trees', $other_trees);
84 84
         
85
-        $data->set('places_hierarchy', $this->provider->getPlacesHierarchy());
85
+		$data->set('places_hierarchy', $this->provider->getPlacesHierarchy());
86 86
         
87
-        $controller
88
-            ->addExternalJavascript(WT_JQUERY_DATATABLES_JS_URL)
89
-            ->addExternalJavascript(WT_DATATABLES_BOOTSTRAP_JS_URL)
90
-            ->addInlineJavascript('
87
+		$controller
88
+			->addExternalJavascript(WT_JQUERY_DATATABLES_JS_URL)
89
+			->addExternalJavascript(WT_DATATABLES_BOOTSTRAP_JS_URL)
90
+			->addInlineJavascript('
91 91
                 //Datatable initialisation
92 92
 				jQuery.fn.dataTableExt.oSort["unicode-asc"  ]=function(a,b) {return a.replace(/<[^<]*>/, "").localeCompare(b.replace(/<[^<]*>/, ""))};
93 93
 				jQuery.fn.dataTableExt.oSort["unicode-desc" ]=function(a,b) {return b.replace(/<[^<]*>/, "").localeCompare(a.replace(/<[^<]*>/, ""))};
@@ -122,7 +122,7 @@  discard block
 block discarded – undo
122 122
 				});
123 123
                 
124 124
                 ')
125
-                ->addInlineJavascript('				
125
+				->addInlineJavascript('				
126 126
                     function set_geoanalysis_status(ga_id, status, gedcom) {
127 127
                 		jQuery.ajax({
128 128
                             url: "module.php", 
@@ -166,55 +166,55 @@  discard block
 block discarded – undo
166 166
                 ');
167 167
         
168 168
         
169
-        ViewFactory::make('AdminConfig', $this, $controller, $data)->render();
170
-    }
169
+		ViewFactory::make('AdminConfig', $this, $controller, $data)->render();
170
+	}
171 171
 
172
-    /**
173
-     * AdminConfig@jsonGeoAnalysisList
174
-     */
175
-    public function jsonGeoAnalysisList() {
176
-        global $WT_TREE;
172
+	/**
173
+	 * AdminConfig@jsonGeoAnalysisList
174
+	 */
175
+	public function jsonGeoAnalysisList() {
176
+		global $WT_TREE;
177 177
         
178
-        $controller = new JsonController();
179
-        $controller
180
-            ->restrictAccess(Auth::isManager($WT_TREE));
178
+		$controller = new JsonController();
179
+		$controller
180
+			->restrictAccess(Auth::isManager($WT_TREE));
181 181
         
182
-        // Generate an AJAX/JSON response for datatables to load a block of rows
183
-        $search = Filter::postArray('search');
184
-        if($search) $search = $search['value'];
185
-        $start  = Filter::postInteger('start');
186
-        $length = Filter::postInteger('length');
187
-        $order  = Filter::postArray('order');
182
+		// Generate an AJAX/JSON response for datatables to load a block of rows
183
+		$search = Filter::postArray('search');
184
+		if($search) $search = $search['value'];
185
+		$start  = Filter::postInteger('start');
186
+		$length = Filter::postInteger('length');
187
+		$order  = Filter::postArray('order');
188 188
         
189
-        foreach($order as $key => &$value) {
190
-            switch($value['column']) {
191
-                case 3:
192
-                    $value['column'] = 'majgd_descr';
193
-                    break;
194
-                case 5;
195
-                    $value['column'] = 'majgd_sublevel';
196
-                    break;
197
-                default:
198
-                    unset($order[$key]);
199
-            }
200
-        }
189
+		foreach($order as $key => &$value) {
190
+			switch($value['column']) {
191
+				case 3:
192
+					$value['column'] = 'majgd_descr';
193
+					break;
194
+				case 5;
195
+					$value['column'] = 'majgd_sublevel';
196
+					break;
197
+				default:
198
+					unset($order[$key]);
199
+			}
200
+		}
201 201
         
202
-        /** @var GeoAnalysisProvider $provider */
203
-        $provider = $this->module->getProvider();
202
+		/** @var GeoAnalysisProvider $provider */
203
+		$provider = $this->module->getProvider();
204 204
         
205
-        $list = $provider->getFilteredGeoAnalysisList($search, $order, $start, $length);
206
-        $recordsFiltered = count($list);
207
-        $recordsTotal = $this->provider->getGeoAnalysisCount();
205
+		$list = $provider->getFilteredGeoAnalysisList($search, $order, $start, $length);
206
+		$recordsFiltered = count($list);
207
+		$recordsTotal = $this->provider->getGeoAnalysisCount();
208 208
         
209
-        $data = array();
210
-        $place_hierarchy = $this->provider->getPlacesHierarchy();
211
-        foreach($list as $ga) {
212
-            /** @var GeoAnalysis $ga */
209
+		$data = array();
210
+		$place_hierarchy = $this->provider->getPlacesHierarchy();
211
+		foreach($list as $ga) {
212
+			/** @var GeoAnalysis $ga */
213 213
             
214
-            $datum = array();
215
-            $options= $ga->getOptions();
214
+			$datum = array();
215
+			$options= $ga->getOptions();
216 216
             
217
-            $datum[0] = '
217
+			$datum[0] = '
218 218
                 <div class="btn-group">
219 219
                     <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
220 220
                         <i class="fa fa-pencil"></i><span class="caret"></span>
@@ -238,108 +238,108 @@  discard block
 block discarded – undo
238 238
                        </li>
239 239
                     </ul>
240 240
                 </div>';
241
-		    $datum[1] = $ga->getId();
242
-		    $datum[2] = $ga->isEnabled() ? 
241
+			$datum[1] = $ga->getId();
242
+			$datum[2] = $ga->isEnabled() ? 
243 243
 				'<i class="fa fa-check"></i><span class="sr-only">'.I18N::translate('Enabled').'</span>' : 
244 244
 				'<i class="fa fa-times"></i><span class="sr-only">'.I18N::translate('Disabled').'</span>';
245
-		    $datum[3] = $ga->getTitle();
246
-		    $analysis_level = $ga->getAnalysisLevel();
247
-		    if($place_hierarchy['type'] == 'header') {
248
-		        $datum[4] = $place_hierarchy['hierarchy'][$analysis_level - 1];
249
-		    } else {
250
-		        $datum[4] = $analysis_level . '(' . $place_hierarchy['hierarchy'][$analysis_level - 1] . ')';
251
-		    }
252
-		    $datum[5] = $ga->getAnalysisLevel();
253
-		    $datum[6] = '<i class="fa fa-times"></i><span class="sr-only">'.I18N::translate('None').'</span>';
254
-		    $datum[7] = '<i class="fa fa-times"></i><span class="sr-only">'.I18N::translate('None').'</span>';
255
-		    if($ga->hasMap()) {
256
-		        $datum[6] = $options->getMap()->getDescription();
257
-		        $datum[7] = '<span data-toggle="tooltip" title="' . $options->getMap()->getTopLevelName() . '" />';
258
-		        $top_level = $options->getMapLevel();
259
-		        if($place_hierarchy['type'] == 'header') {
260
-		            $datum[7] .= $place_hierarchy['hierarchy'][$top_level - 1];
261
-		        } else {
262
-		            $datum[7] .= $top_level . '(' . $place_hierarchy['hierarchy'][$top_level - 1] . ')';
263
-		        }
264
-		        $datum[7] .= '</span>';
265
-		    }
266
-		    $datum[8] = $options->isUsingFlags() ? 
245
+			$datum[3] = $ga->getTitle();
246
+			$analysis_level = $ga->getAnalysisLevel();
247
+			if($place_hierarchy['type'] == 'header') {
248
+				$datum[4] = $place_hierarchy['hierarchy'][$analysis_level - 1];
249
+			} else {
250
+				$datum[4] = $analysis_level . '(' . $place_hierarchy['hierarchy'][$analysis_level - 1] . ')';
251
+			}
252
+			$datum[5] = $ga->getAnalysisLevel();
253
+			$datum[6] = '<i class="fa fa-times"></i><span class="sr-only">'.I18N::translate('None').'</span>';
254
+			$datum[7] = '<i class="fa fa-times"></i><span class="sr-only">'.I18N::translate('None').'</span>';
255
+			if($ga->hasMap()) {
256
+				$datum[6] = $options->getMap()->getDescription();
257
+				$datum[7] = '<span data-toggle="tooltip" title="' . $options->getMap()->getTopLevelName() . '" />';
258
+				$top_level = $options->getMapLevel();
259
+				if($place_hierarchy['type'] == 'header') {
260
+					$datum[7] .= $place_hierarchy['hierarchy'][$top_level - 1];
261
+				} else {
262
+					$datum[7] .= $top_level . '(' . $place_hierarchy['hierarchy'][$top_level - 1] . ')';
263
+				}
264
+				$datum[7] .= '</span>';
265
+			}
266
+			$datum[8] = $options->isUsingFlags() ? 
267 267
 				'<i class="fa fa-check"></i><span class="sr-only">'.I18N::translate('Yes').'</span>' : 
268 268
 				'<i class="fa fa-times"></i><span class="sr-only">'.I18N::translate('No').'</span>';
269
-		    $datum[9] = $options->getMaxDetailsInGen() > 0 ? $options->getMaxDetailsInGen() : I18N::translate('All');
269
+			$datum[9] = $options->getMaxDetailsInGen() > 0 ? $options->getMaxDetailsInGen() : I18N::translate('All');
270 270
 		    
271
-		    $data[] = $datum;
272
-        }
271
+			$data[] = $datum;
272
+		}
273 273
         
274
-        $controller->pageHeader();
274
+		$controller->pageHeader();
275 275
         
276
-        $controller->encode(array(
277
-            'draw'            => Filter::getInteger('draw'),
278
-            'recordsTotal'    => $recordsTotal,
279
-            'recordsFiltered' => $recordsFiltered,
280
-            'data'            => $data
281
-        ));
276
+		$controller->encode(array(
277
+			'draw'            => Filter::getInteger('draw'),
278
+			'recordsTotal'    => $recordsTotal,
279
+			'recordsFiltered' => $recordsFiltered,
280
+			'data'            => $data
281
+		));
282 282
         
283
-    }
283
+	}
284 284
 
285
-    /**
286
-     * AdminConfig@edit
287
-     */
288
-    public function edit() {
289
-        $ga_id = Filter::getInteger('ga_id');
290
-        $ga = $this->provider->getGeoAnalysis($ga_id, false);
285
+	/**
286
+	 * AdminConfig@edit
287
+	 */
288
+	public function edit() {
289
+		$ga_id = Filter::getInteger('ga_id');
290
+		$ga = $this->provider->getGeoAnalysis($ga_id, false);
291 291
         
292
-        $this->renderEdit($ga);
293
-    }
292
+		$this->renderEdit($ga);
293
+	}
294 294
     
295
-    /**
296
-     * AdminConfig@add
297
-     */
298
-    public function add() {
299
-        $this->renderEdit(null);
300
-    }
295
+	/**
296
+	 * AdminConfig@add
297
+	 */
298
+	public function add() {
299
+		$this->renderEdit(null);
300
+	}
301 301
     
302
-    /**
303
-     * AdminConfig@save
304
-     */
305
-    public function save() {
306
-        global $WT_TREE;
302
+	/**
303
+	 * AdminConfig@save
304
+	 */
305
+	public function save() {
306
+		global $WT_TREE;
307 307
         
308
-        $tmp_contrl = new PageController();
309
-        $tmp_contrl->restrictAccess(
310
-            Auth::isManager($WT_TREE) 
311
-            && Filter::checkCsrf()
312
-         );
308
+		$tmp_contrl = new PageController();
309
+		$tmp_contrl->restrictAccess(
310
+			Auth::isManager($WT_TREE) 
311
+			&& Filter::checkCsrf()
312
+		 );
313 313
         
314
-        $ga_id          = Filter::postInteger('ga_id');
315
-        $description    = Filter::post('description');
316
-        $analysislevel  = Filter::postInteger('analysislevel');
317
-        $use_map        = Filter::postBool('use_map');
318
-        if($use_map) {
319
-            $map_file   = base64_decode(Filter::post('map_file'));
320
-            $map_top_level   = Filter::postInteger('map_top_level');
321
-        }
322
-        $use_flags      = Filter::postBool('use_flags');
323
-        $gen_details    = Filter::postInteger('gen_details');
314
+		$ga_id          = Filter::postInteger('ga_id');
315
+		$description    = Filter::post('description');
316
+		$analysislevel  = Filter::postInteger('analysislevel');
317
+		$use_map        = Filter::postBool('use_map');
318
+		if($use_map) {
319
+			$map_file   = base64_decode(Filter::post('map_file'));
320
+			$map_top_level   = Filter::postInteger('map_top_level');
321
+		}
322
+		$use_flags      = Filter::postBool('use_flags');
323
+		$gen_details    = Filter::postInteger('gen_details');
324 324
         
325
-        $success = false; 
326
-        if($ga_id) {
327
-            $ga = $this->provider->getGeoAnalysis($ga_id, false);
328
-            if($ga) {
329
-                $ga->setTitle($description);
330
-                $ga->setAnalysisLevel($analysislevel + 1);
331
-                $options = $ga->getOptions();
332
-                if($options) {
333
-                    $options->setUsingFlags($use_flags);
334
-                    $options->setMaxDetailsInGen($gen_details);
335
-                    if($use_map) {
336
-                        $options->setMap(new OutlineMap($map_file));
337
-                        $options->setMapLevel($map_top_level + 1);
338
-                    }
339
-                    else {
340
-                        $options->setMap(null);
341
-                    }
342
-                }
325
+		$success = false; 
326
+		if($ga_id) {
327
+			$ga = $this->provider->getGeoAnalysis($ga_id, false);
328
+			if($ga) {
329
+				$ga->setTitle($description);
330
+				$ga->setAnalysisLevel($analysislevel + 1);
331
+				$options = $ga->getOptions();
332
+				if($options) {
333
+					$options->setUsingFlags($use_flags);
334
+					$options->setMaxDetailsInGen($gen_details);
335
+					if($use_map) {
336
+						$options->setMap(new OutlineMap($map_file));
337
+						$options->setMapLevel($map_top_level + 1);
338
+					}
339
+					else {
340
+						$options->setMap(null);
341
+					}
342
+				}
343 343
 				
344 344
 				$res = $this->provider->updateGeoAnalysis($ga);
345 345
 				if($res) {
@@ -352,8 +352,8 @@  discard block
 block discarded – undo
352 352
 					FlashMessages::addMessage(I18N::translate('An error occured while updating the geographical dispersion analysis “%s”', $ga->getTitle()), 'danger');
353 353
 					Log::addConfigurationLog('Module '.$this->module->getName().' : Geo Analysis ID “'. $ga->getId() .'” could not be updated. See error log.');
354 354
 				}
355
-            }
356
-        } else {
355
+			}
356
+		} else {
357 357
 			$ga = $this->provider->createGeoAnalysis(
358 358
 				$description,
359 359
 				$analysislevel + 1,
@@ -371,34 +371,34 @@  discard block
 block discarded – undo
371 371
 				FlashMessages::addMessage(I18N::translate('An error occured while adding the geographical dispersion analysis “%s”', $description), 'danger');
372 372
 				Log::addConfigurationLog('Module '.$this->module->getName().' : Geo Analysis “'.$description.'” could not be added. See error log.');
373 373
 			}
374
-        }
374
+		}
375 375
         
376
-        $redirection_url = 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig&ged=' . $WT_TREE->getNameUrl();
377
-        if(!$success) {			
378
-            if($ga) {
379
-                $redirection_url = 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig@edit&ga_id='. $ga->getId() .'&ged=' . $WT_TREE->getNameUrl();
380
-            }
381
-            else {
382
-                $redirection_url = 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig@add&ged=' . $WT_TREE->getNameUrl();
383
-            }
384
-        }        
385
-        header('Location: ' . WT_BASE_URL . $redirection_url);
376
+		$redirection_url = 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig&ged=' . $WT_TREE->getNameUrl();
377
+		if(!$success) {			
378
+			if($ga) {
379
+				$redirection_url = 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig@edit&ga_id='. $ga->getId() .'&ged=' . $WT_TREE->getNameUrl();
380
+			}
381
+			else {
382
+				$redirection_url = 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig@add&ged=' . $WT_TREE->getNameUrl();
383
+			}
384
+		}        
385
+		header('Location: ' . WT_BASE_URL . $redirection_url);
386 386
         
387
-    }
387
+	}
388 388
      
389 389
 	/**
390 390
 	 * Renders the edit form, whether it is an edition of an existing GeoAnalysis, or the addition of a new one.
391 391
 	 * 
392 392
 	 * @param (GeoAnalysis!null) $ga GeoAnalysis to edit
393 393
 	 */
394
-    protected function renderEdit(GeoAnalysis $ga = null) {
395
-        global $WT_TREE;
394
+	protected function renderEdit(GeoAnalysis $ga = null) {
395
+		global $WT_TREE;
396 396
         
397
-        Theme::theme(new AdministrationTheme)->init($WT_TREE);
398
-        $controller = new PageController();        
399
-        $controller
400
-            ->restrictAccess(Auth::isManager($WT_TREE))
401
-            ->addInlineJavascript('
397
+		Theme::theme(new AdministrationTheme)->init($WT_TREE);
398
+		$controller = new PageController();        
399
+		$controller
400
+			->restrictAccess(Auth::isManager($WT_TREE))
401
+			->addInlineJavascript('
402 402
                 function toggleMapOptions() {
403 403
                     if($("input:radio[name=\'use_map\']:checked").val() == 1) {
404 404
                         $("#map_options").show();
@@ -412,34 +412,34 @@  discard block
 block discarded – undo
412 412
                 toggleMapOptions();
413 413
             ');
414 414
         
415
-        $data = new ViewBag();
416
-        if($ga) {
417
-            $controller->setPageTitle(I18N::translate('Edit the geographical dispersion analysis'));
418
-            $data->set('geo_analysis', $ga);
419
-        } else {
420
-            $controller->setPageTitle(I18N::translate('Add a geographical dispersion analysis'));
421
-        }
415
+		$data = new ViewBag();
416
+		if($ga) {
417
+			$controller->setPageTitle(I18N::translate('Edit the geographical dispersion analysis'));
418
+			$data->set('geo_analysis', $ga);
419
+		} else {
420
+			$controller->setPageTitle(I18N::translate('Add a geographical dispersion analysis'));
421
+		}
422 422
         
423
-        $data->set('title', $controller->getPageTitle());
424
-        $data->set('admin_config_url', 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig&ged=' . $WT_TREE->getNameUrl());
425
-        $data->set('module_title', $this->module->getTitle());
426
-        $data->set('save_url', 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig@save&ged=' . $WT_TREE->getNameUrl());
427
-        $data->set('places_hierarchy', $this->provider->getPlacesHierarchy());
423
+		$data->set('title', $controller->getPageTitle());
424
+		$data->set('admin_config_url', 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig&ged=' . $WT_TREE->getNameUrl());
425
+		$data->set('module_title', $this->module->getTitle());
426
+		$data->set('save_url', 'module.php?mod=' . $this->module->getName() . '&mod_action=AdminConfig@save&ged=' . $WT_TREE->getNameUrl());
427
+		$data->set('places_hierarchy', $this->provider->getPlacesHierarchy());
428 428
     
429
-        $map_list = array_map(
430
-            function(OutlineMap $map) {
431
-                return $map->getDescription();
432
-            },
433
-            $this->provider->getOutlineMapsList()
434
-            );
435
-        asort($map_list);
436
-        $data->set('map_list', $map_list);
429
+		$map_list = array_map(
430
+			function(OutlineMap $map) {
431
+				return $map->getDescription();
432
+			},
433
+			$this->provider->getOutlineMapsList()
434
+			);
435
+		asort($map_list);
436
+		$data->set('map_list', $map_list);
437 437
     
438
-        $gen_details = array(0 => I18N::translate('All'));
439
-        for($i = 1; $i <= 10 ; $i++) $gen_details[$i] = $i;
440
-        $data->set('generation_details', $gen_details);
438
+		$gen_details = array(0 => I18N::translate('All'));
439
+		for($i = 1; $i <= 10 ; $i++) $gen_details[$i] = $i;
440
+		$data->set('generation_details', $gen_details);
441 441
     
442
-        ViewFactory::make('GeoAnalysisEdit', $this, $controller, $data)->render();
443
-    }
442
+		ViewFactory::make('GeoAnalysisEdit', $this, $controller, $data)->render();
443
+	}
444 444
     
445 445
 }
446 446
\ No newline at end of file
Please login to merge, or discard this patch.
src/Webtrees/Module/GeoDispersion/GeoAnalysisController.php 1 patch
Indentation   +231 added lines, -231 removed lines patch added patch discarded remove patch
@@ -35,47 +35,47 @@  discard block
 block discarded – undo
35 35
  */
36 36
 class GeoAnalysisController extends MvcController
37 37
 {
38
-    /**
39
-     * GeoAnalysis Provider
40
-     * @var GeoAnalysisProvider $provider
41
-     */
42
-    protected $provider;
38
+	/**
39
+	 * GeoAnalysis Provider
40
+	 * @var GeoAnalysisProvider $provider
41
+	 */
42
+	protected $provider;
43 43
     
44
-    /**
45
-     * Constructor for GeoAnalysis controller
46
-     * @param AbstractModule $module
47
-     */
48
-    public function __construct(AbstractModule $module) {
49
-        parent::__construct($module);
44
+	/**
45
+	 * Constructor for GeoAnalysis controller
46
+	 * @param AbstractModule $module
47
+	 */
48
+	public function __construct(AbstractModule $module) {
49
+		parent::__construct($module);
50 50
         
51
-        $this->provider = $this->module->getProvider();
52
-    }    
51
+		$this->provider = $this->module->getProvider();
52
+	}    
53 53
     
54
-    /**
55
-     * Pages
56
-     */
54
+	/**
55
+	 * Pages
56
+	 */
57 57
         
58
-    /**
59
-     * GeoAnalysis@index
60
-     */
61
-    public function index() {
58
+	/**
59
+	 * GeoAnalysis@index
60
+	 */
61
+	public function index() {
62 62
         
63
-        $controller = new PageController();
64
-        $controller->setPageTitle(I18N::translate('Sosa Geographical dispersion'));
63
+		$controller = new PageController();
64
+		$controller->setPageTitle(I18N::translate('Sosa Geographical dispersion'));
65 65
         
66
-        $data = new ViewBag();
67
-        $data->set('title', $controller->getPageTitle());
68
-        $data->set('has_analysis', false);
66
+		$data = new ViewBag();
67
+		$data->set('title', $controller->getPageTitle());
68
+		$data->set('has_analysis', false);
69 69
         
70
-        $ga_id = Filter::getInteger('ga_id');        
70
+		$ga_id = Filter::getInteger('ga_id');        
71 71
         
72
-        if($ga_id && $ga = $this->provider->getGeoAnalysis($ga_id)) {
73
-            $data->set('has_analysis', true);
74
-            $data->set('geoanalysis', $ga);
72
+		if($ga_id && $ga = $this->provider->getGeoAnalysis($ga_id)) {
73
+			$data->set('has_analysis', true);
74
+			$data->set('geoanalysis', $ga);
75 75
             
76
-            $controller
77
-                ->addExternalJavascript(Constants::WT_RAPHAEL_JS_URL())
78
-                ->addInlineJavascript('
76
+			$controller
77
+				->addExternalJavascript(Constants::WT_RAPHAEL_JS_URL())
78
+				->addInlineJavascript('
79 79
                 jQuery("#geodispersion-tabs").tabs();
80 80
                 jQuery("#geodispersion-tabs").css("visibility", "visible");
81 81
                 
@@ -96,133 +96,133 @@  discard block
 block discarded – undo
96 96
 					"json"
97 97
 				);
98 98
             ');
99
-        }
99
+		}
100 100
         
101
-        ViewFactory::make('GeoAnalysis', $this, $controller, $data)->render();
102
-    }
101
+		ViewFactory::make('GeoAnalysis', $this, $controller, $data)->render();
102
+	}
103 103
     
104
-    /**
105
-     * GeoAnalysis@listAll
106
-     */
107
-    public function listAll() {
104
+	/**
105
+	 * GeoAnalysis@listAll
106
+	 */
107
+	public function listAll() {
108 108
         
109
-        $controller = new PageController();
110
-        $controller->setPageTitle(I18N::translate('Sosa Geographical dispersion'));
109
+		$controller = new PageController();
110
+		$controller->setPageTitle(I18N::translate('Sosa Geographical dispersion'));
111 111
         
112
-        $data = new ViewBag();
113
-        $data->set('title', $controller->getPageTitle());
114
-        $data->set('has_list', false);
112
+		$data = new ViewBag();
113
+		$data->set('title', $controller->getPageTitle());
114
+		$data->set('has_list', false);
115 115
         
116
-        $ga_list = $this->provider->getGeoAnalysisList();
117
-        if(count($ga_list) > 0 ) {
118
-             $data->set('has_list', true);
119
-             $data->set('geoanalysislist', $ga_list);
120
-        }
116
+		$ga_list = $this->provider->getGeoAnalysisList();
117
+		if(count($ga_list) > 0 ) {
118
+			 $data->set('has_list', true);
119
+			 $data->set('geoanalysislist', $ga_list);
120
+		}
121 121
         
122
-        ViewFactory::make('GeoAnalysisList', $this, $controller, $data)->render();        
123
-    }
122
+		ViewFactory::make('GeoAnalysisList', $this, $controller, $data)->render();        
123
+	}
124 124
     	
125 125
 	/**
126 126
 	 * GeoAnalysis@setStatus
127 127
 	 */
128
-    public function setStatus() {  
129
-        global $WT_TREE;
128
+	public function setStatus() {  
129
+		global $WT_TREE;
130 130
         
131
-        $controller = new JsonController();
131
+		$controller = new JsonController();
132 132
         
133
-        $ga_id = Filter::getInteger('ga_id');
134
-        $ga = $this->provider->getGeoAnalysis($ga_id, false);
133
+		$ga_id = Filter::getInteger('ga_id');
134
+		$ga = $this->provider->getGeoAnalysis($ga_id, false);
135 135
         
136
-        $controller->restrictAccess(
137
-            true // Filter::checkCsrf()   -- Cannot use CSRF on a GET request (modules can only work with GET requests)
138
-            &&  Auth::isManager($WT_TREE) 
139
-            && $ga !== null
140
-        );
136
+		$controller->restrictAccess(
137
+			true // Filter::checkCsrf()   -- Cannot use CSRF on a GET request (modules can only work with GET requests)
138
+			&&  Auth::isManager($WT_TREE) 
139
+			&& $ga !== null
140
+		);
141 141
         
142
-        $status = Filter::getBool('status');
143
-        $res = array('geoanalysis' => $ga->getId() , 'error' => null);
144
-        try{
145
-            $this->provider->setGeoAnalysisStatus($ga, $status);
146
-            $res['status'] = $status;
142
+		$status = Filter::getBool('status');
143
+		$res = array('geoanalysis' => $ga->getId() , 'error' => null);
144
+		try{
145
+			$this->provider->setGeoAnalysisStatus($ga, $status);
146
+			$res['status'] = $status;
147 147
 			Log::addConfigurationLog('Module '.$this->module->getName().' : Geo Analysis ID "'.$ga->getId().'" has been '. ($status ? 'enabled' : 'disabled') .'.');
148
-        }
149
-        catch (\Exception $ex) {
150
-            $res['error'] = $ex->getMessage();
148
+		}
149
+		catch (\Exception $ex) {
150
+			$res['error'] = $ex->getMessage();
151 151
 			Log::addErrorLog('Module '.$this->module->getName().' : Geo Analysis ID "'.$ga->getId().'" could not be ' . ($status ? 'enabled' : 'disabled') .'. Error: '. $ex->getMessage());
152
-        }
152
+		}
153 153
         
154
-        $controller->pageHeader();
155
-        if($res['error']) http_response_code(500);
154
+		$controller->pageHeader();
155
+		if($res['error']) http_response_code(500);
156 156
         
157
-        $controller->encode($res);
158
-    }
157
+		$controller->encode($res);
158
+	}
159 159
     
160 160
 	/**
161
-     * GeoAnalysis@delete
162
-     */
163
-    public function delete() {
164
-        global $WT_TREE;
161
+	 * GeoAnalysis@delete
162
+	 */
163
+	public function delete() {
164
+		global $WT_TREE;
165 165
     
166
-        $controller = new JsonController();
166
+		$controller = new JsonController();
167 167
     
168
-        $ga_id = Filter::getInteger('ga_id');
169
-        $ga = $this->provider->getGeoAnalysis($ga_id, false);
168
+		$ga_id = Filter::getInteger('ga_id');
169
+		$ga = $this->provider->getGeoAnalysis($ga_id, false);
170 170
     
171
-        $controller->restrictAccess(
172
-            true // Filter::checkCsrf()   -- Cannot use CSRF on a GET request (modules can only work with GET requests)
173
-            &&  Auth::isManager($WT_TREE)
174
-            && $ga
175
-            );
171
+		$controller->restrictAccess(
172
+			true // Filter::checkCsrf()   -- Cannot use CSRF on a GET request (modules can only work with GET requests)
173
+			&&  Auth::isManager($WT_TREE)
174
+			&& $ga
175
+			);
176 176
             
177
-        $res = array('geoanalysis' => $ga->getId() , 'error' => null);
178
-        try{
179
-            $this->provider->deleteGeoAnalysis($ga);
177
+		$res = array('geoanalysis' => $ga->getId() , 'error' => null);
178
+		try{
179
+			$this->provider->deleteGeoAnalysis($ga);
180 180
 			Log::addConfigurationLog('Module '.$this->module->getName().' : Geo Analysis ID "'.$ga->getId().'" has been deleted.');
181
-        }
182
-        catch (\Exception $ex) {
183
-            $res['error'] = $ex->getMessage();
181
+		}
182
+		catch (\Exception $ex) {
183
+			$res['error'] = $ex->getMessage();
184 184
 			Log::addErrorLog('Module '.$this->module->getName().' : Geo Analysis ID "'.$ga->getId().'" could not be deleted. Error: '. $ex->getMessage());
185
-        }
185
+		}
186 186
     
187
-        $controller->pageHeader();
188
-        if($res['error']) http_response_code(500);
187
+		$controller->pageHeader();
188
+		if($res['error']) http_response_code(500);
189 189
 
190
-        $controller->encode($res);
191
-    }
190
+		$controller->encode($res);
191
+	}
192 192
         	
193
-    /**
194
-     * GeoAnalysis@dataTabs
195
-     */
196
-    public function dataTabs() {
197
-        global $WT_TREE;
193
+	/**
194
+	 * GeoAnalysis@dataTabs
195
+	 */
196
+	public function dataTabs() {
197
+		global $WT_TREE;
198 198
         
199
-        $controller = new JsonController();
199
+		$controller = new JsonController();
200 200
         
201
-        $ga_id = Filter::getInteger('ga_id');
202
-        $ga = $this->provider->getGeoAnalysis($ga_id);
203
-        $sosa_provider = new SosaProvider($WT_TREE, Auth::user());
201
+		$ga_id = Filter::getInteger('ga_id');
202
+		$ga = $this->provider->getGeoAnalysis($ga_id);
203
+		$sosa_provider = new SosaProvider($WT_TREE, Auth::user());
204 204
         
205
-        $controller
206
-            ->restrictAccess($ga && $sosa_provider->isSetup())
207
-            ->pageHeader();
205
+		$controller
206
+			->restrictAccess($ga && $sosa_provider->isSetup())
207
+			->pageHeader();
208 208
         
209
-        $jsonArray = array();
209
+		$jsonArray = array();
210 210
         
211
-        list($placesDispGeneral, $placesDispGenerations) = $ga->getAnalysisResults($sosa_provider->getAllSosaWithGenerations());
211
+		list($placesDispGeneral, $placesDispGenerations) = $ga->getAnalysisResults($sosa_provider->getAllSosaWithGenerations());
212 212
         
213
-        $flags = array();
214
-        if($placesDispGeneral && $ga->getOptions() && $ga->getOptions()->isUsingFlags()) {
215
-            $mapProvider = new GoogleMapsProvider();            
216
-            foreach($placesDispGeneral['places'] as $place => $count) {
217
-                $flags[$place] = $mapProvider->getPlaceIcon(new Place($place, $WT_TREE));
218
-            }
219
-        }
213
+		$flags = array();
214
+		if($placesDispGeneral && $ga->getOptions() && $ga->getOptions()->isUsingFlags()) {
215
+			$mapProvider = new GoogleMapsProvider();            
216
+			foreach($placesDispGeneral['places'] as $place => $count) {
217
+				$flags[$place] = $mapProvider->getPlaceIcon(new Place($place, $WT_TREE));
218
+			}
219
+		}
220 220
         
221
-        $jsonArray['generaltab'] = $this->htmlPlacesAnalysisGeneralTab($ga, $placesDispGeneral, $flags);
222
-        $jsonArray['generationstab'] = $this->htmlPlacesAnalysisGenerationsTab($ga, $placesDispGenerations, $flags);
221
+		$jsonArray['generaltab'] = $this->htmlPlacesAnalysisGeneralTab($ga, $placesDispGeneral, $flags);
222
+		$jsonArray['generationstab'] = $this->htmlPlacesAnalysisGenerationsTab($ga, $placesDispGenerations, $flags);
223 223
 
224
-        $controller->encode($jsonArray);
225
-    }
224
+		$controller->encode($jsonArray);
225
+	}
226 226
     
227 227
 	/**
228 228
 	 * Returns HTML code for the GeoAnalysis general tab (can be either a map or a table).
@@ -232,70 +232,70 @@  discard block
 block discarded – undo
232 232
 	 * @param (null|array) $flags Array of flags
233 233
 	 * @return string HTML code for the general tab
234 234
 	 */
235
-    protected function htmlPlacesAnalysisGeneralTab(GeoAnalysis $ga, $placesGeneralResults, $flags= null) {
236
-        global $WT_TREE;
235
+	protected function htmlPlacesAnalysisGeneralTab(GeoAnalysis $ga, $placesGeneralResults, $flags= null) {
236
+		global $WT_TREE;
237 237
         
238
-        if(!empty($placesGeneralResults)){
239
-            $data = new ViewBag();
238
+		if(!empty($placesGeneralResults)){
239
+			$data = new ViewBag();
240 240
             
241
-            $nb_found = $placesGeneralResults['knownsum'];
242
-            $nb_other = 0;
243
-            if(isset($placesGeneralResults['other'])) $nb_other =$placesGeneralResults['other'];
244
-            $nb_unknown = $placesGeneralResults['unknown'];
241
+			$nb_found = $placesGeneralResults['knownsum'];
242
+			$nb_other = 0;
243
+			if(isset($placesGeneralResults['other'])) $nb_other =$placesGeneralResults['other'];
244
+			$nb_unknown = $placesGeneralResults['unknown'];
245 245
             
246
-            $data->set('stats_gen_nb_found', $nb_found);
247
-            $data->set('stats_gen_nb_other', $nb_other);
248
-            $data->set('stats_gen_nb_unknown', $nb_unknown);
246
+			$data->set('stats_gen_nb_found', $nb_found);
247
+			$data->set('stats_gen_nb_other', $nb_other);
248
+			$data->set('stats_gen_nb_unknown', $nb_unknown);
249 249
             
250
-            $data->set('use_flags', $ga->getOptions() && $ga->getOptions()->isUsingFlags());
250
+			$data->set('use_flags', $ga->getOptions() && $ga->getOptions()->isUsingFlags());
251 251
             
252
-            if($ga->hasMap()) {
253
-                $max = $placesGeneralResults['max'];
254
-                $map = $ga->getOptions()->getMap();
255
-                $results_by_subdivs = $map->getSubdivisions();
256
-                $places_mappings = $map->getPlacesMappings();
257
-                foreach ($placesGeneralResults['places'] as $location => $count) {
258
-                    $levelvalues = array_reverse(array_map('trim',explode(',', $location)));
259
-                    $level_map = $ga->getAnalysisLevel() - $ga->getOptions()->getMapLevel();
260
-                    if($level_map >= 0 && $level_map < count($levelvalues)) {
261
-                        $levelref = $levelvalues[0] . '@' . $levelvalues[$level_map];
262
-                        if(!isset($results_by_subdivs[$levelref])) { $levelref = $levelvalues[0]; }
263
-                    }
264
-                    else {
265
-                        $levelref = $levelvalues[0];
266
-                    }
267
-                    if(isset($places_mappings[$levelref])) $levelref = $places_mappings[$levelref];
268
-                    if(isset($results_by_subdivs[$levelref])) {
269
-                        $count_subd = isset($results_by_subdivs[$levelref]['count']) ? $results_by_subdivs[$levelref]['count'] : 0;
270
-                        $count_subd  += $count;
271
-                        $results_by_subdivs[$levelref]['count'] = $count_subd;   
272
-                        $results_by_subdivs[$levelref]['transparency'] = Functions::safeDivision($count_subd, $max);
273
-                        if($ga->getOptions()->isUsingFlags() && $flags) {
274
-                            $results_by_subdivs[$levelref]['place'] = new Place($location, $WT_TREE);
275
-                            $results_by_subdivs[$levelref]['flag'] = $flags[$location];
276
-                        }
277
-                    }
278
-                }             
252
+			if($ga->hasMap()) {
253
+				$max = $placesGeneralResults['max'];
254
+				$map = $ga->getOptions()->getMap();
255
+				$results_by_subdivs = $map->getSubdivisions();
256
+				$places_mappings = $map->getPlacesMappings();
257
+				foreach ($placesGeneralResults['places'] as $location => $count) {
258
+					$levelvalues = array_reverse(array_map('trim',explode(',', $location)));
259
+					$level_map = $ga->getAnalysisLevel() - $ga->getOptions()->getMapLevel();
260
+					if($level_map >= 0 && $level_map < count($levelvalues)) {
261
+						$levelref = $levelvalues[0] . '@' . $levelvalues[$level_map];
262
+						if(!isset($results_by_subdivs[$levelref])) { $levelref = $levelvalues[0]; }
263
+					}
264
+					else {
265
+						$levelref = $levelvalues[0];
266
+					}
267
+					if(isset($places_mappings[$levelref])) $levelref = $places_mappings[$levelref];
268
+					if(isset($results_by_subdivs[$levelref])) {
269
+						$count_subd = isset($results_by_subdivs[$levelref]['count']) ? $results_by_subdivs[$levelref]['count'] : 0;
270
+						$count_subd  += $count;
271
+						$results_by_subdivs[$levelref]['count'] = $count_subd;   
272
+						$results_by_subdivs[$levelref]['transparency'] = Functions::safeDivision($count_subd, $max);
273
+						if($ga->getOptions()->isUsingFlags() && $flags) {
274
+							$results_by_subdivs[$levelref]['place'] = new Place($location, $WT_TREE);
275
+							$results_by_subdivs[$levelref]['flag'] = $flags[$location];
276
+						}
277
+					}
278
+				}             
279 279
                 
280
-                $data->set('map', $ga->getOptions()->getMap());
281
-                $data->set('results_by_subdivisions', $results_by_subdivs);
280
+				$data->set('map', $ga->getOptions()->getMap());
281
+				$data->set('results_by_subdivisions', $results_by_subdivs);
282 282
                 
283
-                $html = ViewFactory::make('GeoAnalysisTabGeneralMap', $this, new BaseController(), $data)->getHtmlPartial();
284
-            }
285
-            else {
286
-                $results = $placesGeneralResults['places'];
287
-                arsort($results);
288
-                $data->set('results', $results);
289
-                $data->set('analysis_level', $ga->getAnalysisLevel());
283
+				$html = ViewFactory::make('GeoAnalysisTabGeneralMap', $this, new BaseController(), $data)->getHtmlPartial();
284
+			}
285
+			else {
286
+				$results = $placesGeneralResults['places'];
287
+				arsort($results);
288
+				$data->set('results', $results);
289
+				$data->set('analysis_level', $ga->getAnalysisLevel());
290 290
                 
291
-                $html = ViewFactory::make('GeoAnalysisTabGeneralTable', $this, new BaseController(), $data)->getHtmlPartial();
292
-            }
293
-        }
294
-        else {
295
-            $html = '<p class="warning">' . I18N::translate('No data is available for the general analysis.') . '</p>';
296
-        }
297
-        return $html;
298
-    }
291
+				$html = ViewFactory::make('GeoAnalysisTabGeneralTable', $this, new BaseController(), $data)->getHtmlPartial();
292
+			}
293
+		}
294
+		else {
295
+			$html = '<p class="warning">' . I18N::translate('No data is available for the general analysis.') . '</p>';
296
+		}
297
+		return $html;
298
+	}
299 299
     
300 300
 	/**
301 301
 	 * Returns HTML code for the GeoAnalysis generations tab.
@@ -305,68 +305,68 @@  discard block
 block discarded – undo
305 305
 	 * @param (null|array) $flags Array of flags
306 306
 	 * @return string HTML code for the generations tab
307 307
 	 */
308
-    protected function htmlPlacesAnalysisGenerationsTab(GeoAnalysis $ga, $placesGenerationsResults, $flags = null) {
309
-        global $WT_TREE;
308
+	protected function htmlPlacesAnalysisGenerationsTab(GeoAnalysis $ga, $placesGenerationsResults, $flags = null) {
309
+		global $WT_TREE;
310 310
         
311
-        if(!empty($placesGenerationsResults) && $ga->getOptions()){
312
-            $data = new ViewBag();
311
+		if(!empty($placesGenerationsResults) && $ga->getOptions()){
312
+			$data = new ViewBag();
313 313
             
314
-            ksort($placesGenerationsResults);
314
+			ksort($placesGenerationsResults);
315 315
             
316
-            $detailslevel = $ga->getOptions()->getMaxDetailsInGen();
317
-            $data->set('max_details_gen', $detailslevel);    
318
-            $data->set('use_flags', $ga->getOptions()->isUsingFlags());
319
-            $data->set('analysis_level', $ga->getAnalysisLevel());
320
-            $display_all_places = !is_null($detailslevel) && $detailslevel == 0;
321
-            $data->set('display_all_places', $display_all_places);
316
+			$detailslevel = $ga->getOptions()->getMaxDetailsInGen();
317
+			$data->set('max_details_gen', $detailslevel);    
318
+			$data->set('use_flags', $ga->getOptions()->isUsingFlags());
319
+			$data->set('analysis_level', $ga->getAnalysisLevel());
320
+			$display_all_places = !is_null($detailslevel) && $detailslevel == 0;
321
+			$data->set('display_all_places', $display_all_places);
322 322
             
323
-            $results_by_gen = array();
324
-            foreach($placesGenerationsResults as $gen => $genData){
325
-                $sum = 0;
326
-                $other = 0;
327
-                $unknown = 0;
328
-                if(isset($genData['sum'])) $sum = $genData['sum'];
329
-                if(isset($genData['other'])) $other = $genData['other'];
330
-                if(isset($genData['unknown'])) $unknown = $genData['unknown'];
323
+			$results_by_gen = array();
324
+			foreach($placesGenerationsResults as $gen => $genData){
325
+				$sum = 0;
326
+				$other = 0;
327
+				$unknown = 0;
328
+				if(isset($genData['sum'])) $sum = $genData['sum'];
329
+				if(isset($genData['other'])) $other = $genData['other'];
330
+				if(isset($genData['unknown'])) $unknown = $genData['unknown'];
331 331
                 
332
-                if($sum > 0) {                
333
-                    $results_by_gen[$gen]['sum'] = $sum;
334
-                    $results_by_gen[$gen]['other'] = $other;
335
-                    $results_by_gen[$gen]['unknown'] = $unknown;
336
-                    $results_by_gen[$gen]['places'] = array();                    
337
-                    arsort($genData['places']);
332
+				if($sum > 0) {                
333
+					$results_by_gen[$gen]['sum'] = $sum;
334
+					$results_by_gen[$gen]['other'] = $other;
335
+					$results_by_gen[$gen]['unknown'] = $unknown;
336
+					$results_by_gen[$gen]['places'] = array();                    
337
+					arsort($genData['places']);
338 338
                     
339
-                    if($display_all_places){
340
-                        foreach($genData['places'] as $placename=> $count){
341
-                            $results_by_gen[$gen]['places'][$placename]['count'] = $count;
339
+					if($display_all_places){
340
+						foreach($genData['places'] as $placename=> $count){
341
+							$results_by_gen[$gen]['places'][$placename]['count'] = $count;
342 342
                             
343
-                            if($ga->getOptions() && $ga->getOptions()->isUsingFlags() && ($flag = $flags[$placename]) != ''){
344
-                                $results_by_gen[$gen]['places'][$placename]['place'] = new Place($placename, $WT_TREE);
345
-                                $results_by_gen[$gen]['places'][$placename]['flag'] = $flag;
346
-                            }
347
-                        }
348
-                    }
349
-                    else {
350
-                        $tmp = $genData['places'];
351
-                        if($other > 0) {
352
-                            $tmp = array_slice($tmp, 0, 5, true);
353
-                            $tmp['other'] = $other;
354
-                            arsort($tmp);  
355
-                        }                      
356
-                        $results_by_gen[$gen]['places'] = array_slice($tmp, 0, 5, true);                        
357
-                    }
358
-                }
359
-            }
343
+							if($ga->getOptions() && $ga->getOptions()->isUsingFlags() && ($flag = $flags[$placename]) != ''){
344
+								$results_by_gen[$gen]['places'][$placename]['place'] = new Place($placename, $WT_TREE);
345
+								$results_by_gen[$gen]['places'][$placename]['flag'] = $flag;
346
+							}
347
+						}
348
+					}
349
+					else {
350
+						$tmp = $genData['places'];
351
+						if($other > 0) {
352
+							$tmp = array_slice($tmp, 0, 5, true);
353
+							$tmp['other'] = $other;
354
+							arsort($tmp);  
355
+						}                      
356
+						$results_by_gen[$gen]['places'] = array_slice($tmp, 0, 5, true);                        
357
+					}
358
+				}
359
+			}
360 360
             
361
-            $data->set('results_by_generations', $results_by_gen);
361
+			$data->set('results_by_generations', $results_by_gen);
362 362
             
363
-            $html = ViewFactory::make('GeoAnalysisTabGenerations', $this, new BaseController(), $data)->getHtmlPartial();
363
+			$html = ViewFactory::make('GeoAnalysisTabGenerations', $this, new BaseController(), $data)->getHtmlPartial();
364 364
             
365
-        }
366
-        else {
367
-            $html = '<p class="warning">' . I18N::translate('No data is available for the generations analysis.') . '</p>';
368
-        }
369
-        return $html;
370
-    }
365
+		}
366
+		else {
367
+			$html = '<p class="warning">' . I18N::translate('No data is available for the generations analysis.') . '</p>';
368
+		}
369
+		return $html;
370
+	}
371 371
         
372 372
 }
373 373
\ No newline at end of file
Please login to merge, or discard this patch.