{"id":231441,"date":"2022-12-20T17:45:00","date_gmt":"2022-12-20T14:45:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231441"},"modified":"2022-12-07T10:15:39","modified_gmt":"2022-12-07T07:15:39","slug":"wordpress-widgetit-refaktorointi-osa-12","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-widgetit-refaktorointi-osa-12\/","title":{"rendered":"WordPress-widgetit: Refaktorointi, osa 12"},"content":{"rendered":"\n<p>Mit\u00e4 tulee WordPress Widget Boilerplaten uudelleenmuodostukseen \u2013 varsinkin kun otetaan huomioon, kuinka pitk\u00e4lle olemme p\u00e4\u00e4sseet projektin alkamisesta kahdeksan vuotta sitten \u2013 olemme tehneet paljon ty\u00f6t\u00e4.<\/p>\n<p>Olemme saaneet sen paljon nykyaikaisempaan standardiin ja teemme sen kanssa ty\u00f6skentelyst\u00e4 paljon helpompaa, jotta tulevien widgetien rakentamisen pit\u00e4isi olla helpompaa. Ja t\u00e4m\u00e4 ei johdu pelk\u00e4st\u00e4\u00e4n kattilalevyn standardista, vaan oliokeskeisest\u00e4 standardista, joten yll\u00e4pidon ja koodin laatu on korkeampi.<\/p>\n<p>Viimeisess\u00e4 viestiss\u00e4 p\u00e4\u00e4timme suuren osan hallintoalueen ty\u00f6st\u00e4 ja olemme valmiita aloittamaan ty\u00f6mme k\u00e4ytt\u00f6liittym\u00e4n koodin parissa.<\/p>\n<p>Sanoimme:<\/p>\n<blockquote>\n<p>Seuraavaksi aiomme tarkastella sis\u00e4ll\u00f6n render\u00f6imist\u00e4 k\u00e4ytt\u00f6liittym\u00e4ss\u00e4. Olemme l\u00e4hestym\u00e4ss\u00e4 Boilerplaten uudelleenmuodostuksen loppua, mutta viel\u00e4 on v\u00e4h\u00e4n teht\u00e4v\u00e4\u00e4 ennen kuin olemme valmiita yhdist\u00e4m\u00e4\u00e4n sen koodikannan p\u00e4\u00e4haaraan.<\/p>\n<\/blockquote>\n<p>Joten t\u00e4ss\u00e4 postauksessa aiomme jatkaa siell\u00e4. Nyt jos olet seurannut t\u00e4h\u00e4n asti, sinulla pit\u00e4isi olla kaikki mit\u00e4 tarvitset kehityshaaralta.<\/p>\n<p>Jos ei, muista vet\u00e4\u00e4 se, sill\u00e4 aiomme poimia siit\u00e4 postauksen loppuosassa.<\/p>\n<h2>WordPress Widget Boilerplate: Refactoring osa 12<\/h2>\n<p>Mit\u00e4 tulee k\u00e4ytt\u00f6liittym\u00e4\u00e4n, on helppo ajatella, ett\u00e4 k\u00e4ytt\u00f6liittym\u00e4 on mit\u00e4 tahansa, mit\u00e4 k\u00e4ytt\u00e4j\u00e4 n\u00e4kee edess\u00e4\u00e4n riippumatta siit\u00e4, onko se hallinnollisella alueella vai ei.<\/p>\n<p>T\u00e4ss\u00e4 sarjassa on kuitenkin ollut selv\u00e4\u00e4, ett\u00e4 jaamme k\u00e4ytt\u00e4j\u00e4n n\u00e4kem\u00e4n hallinnollisen alueen ja sivuston julkisen alueen kesken.<\/p>\n<p>Aiomme siis kehitt\u00e4\u00e4 koodin aluetta, joka tuottaa tietoja k\u00e4ytt\u00e4j\u00e4lle sivuston julkisella alueella. Aloitamme yksinkertaisesti lukemalla tiedot ja n\u00e4ytt\u00e4m\u00e4ll\u00e4 ne.<\/p>\n<p>Seuraavassa viestiss\u00e4 tarkastelemme ty\u00f6skentely\u00e4 ehdollisen logiikan kanssa joidenkin vaihtoehtojen osalta n\u00e4hd\u00e4ksemme, onko meid\u00e4n teht\u00e4v\u00e4 jotain.<\/p>\n<p>T\u00e4m\u00e4n j\u00e4lkeen siirryt\u00e4\u00e4n koodiin.<\/p>\n<h3>N\u00e4yt\u00e4mme datasta<\/h3>\n<p>Muista, ett\u00e4 widgetill\u00e4 on t\u00e4ss\u00e4 vaiheessa kolme asiaa, jotka vaikuttavat sen n\u00e4ytt\u00f6\u00f6n:<\/p>\n<ol>\n<li>widgetin otsikko,<\/li>\n<li>widgetin sis\u00e4lt\u00f6,<\/li>\n<li>kytkin, joka m\u00e4\u00e4ritt\u00e4\u00e4, pit\u00e4isik\u00f6 meid\u00e4n n\u00e4ytt\u00e4\u00e4 otsikko vai ei<\/li>\n<\/ol>\n<p>Kolmas vaihtoehto on ensisijaisesti n\u00e4ytt\u00e4\u00e4, miten erityyppist\u00e4 elementti\u00e4 k\u00e4ytet\u00e4\u00e4n. Koska teknisesti, jos emme haluaisi n\u00e4ytt\u00e4\u00e4 widgetin otsikkoa, emme vain laittaisi widgetiin mit\u00e4\u00e4n.<\/p>\n<p>Mutta mielest\u00e4ni se auttaa osoittamaan eri elementtityyppien ja niiden arvojen k\u00e4ytt\u00e4misen k\u00e4yt\u00e4nn\u00f6llisell\u00e4 (tai puolik\u00e4yt\u00e4nn\u00f6llisell\u00e4) tavalla.<\/p>\n<p>Joka tapauksessa tied\u00e4mme, ett\u00e4 jokaisen widgetin esiintym\u00e4n tiedot tallennetaan WordPressin tarjoaman <strong>otsikon<\/strong>, <strong>sis\u00e4ll\u00f6n<\/strong> ja <strong>n\u00e4ytt\u00f6otsikon<\/strong> nimen ja tunnuksien kanssa.<\/p>\n<p>Siksi k\u00e4yt\u00e4mme niit\u00e4 k\u00e4ytt\u00f6liittym\u00e4koodissamme arvojen n\u00e4ytt\u00e4miseen.<\/p>\n<h3>N\u00e4ytt\u00f6toimintojen valmistelu<\/h3>\n<p>Tyypillisesti <strong>widget<\/strong> &#8211; toiminto vastaa widgetin tulosteen n\u00e4ytt\u00e4misest\u00e4. Mutta yksi asioista, joita olemme yritt\u00e4neet tehd\u00e4, on erottaa widgetimme huolenaiheet kohdistetuiksi luokiksi ja toiminnoiksi.<\/p>\n<p>Ensimm\u00e4inen asia, jonka haluamme tehd\u00e4, on kirjoittaa <strong>WidgetDisplay-<\/strong> luokka, joka vastaa, kuten on varmasti ilmeist\u00e4, widgetin sis\u00e4ll\u00f6n n\u00e4ytt\u00e4misest\u00e4.<\/p>\n<p>Toistaiseksi t\u00e4m\u00e4 sis\u00e4lt\u00e4\u00e4 ehdoitta otsikon, sis\u00e4ll\u00f6n ja sen arvon, sis\u00e4llytet\u00e4\u00e4nk\u00f6 otsikko vai ei. WordPress tarjoaa my\u00f6s tietyn sis\u00e4ll\u00f6n, kuten merkinn\u00e4t, joiden pit\u00e4isi n\u00e4ky\u00e4 ennen widgeti\u00e4 ja widgetin j\u00e4lkeen, joten varmistamme, ett\u00e4 sis\u00e4llyt\u00e4mme my\u00f6s sen.<\/p>\n<p>Mutta ensin <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-00-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tyhjennet\u00e4\u00e4n luokka<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace WordPressWidgetBoilerplateWordPress;\n\nclass WidgetDisplay\n{\n  private $widgetSlug;\n\n  public function __construct(string $widgetSlug)\n  {\n      $this-&gt;widgetSlug = $widgetSlug;\n  }\n\n  public function show($args, $instance)\n  {\n    \/\/ More to come\n  }\n}\n<\/code><\/pre>\n<p>Sen j\u00e4lkeen meid\u00e4n on varmistettava, ett\u00e4 kirjoitamme sen my\u00f6s muille luokille. Ensin varmistamme, ett\u00e4 sis\u00e4llytet\u00e4\u00e4n <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-01-widget-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">se widget-luokkaamme<\/a> :<\/p>\n<pre><code>&lt;?php\npublic function widget($args, $instance)\n{\n    return $this-&gt;widgetDisplay-&gt;show($args, $instance);\n}<\/code><\/pre>\n<p>Ja sitten <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-02-widget-admin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">lis\u00e4\u00e4mme sen WidgetAdmin-luokkaan<\/a> (koska t\u00e4ss\u00e4 ovat Widget-sovellusliittym\u00e4n ydintoiminnot \u2013 se vain siirt\u00e4\u00e4 vastuun oikealle luokalle):<\/p>\n<pre><code>&lt;?php\n\npublic function __construct($widgetSlug)\n{\n    parent::__construct($widgetSlug);\n    $this-&gt;widgetSerializer = new WidgetSerializer($this-&gt;getWidgetSlug());\n    $this-&gt;widgetDisplay = new WidgetDisplay($this-&gt;getWidgetSlug());\n}<\/code><\/pre>\n<p>T\u00e4ss\u00e4 vaiheessa emme viel\u00e4 n\u00e4yt\u00e4 mit\u00e4\u00e4n. Olemme l\u00e4hell\u00e4 ja keskitymme siihen pian.<\/p>\n<h3>Datan n\u00e4ytt\u00e4minen<\/h3>\n<p>Olettaen, ett\u00e4 pystyt lis\u00e4\u00e4m\u00e4\u00e4n yll\u00e4 olevan koodin ilman virheit\u00e4, on aika n\u00e4ytt\u00e4\u00e4 widgetin sis\u00e4lt\u00f6.<\/p>\n<p>Voimme tehd\u00e4 t\u00e4m\u00e4n monella eri tavalla yksinkertaisesta <strong>var_dump<\/strong> -tiedostosta sis\u00e4ll\u00f6n n\u00e4ytt\u00e4miseen k\u00e4ytt\u00e4j\u00e4yst\u00e4v\u00e4llisemm\u00e4ll\u00e4 tavalla. Ja olen enemm\u00e4n j\u00e4lkimm\u00e4isen fani.<\/p>\n<p>Joten tehd\u00e4\u00e4n se.<\/p>\n<p><strong>Lis\u00e4\u00e4 WidgetDisplay-<\/strong> luokkasi show <strong>&#8211;<\/strong> toimintoon <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-04-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seuraava koodi<\/a> :<a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-04-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a><\/p>\n<pre><code>&lt;?php\npublic function show($args, $instance)\n{\n    include_once 'Views\/Widget.php';\n}<\/code><\/pre>\n<p>Ja sitten mallin n\u00e4kym\u00e4 voi olla n\u00e4in <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-03-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">yksinkertainen<\/a> :<\/p>\n<pre><code>&lt;div id=\"&lt;?php echo $args['id']; ?&gt;\"&gt;\n    &lt;h3 class=\"widget-title\"&gt;&lt;?php echo $instance['title']; ?&gt;&lt;\/h3&gt;\n    &lt;p&gt;&lt;?php echo $instance['content']; ?&gt;&lt;\/p&gt;\n    &lt;pre&gt;&lt;?php echo $instance['display-title']; ?&gt;&lt;\/pre&gt;\n&lt;\/div&gt;&lt;!-- #&lt;?php echo $args['id']; ?&gt;--&gt;<\/code><\/pre>\n<p>T\u00e4m\u00e4 varmistaa, ett\u00e4 kaiken widgeti\u00e4 edelt\u00e4v\u00e4n sis\u00e4ll\u00f6n oikea merkint\u00e4, widgetin sis\u00e4lt\u00f6 ja sis\u00e4lt\u00f6 render\u00f6id\u00e4\u00e4n oikein.<\/p>\n<p>Muista j\u00e4lleen, ett\u00e4 n\u00e4yt\u00e4mme sis\u00e4lt\u00f6\u00e4, jota ei ole t\u00e4m\u00e4n lopullisessa versiossa, mutta olemme l\u00e4hestym\u00e4ss\u00e4 ja k\u00e4sittelemme sit\u00e4 seuraavassa viestiss\u00e4.<\/p>\n<p>Suosittelen leikkim\u00e4\u00e4n <strong>N\u00e4yt\u00e4 otsikko<\/strong> -vaihtoehdon kanssa n\u00e4hd\u00e4ksesi, kuinka se hahmonnetaan k\u00e4ytt\u00f6liittym\u00e4ss\u00e4 tarjoamamme merkinn\u00e4n perusteella.<\/p>\n<p>T\u00e4ll\u00e4 hetkell\u00e4 widgetin tulosteen pit\u00e4isi n\u00e4ytt\u00e4\u00e4 suunnilleen t\u00e4lt\u00e4:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160763-61e7125f80aab.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160763-61e7125f80aab.png\" alt=\"WordPress-widgetit: Refaktorointi, osa 12\" ><\/a><\/p>\n<p>Mutta se on kaikki mit\u00e4 t\u00e4ss\u00e4 postauksessa on katettava.<\/p>\n<h2>Lopulliseen Refaktoriin<\/h2>\n<p>Viimeinen asia, jota tarkastelemme t\u00e4m\u00e4n j\u00e4lkeen, on ehdollisen logiikan tiukentaminen ja sana v\u00e4limuistiin tallentamisesta (koska teemme sit\u00e4 jo aiemmissa viesteiss\u00e4).<\/p>\n<p>Toistaiseksi voit kuitenkin leikitell\u00e4, mit\u00e4 meill\u00e4 on t\u00e4\u00e4ll\u00e4, sek\u00e4 koodilla, jota emme ole sis\u00e4llytt\u00e4neet (kuten mit\u00e4 voidaan n\u00e4ytt\u00e4\u00e4 ennen widgeti\u00e4 tai sen j\u00e4lkeen.<\/p>\n<p>Ne on j\u00e4tetty tarkoituksella pois t\u00e4st\u00e4 esimerkist\u00e4, mutta niit\u00e4 ei v\u00e4ltt\u00e4m\u00e4tt\u00e4 aina j\u00e4tet\u00e4 pois tekem\u00e4st\u00e4si ty\u00f6st\u00e4 riippuen.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aiomme kehitt\u00e4\u00e4 koodin aluetta, joka tuottaa tietoja k\u00e4ytt\u00e4j\u00e4lle sivuston julkisella alueella.<\/p>\n","protected":false},"author":1,"featured_media":234980,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,843,864],"tags":[1166],"class_list":["post-231441","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231441","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=231441"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231441\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/234980"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=231441"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=231441"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=231441"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}