Skip to content

Οδηγίες για προγραμματιστές

Apostolos Vogklis edited this page Nov 12, 2015 · 1 revision

Οδηγίες για Developers

Προαπαιτούμενα

Για να μπορέσετε να εγκαταστήσετε την εφαρμογής DiavgeiaInsight είναι απαραίτητα τα εξής :

  • Web Server (Apache, IIS, Nginx).

  • Η γλώσσα προγραμματισμού PHP.

  • Σύστημα Διαχερίσης Βάσης Δεδομένων MySQL/MariaDB.

  • Το εργαλείο PHP Composer (https://getcomposer.org/) για την εγκατάσταση και αναβάθμιση επεκτάσεων και εργαλείων.

Εφόσον δεν υπάρχει κάποιο από τα παραπάνω, μπορείτε είτε να τα εγκαταστήσετε μεμονομένα, είτε να κατεβάσετε ένα από τα *AMP πακέτα που κυκλοφορούν, όπως το XAMPP (https://www.apachefriends.org/index.html) ή το WAMP (https://bitnami.com/).

Ρυθμίσεις PHP

Επειδή κάποιες από τις εργασίες που γίνονται στην εφαρμογή, όπως η ενημέρωση των αποφάσεων από τη Διαύγεια, είναι χρονοβόρες, θα χρειαστεί να τροποποιήσουμε δύο (2) παραμέτρους στο αρχείο ρυθμίσεων της PHP (php.ini).

  • max_execution_time : Προτίνεται ο ορισμός μιας αρκετά μεγάλης τιμής (>600sec).

  • memory_limit : Χρειάζεται να οριστεί σε τιμή >1024Μ.

Οι τιμές αυτές είναι μόνο για την περίπτωση της αρχικής ενημέρωσης μέσω του API της Διαύγειας, μπορείτε δηλαδή να τις επαναφέρετε στην αρχική τους κατάσταση.

ΠΡΟΣΟΧΗ : Μετά την τροποποίηση και για να περαστεί η αλλαγή στο σύστημα, θα πρέπει να επανεκκινήσετε τον Web Server.

Το περιβάλλον Yii2

Η εφαρμογή DiavgeiaInsights έχει κατασκευαστεί με το PHP Framework Yii2 (http://www.yiiframework.com/), ένα σύγχρονο PHP framework υψηλών επιδόσεων, κατάλληλο για διαδικτυακές εφαρμογές, που ακολουθεί το μοντέλο MVC (Model – View – Controller).

Περισσότερες πληροφορίες μπορείτε να βρείτε εδώ : http://www.yiiframework.com/doc-2.0/guide-index.html

Οι κατάλογοι και τα αρχεία.

Στον κατάλογο basic, έχουμε εκτός των άλλων τα εξής αρχεία και καταλόγους όπου συνοπτικά :

composer.json : Χρησιμοποιείται για τον ορισμό των επεκτάσεων

config : Βρίσκονται τα αρχεία ρυθμίσεων, κυρίως web.php και db.php

controllers : Οι controllers του συστήματος

messages : Οι μεταφράσεις βασικών λέξεων και φράσεων στο el/app.php

models : Τα models του συστήματος

vendor : Αποθηκεύονται τα αρχεία των βιβλιοθηκών και επεκτάσεων

views : Τα views του συστήματος

web : Τα css και μερικά πρόσθετα για την εμφάνιση

Συγκεκριμένα για τα τρία συστατικά του MVC έχουμε :

models

ContactForm.php

Cpv.php

CpvQuery.php

CpvSearch.php

Decisionsb13.php

Decisionsb13Search.php

Decisionsb21.php

Decisionsb21Search.php

Decisionsb22.php

Decisionsb22Search.php

Decisions.php

DecisionsSearch.php

LoginForm.php

Organisations.php

OrganisationsSearch.php

Preferences.php

PreferencesSearch.php

User.php

views

./cpv:

create.php

_form.php

index.php

_search.php

update.php

view.php

./decisions:

create.php

_form.php

index.php

_search.php

update.php

view.php

./decisionsb13:

create.php

_form.php

index.php

_search.php

update.php

view.php

./decisionsb21:

create.php

_form.php

index.php

_search.php

update.php

view.php

./decisionsb22:

create.php

_form.php

index.php

_search.php

update.php

view.php

./layouts:

main.php

./organisations:

create.php

_form.php

index.php

refreshdata1.php

refreshdata.php

_search.php

update1.php

view.php

./preferences:

create.php

_form.php

index.php

_search.php

update.php

view.php

./results:

index.php

resultsb21a.php

resultsb21b.php

resultsb21c.php

resultsmain.php

./site:

about.php

admin_panel.php

contact.php

error.php

index.php

login.php

refreshdata.php

searchcpv.php

search.php

searchpie.php

updatesettings11.php

controllers

CpvController.php

Decisionsb13Controller.php

Decisionsb21Controller.php

Decisionsb22Controller.php

DecisionsController.php

OrganisationsController.php

PreferencesController.php

ResultsController.php

SiteController.php

Πως αλλάζει η σελίδα των αποτελεσμάτων.

Βασικό μέρος του σχεδιασμού της εφαρμογής ήταν η δυνατότητα στους τελικούς χρήστες να μπορέσουν να δημιουργήσουν και να εμφανίσουν προσωποποιημένα ερωτήματα με βάση τα διαθέσιμα δεδομένα.

Η δυνατότητα αυτή δίνεται στην ενότητα 'Αναζήτηση' όπου θα δείξουμε τη διαδικασία που προσθέτουμε νέα ερωτήματα, αλλά και τον τρόπο που αυτά εμφανίζονται.

Υποθέτουμε ότι θέλουμε να εμφανίσουμε όλους του προμηθευτές ενός οργανισμού, μαζί με τα ποσά που έχουν πάρει και το πλήθος των εντολών πληρωμής στο όνομά τους.

Το SQL ερώτημα είναι το εξής :

SELECT awk.afm as ΑΦΜ, awk.name as ΕΠΩΝΥΜΙΑ, ROUND(SUM(awk.amount), 2) as ΠΟΣΟ, COUNT(awk.amount) as ΠΛΗΘΟΣ, ROUND(AVG(awk.amount), 2) as ΜΟ
FROM decisions as dc, decisionsb21 as db21, amountwithkae as awk
WHERE dc.ada=db21.b21_ada AND awk.awk_ada=dc.ada and dc.organizationId=99206915
GROUP BY awk.afm
ORDER BY ΠΟΣΟ DESC

Για να το μεταφέρουμε στην εφαρμογή μας θα πρέπει να τροποποιήσουμε δύο αρχεία και να προσθέσουμε ένα νέο.

Αρχικά θα πρέπει να προσθέσουμε το χώρο στο αρχείο views/results/resultsmain.php, όπου πολύ απλά δημιουργούμε ένα div με την εξής πληροφορία :

Περιγραφή

Ορισμός Φόρμας με τη σελίδα προορισμό (η οποία θα δημιουργηθεί).
[Απαραίτητα Πεδία]+ (ένα ή περισσότερα)

Το πλήκτρο 'Εμφάνιση'

Ενδεικτικά :

\<div style="text-align: justify;" class="col-lg-4"\>

**\<h4\> Αποφάσεις ανά ΑΦΜ για Οργανισμό \</h4\>**

\<?php

// Form 1 : Decisions per month pew organizations

echo Html::beginForm('index.php?r=results/resultsb21afm', 'post');

// 2. Show selected Organisations

echo '\<label class="control-label"\>Οργανισμοί\</label\>';

echo Select2::widget([

'name' =\> 'select\_orgs',

'data' =\> \$currentOrgs,

'value' =\> '',

'options' =\> [

'placeholder' =\> 'Οργανισμός...',

'multiple' =\> false

],

]);

?\>

\<br\>

\<?php

echo Html::submitButton('Εμφάνιση')

?\>

\<br\>

\<?php

echo Html::endForm();

?\>

\<p\>

\</p\>

\</div\>

Στο αρχείο controllers/ResultsController.php προσθέτουμε μια συνάρτηση (actionResultsb21afm) για τον έλεγχο της νέας σελίδας. Εδώ ελέγχουμε τι στοιχεία θα έχει η _POST μεταβλητή της φόρμας μας καθώς κάνουμε και την αποθήκευση τοπικά του ID του οργανισμού στον πίνακα preferences.

Η παράμετρος Resultsb21afmorgID αποθηκεύεται στη ΒΔ για να μπορέσει να λειτουργήσει η λειτουργία σελιδοποίησης στον πίνακα αποτελεσμάτων.

public function actionResultsb21afm()

{

if(!isset(\$\_POST['select\_orgs']) \|\| empty(\$\_POST['select\_orgs'])) {

\$orgID1 = Preferences::findOne (['pref\_name' =\> 'Resultsb21borgID']);

\$orgID = \$orgID1-\>pref\_value;

Preferences::deleteAll(['pref\_name' =\> 'Resultsb21afmorgID']);

}

else

\$orgID = \$\_POST['select\_orgs'];

Preferences::deleteAll(['pref\_name' =\> 'Resultsb21afmorgID']);

Yii::\$app-\>view-\>params['Resultsb21afmorgID'] = \$orgID;

\$pref = new Preferences();

\$pref-\>pref\_name = 'Resultsb21afmorgID';

\$pref-\>pref\_value = \$orgID;

\$pref-\>save();

return \$this-\>render('resultsb21afm');

}

Και τέλος δημιουργούμε το περιεχόμενο του αρχείου views/resultsb21afm.php

`<?php`

use yii\\helpers\\Html;

use yii\\widgets\\ActiveForm;

use yii\\widgets\\Pjax;

use app\\models\\Preferences;

use dosamigos\\chartjs\\ChartJs;

use kartik\\grid\\GridView;

use yii\\data\\SqlDataProvider;

use yii\\db\\Query;

/\* \@var \$this yii\\web\\View \*/

/\* \@var \$model app\\models\\Decisions \*/

/\* \@var \$form ActiveForm \*/

\$org = \$this-\>params['Resultsb21afmorgID'];

Yii::\$app-\>view-\>params['Resultsb21afmorgID'] = \$org;

//Yii::\$app-\>view-\>params['orgID'] = \$org;

// Ορίζουμε τον Τίτλο της σελίδας

\$this-\>title = 'Αποφάσεις ανά ΑΦΜ για Οργανισμό';

\$this-\>params['breadcrumbs'][] = \$this-\>title;

\$connection = \\Yii::\$app-\>db;

?\>

\<h1\>\<?= Html::encode(\$this-\>title) ?\>\</h1\>

\<div class="row"\>

\<div class="col-lg-9"\>

\<div style="width:100%"\>

\<?php

\$rows = 0;

**// Θέτουμε το SQL ερώτημα**

\$query = "SELECT awk.afm as ΑΦΜ, awk.name as ΕΠΩΝΥΜΙΑ, ROUND(SUM(awk.amount), 2) as ΠΟΣΟ, COUNT(awk.amount) as ΠΛΗΘΟΣ, ROUND(AVG(awk.amount), 2) as ΜΟ

FROM decisions as dc, decisionsb21 as db21, amountwithkae as awk

WHERE dc.ada=db21.b21\_ada AND awk.awk\_ada=dc.ada and dc.organizationId=".\$org."

GROUP BY awk.afm

ORDER BY ΠΟΣΟ DESC

";

**// Γίνεται το ερώτημα και διαβάζουμε τα δεδομένα. Αποθηκεύουμε το ΑΦΜ και το ΠΟΣΟ σε δύο διαφορετικούς πίνακες, για την εμφάνιση του διαγράμματος.**

\$model = \$connection-\>createCommand(\$query);

\$lines = \$model-\>queryAll();

\$label = array();

\$data = array();

foreach (\$lines as \$line) {

**\$label[] = \$line['ΑΦΜ'];**

**\$data[] = \$line['ΠΟΣΟ'];**

\$rows += 1;

}

\$label = array\_slice(\$label, 0, 20);

\$data = array\_slice(\$data, 0, 20);

**// Δημιουργούμε με το ίδιο SQL ερώτημα ένα DataProvider για την εμφάνιση των αποτελεσμάτων στον πίνακα.**

\$dataProvider = new SqlDataProvider([

'sql' =\> "SELECT awk.afm as ΑΦΜ, awk.name as ΕΠΩΝΥΜΙΑ, ROUND(SUM(awk.amount), 2) as ΠΟΣΟ, COUNT(awk.amount) as ΠΛΗΘΟΣ, ROUND(AVG(awk.amount), 2) as ΜΟ

FROM decisions as dc, decisionsb21 as db21, amountwithkae as awk

WHERE dc.ada=db21.b21\_ada AND awk.awk\_ada=dc.ada and dc.organizationId=".\$org."

GROUP BY awk.afm

",

'totalCount' =\> \$rows,

'pagination' =\> [

'pageSize' =\> 20,

],

'sort' =\> [

'attributes' =\> [

'ΠΟΣΟ',

'ΠΛΗΘΟΣ',

'ΜΟ',

'ΑΦΜ'

],

],

]);

//\$searchModel = app\\models\\OrganisationsSearch::findAll();

**// Εμφάνιση του Διαγράμματος**

?\>

\<?= ChartJs::widget([

'type' =\> 'Bar',

'options' =\> [

// 'width' =\> '600px',

//'height' =\> '600px',

],

'data' =\> [

'labels' =\> \$label,

'datasets' =\> [

[

'fillColor' =\> "rgba(220,220,220,0.5)",

'strokeColor' =\> "rgba(220,220,220,1)",

'pointColor' =\> "rgba(220,220,220,1)",

'pointStrokeColor' =\> "\#fff",

'data' =\> \$data,

],

]

]

]);

?\>

**// Εμφάνιση του πίνακα αποτελεσμάτων**

\<hr\>

\<?= GridView::widget([

'dataProvider'=\> \$dataProvider,

//'filterModel' =\> \$searchModel,

//'columns' =\> \$gridColumns,

'responsive'=\>true,

'export'=\>[

'fontAwesome'=\>true,

'showConfirmAlert'=\>false,

'target'=\>GridView::TARGET\_BLANK

],

'hover'=\>true,

'pjax'=\>true,

'showPageSummary'=\>true,

'panel'=\>[

'type'=\>'primary',

'heading'=\>'ΠΟΣΑ ΑΝΑ ΑΦΜ ΓΙΑ ΟΡΓΑΝΙΣΜΟ '.\$org

]

]); ?\>

\</div\>

\</div\>

\</div\>