Widget létrehozása az asztalhoz. Windows oldalsáv-modul írása a semmiből Widgetek létrehozása




Ma kitaláljuk, hogyan hozhat létre saját widgetet (Widget) egy Android-eszközön. A widget az asztal ismerős eleme, amellyel elérheti az alkalmazások néhány funkcióját: hírek megtekintése a widget ablakban, időjárás előrejelzés, hírek frissítése különböző szolgáltatásokról, a készülék különféle funkcióinak kezelése (képernyő zárolása, kapcsolja be a rádiót, az internetet és még sok mást). Ezúttal nem valami grandiózus és nagyon hasznos dolgot készítünk, mint például egy zseblámpát :), hanem egy egyszerű widgetet készítünk, amely gombként lesz megvalósítva, rákattintva egy szabványos böngésző segítségével mindenki kedvencéhez jutunk. Természetesen bármilyen webhelyet személyre szabhat.

Létrehozunk egy új projektet, válassza az Üres tevékenység lehetőséget, az Android 2.2+ minimális verzióját. Widget létrehozásakor először egy objektumot kell létrehozni AppWidgetProviderInfo, amelyben megadjuk azt az xml fájlt, amelyből magának a widgetnek a nézete kitöltésre kerül. Ehhez hozzon létre egy mappát a projektben res/xmlés benne létrehozunk egy új xml fájlt, melynek neve widget.xml a következő tartalommal:

< appwidget- provider xmlns: android= android: minWidth= "146dp" android: updatePeriodMillis= "0" android: minHeight= "146dp" android: initialLayout= "@layout/activity_main" > < / appwidget- provider>

Most menjünk a fájlhoz activity_main.xmlés létrehozzuk a widgetünk felületét, az egy gombból fog állni gomb:

< LinearLayout xmlns: android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" android: layout_width= "match_parent" android: layout_height= "match_parent" android: gravity= "top" tools: context= ".MainActivity" >< Button android: id= "@+id/button" android: layout_width= "wrap_content" android: layout_height= "wrap_content" android: layout_marginLeft= "5dp" android: text= "@string/app_name" / > < / LinearLayout >

Amint látja, létrehoztunk egy normál gombot, így ez lesz a mi widgetünk:

Vagyis e gomb helyett azt csinálhat, amit akar.

Térjünk át a fájlban lévő kóddal való munkára MainActivity.java. Az osztálytól kell örökölnie AppWidgetProvider, amelynek fő módszere létezik onUpdate(). Ebben a módszerben két objektumot kell meghatároznunk: Függő szándékÉs távoli nézetek. Használatuk végén meg kell hívni a módszert updateAppWidget(). Fájl kódja MainActivity.java:

import android.net.Uri ; import android.app.PendingIntent ; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context ; import android.content.Intent ; import android.widget.RemoteViews ; import android.widget.Toast ; import com.example.widget.R ; public class MainActivity kiterjeszti az AppWidgetProvider( @Override public void onUpdate (Kontextus , AppWidgetManager appWidgetManager , int appWidgetIds ) ( for (int i= 0 ; i< appWidgetIds. length; i++ ){ int currentWidgetId = appWidgetIds[i]; //Készítsen egy egyszerű http kérést a megadott linkre, és kövesse azt: String url = "http://site" ; Intent intent = new Intent(Intent . ACTION_VIEW); elszánt. addFlags(Intent . FLAG_ACTIVITY_NEW_TASK); elszánt. setData(Uri .parse(url)); //Két kötelező osztályobjektum meghatározása: PendingIntent és RemoteViews: PendingIntent pending = PendingIntent . getActivity(context, 0 ,intent, 0 ); RemoteViews nézetek = new RemoteViews(context.getPackageName(),R.layout.activity_main); //Kattintásfeldolgozás beállítása widget hozzáadásához: nézetek. setOnClickPendingIntent(R . id. gomb, függőben); appWidgetManager. updateAppWidget(current WidgetId,views); Pirítós. makeText(kontextus, "Modul hozzáadva", Pirítós . LENGTH_SHORT). előadás(); ) ) )

A widgetünk sikeres működéséhez szükségünk van némi varázslatra a manifest fájlban AndroidManifest.xml. Így kell kinéznie:

< manifest xmlns: android= "http://schemas.android.com/apk/res/android" package="com.example.widget" android:versionCode="1" android:versionName="1.0">< uses- permission android: name= "android.permission.INTERNET" / > < application android: allowBackup= "true" android: icon= "@drawable/ic_launcher" android: label= "@string/app_name" android: theme= "@style/AppTheme" > < receiver android: name= "home.study.MainActivity" > < intent- filter> < action android: name= "android.appwidget.action.APPWIDGET_UPDATE" / > < / intent- filter> < meta- data android: name= "android.appwidget.provider" android: resource= "@xml/widget" / > < / receiver> < / application> < / manifest>

Ahogy sejtette, a widget a címkében van meghatározva<vevő> .

Már csak a fájl szerkesztése maradt hátra strings.xml, hozzáadva az általunk használt sorokat:

< ? xml version= "1.0" encoding= "utf-8" ? > < resources> < string name= "app_name" >TANUL. ANDROID < string name= "action_settings" >Beállítások < string name= "hello_world" >Helló Világ!< / string> < / resources>

Figyelem! Az Android Studio megszidhatja a program indításakor, kérem, hogy adjon meg egy alapértelmezett tevékenységet. Válassza ki a "Ne indítson tevékenységet" sort (Ne indítsa el a tevékenységet):

Most telepítse az alkalmazást az emulátorra vagy az eszközre, és adja hozzá a widgetet az asztalhoz:

És kattints rá:


Mint látható, minden remekül működik.

Tehát ebben az oktatóanyagban egy egyszerű Android Widgetet hoztunk létre, amely egy Gomb gombból áll, amikor a widgetünkre kattintunk, létrehozunk egy egyszerű http kérést, és követjük a megadott URL hivatkozást. Gyakorolhat néhány más elemmel, nem a gombbal, és érdekes funkciókat találhat ki számukra. Sok szerencsét!

Azért, hogy widget készítése androidban Nem is kell tudnia, hogyan kell programozni. Számos tervezőalkalmazás létezik, amelyek megkönnyítik a widget rajzolását, és megadják a kívánt funkciókat.

Minimális szöveg

Az alkalmazás lehetővé teszi szövegből és számokból álló minimalista widgetek létrehozását. A név ellenére ezek a widgetek nagyon széles lehetőségeket rejtenek magukban.

A telepítés után adja hozzá a Minimalista szöveg widgetet az asztalhoz a kívánt méretben. Megnyílik a widget beállítások ablak.

A beállításokban kiválaszthatja a hátteret, tájolást, betűtípust, kattintási műveletet stb. A beállításokban is vannak előre meghatározott elrendezések a kitöltéshez:

  • Idő.
  • Időpontja.
  • Töltési szint.
  • Hőfok.

Saját widget-elrendezés létrehozásakor további funkciók állnak rendelkezésre a widget kitöltéséhez:

  • Szöveg.
  • Szabad/használt hely az SD-kártyán.
  • A rendszer működési ideje.
  • A mobilhálózaton átvitt adatmennyiség, és nem csak.
  • A Wi-Fi hálózat neve, IP-cím a Wi-Fi hálózatban.
  • Az elfoglalt RAM mennyisége.

Minden érték megjeleníthető szövegben és számokban.

Végső egyéni widget (UCCW)

Ezzel az alkalmazással nemcsak szövegből, hanem grafikus tartalommal is készíthet widgeteket.

Indításkor megnyílik a widget létrehozására szolgáló ablak. Ha objektumot szeretne hozzáadni a widgethez, nyomja meg a felül található +/- gombot. Bármilyen áthelyezéshez és szerkesztéshez kattintson a felül található "Objektum kiválasztása" gombra, és válassza ki a hozzáadott objektumot.

A widgetek a következő objektumokat tartalmazhatják:

  • Idő, dátum és a hét napja.
  • Analóg óra.
  • Egyedi szöveg.
  • A töltöttségi szint számokban vagy annak grafikus megjelenítése.
  • Minden időjárási információ - hőmérséklet, páratartalom, szélsebesség stb.
  • Geometriai figurák.
  • Képek.
  • Az olvasatlan Gmail e-mailek, SMS-ek és nem fogadott hívások száma.
  • Az ébresztő megszólalásának ideje.

Minden elem forgatható, nyújtható, hajlítható, színe változtatható. Természetesen testreszabhatja a kattintási műveletet (Select Object-> Hotspots). Támogatja a létrehozott widgetek importálását és exportálását.

Az Android operációs rendszer számos funkcióval és képességgel rendelkezik. Az egyik a widgetek – olyan ablakok, amelyek lehetővé teszik az alkalmazás funkcióinak egy részének használatát anélkül, hogy elindítaná azt.

Alapvetően a widgetek az alkalmazáshoz tartoznak. Vannak azonban olyan programok, amelyek nem rendelkeznek ezzel a lehetőséggel. Tehát a saját kezedbe kell venned a dolgokat!

  • A Play Market segítségével letöltjük a „KWGT Kustom Widget Maker” ingyenes alkalmazást, amely ingyenesen megvásárolható, de a funkciók egy része csak a kiegészítő megvásárlása után lesz elérhető.

A program platformként működik a különböző fejlesztőktől származó, harmadik féltől származó widgetek elindításához. Ezenkívül megváltoztathatja a widgetek megjelenését, és további funkciókat biztosíthat nekik.


Elsőre azt gondolhatnánk, hogy a „KWGT Kustom Widget Maker” egy összetett alkalmazás, amely szoftverfejlesztő programokra hasonlít. És igen és nem: a felület hasonló, de nincs itt semmi bonyolult.


A widgetek szerkesztésének megkezdése:

  • lépjen az asztalra, és a menü gomb nyomva tartásával vagy a képernyő hosszan megérintésével hívja elő az asztali szerkesztő menüt;
  • keresse meg a „KWGT” widget keretet, és állítsa be a kívánt méretet, például - 4x2. Ezt követően egy ablak jön létre az asztalon;
  • Kattintson az ablakra, ezzel megnyitva a widget kiválasztó menüt;
  • Válassza ki a kívánt elrendezést, és kattintson rá (További elrendezések letölthetők a Play Áruházból. Ehhez az alkalmazás keresősávjában adja meg a „KWGT widgetek” lehetőséget);
  • Miután kiválasztotta a kívánt elrendezést, az alkalmazás folytatja a szerkesztését. A következő beállítások lesznek elérhetők:
  1. A widget geometriai paramétereinek beállításáért felelős elemek;
  2. Háttér, felelős a widget háttérképéért;
  3. Érintés, amely meghatározza a widget aktiválásakor végrehajtandó műveleteket;
  4. A widget méretéért felelős réteg;

Ennek eredményeként egy egyedi widgetet kapunk a szükséges funkciókkal.

Nemrég kellett létrehoznom egy modult a Windows oldalsávhoz. Nem rendelkeztem ezzel kapcsolatban, ezért egy kis guglizás és a dokumentáció elolvasása után kezdjük.

Megmutatom, mire jutottam


A modul információkat kap a webhelyről xml-ben, elemzi, sőt megjeleníti is. Ezenkívül a modul ellenőrzi az új verziókat, és ha jelen vannak, megtagadja a működést :)
Kezdetben a tapasztalatszerzés kedvéért egy kütyüt teljes egészében VBScriptben szerettem volna megírni (mivel még nem foglalkoztam vele), de végül JavaScriptben kellett beszúrni.
Menjünk közvetlenül a kódhoz. Itt nem veszem figyelembe az összes kódot, csak a főbb pontokat mutatom meg. Az elkészült kütyü linkje a cikk végén található.
A modul fő fájlja a manifest, a Gadget.xml fájl. Így kell hívni, és az archívumunk gyökerében kell elhelyezni (a kütyü nem más, mint egy ZIP archívum .gadget kiterjesztéssel).

Időjárás az Info.Denms.Ru 1.0.1232 teljes időjárási widgetből (Info.Denms.Ru)

Tekintsük részletesebben.
Elem tartalmaznia kell az 1.0.0-val egyenlő apiVersion-t (jelenleg), valamint az src attribútumot, amely a modulunk fő fájlját határozza meg;
Gadget engedélyek. Állítsa egyenlőnek a teljes;
A Windows oldalsáv minimális verziója. Jelenleg - 1,0;
Lehetőségek - a modul neve, - verzió, - információ a szerzőről, - link a modult tartalmazó oldalra, - modul ikon és megjelenik a telepített modulok paneljén.

A main.html fájl egy normál html fájl, nem adom meg teljes egészében, csak néhány ponton térek ki.
A g:background elem határozza meg a modul hátterét. Tegyük átláthatóvá.

A modul két állapotú lehet: dokkolt (a bal oldalon a fenti képernyőképen), és nem dokkolt (jobb oldalon). A modul aktuális állapotát a JavaScript dokkolt változóban tároljuk.

A jövőben szükségünk lesz az isDocked wrapper funkcióra, hogy a VBScript-ből megtudjuk a kütyü aktuális állapotát (mivel nem próbáltam, de tiszta VBScript-ben nem tudtam megvalósítani). Még egy megjegyzés - a szkriptek ebben a sorrendben megfelelően működnek, pl. először a VBScript szkripteket írjuk le, majd a JavaScriptet.

A main.html többi elemét abszolút pozicionált DIV elemek képviselik. Ezt követően a szkriptekből az azonosítójukkal hivatkozunk rájuk.

JavaScript használatával állítsa be a modul dokkolt és nem dokkolt állapotát, valamint adja meg a beállításfájlt (main.js)

System.Gadget.onDock = átméretezés; System.Gadget.onUndock = átméretezés; System.Gadget.settingsUI = "settings.html"; System.Gadget.onSettingsClosed = BeállításokClosed; dokkolt=0; //a gadget kezdeti állapota resize(); //inicializálás

Amint a fenti listából látható, amikor a modul állapota megváltozik, a resize() függvény meghívásra kerül.

Függvény resize() ( bd = document.body.style; System.Gadget.beginTransition(); if (System.Gadget.docked) ( // kis állapot bd.width=148; //modul méreteinek beállítása bd.height=201 ; dokkolt = 1; bd.background="url(images/gadget.png) no-repeat"; //háttér beállítása //értékek átvitele a dokkolt állapotból dokkolt állapotba, és nullázza ki az elemeket dokkolt állapotú document.getElementById(" small_needupdate ").innerHTML = document.getElementById("big_needupdate").innerHTML; document.getElementById("big_needupdate").innerHTML = ""; //... ) else ( // big state bd.width=230; bd . height=160; bd.background="url(images/gadgeth.png) no-repeat"; docked=0; //értékek átvitele dokkolt állapotból undokolt állapotba, és elemeinek visszaállítása a dokkolt állapothoz document.getElementById("big_needupdate "). innerHTML = document.getElementById("small_needupdate").innerHTML; document.getElementById("small_needupdate").innerHTML = ""; //... ) System.Gadget.endTransition(System.Gadget.TransitionType.morph, 1); )

Leírhatja a beállítások mentése funkciót is. Nincsenek a kütyümben, de példaként megmutatom, hogyan kell csinálni

FüggvénybeállításokClosed(event) ( if (event.closeAction == event.Action.commit) ( //alert System.Gadget.Settings.readString("teszt"); ) )

ReadString - beolvassa a korábban elmentett karakterláncot, az writeString, illetve ír.
Metódusok System.Gadget.beginTransition(); és System.Gadget.endTransition(); szükséges a kütyü méretének „simán” megváltoztatásához. A Windows Seven figyelmen kívül hagyja őket, de a visszafelé kompatibilitás miatt továbbra is meghagytam őket.

Ahogy fentebb említettük, a szerver xml formátumban szolgáltat számunkra időjárási információkat.

1,7 41 felhős hó 87 DNy 5 -3 -1 -1 26 1 -9 41 0 …

Letöltjük és értelmezzük az xml fájlt VBScript segítségével.

Sub DownloadXML2 Set objXML = CreateObject("Microsoft.XmlHttp") objXML.Open "GET", "http://info.kovonet.ru/weather.xml", True objXML.OnReadyStateChange = GetRef("objXML_onreadystatechange") objXHeaderset "If-Modified-Since"

A mySleep funkció ellenőrizni fogja a kapcsolatunkat, hogy nincs-e időkorlát.

Sub mySleep if bRespReceived = "false" then "nincs válasz még "időtúllépés még nem érte el, számolja tovább a másodperceket iTimeoutID = window.SetTimeout("mySleep", 1000) end if end if End Sub

Ha a letöltés sikeres, az objXML.readyState értéke négy lesz, és az állapot (objXML.status) a 200-as értéket adja vissza.

Függvény objXML_onreadystatechange() If (objXML.readyState = 4) Then "msgbox objXML.statusText If (objXML.status = 200) Then bRespReceived=true SaveFile(objXML.responseText) elseTunimeteout0 window"0SetR =0 window"0stR =0 window. )" próbálja meg egy percen belül újra frissíteni az End If End If End funkciót

Ebben az esetben mentse a fájlt egy ideiglenes Windows mappába

Funkció SaveFile(what) Set fso = CreateObject("Scripting.FileSystemObject") tempFolder = fso.GetSpecialFolder(2) filepath = tempFolder+"\weather.xml" Dim fso1, tf Set fso1 = CreateObject("Scripting.FileSystemObject")SystemObFiject. = fso1.CreateTextFile(filepath, True, True) "újraírás, unicode tf.Write(what) tf.ParseXML végfüggvény bezárása

És elkezdjük elemezni a fájlt.

Sub ParseXML Set fso = CreateObject("Scripting.FileSystemObject") tempFolder = fso.GetSpecialFolder(2) filepath = tempFolder+"\weather.xml" Set xmlDoc = CreateObject("Msxml2.DOMDocument") xmlDocse"xync="xmlDoc.as. load(filepath) "master node - esetünkben CurrNode = xmlDoc.documentElement "a hét napjainak beállítása - Set dayNode = currNode.firstChild, miközben nem dayNode nincs semmi Set currNode = dayNode.firstChild, miközben nem currNode értéke semmi, ha currNode.parentNode.getAttribute("id") = "ma", akkor "ma, ha currNode.nodeName = "temp" akkor dokumentum " = dayNode.nextSibling Wend End Sub

Az új verziók keresése pontosan ugyanúgy történik.
Ne felejtsen el létrehozni egy beállítási fájlt - settings.html, amelynek létezését fent közöltük.

Beállítások

Valójában ez minden. Örülök, ha az (első :)) cikkem hasznosnak bizonyult valakinek.

Felhasznált források.

Teremt WordPress widget- körülbelül így kell létrehozni egy bővítményt, de sokkal egyszerűbb és áttekinthetőbb. Csak egyetlen fájlra van szüksége mindennel PHP kódot, amelyet sokkal könnyebb írni, mint egy több fájlt tartalmazó bővítményt. A widgeteknek három fő funkciója van: ezek widget, frissítésÉs forma.

  • függvény widget()
  • függvényfrissítés()
  • függvény form()

| Források letöltése |

Alapszerkezet

A widgetünk alapvető elrendezése nagyon egyszerű, vannak hasznos funkciók, amelyeket tudnia kell. A widget szerkezetünk gerince a következő lesz:

Add_action("widgets_init", "register_my_widget"); // függvény a widget függvény betöltéséhez register_my_widget() () // függvény a widget osztályom regisztrálásához My_Widget kiterjeszti a WP_Widget () () // A példa widget osztályfüggvény My_Widget() () // Widget beállítások függvény widget() () // megjeleníti a widget függvényt update() () // frissíti a widget függvényt form() () // és természetesen a widget opciók űrlapját

1. lépés. widget_init

Mielőtt mindezt megtennénk, be kell töltenünk a widgetünket a funkcióval widget_init. Ez egy nyom akció, amelyről a WordPress kódexében találsz bővebb információt.

Add_action("widgets_init", "register_my_widget");

A következő dolog, amit meg fogunk tenni Regisztráció widgetünket a WordPressben, hogy az elérhető legyen a widgetek részben.

Függvény register_my_widget() ( register_widget("Saját_modul"); )

2. lépés Osztály

Mellékeljük a widgetünket Osztály. Az osztálynév számít! Amit szem előtt kell tartanunk, az az, hogy az osztálynév és a függvénynév legyen ugyanaz.

A My_Widget osztály kiterjeszti a WP_Widget()

Most átadunk néhányat az osztálynak lehetőségek beállítások. Például átadhatjuk szélességÉs magasság. Adhatunk egy kicsit is leírás a widgetünk, ha akarjuk. Ez akkor lesz hasznos, ha a widgetet a kereskedelmi témájához kapcsolja.

Függvény My_Widget() ( My_Widget() függvény ( $widget_ops = array("classname" => "example", "description" => __("A widget, amely megjeleníti a szerző nevét ", "example")); $control_ops = array("width" => 300, "height" => 350, "id_base" => "example-widget"); $this->WP_Widget("example-widget", __("Példa widget", "example" ), $widget_ops, $control_ops); )

Most, hogy befejeztük a widgetünk alapvető követelményeit, figyelmünket ráirányítjuk három funkciót, amelyekről korábban már beszéltünk, és amelyek fontos funkciók vagy alapvető építőelemek a widgetünk felépítéséhez!

3. lépés functionwidget()

Az első funkció ehhez kapcsolódik kijelző a widgetünk. Küldünk néhányat érvek funkciónkra. Érveket fogunk átadni a témából, lehet cím vagy más paraméter. Most egy változót adunk át példa, amely a függvényosztályunkhoz kapcsolódik.

Functionwidget ($args, $példány)

Ezt követően kivonjuk lehetőségekérvekből, mert szükségünk van arra, hogy a lehetőségek helyben elérhetőek legyenek. Ha nem tudja, mi az a helyi változó, most ne aggódjon miatta, és adja hozzá ezt a lépést.

Extract($args);

Legközelebb beállítjuk fejlécÉs egyéb opciók widgetünkhöz, amelyet a felhasználó a widget menüjében módosíthat. Speciális változókat is hozzáadunk, mint pl $előtt_widget, $utána_widget. Ezeket a lehetőségeket a téma kezeli.

$cím = alkalmaz_szűrők("widget_címe", $példány["cím"]); $név = $példány["név"]; $show_info = isset($instance["show_info"]) ? $példány["show_info"] : false; echo $fore_widget; // A widget címének megjelenítése, ha ($title) echo $before_title . $title. $utána_cím; //A név megjelenítése if ($name) printf("

" . __("Hé, tengerészük! A nevem %1$s.", "példa") . "

", $név); if ($show_info) printf($name); echo $after_widget;

4. lépés: függvényfrissítés()

Függvényfrissítés($új_példány, $régi_példány) ( $példány = $old_példány; //Címkék eltávolítása a címből és a névből a HTML eltávolításához $instance["title"] = strip_tags($new_instance["title"]); $példány[" név"] = strip_tags($új_példány["név"]); $példány["show_info"] = $új_példány["show_info"]; $példány visszaadása; )

Egy dolgot meg kell jegyezni, hogy itt használjuk strip_tags az összes szöveg eltávolításához XHTML, ami összetörheti a widgetünket.

5. lépés: függvény form()

A következő lépésben létrehozzuk forma, amely szolgálni fog bemeneti blokk. Elfogadja a felhasználó által megadott beállításokat és értékeket. Funkció forma tartalmazhat jelölőnégyzeteket, szövegbeviteli mezőket stb.

Mielőtt létrehoznánk ezeket a beviteli mezőket, el kell döntenünk, hogy mit jelenítsünk meg, ha a felhasználó nem választ ki semmit a widgetből. Ehhez a paraméterek alapértelmezett értékeit adjuk át, például cím, leírás stb.

//Állítson be néhány alapértelmezett widget-beállítást. $defaults = array("title" => __("Példa", "példa"), "név" => __("Bilal Shaheen", "example"), "show_info" => true); $példány = wp_parse_args((tömb) $példány, $alapértelmezettek); ?>

Most alkotni fogunk beviteli szövegmező. Ezeket az értékeket egy bekezdéscímkébe foglaljuk.

// Widget címe: Szövegbevitel

"name="get_field_name("cím"); ?>"value=""style="width:100%;" />

//szövegbevitel

"name="get_field_name("név"); ?>"value=""style="width:100%;" />

// jelölőnégyzet

id="get_field_id("show_info"); ?>"name="get_field_name("show_info"); ?>" />

Következtetés

Rendben, most mindennek vége. Elkészítette saját szép és egyszerű widgetjét, amely a blog szerzőjének nevét mutatja. Sőt, lehetővé teszi a felhasználó számára, hogy eldöntse, megjeleníti-e az információt a közönségnek vagy sem. Mentse el a kódot ide PHP fájlés töltse fel a téma mappájába. Hívja a sajátjában függvények.php. Ezután lépjen be a konzolba Megjelenés → Widgetekés látni fogja a widgetet.

Mindezt a kódot a cikkhez csatolt fájl tartalmazza, így még egyszerűbb a másolás és beillesztés. Élvezd!