<?xml version="1.0" encoding="utf-8"?>
<!-- generator="FeedCreator 1.7.2-ppt DokuWiki" -->
<?xml-stylesheet href="https://wiki.oxwall.com/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="https://wiki.oxwall.com/feed.php">
        <title>Oxwall Software Documentation dev:tuts</title>
        <description></description>
        <link>https://wiki.oxwall.com/</link>
        <image rdf:resource="https://wiki.oxwall.com/lib/tpl/dokuwiki/images/favicon.ico" />
       <dc:date>2026-05-07T09:59:53+00:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="https://wiki.oxwall.com/dev:tuts:birthday-list"/>
                <rdf:li rdf:resource="https://wiki.oxwall.com/dev:tuts:birthdays-page"/>
                <rdf:li rdf:resource="https://wiki.oxwall.com/dev:tuts:birthdays-widget"/>
                <rdf:li rdf:resource="https://wiki.oxwall.com/dev:tuts:index"/>
                <rdf:li rdf:resource="https://wiki.oxwall.com/dev:tuts:repository"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="https://wiki.oxwall.com/lib/tpl/dokuwiki/images/favicon.ico">
        <title>Oxwall Software Documentation</title>
        <link>https://wiki.oxwall.com/</link>
        <url>https://wiki.oxwall.com/lib/tpl/dokuwiki/images/favicon.ico</url>
    </image>
    <item rdf:about="https://wiki.oxwall.com/dev:tuts:birthday-list">
        <dc:format>text/html</dc:format>
        <dc:date>2012-10-24T11:08:26+00:00</dc:date>
        <title>Birthday list</title>
        <link>https://wiki.oxwall.com/dev:tuts:birthday-list</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;birthday-list&quot;&gt;Birthday list&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Here is a an example of a working plugin that shows users with upcoming birthdays. It consists of:
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://wiki.oxwall.com/dev:tuts:birthdays-widget&quot; class=&quot;wikilink1&quot; title=&quot;dev:tuts:birthdays-widget&quot;&gt;Main page widget&lt;/a&gt; - shows all site users with upcoming birthdays within 7 days if any.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Dashboard widget - shows member&amp;#039;s friends with upcoming birthdays within 7 days if any.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Profile widget - shows member&amp;#039;s upcoming birthday status within 7 days if available.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://wiki.oxwall.com/dev:tuts:birthdays-page&quot; class=&quot;wikilink1&quot; title=&quot;dev:tuts:birthdays-page&quot;&gt;Separate page&lt;/a&gt; with the list of users with upcoming birthdays withing 7 days if any.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
You can view the above pieces of code and also &lt;a href=&quot;http://www.oxwall.org/store/item/11&quot; class=&quot;urlextern&quot; title=&quot;http://www.oxwall.org/store/item/11&quot;  rel=&quot;nofollow&quot;&gt;download the plugin&lt;/a&gt; from the &lt;a href=&quot;http://www.oxwall.org/store/&quot; class=&quot;urlextern&quot; title=&quot;http://www.oxwall.org/store/&quot;  rel=&quot;nofollow&quot;&gt;Oxwall Store&lt;/a&gt; for general plugin creation guidelines.
&lt;/p&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="https://wiki.oxwall.com/dev:tuts:birthdays-page">
        <dc:format>text/html</dc:format>
        <dc:date>2012-10-24T11:08:38+00:00</dc:date>
        <title>Birthdays: Separate page</title>
        <link>https://wiki.oxwall.com/dev:tuts:birthdays-page</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;birthdaysseparate-page&quot;&gt;Birthdays: Separate page&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Here we create a separate page with upcoming birthdays of site users.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Objective&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Add “Birthdays” list to “Members” page&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;a href=&quot;https://wiki.oxwall.com/_detail/dev-tuts:birthdays_page.png?id=dev%3Atuts%3Abirthdays-page&quot; class=&quot;media&quot; title=&quot;dev-tuts:birthdays_page.png&quot;&gt;&lt;img src=&quot;https://wiki.oxwall.com/_media/dev-tuts:birthdays_page.png&quot; class=&quot;media&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Implementation - Server Side (PHP)&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
birthdays/init.php
&lt;/p&gt;

&lt;p&gt;
&lt;pre class=&quot;code&quot;&gt;
// class that contains all data and functionality to add new type of members listing  
        class BIRTHDAYS_UsersPageData implements BASE_CLASS_IusersPageData
        {

            //set menu item for &amp;quot;Birthdays&amp;quot; page
            public function getMenuItem()
            {
                //$language - helps our site to be multilingual
                $language = OW::getLanguage();

                //initializing menu item
                $item = new BASE_MenuItem();

                $item-&amp;gt;setLabel($language-&amp;gt;text(&amp;#039;base&amp;#039;, &amp;#039;user_list_menu_item_birthdays&amp;#039;))
                    -&amp;gt;setKey(&amp;#039;birthdays&amp;#039;)
                    -&amp;gt;setUrl(OW::getRouter()
                        -&amp;gt;urlForRoute(&amp;#039;birthdays_users&amp;#039;))
                    -&amp;gt;setOrder(5)
                    -&amp;gt;setIconClass(&amp;#039;ow_ic_calendar&amp;#039;);

                if ( $this-&amp;gt;isCase() )
                {
                    $item-&amp;gt;setActive(true); // activate menu if &amp;quot;Birthdays&amp;quot; selected
                }

                return $item;
            }

            // check if URL is belong to &amp;quot;Birthdays&amp;quot; page
            public function isCase()
            {
                return false !== strstr(OW::getRequest()-&amp;gt;getRequestUri(), OW::getRouter()-&amp;gt;uriForRoute(&amp;#039;birthdays_users&amp;#039;));
            }

            // &amp;quot;Birthdays&amp;quot; page&amp;#039;s unique key
            public function getCase()
            {
                return &amp;#039;birthdays&amp;#039;;
            }

            // get data for &amp;quot;Birthdays&amp;quot; user listing
            public function getData( $first, $count )
            {
                $service = BOL_UserService::getInstance();

                //set date bounds for birthdays
                $period = array(
                    &amp;#039;start&amp;#039; =&amp;gt; date(&amp;#039;Y-m-d&amp;#039;),
                    &amp;#039;end&amp;#039; =&amp;gt; date(&amp;#039;Y-m-d&amp;#039;, strtotime(&amp;#039;+7 day&amp;#039;))
                );

                return array(
                    $service-&amp;gt;findListByBirthdayPeriod($period[&amp;#039;start&amp;#039;], $period[&amp;#039;end&amp;#039;], $first, $count), // get users
                    $service-&amp;gt;countByBirthdayPeriod($start, $end) // count users
                );
            }
        }

        // register data for &amp;quot;Birthdays&amp;quot; page. 
        OW::getRegistry()-&amp;gt;addToArray(&amp;#039;users_page_data&amp;#039;, new BIRTHDAYS_UsersPageData());
&lt;/pre&gt;

&lt;/p&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="https://wiki.oxwall.com/dev:tuts:birthdays-widget">
        <dc:format>text/html</dc:format>
        <dc:date>2012-10-24T11:08:50+00:00</dc:date>
        <title>Birthdays: Main page widget</title>
        <link>https://wiki.oxwall.com/dev:tuts:birthdays-widget</link>
        <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;birthdaysmain-page-widget&quot;&gt;Birthdays: Main page widget&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Here&amp;#039;s how we create a widget on the main page that shows the upcoming birthdays of site users.
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Objective&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Create “Birthdays” widget for Index page &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Use standard BASE_CMP_UsersWidget component&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;a href=&quot;https://wiki.oxwall.com/_detail/dev-tuts:birthdays_widget.png?id=dev%3Atuts%3Abirthdays-widget&quot; class=&quot;media&quot; title=&quot;dev-tuts:birthdays_widget.png&quot;&gt;&lt;img src=&quot;https://wiki.oxwall.com/_media/dev-tuts:birthdays_widget.png&quot; class=&quot;media&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Implementation - Server Side (PHP)&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;
birthdays/components/birthdays_widget.php
&lt;/p&gt;

&lt;p&gt;
&lt;pre class=&quot;code&quot;&gt;
class BIRTHDAYS_CMP_BirthdaysWidget extends BASE_CMP_UsersWidget
{

    public function getData( $count )
    {
        //$language - helps our site to be multilingual  
        $language = OW::getLanguage();

        // $userService - contain basic user functionality
        $userService = BOL_UserService::getInstance();

        // $toolbar - widget&amp;#039;s toolbar
        $toolbar = self::getToolbar();

        //set date bounds for birthdays 
        $period = array(
            &amp;#039;start&amp;#039; =&amp;gt; date(&amp;#039;Y-m-d&amp;#039;),
            &amp;#039;end&amp;#039; =&amp;gt; date(&amp;#039;Y-m-d&amp;#039;, strtotime(&amp;#039;+7 day&amp;#039;))
        );

        // getting users
        $users = $userService-&amp;gt;findListByBirthdayPeriod($period[&amp;#039;start&amp;#039;], $period[&amp;#039;end&amp;#039;], 0, $count);


        if ( !$this-&amp;gt;isCustomizeMode &amp;amp;&amp;amp; empty($users) )
        {
            //hide widget if there are no Birthdays this week
            $this-&amp;gt;setVisible(false);
        }

        return array(
            array(
                &amp;#039;key&amp;#039; =&amp;gt; &amp;#039;birthdays&amp;#039;,
                &amp;#039;menu-label&amp;#039; =&amp;gt; $language-&amp;gt;text(&amp;#039;birthdays&amp;#039;, &amp;#039;user_list_menu_item_birthdays&amp;#039;),
                &amp;#039;users&amp;#039; =&amp;gt; $users,
                &amp;#039;toolbar&amp;#039; =&amp;gt; $toolbar[&amp;#039;birthdays&amp;#039;][0],
            ),
        );
    }

    //returns array of toolbar items
    public static function getToolbar()
    {
        return array(
            &amp;#039;birthdays&amp;#039; =&amp;gt; array(
                array(
                    &amp;#039;label&amp;#039; =&amp;gt; OW::getLanguage()-&amp;gt;text(&amp;#039;base&amp;#039;, &amp;#039;view_all&amp;#039;),
                    &amp;#039;href&amp;#039; =&amp;gt; OW::getRouter()-&amp;gt;urlForRoute(&amp;#039;birthdays_users&amp;#039;)
                )
            ),
        );
    }

    //default settings
    public static function getSettingList()
    {
        $settingList = array();
        $settingList[&amp;#039;count&amp;#039;] = array(
            &amp;#039;presentation&amp;#039; =&amp;gt; &amp;#039;number&amp;#039;,
            &amp;#039;label&amp;#039; =&amp;gt; &amp;#039;Count&amp;#039;,
            &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;10&amp;#039;
        );

        return $settingList;
    }

    // set title and toolbar
    public static function getStandardSettingValueList()
    {
        $toolbars = self::getToolbar();
        return array(
            self::SETTING_TITLE =&amp;gt; OW::getLanguage()-&amp;gt;text(&amp;#039;birthdays&amp;#039;, &amp;#039;widget_title&amp;#039;),
            self::SETTING_TOOLBAR =&amp;gt; $toolbars[&amp;#039;birthdays&amp;#039;]
        );
    }

    // set who allowed to see widget
    public static function getAccess()
    {
        /*
          ACCESS_GUEST - for guests only,
          ACCESS_ALL  - everyone,
          ACCESS_MEMBER - only for registered users )
         */
        return self::ACCESS_ALL;
    }
}
&lt;/pre&gt;

&lt;/p&gt;

&lt;p&gt;
birthdays/activate.php
&lt;/p&gt;

&lt;p&gt;
&lt;pre class=&quot;code&quot;&gt;
        //add &amp;#039;birthdays&amp;#039; widget to index page when plugin activated
        $placeWidget = BOL_ComponentAdminService::getInstance()-&amp;gt;addWidgetToPlace(
            BOL_ComponentAdminService::getInstance()-&amp;gt;addWidget(&amp;#039;BIRTHDAYS_CMP_BirthdaysWidget&amp;#039;, false),
            BOL_ComponentAdminService::PLACE_INDEX
        );
        
        //place widget on index page&amp;#039;s left section
        BOL_ComponentAdminService::getInstance()-&amp;gt;addWidgetToPosition($placeWidget, BOL_ComponentAdminService::SECTION_LEFT);
&lt;/pre&gt;

&lt;/p&gt;

&lt;p&gt;
birthdays/deactivate.php
&lt;/p&gt;

&lt;p&gt;
&lt;pre class=&quot;code&quot;&gt;
	//remove &amp;#039;birthdays&amp;#039; widget when plugin deactivated
	BOL_ComponentAdminService::getInstance()-&amp;gt;deleteWidget(&amp;#039;BIRTHDAYS_CMP_BirthdaysWidget&amp;#039;);
&lt;/pre&gt;

&lt;/p&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="https://wiki.oxwall.com/dev:tuts:index">
        <dc:format>text/html</dc:format>
        <dc:date>2012-10-24T11:09:02+00:00</dc:date>
        <title>Sample plugins with tutorials</title>
        <link>https://wiki.oxwall.com/dev:tuts:index</link>
        <description>
&lt;h3 class=&quot;sectionedit1&quot; id=&quot;sample-plugins-with-tutorials&quot;&gt;Sample plugins with tutorials&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Here you can find examples and code&amp;#039;s samples of some plugins. In some cases this is the good practice to learn code structure and begin to study plugin&amp;#039;s development.
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;a href=&quot;https://wiki.oxwall.com/dev:tuts:birthday-list&quot; class=&quot;wikilink1&quot; title=&quot;dev:tuts:birthday-list&quot;&gt;Birthday List&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
</description>
    </item>
    <item rdf:about="https://wiki.oxwall.com/dev:tuts:repository">
        <dc:format>text/html</dc:format>
        <dc:date>2013-08-27T12:18:32+00:00</dc:date>
        <title>dev:tuts:repository</title>
        <link>https://wiki.oxwall.com/dev:tuts:repository</link>
        <description>
&lt;p&gt;
Using Oxwall Repository. 
&lt;/p&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 1. Create an account at: &lt;a href=&quot;https://bitbucket.org/account/simple-signup/&quot; class=&quot;urlextern&quot; title=&quot;https://bitbucket.org/account/simple-signup/&quot;  rel=&quot;nofollow&quot;&gt;https://bitbucket.org/account/simple-signup/&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 2. Sign in and proceed to Oxwall&amp;#039;s public repository located at : &lt;a href=&quot;https://bitbucket.org/oxwall/public&quot; class=&quot;urlextern&quot; title=&quot;https://bitbucket.org/oxwall/public&quot;  rel=&quot;nofollow&quot;&gt;https://bitbucket.org/oxwall/public&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 3. Fork the repository &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 4. Clone forked repository to your local machine&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 5. Do the changes.&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 6. Push changes ( commit) to your fork&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 6. Create Pull Request. &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; 7. Wait. &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; &lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
</rdf:RDF>
