Open eClass Widgets (Μικροεφαρμογές)

Ένα widget εγκαθίσταται μέσα στον φάκελο widgets στο root του openeclass και πρέπει να ακολουθούν την παρακάτω δομή φακέλων και αρχείων:

Παράδειγμα δημιουργία ενός hello world widget

Αρχείο HelloWorldWidget.php

<?php 
// Widget's namespace should always follow folder structure (according to PSR-2 autoloading)
namespace Widgets\Openeclass\HelloWorld; 
// These declarations are mandatory 
use Widgets\Widget;
use Widgets\WidgetWidgetArea;
use Widgets\WidgetInterface;

// A widget's class should always extend class "Widget" and implement WidgetInterface
class HelloWorldWidget extends Widget implements WidgetInterface {
  
    public function __construct() {  
        parent::__construct();
        
        /* Supported languages
         * [el] => Ελληνικά, [en] => English, [es] => Español, [cs] => Česky, [sq] => Shqip,
         * [bg] => Български, [ca] => Català, [da] => Dansk, [nl] => Nederlands, [fi] => Suomi,
         * [fr] => Français [de] => Deutsch [is] => Íslenska [it] => Italiano [jp] => 日本語 [pl] => Polski [ru] => Русский [tr] => Türkçe [sv] => Svenska
         * 
         * Fallback language is English
         */        
        $this->name = array(
            'en' => 'Hello World',
            'el' => 'Γεια σου κόσμε'     
        );
        $this->description = array(
            'en' => 'This is a widget simply for widget creation reference',
            'el' => 'Ένα widget ως αναφορά για την δημιουργία άλλων widgets από τους προγραμματιστές'     
        );               
    }
    
    public static function install()
    {
        /* START CUSTOM CODE */

        /* END CUSTOM CODE */
        return self::register_widget();
    }
    
    public static function uninstall()
    {
        /* START CUSTOM CODE */

        /* END CUSTOM CODE */        
        return self::unregister_widget();
    }
    public function run($widget_widget_area_id)
    {
        $this->initialize_widget_data($widget_widget_area_id);
        /* START CUSTOM CODE */

        /* END CUSTOM CODE */
        return widget_view("run", $this->view_data);

    }
    public function getOptionsForm($widget_widget_area_id)
    {
        $this->initialize_widget_data($widget_widget_area_id);
        //START CUSTOM CODE

        //END CUSTOM CODE
        return widget_view("options", $this->view_data);
    }

}

Αντίστοιχα αρχεία blade

run.blade.php

    <div class="panel">
        <div class="panel-body">
              <h1>Hello World! Nice to meet you!</h1>
        </div>
    </div>

option.blade.php

// We live the file empty as there are no options in our hello world widget

Χρήσιμες functions και variables

widget_view() και $this→view_data

Για να περάσουμε μια variable σε ένα blade view απλά χρησιμοποιούμε τον $this→view_data πίνακα.

Παράδειγμα

$this->view_data['announcements'] = Database::get()->queryArray("SELECT * FROM announcement");
return widget_view("run", $this->view_data);

Για να εμφανίσουμε το αποτέλεσμα στο Blade view θα κάναμε το παρακάτω

@foreach ($announcements as $announcement)
<li>{{ $announcement->title }}</li>
@endforeach

widget_css_link() και widget_js_link()

Για να συμπεριλάβουμε css και js αρχεία που βρίσκονται στους φακέλους css και js αντίστοιχα του φακέλου του widget χρησιμοποιούμε τις functions widget_css_link() και widget_js_link() σύμφωνα με το παρακάτω παράδειγμα

        widget_css_link('clock.css', $this->folder);
        widget_js_link('clock.js', $this->folder);

widget_tbl_name()

Οι ονοματοδοσία πινάκων μιας μικροεφαρμογής ακολουθεί συγκεκριμένο πρότυπο (wdgt_{developer_team}_{onoma_pinaka}).

Για να παράγουμε ένα τέτοιο όνομα εύκολα μπορούμε να χρησιμοποιήσουμε την function widget_tbl_name() σύμφωνα με τα παρακάτω παραδείγματα.

<?php namespace Widgets\Openeclass\Clock;
use Widgets\Widget;
use Widgets\WidgetWidgetArea;
use Widgets\WidgetInterface;
class ClockWidget extends Widget implements WidgetInterface {
...
    public static function install()
    {
        $tbl_name = self::widget_tbl_name();
        \Database::get()->query("CREATE TABLE IF NOT EXISTS $tbl_name (
          `id` int(11) NOT NULL auto_increment PRIMARY KEY,
          `whatever` varchar(255) NOT NULL)");        
        return self::register_widget();
    }
    
    public static function uninstall()
    {  
        $tbl_name = self::widget_tbl_name();
        \Database::get()->query("DROP TABLE IF EXISTS $tbl_name");
        return self::unregister_widget();
    }

Στην παραπάνω περίπτωση ο πίνακας που θα δημιουργείται κατά την εγκατάσταση της μικροεφαρμογής είναι ο wdgt_openeclass_clock Εναλλακτικά θα μπορούμε να παραλλάξουμε το όνομα του πίνακα που δημιουργείται περνώντας στην function κάποιο string ως εξής:

  $tbl_name = self::widget_tbl_name('time');

Το παραπάνω θα δημιουργούσε έναν πίνακα με όνομα wdgt_openeclass_time