Как в андроиде создать виджет. Как создать свой собственный виджет в WordPress? Как отключить виджеты

Знаете ли вы, что вы можете создать виджеты для WordPress своими руками? Несмотря на то, что существует множество других виджетов, которые идут вместе с разными темами и плагинами, WordPress предоставляет возможность создать виджет вручную для всех своих пользователей. В этом вы узнаете, как создать виджеты для WordPress и добавить их на ваш сайт. Если вас это заинтересовало, то мы можем вас обрадовать – единственными ингредиентами, которые вам понадобятся, являются лишь базовые знания о WordPress и PHP. Итак, без лишних слов, давайте приступать.

Перед тем, как вы начнете это руководство, вам понадобится следующее:

Немного о WordPress виджетах

Виджеты WordPress предназначены для более легкого процесса добавления различных блоков на ваш сайт с помощью интерфейса перетаскивания. WordPress уже имеет стандартные встроенные виджеты. Эти виджеты дают вам некоторые базовые инструменты и совместимы с любой темой WordPress. Но иногда, вам может потребоваться добавить новые возможности и блоки для сайта. В таком случае, лучшим решением станет поиск нужного плагина, который имеет нужный вам функционал. Хотя вы и можете найти плагины для большинства стандартных задач, иногда трудно найти нужный, который удовлетворит ваши потребности. Это именно тот случай, когда вам может понадобиться создать виджеты для WordPress самому. Эта возможность дает пользователю полный контроль над своим сайтом и его функционалом.

Перед началом руководства

Перед тем, как создать виджеты для WordPress, вам необходимо подумать о нескольких вещах. Первое, вы можете создать виджет в качестве пользовательского плагина. Это позволит использовать его на любом сайте, который использует этот плагин. Или, вы можете просто добавить виджет в файл functions.php или определенную тему, что сделает его совместимым лишь для этой темы. Второе, у вас есть возможность добавить виджет на запущенный и работающий сайт или в локальную среду. В соответствии с рекомендациями по разработке, мы советуем для начала добавить плагин в локальную среду (ознакомьтесь с нашим руководством о ). После того, как вы убедитесь в отсутствии ошибок и его правильной работе, вы сможете легко портировать его на ваш сайт .

Как работают пользовательские виджеты WordPress: Widgets API

WordPress позволяет вам создавать свои виджеты, предоставляя вам доступ к Widgets API . Чтобы создать пользовательский виджет, вы должны использовать стандартные классы WP_Widget из API. Эти базовые классы предлагают более 20 функций, которые вы можете свободно использовать и комбинировать. Из всех этих функций, 4 являются минимальным требованием для работы любого виджета. Вот список этих функций:

  • __construct() – функция конструктора
  • widget() – содержит вывод виджета
  • form() – определяет настройки виджета в панели управления WordPress
  • update() – обновляет настройки виджета

Конечно, существует и множество других методов, которые предоставляют дополнительный функционал. Чтобы узнать больше о классах WP_Widget , посетите данную страницу .

Как создать виджеты для WordPress

Теперь, когда мы составили концепт нашей задачи, давайте приступим к ее реализации. Для этого урока мы создадим простой пользовательский виджет Привет мир, чтобы вы могли узнать об азах создания виджета в WordPress. Конечно, вы можете перейти к созданию более сложных виджетов по своему усмотрению.

Еще один нюанс, мы пишет этот код в файле functions.php текущей темы, но вы можете делать это в любом пользовательском плагине.

Теперь откройте любой текстовый редактор на вашем компьютере и создайте новый класс, который расширит базовый класс WP_Widget , вот так:

Class hstngr_widget extends WP_Widget { //Вставляйте функции сюда }

Теперь мы начнем добавление 4 ранее упомянутых функций, одну за другой. Первой в списке идет метод конструктора, которую мы используем для указания ID, названия виджета и описания:

Function __construct() { parent::__construct(// widget ID "hstngr_widget", // widget name __("Тестовый Виджет Hostinger", " hstngr_widget_domain"), // widget description array("description" => __("Как создать виджеты для WordPress", "hstngr_widget_domain"),)); }

Public function widget($args, $instance) { $title = apply_filters("widget_title", $instance["title"]); echo $args["before_widget"]; //if title is present if (! empty($title)) echo $args["before_title"] . $title . $args["after_title"]; //output echo __("Привет мир, от сайт", "hstngr_widget_domain"); echo $args["after_widget"]; }

Здесь мы настроили вывод виджета так, чтобы он отобразил ‘Привет мир, от сайт’, и название виджета указанного пользователем.

Теперь нам необходимо написать бек-энд виджета с помощью метода form() :

Public function form($instance) { if (isset($instance[ "title" ])) $title = $instance[ "title" ]; else $title = __("Стандартный Заголовок", "hstngr_widget_domain"); ?>

" name="get_field_name("title"); ?>" type="text" value="" />

Здесь вы можете увидеть как был настроен пользовательский виджет. Если пользователь предоставил заголовок, то тогда он будет добавлен в созданную HTML форму. В противном случае, будет добавлено название Стандартный Заголовок в качестве заголовка. Этот код отвечает за то, как отображается виджет в панели управления WordPress.

И наконец последнее, но не по значению, мы добавим функцию обновления, чтобы обновлять виджет при каждом изменении его настроек.

Public function update($new_instance, $old_instance) { $instance = array(); $instance["title"] = (! empty($new_instance["title"])) ? strip_tags($new_instance["title"]) : ""; return $instance; }

Этот код принимает текущий заголовок вновь созданного экземпляра, удаляет любые теги HTML/PHP, передает заголовок экземпляру и возвращает его.

Осталась еще одна вещь, которую вам необходимо сделать, вам нужно использовать дополнительную функцию, чтобы зарегистрировать виджет в WordPress:

Function hstngr_register_widget() { register_widget("hstngr_widget"); } add_action("widgets_init", "hstngr_register_widget");

Обратите внимание, что этот код должен быть помещен вне функции hstngr_widget .

Мы определили новую функцию под названием hstngr_register_widget() , которая регистрирует наш виджет с помощью ID виджета, указанного в функции __construct() . Затем мы связали эту функцию при помощи widgets_init , которая загружает этот виджет в WordPress через встроенный метод add_action() . В финальном варианте ваш WordPress виджет должен выглядеть примерно вот так:

Function hstngr_register_widget() { register_widget("hstngr_widget"); } add_action("widgets_init", "hstngr_register_widget"); class hstngr_widget extends WP_Widget { function __construct() { parent::__construct(// widget ID "hstngr_widget", // widget name __("Тестовый Виджет Hostinger", " hstngr_widget_domain"), // widget description array("description" => __("Как создать виджеты для WordPress", "hstngr_widget_domain"),)); } public function widget($args, $instance) { $title = apply_filters("widget_title", $instance["title"]); echo $args["before_widget"]; //if title is present if (! empty($title)) echo $args["before_title"] . $title . $args["after_title"]; //output echo __("Привет мир, от сайт", "hstngr_widget_domain"); echo $args["after_widget"]; } public function form($instance) { if (isset($instance[ "title" ])) $title = $instance[ "title" ]; else $title = __("Стандартный Заголовок", "hstngr_widget_domain"); ?>

" name="get_field_name("title"); ?>" type="text" value="" />

Вы можете использовать Файловый Менеджер, FTP-клиент или Редактор WordPress для добавления этого кода в файл functions.php вашей темы. Добавьте код в файл function.php активной темы и нажмите Обновить файл для сохранения изменений.

Теперь зайдите в панель управления WordPress и перейдите во вкладку Внешний вид → Виджеты . Далее вы должны найти виджет под названием Тестовый Виджет Hostinger в списке виджетов.

Перетащите виджет в область для виджетов в правой части страницы. Теперь вы сможете выставить заголовок для виджета. Сохраните его и посетите вашу страницу..

Поздравляем, вы успешно узнали, как создать виджеты для WordPress. Теперь вы можете посмотреть как выглядит ваш виджет.

Заключение

Создать виджеты для WordPress – наверное это казалось вам очень трудной задачей, однако, это возможно для каждого человека с базовыми знаниями в HTML и PHP. В этом руководстве вы узнали, как создать виджеты для WordPress при помощи нашей краткой инструкции. Теперь вы можете начать создание еще более функциональных виджетов. Если вам понравилось наше руководство, то посетите другие .

Создавать виджет WordPress – это примерно, как создавать плагин, но гораздо проще и понятнее. Все, что вам нужно, это один файл со всем PHP кодом, который писать гораздо проще, чем плагин, у которого несколько файлов. Есть три основные функции виджета: это widget , update и form .

  • function widget()
  • function update()
  • function form()

| Скачать исходники |

Базовая структура

Базовая схема нашего виджета – очень простая, есть полезные функции, которые вам нужно знать. Костяком структуры нашего виджета будет что-то вроде этого:

Add_action("widgets_init", "register_my_widget"); // function to load my widget function register_my_widget() {} // function to register my widget class My_Widget extends WP_Widget () {} // The example widget class function My_Widget() {} // Widget Settings function widget() {} // display the widget function update() {} // update the widget function form() {} // and of course the form for the widget options

Шаг 1. widget_init

Перед тем, как мы все это сделаем, нам нужно загрузить наш виджет с помощью функции widget_init . Это зацепка к action , о которой вы можете найти больше информации в WordPress codex .

Add_action("widgets_init", "register_my_widget");

Следующее, что мы сделаем, это зарегистрируем наш виджет в WordPress, чтобы он был доступен в разделе виджетов.

Function register_my_widget() { register_widget("My_Widget"); }

Шаг 2. Класс

Мы заключим наш виджет в класс . Имя класса имеет значение! Что мы должны иметь в виду, так это что имя класса и имя функции должны быть одинаковыми .

Class My_Widget extends WP_Widget {}

Теперь мы передадим классу некоторые параметры настроек. Например, мы можем передать ширину и высоту . Мы также можем дать небольшое описание нашему виджету, если хотим. Это будет полезно, если вы связываете виджет с вашей коммерческой темой.

Function My_Widget() { function My_Widget() { $widget_ops = array("classname" => "example", "description" => __("A widget that displays the authors name ", "example")); $control_ops = array("width" => 300, "height" => 350, "id_base" => "example-widget"); $this->WP_Widget("example-widget", __("Example Widget", "example"), $widget_ops, $control_ops); }

Теперь, когда мы закончили с основными требованиями к нашему виджету, мы обратим наше внимание на три функции , о которых мы говорили ранее, и которые являются важными функциями или основными блоками для построения нашего виджета!

Шаг 3. function widget()

Первая функция относится к отображению нашего виджета. Мы передадим несколько аргументов в нашу функцию. Мы будем передавать аргументы из темы, это могут быть заголовок или какие-то другие параметры. Теперь мы передаем переменную instance , которая связана с классом нашей функции.

Function widget($args, $instance)

После этого мы извлекаем параметры из аргументов, потому что нам нужно, чтобы параметры были доступны локально. Если вы не знаете, что такое локальная переменная, не переживайте об этом сейчас и просто добавьте этот шаг.

Extract($args);

Дальше мы установим заголовок и другие параметры для нашего виджета, которые могут быть изменены пользователем в меню видежета. Мы также добавляем специальные переменные типа $before_widget, $after_widget . Эти параметры обрабатываются темой.

$title = apply_filters("widget_title", $instance["title"]); $name = $instance["name"]; $show_info = isset($instance["show_info"]) ? $instance["show_info"] : false; echo $before_widget; // Display the widget title if ($title) echo $before_title . $title . $after_title; //Display the name if ($name) printf("

" . __("Hey their Sailor! My name is %1$s.", "example") . "

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

Шаг 4. function update()

Function update($new_instance, $old_instance) { $instance = $old_instance; //Strip tags from title and name to remove HTML $instance["title"] = strip_tags($new_instance["title"]); $instance["name"] = strip_tags($new_instance["name"]); $instance["show_info"] = $new_instance["show_info"]; return $instance; }

Одна вещь, на которую нужно обратить внимание: здесь мы используем strip_tags , чтобы удалить из текста весь XHTML , который может нарушить работу нашего виджета.

Шаг 5. function form()

На следующем шаге мы создадим форму , которая послужит блоком ввода . Она примет определяемые пользователем настройки и значения. Функция form может включать чекбоксы, поля для ввода текста и т.д.

Перед тем, как мы создадим эти поля для ввода, нам нужно определиться, что показывать, когда пользователь не выбирает ничего из виджета. Чтобы сделать это, мы передадим значения по умолчанию для параметров, например, заголовок, описание и т.д.

//Set up some default widget settings. $defaults = array("title" => __("Example", "example"), "name" => __("Bilal Shaheen", "example"), "show_info" => true); $instance = wp_parse_args((array) $instance, $defaults); ?>

Теперь мы создадим текстовое поле ввода . Мы заключим эти значения в тег абзаца.

// Widget Title: Text Input

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

//Text Input

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

// Checkbox

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

Заключение

Ну вот и все. Вы только что сделали самостоятельно симпатичный и простой виджет, который показывает имя автора блога. Более того, он дает возможность пользователю выбирать, показывать информацию аудитории или нет. Сохраните код в PHP файл и загрузите в папку своей темы. Вызовите его в вашем functions.php . После этого, перейдите в консоли в Внешний вид → Виджеты и вы увидите ваш виджет.

Весь этот код включен в прикрепленный к статье файл, так что скопировать и вставить можно еще проще. Наслаждайтесь!

Операционная система Аndroid имеет множество функций и возможностей. Одной из них являются виджеты - окошки, которые позволяют использовать часть функционала приложения, без его запуска.

В основном виджеты идут в комплекте с приложением. Однако есть программы, которые лишены данной опции. А значит, нужно брать дело в свои руки!

  • С помощью Play Market скачиваем бесплатное приложение “KWGT Kustom Widget Maker”, которые можно приобрести бесплатно, однако часть функций будут доступны только после покупки дополнения.

Программа выступает в качестве платформы для запуска сторонних виджетов от разных разработчиков. Помимо этого вы можете изменить внешний вид виджетов, задать им дополнительный функционал.


Сперва можно подумать, что “KWGT Kustom Widget Maker” сложное приложение, которое напоминает программы для разработки софта. И да и нет: интерфейс похож, но сложного тут ничего нет.


Чтобы начать редактировать виджеты:

  • заходим на рабочий стол и вызываем меню редактирования рабочих столов путем удержания кнопки меню или долгим тапом по экрану;
  • находим рамку виджетов “KWGT” и выставляем необходимый размер, например - 4х2. После этого на рабочем столе образуется окошко;
  • Кликаем по окошку, тем самым открывая меню выбора виджетов;
  • Выбираем понравившийся макет и нажимаем на него (Дополнительные макеты можно скачивать с Play Маркет. Для этого в строке поиска приложений указываем “KWGT виджеты”);
  • После выбора понравившегося макета приложение перейдет к его редактированию. Будут доступны следующие настройки:
  1. Элементы, отвечающие за настройку геометрических параметров виджета;
  2. Фон, отвечающий за фоновую картинку на виджета;
  3. Касание, задающий действия которые будут выполняться при активации виджета;
  4. Слой, отвечающий за масштаб виджета;

В итоге мы получим уникальный виджет, с необходимым функционалом.

май 21 , 2016

Каждый раз подключая на своих сайтах готовое решение от сервисов вроде disqus или google-аналитики, я удивляюсь простоте интеграции достаточно сложного функционала. Поставил в код 3 строчки javascript-кода - и у тебя уже развернулся блок с комментариями. Еще 2 строчки - и доступна аналитика от гугла или яндекса. Конечно, никакого волшебства при этом не происходит, те самые 3 строчки кода подтягивают с удаленного сервера весь нужный код, и по сути разворачивают небольшое веб-приложение на страницах Вашего сайта. Но как это устроено внутри и как это сделать самому? Разобраться с этим было достаточно интересно, и в итоге у меня получился небольшой виджет, который работает именно по такой простой схеме встраивания и при этом еще выполняют некоторые полезные вещи. Далее подробности.

Зачем нужны виджеты?

Для этой цели хорошо подходят iframe-ы. Это фактически отдельные html-страницы, которые встраиваются в другие страницы, при этом не имея доступа к своему "родителю". То есть в iframe можно встроить наше веб-приложение, которое будет спокойно выполнять свою работу, не вмешиваясь в основной сайт. А что именно будет делать Ваш виджет, строить систему комментариев на странице, показывать прикольную игрушку или рисовать интерактивный рекламный баннер - дело исключительно Вашего вкуса и фантазии.

В этой статье на игрушку мы замахиваться не будем, а рассмотрим, как создать встраиваемый виджет для определения погоды. Конечно, для этого есть много различных погодных сервисов, но нам неинтересно воспользоваться готовым решением. Хочется создать простенький виджет своими руками, чтобы понять, как это вообще работает и в дальнейшем применить знания уже для каких-то полезных вещей. Заодно попутно освежим знания в нативном javascript и php.

Что будем делать?

Мы создадим виджет, который рисует форму с прогнозом погоды на завтра. В качестве примера возьмем только температуру, но как увидите дальше, легко можно будет добавить и другие данные. В виджете будет располагаться информация о температуре на завтра, раскрывающийся список с возможностью выбрать город. Кнопка Обновить будет отправлять запрос на сервер, который в свою очередь обращается на сторонний сервис для определения погоды и возвращает нам нужную инфу. Эти данные мы обрабатываем и возвращаем в браузер клиенту. Где уже клиентская часть виджета перехватывает информацию и выводит ее пользователю.


Здесь мы видим какую-то страницу, где рассказывается, что якобы мы умеем определять погоду. И демонстрируем нашим посетителям формочку, дабы они могли убедиться, что погоду действительно можно узнать прямо здесь.

Я не развлекался с версткой формы, цель статьи не в этом. В реальном мире мы, конечно же, создали бы симпатичную формочку, которая привлекала бы внимание.

Итак, вернемся. Люди узнают погоду, возможно, даже не задумываясь о том, что фактически пользуются другим сервисом. Но все довольны и счастливы, Вы получаете посетителей на свой сайт, клиенты - нужную информацию.

Здесь нужно небольшое уточнение: смысл виджетов в том, чтобы предоставлять уникальный, удобный, интересный функционал. Мы не даем в нашем примере какую-то особенную информацию. Погоду можно узнать где угодно. Но в познавательных целях, так как мы сами пока ничего не умеем делать, возьмем данные по погоде с сервиса Прогноз погоды в России и СНГ . Они любезно предоставляют бесплатный api, коим мы и воспользуемся.

По технологиям

Тоже ничего сложного. Про iframe я уже проговорился. javascript-код будем писать на vanillaJS, без единой дополнительной библиотеки. Даже без jQuery для манипуляции DOM. Наша цель еще состоит и в том, чтобы полученный виджет был максимально легковесным, и ни к чему тащить в браузер пользователя мешок дополнительных библиотек для облегчения своей работы. Поэтому вспомним, как работать с DOM и отправлять ajax-запросы на нативном javascript, и наши клиенты скажут нам спасибо. Серверная часть - пара десятков строк кода на php.

Пишем код. Создаем базовую страницу

Страницу, на которой будет располагаться наш будущий виджет. Напишем там пару строчек текста о том, какие мы классные в плане умения прогнозировать погоду на завтра. Это будет файл index.html - обычная html-страничка. В секции head напишем так:

Webdevkin. Демонстрация виджета Погода

В секции body вот так:

Что здесь из интересного? В файле css/style.css будем хранить стили для страницы (не для виджета!). И в нужном месте создаем iframe..html. Мы убираем у него границу и возможность скроллинга и задаем руками размеры виджета. Конечно, интереснее создать адаптивный, но до этого доберемся позже.

Стили для страницы, без особых изысков:

Body { font-family: Arial; font-size: 14px; } .wrapper { width: 960px; margin: 0 auto; } .weather-widget-container { margin: 30px 0; }

Заготовка для виджета

Виджет представляет из себя обычный html-документ. В чем отличие? Первое - мы не будем заморачиваться с лишними мета-тегами, потому как поисковикам наш виджет не нужен. И второе - и стили, и js-код мы напишем прямо в коде html-страницы. Нам это нужно, чтобы сделать загрузку виджета максимально быстрой, а уменьшение числа запросов к веб-серверу в этом нам поможет. Все, что нужно, мы загрузим одним файлом.

В секции head у нас будет такой код:

В секции body:

Рассмотрим эти блоки подробнее.

Разметка для виджета

Температура на завтра °C

Здесь обычная форма. Сверху небольшая панель, где мы будем выводить температуру. Дальше select с выбором города. Значения value у городов взяты с сервиса meteoservice.ru, где именно, расскажу позже, в разделе, где будем непосредственно получать данные о погоде. И в конце кнопка Обновить. Верстка у нас будет на классах, айдишники проставлены тем элементам, доступ к которым нужен из кода javascript. Префикс wbd- (от webdevkin) используется для удобства, чтобы не путать разметки виджета и основной страницы.

Стили для виджета

html, body, body * { margin: 0; padding: 0; } .wbd-widget, .wbd-widget * { box-sizing: border-box; font-family: Ubuntu; } .wbd-widget { border: solid 1px #333; padding: 20px; color: black; } .wbd-widget__info { color: steelblue; font-size: 16px; text-align: center; } .wbd-widget__form-label { display: block; line-height: 30px; }

Стили для виджета максимально просты - Вы можете написать их под себя, как угодно. Не забываем, что стили ставим прямо в html-файл виджета в раздел head - style.

javascript-код виджета.

Напишем класс, в котором будут методы инициализации, привязки событий и получения данных с сервера. Не забываем, что код будем писать на нативном js, так как не хотим обременять пользователей лишним грузом библиотек.

Var WeatherWidget = (function() { // Для выполнения ajax-запросов var XHR = ("onload" in new XMLHttpRequest()) ? XMLHttpRequest: XDomainRequest; // Конструктор виджета function Widget() { this..php"; this.ui = { updateBtn: null, citySelect: null, temperatureSpan: null }; this.init(); } // Обновление данных о погоде Widget.prototype._updateData = function(e) { // Отправка ajax-запроса на сервер } // Инициализация компонентов ui Widget.prototype._initUI = function() { this.ui.updateBtn = document.getElementById("wbd-widget-update"); this.ui.citySelect = document.getElementById("wbd-widget-city"); this.ui.temperatureSpan = document.getElementById("wbd-widget-temperature"); } // Привязывание событий Widget.prototype._bindHandlers = function() { this.ui.updateBtn.addEventListener("click", Widget.prototype._updateData.bind(this)); } // Инициализация виджета Widget.prototype.init = function() { this._initUI(); this._bindHandlers(); this._updateData(); } // Возвращаем класс виджета return Widget; })(); new WeatherWidget();

Что здесь происходит? Мы создаем модуль на основе замыкания WeatherWidget, внутри оного пишем класс Widget, в прототип которого закидываем нужные методы и возвращаем его из замыкания. Последней строкой мы создаем экземпляр виджета - new WeatherWidget();

Переменная XHR нужна для выполнения ajax-запросов. В конструкторе инициализируем свойство url, по которому будем получать данные о погоде. Также есть объект ui, в котором хранятся 3 поля - те самые элементы DOM, к которым нам нужен доступ из js-кода. Инициализируются они позже, в методе _initUI(). Метод init() вызывает инициализацию ui, привязку событий и обновление данных с сервера (мы же хотим, чтобы при отрисовке виджета пользователь сразу видел погоду без нажатия на Обновить). В _bindHandlers привязывается метод _updateData к клику на кнопку Обновить. Это единственная "интерактивная" часть нашего виджета.

Обратите внимание на конструкцию Widget.prototype._updateData.bind(this). Здесь явным образом привязываем контекст - нам нужно, чтобы в методе _updateData this всегда указывал на экземпляр класса Widget. Сейчас будет видно, зачем - рассмотрим код метода _updateData

Получение данных с сервера, метод _updateData

// Обновление данных о погоде Widget.prototype._updateData = function(e) { e && e.preventDefault(); var xhr = new XHR(), city = this.ui.citySelect.value, temperatureSpan = this.ui.temperatureSpan, data = "city=" + city, resp; xhr.open("POST", this.url, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(data); xhr.onreadystatechange = function() { if (this.readyState != 4) return; if (this.status != 200) { console.log("Request error"); return; } resp = JSON.parse(this.responseText); temperatureSpan.innerHTML = resp.temperature; } }

Обращаю внимание, что в параметры метода передаем свойство e (event). Оно нужно, чтобы сделать preventDefault в самом начале, дабы не перезагрузить наш виджет (иначе сработает submit формы).
Но делаем мы это такой строчкой
e && e.preventDefault();
Эта дополнительная проверка на наличие параметра e нужна, потому что когда мы вызываем this._updateData(), параметр e будет равен undefined, и соответственно e.preventDefault() выкинет исключение.

После этого мы создаем нужные переменные, объект для ajax-запроса, выбранный город и DOM-элемент, в который выводим значение температуры, полученной с сервера. data будет отправляться в ajax-запросе, resp - это ответ от сервера. Дальше мы открываем соединение и отправляем данные на сервер. Дожидаемся ответа 200 от сервера и выводим полученную температуру в span. Условимся, что от сервера приходит json-строка в формате {"code": "success", "temperature": "диапазон температур"}. Традиционно обработку ошибок оставлю на Вашу совесть, все делают по-разному. И наконец, нам осталось узнать, как получить данные о погоде с нашего сервера.

Как узнавать погоду?

Рекомендую пользоваться этим сервисом с осторожностью. Когда статья уже почти была готова, неожиданно поменялся формат ответа по запросу о погоде. Отрубился вывод прогноза по времени суток, который я изначально хотел продемонстрировать в виджете. Пришлось частично переписывать код и уменьшать функциональность виджета, что меня не порадовало. Не знаю, как часто происходят у них такие вещи, но пользоваться сервисом в реальном приложении не советую.

Пишем php-код для получения информации о погоде

Как брать данные, уже понятно, алгоритм прост: вытаскиваем из $_POST параметр city - выбранный город, формируем строку вида http://xml.meteoservice.ru/export/gismeteo/point/$cityId.xml. Это путь к файлу с погодой. Отправляем на него get-запрос curl-ом. Полученный ответ парсим и вытаскиваем из него нужные параметры: минимальная и максимальная температуры. Полученные числа отдаем в json-объекте обратно в браузер.

$cityId = (int)$_POST["city"]; $url = "http://xml.meteoservice.ru/export/gismeteo/point/$cityId.xml"; $temperature = ""; if ($curl = curl_init()) { curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($curl); curl_close($curl); $xml = simplexml_load_string($result); $object = $xml->REPORT->TOWN->FORECAST->TEMPERATURE; $temperature = $object["min"] . "-" . $object["max"]; } echo json_encode(array("code" => "success", "temperature" => $temperature));

Поясню про simplexml_load_string - эта функция создает xml-объект, который мы уже можем парсить. А создается объект из строки xml, которую мы получаем от сервиса погоды.
REPORT->TOWN->FORECAST->TEMPERATURE - это путь по узлам xml, чтобы добраться до нужных значений температуры. Пройдите по ссылке выше (московская погода) и наглядно увидите эти пути.
Если что-то непонятно, спрашивайте в комментариях.

Итого

И на этом все! Мы создали несложный виджет для получения информации о погоде. Главная его особенность в том, что его очень легко встроить на любой сайт, достаточно всего лишь вставить в html-код такие строки

Полагаю, что есть масса вариантов применения таких виджетов, от сбора различной информации до рекламных баннеров. А у Вас есть идеи, где это можно применить? Поделитесь в комментариях!

Недавно мне понадобилось создать гаджет для Windows Sidebar. Навыков в этом у меня не было, поэтому, немного погуглив и почитав документацию , приступаем.

Сразу покажу то, что получилось в итоге


Гаджет будет получать информацию с сайта в виде xml, парсить и, собственно, отображать. Также гаджет будет проверять наличие новых версий, и в случае их присутствия, отказываться работать:)
Изначально, ради получения опыта, хотел написать гаджет полностью на VBScript (так как с ним еще не имел дела), но в конечном итоге пришлось делать вставки на JavaScript.
Перейдем непосредственно к коду. Весь код здесь я рассматривать не буду, покажу лишь основные моменты. Ссылка на готовый гаджет – в конце статьи.
Главный файл гаджета – его манифест – файл Gadget.xml. Он должен называться именно так и располагаться в корне нашего архива (гаджет есть ни что иное, как архив ZIP с расширением.gadget).

Weather from Info.Denms.Ru 1.0.1232 Full Weather Widget (Info.Denms.Ru)

Рассмотрим его более подробно.
Элемент должен содержать apiVersion, равный 1.0.0 (на данный момент), а также атрибут src, в котором указан главный файл нашего гаджета;
Разрешения для гаджета. Устанавливаем равным full;
Минимальная версия Widows Sidebar. На данный момент – 1.0;
Параметры - имя гаджета, - версия, - информация об авторе, - ссылка на страницу с гаджетом, - иконка гаджета и будут отображаться на панели установленных гаджетов.

Файл main.html – обычный html файл, приводить его полностью не буду, остановлюсь лишь на некоторых моментах.
С помощью элемента g:background задается фон гаджета. Сделаем его прозрачным.

Гаджет может находиться в двух состояниях – docked (слева на скрине выше), и undocked (справа). Будем хранить текущее состояние гаджета в переменной JavaScript docked.

Функция-обертка isDocked потребуется нам в дальнейшем, чтобы из VBScript узнать текущее состояние гаджета (как я не старался, но реализовать это на чистом VBScript не смог). Еще одно замечание – скрипты корректно работают именно в этом порядке, т.е. сначала описываем скрипты VBScript, потом JavaScript.

Остальные элементы в main.html представлены элементами DIV с абсолютным позицированием. Впоследствии из скриптов мы будем обращаться к ним по их id.

С помощью JavaScript зададим состояния docked и undocked для гаджета, а так же укажем файл настроек (main.js)

System.Gadget.onDock = resize; System.Gadget.onUndock = resize; System.Gadget.settingsUI = "settings.html"; System.Gadget.onSettingsClosed = SettingsClosed; docked=0; //начальное состояние гаджета resize(); //инициализация

Как видно из листинга выше, при смене состояний гаджета будет вызываться функция resize().

Function resize() { bd = document.body.style; System.Gadget.beginTransition(); if (System.Gadget.docked) { // small state bd.width=148; //устанавливаем размеры гаджета bd.height=201; docked = 1; bd.background="url(images/gadget.png) no-repeat"; //устанавливаем фон //далее следует перенос значений из состояния undocked в docked и обнуление элементов для состояния undocked 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; //перенос значений из состояния docked в undocked и обнуление элементов для состояния docked document.getElementById("big_needupdate").innerHTML = document.getElementById("small_needupdate").innerHTML; document.getElementById("small_needupdate").innerHTML = ""; //... } System.Gadget.endTransition(System.Gadget.TransitionType.morph,1); }

Также можно описать функцию сохранения настроек. В моем гаджете их нет, но для примера покажу как это делается

Function SettingsClosed(event) { if (event.closeAction == event.Action.commit) { //alert System.Gadget.Settings.readString("test"); } }

ReadString – читает ранее сохраненную строку, writeString, соответственно, записывает.
Методы System.Gadget.beginTransition(); и System.Gadget.endTransition(); нужны для “плавного» изменения размера гаджета. В Windows Seven они игнорируются , но я все же оставил их для обратной совместимости.

Как уже говорилось выше, сервер предоставляет нам информацию о погоде в формате xml.

1.7 41 пасмурно снег 87 Ю-З 5 -3 -1 -1 26 1 -9 41 0 …

Скачивать и парсить xml будем на VBScript.

Sub DownloadXML2 Set objXML = CreateObject("Microsoft.XmlHttp") objXML.Open "GET", "http://info.kovonet.ru/weather.xml", True objXML.OnReadyStateChange = GetRef("objXML_onreadystatechange") objXML.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" objXML.Send iTimeoutID = window.SetTimeout("mySleep", 1000) End Sub

Функция mySleep будет проверять наше соединение на таймаут.

Sub mySleep if bRespReceived = "false" then "ответ еще не получен iTimeout = iTimeout + 1 if (iTimeout > 30) then "таймаут timerFirstRun = window.SetTimeout("Update", 60000) "попытка повторного обновления через минуту else "таймаут еще не достигнут, продолжаем считать секунды iTimeoutID = window.SetTimeout("mySleep", 1000) end if end if End Sub

В случае успешного скачивания objXML.readyState будет равен четырем, а статус (objXML.status) вернет значение 200.

Function objXML_onreadystatechange() If (objXML.readyState = 4) Then "msgbox objXML.statusText If (objXML.status = 200) Then bRespReceived=true SaveFile(objXML.responseText) else timerFirstRun = window.SetTimeout("Update", 60000) "попытка повторного обновления через минуту End If End If End Function

В этом случае сохраняем файл во временную папку Windows

Function SaveFile(what) Set fso = CreateObject("Scripting.FileSystemObject") tempFolder = fso.GetSpecialFolder(2) filepath = tempFolder+"\weather.xml" Dim fso1, tf Set fso1 = CreateObject("Scripting.FileSystemObject") Set tf = fso1.CreateTextFile(filepath, True, True) "rewrite, unicode tf.Write(what) tf.Close ParseXML End Function

И начинаем парсить файл.

Sub ParseXML Set fso = CreateObject("Scripting.FileSystemObject") tempFolder = fso.GetSpecialFolder(2) filepath = tempFolder+"\weather.xml" Set xmlDoc = CreateObject("Msxml2.DOMDocument") xmlDoc.async="false" xmlDoc.load(filepath) "главная нода – в нашем случае Set currNode = xmlDoc.documentElement "дни недели – Set dayNode = currNode.firstChild While Not dayNode Is Nothing Set currNode = dayNode.firstChild While Not currNode Is Nothing if currNode.parentNode.getAttribute("id") = "today" then "сегодняшний день if currNode.nodeName = "temp" then document.getElementById(prefix+"maintemp").innerHTML = currNode.childNodes(0).text+Chr(176) "отображаем остальные элементы Else "не сегодняшний день, отображаем более мелко "... end If Set currNode = currNode.nextSibling Wend Set dayNode = dayNode.nextSibling Wend End Sub

Проверка на новые версии производится точно таким же способом.
Не забываем создать файл настроек - settings.html, о существовании которого мы объявили выше.

Настройки

Вот, собственно, и все. Буду рад, если моя (первая:)) статья оказалась кому-то полезной.

Использованные источники.

Понравилось? Лайкни нас на Facebook