PHPPamokos.lt


8. Šoninės juostos skydeliai (widgets)

Namų darbai

Šiam namų darbui (v0.5.1) atlikti teko pataisyti porą metodų, kurios parašėme pačioje pradžioje - build_list() (68-93 eilutės) ir get_list() (112-117 eilutės). Abiems buvo pridėta po papildomą argumentą - $options. Tai masyvas, kurio pagalba galima permušti nustatymų reikšmes kurios ateina iš meta laukų ar pagrindinio nustatymų masyvo. Čia taip pat atsirado dvi papildomos reikšmės, kurios anksčiau buvo tiesiog įrašytos į programinį kodą - sąrašo antraštė (title) ir sąrašo klasė (class) - bei naujas filtras - tinyrelated_list_options.

Atlikus šiuos pakeitimus atsirado galimybė iš shortcode() metodo perduoti redaktoriaus žymėje nustatytus atributus (307 eilutė). Taip pat šį funkcionalumą mes išnaudosime tolimesniuose skyriuose, dirbdami su šoninės juostos skydeliais ir ir šablono žymomis.

Skydeliai

Šiame skyriuje toliau kalbame apie 4 pagrindinius būdus, kuriais WordPress įskiepis gali įtakokti WordPress sistemos veikimą, išvesti savo rezultatus ir pridėti naują funkcionalumą:

  • Veiksmų ir filtrų kabliai (hooks)
  • Redaktoriaus žymos (shortcodes)
  • Skydeliai (widgets)
  • Šablono žymos (template tags)

Aptarus kablius (4 skyrius) ir redaktoriaus žymas (7 skyrius), dabar atėjo eilė šoninės juostos skydeliams (angl. widgets).

Skydeliai - nedideli funkciniai blokai, rodomi numatytose temos vietose ir valdomi per WP Admin > Appearance > Widgets langą. Vartotojas gali pasirinkti, kuriuos skydelius rodyti, kokia eilės tvarka ir kuriose skydelių zonose, o taip pat - valdyti atsikrų skydelių nustatymus.

WordPress šerdyje yra įdiegti tokie skydeliai:

  • WP_Widget_Pages - puslapių sąrašas;
  • WP_Widget_Calendar - kalendorius;
  • WP_Widget_Archives - įrašų archyvo nuorodos;
  • WP_Widget_Links - nuorodų sąrašas
  • WP_Widget_Meta - „Meta“ skydelis - prisijungimo/atsijungimo nuorodos ir pan.;
  • WP_Widget_Search - paieškos forma;
  • WP_Widget_Text - teksto blokas;
  • WP_Widget_Categories - kategorijų sąrašas;
  • WP_Widget_Recent_Posts - naujiausių įrašų sąrašas;
  • WP_Widget_Recent_Comments - naujausių komentarų sąrašas;
  • WP_Widget_RSS - RSS srautas;
  • WP_Widget_Tag_Cloud - žymų debesis;
  • WP_Nav_Menu_Widget - navigacijos meniu.

Papildomus skydelius taip pat gali pridėti (arba pakeisti standartinius) išvaizdos temos ir įskiepiai. Tam reikia dviejų dalykų:

  1. sukurti naują klasę, išplečiančią WP_Widget;
  2. užregistruoti naująjį įskiepį naudojant funkciją register_widget();

Sukūrimas

class My_Widget extends WP_Widget {

    public function __construct() {
        // widget actual processes
    }

    public function widget( $args, $instance ) {
        // outputs the content of the widget
    }

    public function form( $instance ) {
        // outputs the options form on admin
    }

    public function update( $new_instance, $old_instance ) {
        // processes widget options to be saved
    }
}

Jūsų sukurta klasė (žr. pavyždį aukščiau) turėtų turėti šiuos keturis metodus:

  1. __construct() - skydelio registracija;
  2. widget() - skydelio turinys - kas rodoma lankytojams;
  3. form() - nustatymų forma - kas rodoma vartotojui, kai jis pasirenka skydelio nustatymus;
  4. update() - skydelio nustatymų apdorojimas ir išsaugojimas;

Žemiau, platesnis, jau veikiantis pavyzdys. Šis skydelis turės vieną nustatymą - Vardas ir išspausdins "Labas, $vardas".

class My_Widget extends WP_Widget {

  public function __construct() {
    parent::__construct(
      'my_widget', // Base ID
      'Mano skydelis', // Name
      array( 'description' => 'Labas, pasauli', ) // Args
    );
  }

  public function widget( $args, $instance ) {
    echo $args['before_widget'];
    if ( ! empty( $instance['title'] ) ) {
      echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ). $args['after_title'];
    }
    echo "Labas, {$instance['vardas']}";
    echo $args['after_widget'];
  }

  public function form( $instance ) {
    if ( isset( $instance[ 'title' ] ) ) {
      $title = $instance[ 'title' ];
    }
    else {
      $title = 'Mano skydelis';
    }
    if ( !isset( $instance['vardas'] ) ) {
      $instance['vardas'] = '';
    }
    ?>
    <p>
    <label for="<?php echo $this->get_field_id( 'title' ); ?>">Title:</label> 
    <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
    </p>
    <p>
    <label for="<?php echo $this->get_field_id( 'vardas' ); ?>">Vardas:</label> 
    <input class="widefat" id="<?php echo $this->get_field_id( 'vardas' ); ?>" name="<?php echo $this->get_field_name( 'vardas' ); ?>" type="text" value="<?php echo esc_attr( $instance['vardas'] ); ?>">
    </p>
    <?php 
  }

  public function update( $new_instance, $old_instance ) {
    $instance = array();
    $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
    $instance['vardas'] = ( ! empty( $new_instance['vardas'] ) ) ? strip_tags( $new_instance['vardas'] ) : '';
    return $instance;  
  }
}

// register Foo_Widget widget
function register_my_widget() {
    register_widget( 'My_Widget' );
}
add_action( 'widgets_init', 'register_my_widget' );

Šio kodo rezultatas atrodys štai taip:

Naikinimas / keitimas

Jeigu norite panaikinti jau esamą skydelį, pirmiausiai reikės jį išregistruoti, o tuomet įregistruoti savo pataisytą klasę:

function replace_my_widget() {
  unregister_widget( 'WP_Widget_Text' );  
  register_widget( 'My_Widget_Text' );
}
add_action( 'widgets_init', 'replace_my_widget' );

class My_Widget_Text extends WP_Widget_Text {...}

the_widget()

Kartais reikia skydelį išvesti nestandartinėje išvaizdos temos vietoje - ne skydelių zonoje, o kur nors kitur. Tam temos kūrėjas gali panaudoti šablono žymą the_widget( $widget, $instance, $args ).

  • $widget - skydelio, kurį norite įterpti, klasės pavadinimas, pvz. 'WP_Widget_Text';
  • $instance - masyvas su skydelio nustatymasis, pvz. array('title'=>'Pavadinimas','text'=>'Tekstas);
  • $args - šoninės juostos nustatymai, pvz. array('before_widget'=>'<div>', 'after_widget'=>'</div>')

tinyRelated v0.6.0

Šiame skyriuje tinyRelated įskiepiui sukursime skydelį. Skydelis bus matomas tik lankytojui esant atskiro įrašo lange ir turės du nustatymus - pavadinimą ir rodomų įrašų skaičių. Tai pasiekiama v0.6.0 versijoje atliekant tokius pakeitimus:

  1. Sukurta skydelio klasė tinyRelated_Widget (nuo 318 eilutės);
  2. Sukurtas skydelio registravimo metodas widget() pagrindinėje įskiepio klasėje (313-315 eilutės);
  3. Metodas widget prikabintas prie widgets_init kablio (38 eilutė);

Galutinis rezultatas:

Namų darbai

Kažkokių didelių gudrybių su tinyRelated skydeliu nenuveiksime, todėl šį kartą namų darbai - truputį iš kitos operos. Mūsų pagrindinis įskiepio fainas, tinyrelated.php, pamažu bet užtikrintai auga ir netrukus pasieks 400 kodo eilučių. Turbūt pats laikas - šiek tiek apsitvarkyti ir viską sustruktūruoti.

  1. Iškelkite tinyRelated_Widget klasę į atskirą failą;
  2. Visus initializavimo veiksmus (30-39 eilutė) perkelkite į naują init() metodą ir jį prikabinkite prie ankstyviausio (plugins_loaded) kablio.


(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com