{"id":230676,"date":"2022-12-15T10:42:00","date_gmt":"2022-12-15T07:42:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230676"},"modified":"2022-12-17T15:19:12","modified_gmt":"2022-12-17T12:19:12","slug":"wordpressi-vidinad-uembertoeoetamine-4-osa","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-vidinad-uembertoeoetamine-4-osa\/","title":{"rendered":"WordPressi vidinad: \u00fcmbert\u00f6\u00f6tamine, 4. osa"},"content":{"rendered":"\n<p>Oleme WordPress Widget Boilerplate&#8217;is sisse viinud m\u00e4rkimisv\u00e4\u00e4rse hulga muudatusi. Kui te pole j\u00e4lginud, soovitan alustada sarja algusest ja j\u00f5uda j\u00e4rele.<\/p>\n<p>Kui aga olete seda j\u00e4lginud ja kasutate ka m\u00f5nda koodikvaliteedi t\u00f6\u00f6riista, mis uurib projekti olekut, m\u00e4rkate konsoolis k\u00e4put\u00e4is vigu.<\/p>\n<p>Tavaliselt on see punkt, kus soovitan p\u00f6\u00f6rata t\u00e4helepanu sellele, mida see jagab, ja seej\u00e4rel parandada k\u00f5ik, mida see teatab, kuid me pole veel seal.<\/p>\n<p>N\u00e4iteks m\u00f5ned vead, mida meie t\u00f6\u00f6riistad praegu n\u00e4itavad, p\u00f5hinevad asjaolul, et meil on kasutamata muutujaid. Muidugi on see nii, sest me pole alustanud vidina ehitamist.<\/p>\n<p>Kuid meil on veel m\u00f5ned konkreetsed klassid, mida peame rakendama.<\/p>\n<h2>WordPressi vidina katlaplaat: \u00fcmberkujundamine, 4. osa<\/h2>\n<p>\u00dcks probleem, mis koodis praegu veel eksisteerib, on see, et vidina konstruktor registreerib funktsioone ja see pole hea.<\/p>\n<p>Konstruktori eesm\u00e4rk on m\u00e4\u00e4rata klassi omaduste v\u00e4\u00e4rtusi, mitte realiseerida mingit t\u00fc\u00fcpi loogikat. Seda mitmel p\u00f5hjusel:<\/p>\n<ul>\n<li>see loob tugeva seose v\u00f5i s\u00f5ltuvused projekti klasside vahel alati, kui antud klass instantseeritakse,<\/li>\n<li>see lisab \u00e4riloogika funktsiooni, mis ei ole m\u00f5eldud nimetatud funktsiooni sisaldama,<\/li>\n<li>see muudab klassi eraldiseisva testimise keeruliseks.<\/li>\n<\/ul>\n<p>Sellega toimetulemiseks on kaks v\u00f5imalust:<\/p>\n<ol>\n<li>lisage register, mida saame kasutada klasside registreerimiseks rakenduses (ja edastage need v\u00f5imalikult v\u00e4heste s\u00f5ltuvustega, mida ma hiljem selgitan),<\/li>\n<li>luua tellijaid, kes saavad \u00e4riloogikaga konksup\u00f5hiselt hakkama.<\/li>\n<\/ol>\n<p>J\u00e4rgmise kolme postituse jooksul:<\/p>\n<ol>\n<li>uurime registri loomist,<\/li>\n<li>kuidas saame selle alglaadimisfaili sisestada,<\/li>\n<li>ja seej\u00e4rel vaadake iga meie funktsiooni jaoks tellijate loomist (mis ei tohiks olla liiga raske, arvestades seda, mida me tegime eelmises postituses ja mida me teeme selles postituses).<\/li>\n<\/ol>\n<h3>Looge register<\/h3>\n<p>Enne registri koodi kirjutamist on oluline m\u00e4rkida, mis on selle peamine eesm\u00e4rk. Lihtsamalt \u00f6eldes on klass m\u00f5eldud sisaldama viidet mis tahes klassile, mis on sellega registreeritud.<\/p>\n<p>Selleks antakse antud objektile viide funktsioonile ja seotakse see ka v\u00f5tmega, et saaksime selle hiljem h\u00f5lpsasti k\u00e4tte saada.<\/p>\n<h4>Esialgsed kaalutlused<\/h4>\n<p>Kuid m\u00f5ningaid asju tuleb arvestada. N\u00e4iteks:<\/p>\n<p>kui antud v\u00f5tme jaoks on registris objekt juba olemas, siis tuleb teha erand \u2013 kui kasutaja \u00fcritab antud v\u00f5tmega registrist objekti haarata, siis peaks ta tegema erandi<\/p>\n<p>Muidugi ei pea see ilmtingimata erandeid tegema. Selle asemel v\u00f5ib see kuvada ka t\u00f5rketeateid, tagastada null- v\u00f5i t\u00fchjad v\u00e4\u00e4rtused v\u00f5i mida iganes soovite.<\/p>\n<p>Teiseks peab register suutma tagastada k\u00f5igi selles sisalduvate tellijate loendi, et neid saaks WordPressis registreerida (see on see, mida me j\u00e4rgmises postituses n\u00e4eme).<\/p>\n<p>Selleks peame aga tagama, et see toetaks k\u00f5iki tellijaid ja siin tuleb m\u00e4ngu <a href=\"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-vidinad-uembertoeoetamine-3-osa\/\" title=\"eelmise postituse m\u00f5iste AbstractSubscriber.\">eelmise postituse m\u00f5iste AbstractSubscriber.<\/a> See t\u00e4hendab, et seni, kuni klass on selle klassi lasteklass, on k\u00f5ik korras.<\/p>\n<h4>Registri loomine<\/h4>\n<p>Seda arvestades kavandame j\u00e4rgmise:<\/p>\n<ul>\n<li>Loome registriklassi ja asetame selle utiliitide nimeruumi (ja seega ka kataloogi), kui seda teie t\u00f6\u00f6s veel ei ole.<\/li>\n<li>Me laseme registril s\u00e4ilitada viiteid k\u00f5ikidele oma objektidele assotsiatiivses massiivis.<\/li>\n<li>Vajame meetodeid \u00fcksiku abonendi <strong>lisamiseks<\/strong> ja <strong>hankimiseks<\/strong> ning seej\u00e4rel tervete tellijate loendi hankimiseks.<\/li>\n<\/ul>\n<p>Klassi t\u00fcnn n\u00e4eb v\u00e4lja umbes <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b45606bde5d777e88fd5e3988f610dea#file-00-registry-stub-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">selline:<\/a><\/p>\n<pre><code>&lt;?php\n\nclass Registry extends AbstractSubscriber\n{\n    public function __construct()\n    {\n    }\n\n    public function add($id, $obj)\n    {\n    }\n\n    public function get($id)\n    {\n    }\n\n    public function getRegisteredSubscribers()\n    {\n    }\n}\n<\/code><\/pre>\n<p>J\u00e4rgmisena <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b45606bde5d777e88fd5e3988f610dea#file-01-registry-constructor-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">saame m\u00e4\u00e4ratleda p\u00f5hiomaduse<\/a>, massiivi ja l\u00e4htestada selle konstruktoris:<\/p>\n<pre><code>&lt;?php\n\nclass Registry\n{\n    private $registry;\n\n    public function __construct()\n    {\n        $this-&gt;registry = [];\n    }\n\n    \/\/ ...\n\n}<\/code><\/pre>\n<p>P\u00e4rast seda <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b45606bde5d777e88fd5e3988f610dea#file-02-registry-add-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">saame luua lisamismeetodi<\/a>. Pidage meeles, et kui v\u00f5ti on juba m\u00e4\u00e4ratletud, valin ma oma teostuses erandi, kuid te ei pea seda tegema.<\/p>\n<pre><code>&lt;?php\n\npublic function add($id, $obj)\n{\n    if (isset($this-&gt;registry[$id])) {\n        throw new Exception('An object already exists for this given key.');\n    }\n    $this-&gt;registry[$id] = $obj;\n}<\/code><\/pre>\n<p>Samamoodi tagastab <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b45606bde5d777e88fd5e3988f610dea#file-03-registry-get-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">meetod get<\/a> viite selle v\u00f5tmega tuvastatud objekti eksemplarile. Kui v\u00f5tit pole seadistatud, teeb see erandi. Kui see on m\u00e4\u00e4ratud, kuid objekti pole olemas, tagastame null.<\/p>\n<pre><code>&lt;?php\n\npublic function get($id)\n{\n    if (!isset($this-&gt;registry[$id])) {\n        throw new Exception('No object exists for the specified key.');\n    }\n\n    return $this-&gt;registry[$id] ?? null;\n}<\/code><\/pre>\n<p>L\u00f5puks vajame meetodit k\u00f5igi registreeritud abonentide tagastamiseks. Tulevases postituses muutub selle kasutamine palju selgemaks, kuid praegu pange t\u00e4hele, et loome massiivi mis tahes klassist, mis on klassi <strong>AbstractSubscriber<\/strong> eksemplar, ja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b45606bde5d777e88fd5e3988f610dea#file-04-registry-get-subscribers-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tagastame seej\u00e4rel filtreeritud massiivi.<\/a><\/p>\n<pre><code>&lt;?php\n\npublic function getRegisteredSubscribers()\n{\n    $subscribers = [];\n    foreach ($this-&gt;registry as $object) {\n        if ($object instanceof AbstractSubscriber) {\n            $subscribers[] = $object;\n        }\n    }\n\n    return array_filter($subscribers);\n}<\/code><\/pre>\n<p>Praegu on <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b45606bde5d777e88fd5e3988f610dea#file-05-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">meil terve klass<\/a> (koos dokumentatsiooniga):<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of the WordPress Widget Boilerplate\n *\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateUtilities;\n\nuse Exception;\nuse WordPressWidgetBoilerplateSubscriberAbstractSubscriber;\n\n\/**\n * This class services as a simple container that can be used to pass objects\n * around the plugin.\n *\n * To use this class you'd make a call to the registry by saying Registry-&gt;get(),\n * then making a class to `register()` and `retrieve()` on an instance of the object.\n *\/\nclass Registry\n{\n    \/**\n     * @var array an array used to maintain the objects registered with the plugin\n     *\/\n    private $registry;\n\n    \/**\n     * Initializes the class by setting up the registry.\n     *\/\n    public function __construct()\n    {\n        $this-&gt;registry = [];\n    }\n\n    \/**\n     * Registers an object with the registry with the specified ID; however, will throw an\n     * exception if the ID is already referencing an object.\n     *\n     * @param string $id  an ID by which the specified object will be referenced\n     * @param mixed  $obj an instance of an object to store in the registry\n     *\n     * @throws Exception if an object already exists for the specified key\n     *\/\n    public function add($id, $obj)\n    {\n        if (isset($this-&gt;registry[$id])) {\n            throw new Exception('An object already exists for this given key.');\n        }\n        $this-&gt;registry[$id] = $obj;\n    }\n\n    \/**\n     * @param string $id the ID for the object that we wish to retrieve\n     *\n     * @throws Exception if no object exists for the specified key\n     *\n     * @return mixed a reference to the object or null\n     *\/\n    public function get($id)\n    {\n        if (!isset($this-&gt;registry[$id])) {\n            throw new Exception('No object exists for the specified key.');\n        }\n\n        return $this-&gt;registry[$id] ?? null;\n    }\n\n    \/**\n     * @return array all of the the Subscribers that should be registered with WordPress\n     *\/\n    public function getRegisteredSubscribers()\n    {\n        $subscribers = [];\n        foreach ($this-&gt;registry as $object) {\n            if ($object instanceof AbstractSubscriber) {\n                $subscribers[] = $object;\n            }\n        }\n\n        return array_filter($subscribers);\n    }\n}\n<\/code><\/pre>\n<p>N\u00fc\u00fcd peame selle lisama oma pistikprogrammi alglaadimisribale.<\/p>\n<h2>Enne The Bootstrapi siiski<\/h2>\n<p>Nagu postituses varem mainitud, peame selle lisama pistikprogrammi alglaadimisribale. Selleks peame aga m\u00e4\u00e4ratlema oma filtri, et saaksime registrit h\u00f5lpsalt \u00fclej\u00e4\u00e4nud pistikprogrammist m\u00f6\u00f6da saata (kui selleks on aeg).<\/p>\n<p>Enne selle tegemist on aga oluline veenduda, et teil on \u00e4sja loodud registriga hea k\u00e4sitlus, et see sobiks pistikprogrammiga ja et j\u00e4lgiksite arendusharu, <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mis<\/a> meil seni on olnud.<\/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>\u00dcks probleem, mis koodis praegu veel eksisteerib, on see, et WordPressi vidina konstruktor registreerib funktsioone ja see pole hea.<\/p>\n","protected":false},"author":1,"featured_media":223984,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,894,863],"tags":[1165],"class_list":["post-230676","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-kood","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230676","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=230676"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230676\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/223984"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=230676"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=230676"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=230676"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}