WordPress-widgetit: Refaktorointi, osa 10
Mitä tulee WordPress Widget Boilerplaten uudelleenjärjestelyyn, olemme hyvässä paikassa. Paljon työtä on tehty niin, että uusien luokkien, ominaisuuksien ja toimintojen käyttöönoton pitäisi olla paljon helpompaa.
Eikä vain sitä: Sen pitäisi olla helpompi seurata.
Kiitos edellisen postauksen työstä, meillä on paljon tehtävää – nimittäin perushallinnollinen käyttöliittymä.
Lopuksi viimeisessä viestissä sanottiin:
Muutaman seuraavan artikkelin aikana tämä kehittyy edelleen, mutta kuten näet, varmistamme, että meillä on yksi perustoimintoluokka WordPressin kanssa keskustelua varten ja luokka erityisesti hallinnollisen lomakkeen renderöintiä varten.
Ja siitä aiomme poimia tässä artikkelissa. Tarkastelemme erityisesti tietojen puhdistamista ja sarjoittamista sekä widgetiin tallennettujen tietojen hakemista.
WordPress Widget Boilerplate: Refactoring osa 10
Käyttöliittymän refaktorointi
Ennen kuin aloitamme serialisoinnin, meidän on tehtävä joitain pieniä töitä hallinnollisen näkymämme suhteen. Muista sarjan aiemmista viesteistä, että olemme rakentaneet lomakkeen, joka hyväksyy:
- titteli,
- jotain sisältöä,
- ja valintaruutu.
Tämä näkyy hienosti, mutta se ei sisällä joitakin Widgets API :n tärkeimpiä ominaisuuksia. Meidän on nimittäin varmistettava, että nimeämme elementit oikein seuraavilla funktioilla:
Ja sitten kirjoitamme funktiomme nimeltä get, jonka selitän hetken.
Yllä olevat toiminnot ovat välttämättömiä, koska ne auttavat WordPressiä seuraamaan kuinka monta widgetin esiintymää on käytössä ja mitä käyttäjä muokkaa. Toisin sanoen, saamme paljon toimintoja ilmaiseksi.
Ennen kuin näytän sinulle koodin, haluan keskustella lyhyesti esittelemän get – toiminnon tarkoituksesta. Lyhyesti sanottuna se on tapa, jolla voimme välittää avain (kuten avain/arvo-parin avaimessa) funktioon ja saada se sitten helposti hakemaan arvon, jotta se pitää käyttöliittymämme mahdollisimman puhtaana.
Joten ensin hakumenetelmä :
<?php
/**
* If the value for the key exists in the current instance of the widget, then it will
* retrieve it. Otherwise, it will return an empty value.
*
* @param string $key the used to identify the value of the widget.
* @param array $instance the options for the instance of this widget
*/
protected function get($key, $instance)
{
return empty($instance[$key])? '': $instance[$key];
}
Tärkeää on huomata, että tämä menetelmä ei hyväksy ainoastaan lukemamme arvon avainta, vaan myös taulukon esiintymään viittaavan taulukon.
Ja nyt, uudelleen muotoiltu käyttöliittymä :
<?php
/*
* This file is part of WordPress Widget Boilerplate
* (c) Tom McFarlin <tom@tommcfarlin.com>
*
* This source file is subject to the GPL license that is bundled
* with this source code in the file LICENSE.
*/
?>
<div class="widget-content">
<p>
<input
type="text"
id="<?php echo esc_attr($this->get_field_id('title')); ?>"
name="<?php echo esc_attr($this->get_field_name('title')); ?>"
value="<?php echo $this->get('title', $instance) ?>"
placeholder="Widget Title"
class="widefat"
/>
</p>
<p>
<textarea
id="<?php echo esc_attr($this->get_field_id('content')); ?>"
name="<?php echo esc_attr($this->get_field_name('content')); ?>"
placeholder="Widget Content"
style="width:100%;"><?php echo $this->get('content', $instance) ?></textarea>
</p>
<p>
<input
type="checkbox"
value="on"
name="<?php echo esc_attr($this->get_field_name('display-title')); ?>"
id="<?php echo esc_attr($this->get_field_id('display-title')); ?>"
<?php checked('on', $this->get('display-title', $instance), true); ?>
class="checkbox"
/>
<label for="<?php echo esc_attr($this->get_field_id('display-title')); ?>">Display Title?</label>
</p>
</div><!-- .widget-content -->
Mutta tämä jättää silti toiminnallisuuden puutteen ja se jättää meille työtä. Meidän on nimittäin desinfioitava tiedot ja lähetettävä ne takaisin WordPressille, jotta se tallentaa tiedot.
Puhdistus ja serialisointi
Esimerkkimme tarkoituksia varten aiomme olla hyvin tiukkoja siinä, mitä sallimme. Nimittäin tuemme vain perustekstiä ja poistamme kaiken aggressiivisesti.
Tämä tarkoittaa, että emme salli merkintöjä tai muuta vastaavaa. Sen sijaan poistamme kaiken, mikä ei ole perustekstiä. Voimme koristella sitä hieman, kun on aika laittaa se esille, mutta jätämme sen sopivaan postaukseen.
Tätä varten käytämme seuraavia toimintoja:
Muista, että widgetissämme on kaksi kenttää – otsikkokenttä ja sisältökenttä. Rakentamasi widgetin tyypistä riippuen saatat tarvita vain yhden luokan tai funktion tietojen puhdistamiseen. Muissa tilanteissa saatat tarvita jotain monimutkaisempaa.
Pidä tämä mielessä, kun käymme läpi tätä koodia, koska tämä ei tule olemaan yksi kokoinen ratkaisu. Sen sijaan se on nimenomaan tätä varten.
Joka tapauksessa tietojen desinfioimiseksi kirjoitamme luokan erityisesti tätä tarkoitusta varten ja annamme sen sitten WidgetAdmin-luokkamme saataville.
Tässä on luokka kokonaisuudessaan seurattavalla kuvauksella:
<?php
/*
* This file is part of WordPress Widget Boilerplate
* (c) Tom McFarlin <tom@tommcfarlin.com>
*
* This source file is subject to the GPL license that is bundled
* with this source code in the file LICENSE.
*/
namespace WordPressWidgetBoilerplateWordPress;
/**
* Santiizes and saves the data for the widget.
*/
class WidgetSerializer
{
/**
* Updates the values of the widget. Sanitizes the information before saving it.
*
* @param array $newInstance the array of new options to save
*/
public function update($newInstance)
{
$instance = [];
foreach ($newInstance as $key => $value) {
$instance[$key] = strip_tags(
stripslashes($value)
);
}
return $instance;
}
}
Luokan tulee olla suoraviivaista. Se ottaa vastaan widgetin saapuvat arvot, puhdistaa ne ja palauttaa sitten uuden taulukon, joka palautetaan WordPressille.
Siinä on kuitenkin saalis. Tämän luokan on oltava viimeisessä viestissä näytetyn Widget -pääluokan ominaisuus.
Toiseksi päivitysmenetelmä, joka on osa Widgets API:ta, kutsuu tähän luokkaan. $oldInstance- muuttujaa ei tarvitse välittää serialisaattoriin, mutta se on pakollinen päivitysmenetelmässä.
Tässä on Widget – luokka sellaisena kuin se tällä hetkellä on rakennettu :
<?php
/*
* This file is part of WordPress Widget Boilerplate
* (c) Tom McFarlin <tom@tommcfarlin.com>
*
* This source file is subject to the GPL license that is bundled
* with this source code in the file LICENSE.
*/
namespace WordPressWidgetBoilerplateWordPress;
use WP_Widget;
class Widget extends WP_Widget
{
/**
* @var string unique identifier for your widget
*/
protected $widgetSlug;
/**
* Initializes the plugin by setting its properties and calling the parent class with the description.
*
* @param string $widgetSlug unique identifier for your widget
* @param WidgetSerializer $widgetSerializer the class responsible for saving widget options
*/
public function __construct($widgetSlug)
{
$this->widgetSlug = $widgetSlug;
parent::__construct(
$this->getWidgetSlug(),
__('Widget Name', $this->getWidgetSlug()),
[
'classname' => $this->getWidgetSlug().'-class',
'description' => __('Short description of the widget goes here.', $this->getWidgetSlug()),
]
);
}
/**
* Return the widget slug.
*
* @return string slug variable
*/
public function getWidgetSlug()
{
return $this->widgetSlug;
}
/**
* Displays the administrative view of the form and includes the options
* for the instance of the widget as arguments passed into the function.
*
* @param array $instance the options for the instance of this widget
*/
public function form($instance)
{
include plugin_dir_path(__FILE__).'Views/Admin.php';
}
/**
* Updates the values of the widget. Uses the serialization class to sanitize the
* information before saving it.
*
* @param array $newInstance the values to be sanitized and saved
* @param array $oldInstance the values that were originally saved
*/
public function update($newInstance, $oldInstance)
{
return $this->widgetSerializer->update($newInstance, $oldInstance);
}
/**
* If the value for the key exists in the current instance of the widget, then it will
* retrieve it. Otherwise, it will return an empty value.
*
* @param string $key the used to identify the value of the widget
* @param array $instance the options for the instance of this widget
*/
protected function get($key, $instance)
{
return empty($instance[$key])? '': $instance[$key];
}
}
Mutta jos päivität sivun, saatat huomata, että desinfiointi ja serialisointi eivät näytä toimivan tietoja haettaessa. Ja sitä aiomme tarkastella seuraavassa postauksessa.
Haetaan tietoja
Huomaa, että vaikka toiminnot vaikuttavat epätäydelliseltä tässä (koska puhdistamattomat tiedot näkyvät edelleen), olemme keskittyneet varmistamaan, että kirjoitamme luokkia johdonmukaisesti, vastuullisesti ja jotka eivät ole tiukasti kytkettyjä.
Aiomme toistaa tätä hieman enemmän seuraavassa postauksessa. Joten tutki yllä olevaa koodia, ota se käyttöön, jos olet tehnyt niin, ja jatkamme siitä seuraavassa viestissä.