{"id":230861,"date":"2022-12-20T12:48:00","date_gmt":"2022-12-20T09:48:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230861"},"modified":"2022-12-20T12:50:22","modified_gmt":"2022-12-20T09:50:22","slug":"wordpressi-vidinad-uembertoeoetamine-10-osa","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-vidinad-uembertoeoetamine-10-osa\/","title":{"rendered":"WordPressi vidinad: \u00fcmbert\u00f6\u00f6tamine, 10. osa"},"content":{"rendered":"\n<p>Mis puutub WordPressi vidinate katlaplaadi \u00fcmbert\u00f6\u00f6tamisse, siis oleme heas kohas. Palju t\u00f6\u00f6d on tehtud selle nimel, et uute klasside, funktsioonide ja funktsionaalsuse juurutamine peaks olema palju lihtsam.<\/p>\n<p>Ja mitte ainult: seda peaks olema lihtsam j\u00e4lgida.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-vidinad-uembertoeoetamine-9-osa\/\" title=\"T\u00e4name viimases postituses tehtud t\u00f6\u00f6d, et\">T\u00e4name viimases postituses tehtud t\u00f6\u00f6d, et<\/a> meil on veel palju t\u00f6\u00f6d edasi arendada \u2013 nimelt p\u00f5hiline haldusliides.<\/p>\n<p>L\u00f5puks \u00f6eldi viimases postituses:<\/p>\n<blockquote>\n<p>M\u00f5ne j\u00e4rgmise artikli jooksul see areneb edasi, kuid nagu n\u00e4ete, hoolitseme selle eest, et meil oleks WordPressiga r\u00e4\u00e4kimiseks \u00fcks p\u00f5hifunktsioonide klass ja klass, mis on m\u00f5eldud spetsiaalselt haldusvormi renderdamiseks.<\/p>\n<\/blockquote>\n<p>Ja see on koht, kus me selles artiklis \u00fcles v\u00f5tame. T\u00e4psemalt k\u00e4sitleme andmete desinfitseerimist ja serialiseerimist ning vidinasse salvestatud andmete toomist.<\/p>\n<h2>WordPressi vidina katlaplaat: \u00fcmbert\u00f6\u00f6tlemine, 10. osa<\/h2>\n<h3>Kasutajaliidese \u00fcmberkujundamine<\/h3>\n<p>Enne serialiseerimise juurde asumist peame tegema m\u00f5ned v\u00e4ikesed t\u00f6\u00f6d oma haldusvaatega. Tuletage meelde seeria varasemaid postitusi, et oleme loonud vormi, mis aktsepteerib:<\/p>\n<ul>\n<li>pealkiri,<\/li>\n<li>natuke sisu,<\/li>\n<li>ja m\u00e4rkeruut.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/codex.wordpress.org\/Widgets_API#Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">See kuvatakse suurep\u00e4raselt, kuid see v\u00e4listab m\u00f5ned vidinate API<\/a> p\u00f5hifunktsioonid. Nimelt peame tagama, et nimetaksime oma elemente \u00f5igesti, kasutades j\u00e4rgmisi funktsioone:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/get_field_id\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hanki_v\u00e4lja_id<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/get_field_name\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hanki_v\u00e4lja_nimi<\/a><\/li>\n<\/ul>\n<p>Ja siis kirjutame oma funktsiooni, mida nimetatakse lihtsalt <a href=\"https:\/\/codex.wordpress.org\/Widgets_API#Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hankimiseks<\/a>, mida ma l\u00fchidalt selgitan.<\/p>\n<p>\u00dclaltoodud funktsioonid on vajalikud, kuna need aitavad WordPressil j\u00e4lgida, mitu vidina eksemplari kasutatakse ja millist kasutaja redigeerib. Teisis\u00f5nu saame palju funktsioone tasuta.<\/p>\n<p>Enne koodi n\u00e4itamist tahan l\u00fchidalt arutada selle <strong>hankimise<\/strong> funktsiooni eesm\u00e4rki, mida me tutvustame. L\u00fchidalt, see on viis, kuidas me edastame v\u00f5ti (nagu v\u00f5tme\/v\u00e4\u00e4rtuse paari v\u00f5tmes) funktsiooni ja seej\u00e4rel saame sellel h\u00f5lpsalt meie jaoks v\u00e4\u00e4rtuse hankida, nii et see hoiab meie liidese v\u00f5imalikult puhtana.<\/p>\n<p>Niisiis, esiteks <a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-00-get-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hankimise meetod<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * If the value for the key exists in the current instance of the widget, then it will\n * retrieve it. Otherwise, it will return an empty value.\n *\n * @param string $key the used to identify the value of the widget.\n * @param array $instance the options for the instance of this widget\n *\/\nprotected function get($key, $instance)\n{\n    return empty($instance[$key])? '': $instance[$key];\n}<\/code><\/pre>\n<p>Oluline on m\u00e4rkida, et see meetod ei aktsepteeri mitte ainult loetava v\u00e4\u00e4rtuse v\u00f5tit, vaid ka massiivi, mis viitab massiivi eksemplarile.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-01-admin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ja n\u00fc\u00fcd, \u00fcmbert\u00f6\u00f6tatud kasutajaliides<\/a> :<\/p>\n<pre><code>&lt;?php\n\/*\n * This file is part of WordPress Widget Boilerplate\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?&gt;\n\n&lt;div class=\"widget-content\"&gt;\n    &lt;p&gt;\n        &lt;input\n            type=\"text\"\n            id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('title')); ?&gt;\"\n            name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('title')); ?&gt;\"\n            value=\"&lt;?php echo $this-&gt;get('title', $instance) ?&gt;\"\n            placeholder=\"Widget Title\"\n            class=\"widefat\"\n        \/&gt;\n    &lt;\/p&gt;\n\n    &lt;p&gt;\n        &lt;textarea\n            id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('content')); ?&gt;\"\n            name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('content')); ?&gt;\"\n            placeholder=\"Widget Content\"\n            style=\"width:100%;\"&gt;&lt;?php echo $this-&gt;get('content', $instance) ?&gt;&lt;\/textarea&gt;\n    &lt;\/p&gt;\n\n    &lt;p&gt;\n        &lt;input\n            type=\"checkbox\"\n            value=\"on\"\n            name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('display-title')); ?&gt;\"\n            id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('display-title')); ?&gt;\"\n            &lt;?php checked('on', $this-&gt;get('display-title', $instance), true); ?&gt;\n            class=\"checkbox\"\n        \/&gt;\n        &lt;label for=\"&lt;?php echo esc_attr($this-&gt;get_field_id('display-title')); ?&gt;\"&gt;Display Title?&lt;\/label&gt;\n    &lt;\/p&gt;\n&lt;\/div&gt;&lt;!-- .widget-content --&gt;\n<\/code><\/pre>\n<p>Kuid see j\u00e4tab siiski funktsionaalsusest puudu ja j\u00e4tab t\u00f6\u00f6 meie teha. Nimelt peame andmed desinfitseerima ja WordPressile tagasi saatma, nii et see salvestab andmed.<\/p>\n<h3>Desinfitseerimine ja serialiseerimine<\/h3>\n<p>Meie n\u00e4ite puhul oleme v\u00e4ga ranged selles, mida lubame. Nimelt hakkame toetama ainult p\u00f5hiteksti ja eemaldame k\u00f5ik agressiivselt v\u00e4lja.<\/p>\n<p>See t\u00e4hendab, et me ei luba m\u00e4rgistamist ega midagi sellist. Selle asemel eemaldame k\u00f5ik, mis pole p\u00f5hitekst. V\u00f5ime seda natuke kaunistada, kui on aeg esik\u00fcljel kuvada, kuid j\u00e4tame selle vastava postituseni.<\/p>\n<p>Selleks kasutame j\u00e4rgmisi funktsioone:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.strip-tags.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">riba_sildid<\/a><\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.stripslashes.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kaldkriipsud<\/a><\/li>\n<\/ul>\n<p>Tuletage meelde, et meie vidinas on kaks v\u00e4lja \u2013 pealkirjav\u00e4li ja sisuv\u00e4li. S\u00f5ltuvalt loodava vidina t\u00fc\u00fcbist v\u00f5ib andmete puhastamiseks vaja minna ainult \u00fchte klassi v\u00f5i funktsiooni. Teistes olukordades v\u00f5ib vaja minna midagi keerukamat.<\/p>\n<p>Pidage seda koodi l\u00e4bimisel meeles, kuna see ei ole k\u00f5igile sobiv lahendus. Selle asemel tehakse see spetsiaalselt selle jaoks.<\/p>\n<p>Igatahes, andmete desinfitseerimiseks kirjutame spetsiaalselt selleks otstarbeks klassi ja seej\u00e4rel teeme selle oma WidgetAdmini klassile k\u00e4ttesaadavaks.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-02-widget-serializer-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Siin on klass tervikuna<\/a> koos j\u00e4rgneva kirjeldusega:<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\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 WordPressWidgetBoilerplateWordPress;\n\n\/**\n * Santiizes and saves the data for the widget.\n *\/\nclass WidgetSerializer\n{\n    \/**\n     * Updates the values of the widget. Sanitizes the information before saving it.\n     *\n     * @param array $newInstance the array of new options to save\n     *\/\n    public function update($newInstance)\n    {\n        $instance = [];\n        foreach ($newInstance as $key =&gt; $value) {\n            $instance[$key] = strip_tags(\n                stripslashes($value)\n            );\n        }\n\n        return $instance;\n    }\n}\n<\/code><\/pre>\n<p>Klass peaks olema sirgjooneline. See v\u00f5tab sisse vidina sissetulevad v\u00e4\u00e4rtused, desinfitseerib need ja tagastab seej\u00e4rel uue massiivi, mis antakse WordPressile tagasi.<\/p>\n<p>Siiski on konks. See klass peab olema viimases postituses n\u00e4idatud <strong>p\u00f5hividinate klassi atribuut.<\/strong><\/p>\n<p>Teiseks\u00a0 kutsub sellesse klassi sisse <strong>v\u00e4rskendusmeetod<\/strong>, mis on osa vidinate API-st. <strong>Muutujat $oldInstance<\/strong> ei ole vaja serialisaatorisse edastada, kuid see on vajalik v\u00e4rskendusmeetodi jaoks.<\/p>\n<p>Siin on <strong>vidinaklass<\/strong>, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/392a2eda9ebc0b0a59cd4b364e427445#file-03-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nagu see praegu on \u00fcles ehitatud<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\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 WordPressWidgetBoilerplateWordPress;\n\nuse WP_Widget;\n\nclass Widget extends WP_Widget\n{\n    \/**\n     * @var string unique identifier for your widget\n     *\/\n    protected $widgetSlug;\n\n    \/**\n     * Initializes the plugin by setting its properties and calling the parent class with the description.\n     *\n     * @param string           $widgetSlug       unique identifier for your widget\n     * @param WidgetSerializer $widgetSerializer the class responsible for saving widget options\n     *\/\n    public function __construct($widgetSlug)\n    {\n        $this-&gt;widgetSlug = $widgetSlug;\n\n        parent::__construct(\n            $this-&gt;getWidgetSlug(),\n            __('Widget Name', $this-&gt;getWidgetSlug()),\n            [\n                'classname' =&gt; $this-&gt;getWidgetSlug().'-class',\n                'description' =&gt; __('Short description of the widget goes here.', $this-&gt;getWidgetSlug()),\n            ]\n        );\n    }\n\n    \/**\n     * Return the widget slug.\n     *\n     * @return string slug variable\n     *\/\n    public function getWidgetSlug()\n    {\n        return $this-&gt;widgetSlug;\n    }\n\n    \/**\n     * Displays the administrative view of the form and includes the options\n     * for the instance of the widget as arguments passed into the function.\n     *\n     * @param array $instance the options for the instance of this widget\n     *\/\n    public function form($instance)\n    {\n        include plugin_dir_path(__FILE__).'Views\/Admin.php';\n    }\n\n    \/**\n     * Updates the values of the widget. Uses the serialization class to sanitize the\n     * information before saving it.\n     *\n     * @param array $newInstance the values to be sanitized and saved\n     * @param array $oldInstance the values that were originally saved\n     *\/\n    public function update($newInstance, $oldInstance)\n    {\n        return $this-&gt;widgetSerializer-&gt;update($newInstance, $oldInstance);\n    }\n\n    \/**\n     * If the value for the key exists in the current instance of the widget, then it will\n     * retrieve it. Otherwise, it will return an empty value.\n     *\n     * @param string $key      the used to identify the value of the widget\n     * @param array  $instance the options for the instance of this widget\n     *\/\n    protected function get($key, $instance)\n    {\n        return empty($instance[$key])? '': $instance[$key];\n    }\n}\n<\/code><\/pre>\n<p>Kui aga lehte v\u00e4rskendate, v\u00f5ite m\u00e4rgata, et desinfitseerimine ja serialiseerimine ei paista andmete toomisel t\u00f6\u00f6tavat. Ja seda me j\u00e4rgmises postituses uurimegi.<\/p>\n<h2>Andmete otsimine<\/h2>\n<p>Pange t\u00e4hele, et kuigi funktsionaalsus tundub selle jaoks puudulik (kuna desinfitseerimata andmed on endiselt kuvatud), oleme keskendunud sellele, et kirjutaksime klasse sidusalt ja vastutustundlikult ning need ei oleks omavahel tihedalt seotud.<\/p>\n<p>Kordame seda j\u00e4rgmises postituses veidi rohkem. Nii et uurige \u00fclaltoodud koodi, rakendage seda, kui olete seda teinud, ja j\u00e4tkame j\u00e4rgmises postituses.<\/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>Ja n\u00fc\u00fcd hakkame WordPressi vidinate katlasse lisama desinfitseerimis- ja serialiseerimisfunktsioone.<\/p>\n","protected":false},"author":1,"featured_media":234957,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,842],"tags":[1165],"class_list":["post-230861","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-opetused","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230861","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=230861"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230861\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/234957"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=230861"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=230861"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=230861"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}