<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>Dawid Baruch - DEV blog</title>
	<atom:link href="http://www.baruch.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.baruch.pl</link>
	<description>Blog eksperta IP.Board</description>
	<lastBuildDate>Tue, 15 May 2012 11:08:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Własna wyszukiwarka w aplikacji IP.Board</title>
		<link>http://www.baruch.pl/2012/05/wlasna-wyszukiwarka-aplikacji-ip-board/</link>
		<comments>http://www.baruch.pl/2012/05/wlasna-wyszukiwarka-aplikacji-ip-board/#comments</comments>
		<pubDate>Tue, 15 May 2012 11:08:24 +0000</pubDate>
		<dc:creator>Dawid Baruch</dc:creator>
				<category><![CDATA[IP.Board]]></category>
		<category><![CDATA[IPSBeyond.pl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[aplikacje]]></category>
		<category><![CDATA[dodatek]]></category>
		<category><![CDATA[ip.board]]></category>
		<category><![CDATA[ipb]]></category>
		<category><![CDATA[ipsbeyond.pl]]></category>
		<category><![CDATA[moduł]]></category>
		<category><![CDATA[modyfikacja]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[solutiondevs]]></category>
		<category><![CDATA[wyszukiwarka]]></category>
		<guid isPermaLink="false">http://www.baruch.pl/?p=241</guid>
		<description><![CDATA[Dzisiejszy wpis jest delikatnie inny od wcześniejszych wpisów, ponieważ będzie dokładnie opisywał proces tworzenia własnej wyszukiwarki w aplikacjach IP.Board. Artykuł ten jest kontynuacją cyklu wpisów na temat tworzenia dodatków do IP.Board. Nie pozostaje mi nic innego jak zaprosić do czytania dalszej części wpisu. Zapewne zapytać dlaczego cykl tworzenia aplikacji do IP.Board zaczynam od stworzenia wyszukiwarki [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.baruch.pl/wp-content/uploads/2012/04/FB-IPSB-e1334135508176.png" alt="" title="Własna wyszukiwarka w aplikacji IP.Board" width="150" height="150" class="alignleft size-full wp-image-209" /> Dzisiejszy wpis jest delikatnie inny od wcześniejszych wpisów, ponieważ będzie dokładnie opisywał proces tworzenia własnej wyszukiwarki w aplikacjach <a href="http://www.ipsbeyond.pl/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="Support IP.Board" target="_blank"><strong>IP.Board</strong></a>. Artykuł ten jest kontynuacją cyklu wpisów na temat tworzenia dodatków do IP.Board. Nie pozostaje mi nic innego jak zaprosić do czytania dalszej części wpisu.<span id="more-241"></span></p>
<p>Zapewne zapytać dlaczego cykl tworzenia <a href="http://www.ipsbeyond.pl/forum/34-ipboard-coding/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="IP.Board Coding - Support IP.Board" target="_blank"><strong>aplikacji do IP.Board</strong></a> zaczynam od stworzenia wyszukiwarki a nie od stworzenia szkieletu aplikacji? Odpowiedź jest dość prosta (przynajmniej dla mnie). Wiedzę zdobytą w tej publikacji możemy wykorzystać w dowolnej aplikacji, którą mamy zainstalowaną, a która nie posiada jeszcze własnej wyszukiwarki. Natomiast temat tworzenia szkieletu aplikacji jest bardziej skomplikowany i wymaga więcej czasu ode mnie na napisanie tego, oraz od czytelnika aby przyswoił wiedzę.</p>
<p>Opis tworzenia wyszukiwarki zacznę od opisu struktury katalogów, bo ona jest tutaj bardzo ważna. Na poniższym obrazku przedstawiona jest cała struktura folderu search, który musi znajdować się w katalogu extensions naszej aplikacji:</p>
<p><img src="http://www.baruch.pl/wp-content/uploads/2012/05/application_extensions.png" alt="" title="application extensions" width="184" height="236" class="alignnone size-full wp-image-244" /></p>
<p>Teraz znając już strukturę omówię dokładnie co jest czym ;)</p>
<p>Zaczniemy od pliku <em>config.php</em>. Jest to plik konfiguracyjny, który decyduje o tym gdzie można używać wyszukiwarki (chodzi tutaj o wyszukiwanie nowych wpisów, treści użytkownika itp.)</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
/* Można szukać w aplikacji */
$CONFIG['can_search']	      = 1;
/* Można widzieć nową zawartość */
$CONFIG['can_viewNewContent'] = 0;
/* Można pokazać aktywną zawartość */
$CONFIG['can_activeContent']  = 0;
/* Można pokazać treść użytkownika */
$CONFIG['can_userContent'] = 0;
/* Typy treści */
$CONFIG['contentTypes'] = array( 'content', 'comments' );
?&gt;</pre>
<p>W pliku tym umieszczamy taką zawartość i decydujemy co ma być włączone a co nie. Ustawienia dotyczące typu treści dają nam możliwość w wyszukiwarce wybrania np. sekcji w jakiej chcemy szukać. Przykładowo nasza aplikacja posiada treści i komentarze, w związku z tym możemy szukać w typie treść i w typie komentarze.</p>
<p>Kolejnym plikiem jest <em>form.php</em>, który odpowiada za wyświetlenie formularza z opcjami w wyszukiwarce zaawansowanej. Kod pliku umieszczony jest poniżej.</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
/**
 * SolutionrDEVs Application
 * Wyszukiwarka
 *
 * @author      Dawid Baruch
 * @copyright   (c) 2005 - 2012 SolutionDEVs
 * @package     SolutionDEVs Apps
 * @subpackage  PHP
 * @link        http://www.solutiondevs.pl
 * @version     1.0.0
 *
 */
if ( ! defined( 'IN_IPB' ) )
{
	print &quot;&lt;h1&gt;Incorrect access&lt;/h1&gt;You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files.&lt;br /&gt;Author: Dawid Baruch &lt;a href='http://www.solutiondevs.pl'&gt;&lt;strong&gt;SolutionDEVs.pl&lt;/strong&gt;&lt;/a&gt;&quot;;
	exit();
}
class search_form_application
{
	/**
	 * Construct
	 *
	 */
	public function __construct()
	{
		/* Make object */
		$this-&gt;registry   =  ipsRegistry::instance();
		$this-&gt;DB         =  $this-&gt;registry-&gt;DB();
		$this-&gt;settings   =&amp; $this-&gt;registry-&gt;fetchSettings();
		$this-&gt;request    =&amp; $this-&gt;registry-&gt;fetchRequest();
		$this-&gt;lang       =  $this-&gt;registry-&gt;getClass('class_localization');
		$this-&gt;member     =  $this-&gt;registry-&gt;member();
		$this-&gt;memberData =&amp; $this-&gt;registry-&gt;member()-&gt;fetchMemberData();
		$this-&gt;cache      =  $this-&gt;registry-&gt;cache();
		$this-&gt;caches     =&amp; $this-&gt;registry-&gt;cache()-&gt;fetchCaches();
		/* Language */
		$this-&gt;registry-&gt;class_localization-&gt;loadLanguageFile( array( 'public_view' ), 'application' );
	}
	/**
	 * Return sort drop down
	 *
	 *
	 * @access	public
	 * @return	array
	 */
	public function fetchSortDropDown()
	{
		$array = array(
						'content' =&gt; array(
					    					'date'		=&gt; $this-&gt;lang-&gt;words[ 'sd32_content_date' ],
					    					'title'		=&gt; $this-&gt;lang-&gt;words[ 'sd32_content_title' ],
										),
					    'comments'  =&gt; array(
					    					'date'		=&gt; $this-&gt;lang-&gt;words[ 'sd32_comment_date' ],
					    					'title'		=&gt; $this-&gt;lang-&gt;words[ 'sd32_comment_title' ],
				    					)
					);
		return $array;
	}
	/**
	 * Return sort in
	 * Optional function to allow apps to define searchable 'sub-apps'.
	 *
	 *
	 * @access	public
	 * @return	array
	 */
	public function fetchSortIn()
	{
		$array = array(
						array( 'content',	$this-&gt;lang-&gt;words[ 'sd32_search_content' ] ),
					    array( 'comment',	$this-&gt;lang-&gt;words[ 'sd32_search_comment' ] )
					);
		return $array;
	}
	/**
	 * Retuns the html for displaying the extra groups search filters
	 *
	 * @access	public
	 * @return	string	Filter HTML
	 **/
	public function getHtml()
	{
		return array( 'title' =&gt; ipsRegistry::$applications['application']['app_public_title'], 'html' =&gt; '' );
	}
}
</pre>
<p>Metoda <strong>fetchSortDropDown()</strong> musi zwracać tablicę w podobnej postaci jak w powyższym kodzie. Tablica ta jako klucz zawiera typ treści, a jako wartość tablicę zawierającą pary klucz => opis. Klucz jest nazwą po jakiej będziemy sortować wyniki wyszukiwania.</p>
<p>Metoda <strong>fetchSortIn()</strong> Zwraca nam tablicę, która definiuje typy treści oraz ich opisową nazwę (nazwę jaką zobaczy użytkownik).</p>
<p>Metoda <strong>getHtml()</strong> Zwraca nam kod dla dodatkowych ustawień wyszukiwania. Jeśli nie chcemy dawać nic ponad standardowe opcje + możliwość wyszukiwania po różnych typach treści to nie musimy się przejmować tą metodą.</p>
<p>Kolejnym plikiem omówionym przeze mnie będzie <strong>format.php</strong></p>
<pre class="brush: php; title: ; notranslate">&lt;?php
/**
 * SolutionrDEVs Application
 * Wyszukiwarka
 *
 * @author      Dawid Baruch
 * @copyright   (c) 2005 - 2012 SolutionDEVs
 * @package     SolutionDEVs Apps
 * @subpackage  PHP
 * @link        http://www.solutiondevs.pl
 * @version     1.0.0
 *
 */
if ( ! defined( 'IN_IPB' ) )
{
	print &quot;&lt;h1&gt;Incorrect access&lt;/h1&gt;You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files.&lt;br /&gt;Author: Dawid Baruch &lt;a href='http://www.solutiondevs.pl'&gt;&lt;strong&gt;SolutionDEVs.pl&lt;/strong&gt;&lt;/a&gt;&quot;;
	exit();
}
class search_format_application extends search_format
{
	/**
	 * Constructor
	 */
	public function __construct( ipsRegistry $registry )
	{
		parent::__construct( $registry );
		/* Language */
		$this-&gt;registry-&gt;class_localization-&gt;loadLanguageFile( array( 'public_view' ), 'application' );
	}
	/**
	 * Parse search results
	 *
	 * @access	private
	 * @param	array 	$r				Search result
	 * @return	array 	$html			Blocks of HTML
	 */
	public function parseAndFetchHtmlBlocks( $rows )
	{
		/* INIT */
		$search_term        = IPSSearchRegistry::get('in.clean_search_term');
		/* Go through and build HTML */
		foreach( $rows as $id =&gt; $data )
		{
			/* Format content */
			list( $html, $sub ) = $this-&gt;formatContent( $data );
			$data['content_title'] = IPSText::searchHighlight( $data['content_title'], $search_term );
			$results[ $id ] = array( 'html' =&gt; $html, 'app' =&gt; $data['app'], 'type' =&gt; $data['type'], 'sub' =&gt; $sub );
		}
		return $results;
	}
	/**
	 * Formats the forum search result for display
	 *
	 * @access	public
	 * @param	array   $search_row		Array of data from search_index
	 * @return	mixed	Formatted content, ready for display, or array containing a $sub section flag, and content
	 **/
	public function formatContent( $data )
	{
		$template		= ( IPSSearchRegistry::get('application.searchInKey') == 'topics' ) ? 'groupsTopicsSearchResult' : 'groupsGroupSearchResult';
		return array( ipsRegistry::getClass( 'output' )-&gt;getTemplate( 'application' )-&gt;$template( $data, IPSSearchRegistry::get('display.onlyTitles') ), 0 );
	}
	/**
	 * Decides which type of search this was
	 *
	 * @access public
	 * @return array
	 */
	public function processResults( $ids )
	{
		$this-&gt;templates = array( 'group' =&gt; 'application', 'template' =&gt; 'groupsSearchResult' );
		if ( IPSSearchRegistry::get('application.searchInKey') == 'comment' )
		{
			/* Set up wrapper */
			return $this-&gt;_processCommentResults( $ids );
		}
		else
		{
			return $this-&gt;_processContentResults( $ids );
		}
	}
	public function _processContentResults( $ids )
	{
		/* INIT */
		$sort_by     		= IPSSearchRegistry::get('in.search_sort_by');
		$sort_order         = IPSSearchRegistry::get('in.search_sort_order');
		$search_term        = IPSSearchRegistry::get('in.clean_search_term');
		$content_title_only = IPSSearchRegistry::get('opt.searchTitleOnly');
		$onlyPosts          = IPSSearchRegistry::get('opt.onlySearchPosts');
		$order_dir 			= ( $sort_order == 'asc' ) ? 'asc' : 'desc';
		$sortKey			= '';
		$sortType			= '';
		$rows				= array();
		$_rows				= array();
		$members			= array();
		$results			= array();
		/* Got some? */
		if ( count( $ids ) )
		{
			/* Sorting */
			switch( $sort_by )
			{
				default:
				case 'date':
					$sortKey  = 'last_post';
					$sortType = 'numerical';
				break;
				case 'title':
					$sortKey  = 'g_name';
					$sortType = 'string';
				break;
			}
			/* Set vars */
			IPSSearch::$ask = $sortKey;
			IPSSearch::$aso = strtolower( $order_dir );
			IPSSearch::$ast = $sortType;
			/* Fetch data */
			$this-&gt;DB-&gt;build( array(
									'select'   =&gt; &quot;g.*&quot;,
									'from'	   =&gt; array( 'c_groups' =&gt; 'g' ),
		 							'where'	   =&gt; 'g.g_id IN( ' . implode( ',', $ids ) . ')',
									'add_join' =&gt; array(
														array(
																'select' =&gt; 'f.*',
																'from'   =&gt; array( 'forums' =&gt; 'f' ),
																'where'  =&gt; &quot;f.id=g.g_forum&quot;,
																'type'   =&gt; 'inner',
															),
														array(
																'select' =&gt; 't.*',
																'from'   =&gt; array( 'topics' =&gt; 't' ),
																'where'  =&gt; &quot;t.tid=f.last_id&quot;,
																'type'   =&gt; 'inner',
															),
														)
							)	);
			/* Grab data */
			$res = $this-&gt;DB-&gt;execute();
			/* Grab the results */
			while( $row = $this-&gt;DB-&gt;fetch( $res ) )
			{
			    IPSText::getTextClass('bbcode')-&gt;parse_html 				= 0;
        		IPSText::getTextClass('bbcode')-&gt;parse_nl2br				= 1;
        		IPSText::getTextClass('bbcode')-&gt;parse_bbcode				= 1;
        		IPSText::getTextClass('bbcode')-&gt;parse_smilies				= 0;
        		IPSText::getTextClass('bbcode')-&gt;parsing_section			= 'group_add';
        		$row['g_desc'] = IPSText::getTextClass( 'bbcode' )-&gt;preDisplayParse( $row['g_desc'] );
				$_rows[] = $row;
			}
			/* Sort */
			if ( count( $_rows ) )
			{
				usort( $_rows, array(&quot;IPSSearch&quot;, &quot;usort&quot;) );
				foreach( $_rows as $id =&gt; $row )
				{
					/* Got author but no member data? */
					if ( ! empty( $row['last_poster_id'] ) )
					{
						$members[ $row['last_poster_id'] ] = $row['last_poster_id'];
					}
					$results[ $row['id'] ] = $this-&gt;genericizeResults( $row );
				}
			}
			/* Need to load members? */
		    if ( count( $members ) )
			{
				$mems = IPSMember::load( $members, 'all' );
				foreach( $results as $id =&gt; $r )
				{
					if ( ! empty( $r['last_poster_id'] ) AND isset( $mems[ $r['last_poster_id'] ] ) )
					{
						$_mem = IPSMember::buildDisplayData( $mems[ $r['last_poster_id'] ], array( 'reputation' =&gt; 0, 'warn' =&gt; 0 ) );
						$results[ $id ] = array_merge( $results[ $id ], $_mem );
					}
				}
			}
		}
		return $results;
	}
	/**
	 * Formats / grabs extra data for results
	 * Takes an array of IDS (can be IDs from anything) and returns an array of expanded data.
	 *
	 * @access public
	 * @return array
	 */
	public function _processCommentResults( $ids )
	{
		/* INIT */
		$sort_by     		= IPSSearchRegistry::get('in.search_sort_by');
		$sort_order         = IPSSearchRegistry::get('in.search_sort_order');
		$search_term        = IPSSearchRegistry::get('in.clean_search_term');
		$content_title_only = IPSSearchRegistry::get('opt.searchTitleOnly');
		$onlyPosts          = IPSSearchRegistry::get('opt.onlySearchPosts');
		$order_dir 			= ( $sort_order == 'asc' ) ? 'asc' : 'desc';
		$sortKey			= '';
		$sortType			= '';
		$rows				= array();
		$_rows				= array();
		$members			= array();
		$results			= array();
		/* Got some? */
		if ( count( $ids ) )
		{
			/* Sorting */
			switch( $sort_by )
			{
				default:
				case 'date':
					$sortKey  = 'last_post';
					$sortType = 'numerical';
				break;
				case 'title':
					$sortKey  = 'g_name';
					$sortType = 'string';
				break;
				case 'reply':
					$sortKey	= 'posts';
					$sortType	= 'numerical';
				break;
				case 'views':
					$sortKey	= 'views';
					$sortType	= 'numerical';
				break;
			}
			/* Set vars */
			IPSSearch::$ask = $sortKey;
			IPSSearch::$aso = strtolower( $order_dir );
			IPSSearch::$ast = $sortType;
			/* Fetch data */
			$this-&gt;DB-&gt;build( array(
									'select'   =&gt; &quot;t.*&quot;,
									'from'	   =&gt; array( 'topics' =&gt; 't' ),
		 							'where'	   =&gt; 't.tid IN( ' . implode( ',', $ids ) . ')',
									'add_join' =&gt; array(
														array(
																'select' =&gt; 'g.*',
																'from'   =&gt; array( 'c_groups' =&gt; 'g' ),
																'where'  =&gt; &quot;g.g_forum=t.forum_id&quot;,
																'type'   =&gt; 'inner',
															),
														)
							)	);
			/* Grab data */
			$res = $this-&gt;DB-&gt;execute();
			/* Grab the results */
			while( $row = $this-&gt;DB-&gt;fetch( $res ) )
			{
			    IPSText::getTextClass('bbcode')-&gt;parse_html 				= 0;
        		IPSText::getTextClass('bbcode')-&gt;parse_nl2br				= 1;
        		IPSText::getTextClass('bbcode')-&gt;parse_bbcode				= 1;
        		IPSText::getTextClass('bbcode')-&gt;parse_smilies				= 0;
        		IPSText::getTextClass('bbcode')-&gt;parsing_section			= 'group_add';
        		$row['g_desc'] = IPSText::getTextClass( 'bbcode' )-&gt;preDisplayParse( $row['g_desc'] );
				$_rows[] = $row;
			}
			/* Sort */
			if ( count( $_rows ) )
			{
				usort( $_rows, array(&quot;IPSSearch&quot;, &quot;usort&quot;) );
				foreach( $_rows as $id =&gt; $row )
				{
					/* Got author but no member data? */
					if ( ! empty( $row['last_poster_id'] ) )
					{
						$members[ $row['last_poster_id'] ] = $row['last_poster_id'];
					}
					$results[ $row['id'] ] = $this-&gt;genericizeResults( $row );
				}
			}
			/* Need to load members? */
			if ( count( $members ) )
			{
				$mems = IPSMember::load( $members, 'all' );
				foreach( $results as $id =&gt; $r )
				{
				    // Modify by Dawid
					if ( ! empty( $r['last_poster_id'] ) AND isset( $mems[ $r['last_poster_id'] ] ) )
					{
						$_mem = IPSMember::buildDisplayData( $mems[ $r['last_poster_id'] ], array( 'reputation' =&gt; 0, 'warn' =&gt; 0 ) );
						$results[ $id ] = array_merge( $results[ $id ], $_mem );
					}
				}
			}
		}
		return $results;
	}
	/**
	 * Reassigns fields in a generic way for results output
	 *
	 * @param  array  $r
	 * @return array
	 **/
	public function genericizeResults( $r )
	{
		if ( IPSSearchRegistry::get('application.searchInKey') == 'commen' )
		{
			$r['app']                 = 'application';
			$r['content']             = $r['g_desc'];
			$r['content_title']       = $r['title'];
			$r['updated']             = $r['last_post'];
			$r['type_2']              = 'topics';
			$r['type_id_2']           = $r['tid'];
			$r['type_id_3']           = $r['g_id'];
			$r['content_subtitle']    = $r['g_name'];
		}
		else
		{
			$r['app']                 = 'application';
			$r['content']             = $r['g_desc'];
			$r['content_title']       = $r['g_name'];
			$r['updated']             = $r['last_post'];
			$r['type_2']              = 'groups';
			$r['type_id_2']           = $r['g_id'];
			$r['content_subtitle']    = $r['title'];
		}
		return $r;
	}
}</pre>
<p>Plik ten odpowiada za prezentację wyników wyszukiwania. Dokładniej  metodzie <strong>parseAndFetchHtmlBlocks()</strong> zwracamy kod html dla poszczególnych wierszy wyników.</p>
<p>Natomiast metoda <strong>formatContent()</strong> decyduje o tym jakiego szablonu użyć dla konkretnego typu treści.</p>
<p>Pozostałe metody wydaje mi się, że są na tyle przejrzyste, że nie trzeba ich opisywać jakoś szczegółowo.</p>
<p>Przejdźmy zatem do ostatniego już pliku &#8211; <em>sql.php</em></p>
<pre class="brush: php; title: ; notranslate">&lt;?php
/**
 * SolutionrDEVs Application
 * Wyszukiwarka
 *
 * @author      Dawid Baruch
 * @copyright   (c) 2005 - 2012 SolutionDEVs
 * @package     SolutionDEVs Apps
 * @subpackage  PHP
 * @link        http://www.solutiondevs.pl
 * @version     1.0.0
 *
 */
if ( ! defined( 'IN_IPB' ) )
{
	print &quot;&lt;h1&gt;Incorrect access&lt;/h1&gt;You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files.&lt;br /&gt;Author: Dawid Baruch &lt;a href='http://www.solutiondevs.pl'&gt;&lt;strong&gt;SolutionDEVs.pl&lt;/strong&gt;&lt;/a&gt;&quot;;
	exit();
}
class search_engine_application extends search_engine
{
	/**
	 * Constructor
	 */
	public function __construct( ipsRegistry $registry )
	{
		/* Hard limit */
		IPSSearchRegistry::set('set.hardLimit', ( ipsRegistry::$settings['search_hardlimit'] ) ? ipsRegistry::$settings['search_hardlimit'] : 200 );
		parent::__construct( $registry );
	}
	/**
	 * Decide what type of search we're using
	 *
	 * @access	public
	 * @return	array
	 */
	public function search()
	{
		if ( IPSSearchRegistry::get('application.searchInKey') == 'comment' )
		{
			return $this-&gt;_commentSearch();
		}
		else
		{
			return $this-&gt;_contentSearch();
		}
	}
	/**
	 * Perform a comment search.
	 * Returns an array of a total count (total number of matches)
	 * and an array of IDs ( 0 =&gt; 1203, 1 =&gt; 928, 2 =&gt; 2938 ).. matching the required number based on pagination. The ids returned would be based on the filters and type of search
	 *
	 * So if we had 1000 replies, and we are on page 2 of 25 per page, we'd return 25 items offset by 25
	 *
	 * @access public
	 * @return array
	 */
	public function _contentSearch()
	{
		/* INIT */
		$count       		= 0;
		$results     		= array();
		$sort_by     		= IPSSearchRegistry::get('in.search_sort_by');
		$sort_order         = IPSSearchRegistry::get('in.search_sort_order');
		$search_term        = IPSSearchRegistry::get('in.clean_search_term');
		$content_title_only = IPSSearchRegistry::get('opt.searchTitleOnly');
		$order_dir 			= ( $sort_order == 'asc' ) ? 'asc' : 'desc';
		$rows    			= array();
		$count   			= 0;
		$c                  = 0;
		$got     			= 0;
		$sortKey			= '';
		$sortType			= '';
		/* Sorting */
	    switch( $sort_by )
		{
			default:
			case 'date':
				$sortKey  = 'last_post';
				$sortType = 'numerical';
			break;
			case 'title':
				$sortKey  = 'g_name';
				$sortType = 'string';
			break;
		}
		/* Fetch data */
		$this-&gt;DB-&gt;build( array(
									'select'   =&gt; &quot;g.g_id, g.g_name&quot;,
									'from'	   =&gt; array( 'c_groups' =&gt; 'g' ),
									'where'	   =&gt; $this-&gt;_buildWhereStatement( $search_term, $content_title_only, 'groups' ),
									'limit'    =&gt; array(0, IPSSearchRegistry::get('set.hardLimit') + 1),
									'order'	   =&gt; &quot;{$sortKey} {$order_dir}&quot;,
									'add_join' =&gt; array(
														array(
																'from'   =&gt; array( 'forums' =&gt; 'f' ),
																'where'  =&gt; &quot;f.id=g.g_forum&quot;,
																'type'   =&gt; 'inner',
															),
														array(
																'select' =&gt; 't.tid, t.last_poster_id, t.last_post',
																'from'   =&gt; array( 'topics' =&gt; 't' ),
																'where'  =&gt; &quot;t.tid=f.last_id&quot;,
																'type'   =&gt; 'inner',
															),
														)
						)	);
		$this-&gt;DB-&gt;execute();
		/* Fetch count */
		$count = intval( $this-&gt;DB-&gt;getTotalRows() );
		if ( $count &gt; IPSSearchRegistry::get('set.hardLimit') )
		{
			$count = IPSSearchRegistry::get('set.hardLimit');
			IPSSearchRegistry::set('set.resultsCutToLimit', true );
		}
		$_rows = array();
		/* Fetch to sort */
		while ( $r = $this-&gt;DB-&gt;fetch() )
		{
			$_rows[ $r['g_id'] ] = $r;
		}
		/* Set vars */
		IPSSearch::$ask = $sortKey;
		IPSSearch::$aso = strtolower( $order_dir );
		IPSSearch::$ast = $sortType;
		/* Sort */
		if ( count( $_rows ) )
		{
			usort( $_rows, array(&quot;IPSSearch&quot;, &quot;usort&quot;) );
			/* Build result array */
			foreach( $_rows as $r )
			{
				$c++;
				if ( IPSSearchRegistry::get('in.start') AND IPSSearchRegistry::get('in.start') &gt;= $c )
				{
					continue;
				}
				$rows[ $got ] = $r['g_id'];
				$got++;
				/* Done? */
				if ( IPSSearchRegistry::get('opt.search_per_page') AND $got &gt;= IPSSearchRegistry::get('opt.search_per_page') )
				{
					break;
				}
			}
		}
		/* Return it */
		return array( 'count' =&gt; $count, 'resultSet' =&gt; $rows );
	}
	/**
	 * Perform an image search.
	 * Returns an array of a total count (total number of matches)
	 * and an array of IDs ( 0 =&gt; 1203, 1 =&gt; 928, 2 =&gt; 2938 ).. matching the required number based on pagination. The ids returned would be based on the filters and type of search
	 *
	 * So if we had 1000 replies, and we are on page 2 of 25 per page, we'd return 25 items offset by 25
	 *
	 * @access public
	 * @return array
	 */
	public function _commentSearch()
	{
		/* INIT */
		$count       		= 0;
		$results     		= array();
		$sort_by     		= IPSSearchRegistry::get('in.search_sort_by');
		$sort_order         = IPSSearchRegistry::get('in.search_sort_order');
		$search_term        = IPSSearchRegistry::get('in.clean_search_term');
		$content_title_only = IPSSearchRegistry::get('opt.searchTitleOnly');
		$order_dir 			= ( $sort_order == 'asc' ) ? 'asc' : 'desc';
		$rows    			= array();
		$count   			= 0;
		$c                  = 0;
		$got     			= 0;
		$sortKey			= '';
		$sortType			= '';
		/* Sorting */
	    switch( $sort_by )
		{
			default:
			case 'date':
				$sortKey  = 'last_post';
				$sortType = 'numerical';
			break;
			case 'title':
				$sortKey  = 'g_name';
				$sortType = 'string';
			break;
			case 'reply':
				$sortKey	= 'posts';
				$sortType	= 'numerical';
			break;
			case 'views':
				$sortKey	= 'views';
				$sortType	= 'numerical';
			break;
		}
		/* Fetch data */
		$this-&gt;DB-&gt;build( array(
								'select'   =&gt; &quot;t.tid, t.last_post, t.last_poster_id, t.views, t.posts&quot;,
								'from'	   =&gt; array( 'topics' =&gt; 't' ),
								'where'	   =&gt; $this-&gt;_buildWhereStatement( $search_term, $content_title_only ),
								'limit'    =&gt; array(0, IPSSearchRegistry::get('set.hardLimit') + 1),
		                        'order'	   =&gt; &quot;t.{$sortKey} {$order_dir}&quot;,
								'add_join' =&gt; array(
														array(
																'select' =&gt; 'g.g_id, g.g_name',
																'from'   =&gt; array( 'c_groups' =&gt; 'g' ),
																'where'  =&gt; &quot;g.g_forum=t.forum_id&quot;,
																'type'   =&gt; 'inner',
															),
														)
								)	);
		$this-&gt;DB-&gt;execute();
		/* Fetch count */
		$count = intval( $this-&gt;DB-&gt;getTotalRows() );
		if ( $count &gt; IPSSearchRegistry::get('set.hardLimit') )
		{
			$count = IPSSearchRegistry::get('set.hardLimit');
			IPSSearchRegistry::set('set.resultsCutToLimit', true );
		}
		$_rows = array();
		/* Fetch to sort */
		while ( $r = $this-&gt;DB-&gt;fetch() )
		{
			$_rows[ $r['tid'] ] = $r;
		}
		/* Set vars */
		IPSSearch::$ask = $sortKey;
		IPSSearch::$aso = strtolower( $order_dir );
		IPSSearch::$ast = $sortType;
		/* Sort */
		if ( count( $_rows ) )
		{
			usort( $_rows, array(&quot;IPSSearch&quot;, &quot;usort&quot;) );
			/* Build result array */
			foreach( $_rows as $r )
			{
				$c++;
				if ( IPSSearchRegistry::get('in.start') AND IPSSearchRegistry::get('in.start') &gt;= $c )
				{
					continue;
				}
				$rows[ $got ] = $r['tid'];
				$got++;
				/* Done? */
				if ( IPSSearchRegistry::get('opt.search_per_page') AND $got &gt;= IPSSearchRegistry::get('opt.search_per_page') )
				{
					break;
				}
			}
		}
		/* Return it */
		return array( 'count' =&gt; $count, 'resultSet' =&gt; $rows );
	}
	/**
	 * Perform the search for viewUserContent, viewActiveContent, and viewNewContent
	 *
	 * @access	public
	 * @return	array
	 */
	public function _getNonSearchData( $where )
	{
		/* Init */
		$start		= IPSSearchRegistry::get('in.start');
		$perPage	= IPSSearchRegistry::get('opt.search_per_page');
		IPSSearchRegistry::set( 'in.search_sort_by'   , 'date' );
		IPSSearchRegistry::set( 'in.search_sort_order', 'desc' );
		IPSSearchRegistry::set( 'groups.searchInKey'	, in_array( $this-&gt;request['search_app_filters']['application']['searchInKey'], array( 'comment', 'content' ) ) ? $this-&gt;request['search_app_filters']['application']['searchInKey'] : 'contet' );
		/* Fetch the count */
		if( IPSSearchRegistry::get('gapplication.searchInKey') == 'comment' )
		{
			$count = $this-&gt;DB-&gt;buildAndFetch(
												array(
														'select'	=&gt; 'count(*) as count',
														'from'		=&gt; array( 'topis' =&gt; 't' ),
														'where'		=&gt; $where,
														'add_join'	=&gt; array(
																				array(
                        																'from'   =&gt; array( 'c_groups' =&gt; 'g' ),
                        																'where'  =&gt; &quot;g.g_forum=t.forum_id&quot;,
                        																'type'   =&gt; 'inner',
                        															),
																				)
													)
											);
		}
		else
		{
			$count = $this-&gt;DB-&gt;buildAndFetch(
												array(
														'select'	=&gt; 'count(*) as count',
														'from'		=&gt; array( 'c_groups' =&gt; 'g' ),
														'where'		=&gt; $where,
														'add_join' =&gt; array(
                        														array(
                        																'from'   =&gt; array( 'forums' =&gt; 'f' ),
                        																'where'  =&gt; &quot;f.id=g.g_forum&quot;,
                        																'type'   =&gt; 'inner',
                        															),
                        														array(
                        																'from'   =&gt; array( 'topics' =&gt; 't' ),
                        																'where'  =&gt; &quot;t.tid=f.last_id&quot;,
                        																'type'   =&gt; 'inner',
                        															),
                    														)
													)
											);
		}
		/* Fetch the data */
		$imgIds = array();
		if ( $count['count'] )
		{
			if( IPSSearchRegistry::get('application.searchInKey') == 'comment' )
			{
				$this-&gt;DB-&gt;build( array(
											'select'	=&gt; 't.tid as id',
											'from'		=&gt; array( 'topics' =&gt; 't' ),
										 	'where'		=&gt; $where,
										 	'order'		=&gt; 't.last_post DESC',
										 	'limit'		=&gt; array( $start, $perPage ),
										 	'add_join'	=&gt; array(
																	array(
            																'from'   =&gt; array( 'c_groups' =&gt; 'g' ),
            																'where'  =&gt; &quot;g.g_forum=t.forum_id&quot;,
            																'type'   =&gt; 'inner',
            															),
																	)
								)	);
			}
			else
			{
				$this-&gt;DB-&gt;build( array(
											'select'	=&gt; 'g.g_id as id',
											'from'		=&gt; array( 'c_groups' =&gt; 'g' ),
										 	'where'		=&gt; $where,
										 	'order'		=&gt; 't.last_post DESC',
										 	'limit'		=&gt; array( $start, $perPage ),
										 	'add_join'	=&gt; array(
																	array(
            																'from'   =&gt; array( 'forums' =&gt; 'f' ),
            																'where'  =&gt; &quot;f.id=g.g_forum&quot;,
            																'type'   =&gt; 'inner',
            															),
            														array(
            																'from'   =&gt; array( 'topics' =&gt; 't' ),
            																'where'  =&gt; &quot;t.tid=f.last_id&quot;,
            																'type'   =&gt; 'inner',
            															),
																	)
								)	);
			}
			$this-&gt;DB-&gt;execute();
			while( $row = $this-&gt;DB-&gt;fetch() )
			{
				$imgIds[] = $row['id'];
			}
		}
		/* Return it */
		return array( 'count' =&gt; $count['count'], 'resultSet' =&gt; $imgIds );
	}
	/**
	 * Builds the where portion of a search string
	 *
	 * @access	private
	 * @param	string	$search_term		The string to use in the search
	 * @param	bool	$content_title_only	Search only title records
	 * @return	string
	 */
	private function _buildWhereStatement( $search_term, $content_title_only=false, $type='topics' )
	{
		/* INI */
		$where_clause	= array();
		$searchInCats	= array();
		if( $search_term )
		{
			$search_term	= trim($search_term);
			if( $type == 'topics' )
			{
				$where_clause[] = &quot;t.title LIKE '%{$search_term}%'&quot;;
			}
			else
			{
				$where_clause[] = &quot;(g.g_name LIKE '%{$search_term}%' OR g.g_desc LIKE '%{$search_term}%')&quot;;
			}
		}
		/* Exclude some items */
		if( !$this-&gt;memberData['g_is_supmod'] )
		{
			if( $type == 'topics' )
			{
				$where_clause[] = 't.approved=1 AND t.tdelete_time=0';
			}
			/* Approved only */
			$where_clause[]	= 'g.g_approval=1';
		}
		/* Date Restrict */
		if( $this-&gt;search_begin_timestamp &amp;&amp; $this-&gt;search_end_timestamp )
		{
			$where_clause[] = $this-&gt;DB-&gt;buildBetween( &quot;t.last_post&quot;, $this-&gt;search_begin_timestamp, $this-&gt;search_end_timestamp );
		}
		else
		{
			if( $this-&gt;search_begin_timestamp )
			{
				$where_clause[] = &quot;t.last_post &gt; {$this-&gt;search_begin_timestamp}&quot;;
			}
			if( $this-&gt;search_end_timestamp )
			{
				$where_clause[] = &quot;t.last_post &lt; {$this-&gt;search_end_timestamp}&quot;;
			}
		}
		/* Add in AND where conditions */
		if( isset( $this-&gt;whereConditions['AND'] ) &amp;&amp; count( $this-&gt;whereConditions['AND'] ) )
		{
			$where_clause = array_merge( $where_clause, $this-&gt;whereConditions['AND'] );
		}
		/* ADD in OR where conditions */
		if( isset( $this-&gt;whereConditions['OR'] ) &amp;&amp; count( $this-&gt;whereConditions['OR'] ) )
		{
			$where_clause[] = '( ' . implode( ' OR ', $this-&gt;whereConditions['OR'] ) . ' )';
		}
		/* Build and return the string */
		return implode( &quot; AND &quot;, $where_clause );
	}
	/**
	 * Remap standard columns (Apps can override )
	 *
	 * @access	public
	 * @param	string	$column		sql table column for this condition
	 * @return	string				column
	 * @return	void
	 */
	public function remapColumn( $column )
	{
		$column = $column == 'member_id' ? 'g.member_id' : $column;
		return $column;
	}
	/**
	 * Returns an array used in the searchplugin's setCondition method
	 *
	 * @access	public
	 * @param	array 	$data	Array of forums to view
	 * @return	array 	Array with column, operator, and value keys, for use in the setCondition call
	 **/
	public function buildFilterSQL( $data )
	{
		/* INIT */
		$return		= array();
		$searchIn	= $this-&gt;request['search_app_filters']['application']['searchInKey'];
		/* Set up some defaults */
		IPSSearchRegistry::set( 'opt.noPostPreview'  , false );
		IPSSearchRegistry::set( 'opt.onlySearchPosts', false );
		IPSSearchRegistry::set( 'application.searchInKey', in_array( $searchIn, array( 'comment', 'conetnt' ) ) ? $searchIn : 'content' );
		return array();
	}
	/**
	 * Can handle boolean searching
	 *
	 * @access	public
	 * @return	boolean
	 */
	public function isBoolean()
	{
		return false;
	}
}</pre>
<p>Plik ten jest używany do wyszukiwania treści w bazie danych. Dokładny opis pliku oraz dalszą część artykułu można przeczytać w publikacji <a href="http://www.ipsbeyond.pl/topic/5513-wlasna-wyszukiwarka-tresci/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="Własna wyszukiwarka treści - Support IP.Board" target="_blank">Własna wyszukiwarka treści</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baruch.pl/2012/05/wlasna-wyszukiwarka-aplikacji-ip-board/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Szkolenie on-line z zakresu IP.Board</title>
		<link>http://www.baruch.pl/2012/05/szkolenie-on-line-zakresu-ip-board/</link>
		<comments>http://www.baruch.pl/2012/05/szkolenie-on-line-zakresu-ip-board/#comments</comments>
		<pubDate>Tue, 08 May 2012 08:22:28 +0000</pubDate>
		<dc:creator>Dawid Baruch</dc:creator>
				<category><![CDATA[Firma]]></category>
		<category><![CDATA[IP.Board]]></category>
		<category><![CDATA[ip.board]]></category>
		<category><![CDATA[ipb]]></category>
		<category><![CDATA[on-line]]></category>
		<category><![CDATA[solutiondevs]]></category>
		<category><![CDATA[szkolenie]]></category>
		<category><![CDATA[trening]]></category>
		<guid isPermaLink="false">http://www.baruch.pl/?p=239</guid>
		<description><![CDATA[Firma SolutionDEVs jako lider rozwiązań IP.Board w Polsce wprowadza nową usługę &#8211; szkolenie on-line z zakresu IP.Board. Szkolenia odbywają się za pośrednictwem programu np. TeamSpeak na komputerze klienta, dzięki czemu na bieżąco widzi on co się dzieje na forum i dokładnie wie co obecnie jest omawiane. Ponieważ jestem już po przeprowadzeniu kilku godzin szkoleń mogę [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.baruch.pl/wp-content/uploads/2012/04/FB-IPSB-e1334135508176.png" alt="" title="Szkolenie on-line z zakresu IP.Board" width="150" height="150" class="alignleft size-full wp-image-209" /> <a href="http://www.solutiondevs.pl/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="Profesjonalne rozwiązania IP.Board - SolutionDEVs" target="_blank">Firma <strong>SolutionDEVs</strong></a> jako lider rozwiązań <a href="http://www.ipsbeyond.pl/forum/6-ipboard-support/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="Polskie wsparcie IP.Board" target="_blank"><strong>IP.Board</strong></a> w Polsce wprowadza nową usługę &#8211; <a href="http://www.ipsbeyond.pl/store/product/18-szkolenie-on-line-1h/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="Szkolenie on-line - 1h - Support IP.Board" target="_blank">szkolenie on-line</a> z zakresu IP.Board. Szkolenia odbywają się za pośrednictwem programu np. TeamSpeak na komputerze klienta, dzięki czemu na bieżąco widzi on co się dzieje na forum i dokładnie wie co obecnie jest omawiane.<span id="more-239"></span></p>
<p>Ponieważ jestem już po przeprowadzeniu kilku godzin szkoleń mogę napisać, że jest to naprawdę oferta warta uwagi. Zapytacie dlaczego? a chociażby dlatego, że jeśli nie mamy wiedzy z zakresu IP.Board takie szkolenie pozwoli nam bardzo szybko poznać zarówno podstawowe rzeczy, jak np. tworzenie nowego forum, po przez bardziej zaawansowane funkcje forum jak tworzenie nowych masek dostępu dla nowych grup a skończywszy na nauce edycji skinów, czy tworzenia dodatków do IP.Board.</p>
<p>Istnieje oczywiście możliwość przeprowadzenia takiego szkolenia za pośrednictwem maila, komunikatora np. GG, czy chociażby szkolenia zrealizowanego bezpośrednio u klienta. W przypadku szkoleń organizowanych u klienta cena takiego szkolenia jest ustalana indywidualnie.</p>
<p>Szkolenie można zakupić bezpośrednio w naszym <a href="http://www.ipsbeyond.pl/store/product/18-szkolenie-on-line-1h/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="Szkolenie on-line - 1h - Support IP.Board" target="_blank">sklepie</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.baruch.pl/2012/05/szkolenie-on-line-zakresu-ip-board/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SeoPilot &#8211; podsumowanie testów</title>
		<link>http://www.baruch.pl/2012/05/seopilot-podsumowanie-testow/</link>
		<comments>http://www.baruch.pl/2012/05/seopilot-podsumowanie-testow/#comments</comments>
		<pubDate>Fri, 04 May 2012 11:31:15 +0000</pubDate>
		<dc:creator>Dawid Baruch</dc:creator>
				<category><![CDATA[Ogólne]]></category>
		<category><![CDATA[pozycjonowanie]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[seopilot]]></category>
		<category><![CDATA[test systemu]]></category>
		<guid isPermaLink="false">http://www.baruch.pl/?p=233</guid>
		<description><![CDATA[Miesiąc temu w wpisie SeoPilot &#8211; testy pozycjonowania pisałem o tym, że rozpoczynam testy interface&#8217;u pozycjonera w systemie SeoPilot.pl. Dziś przyszedł czas na podsumowanie miesiąca testów. Czy system zdał egzamin i pozycja strony poprawiła się po testach? A może została na tym samym miejscu? Zachęcam do przeczytania dalszej części wpisu aby przekonać się jak wygląda [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.baruch.pl/wp-content/uploads/2012/04/seopilot-150x100.png" alt="" title="SeoPilot.pl - podsumowanie testów" width="150" height="100" class="alignleft size-thumbnail wp-image-174" /> Miesiąc temu w wpisie <a href="http://www.baruch.pl/2012/04/seopilot-testy-pozycjonowania/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="SeoPilot – testy pozycjonowania">SeoPilot &#8211; testy pozycjonowania</a> pisałem o tym, że rozpoczynam testy interface&#8217;u pozycjonera w systemie <a href="http://www.seopilot.pl/webmaster/?session=39305955febcc3eab1e1544332002805" title="SeoPilot" target="_blank">SeoPilot.pl</a>. Dziś przyszedł czas na podsumowanie miesiąca testów. Czy system zdał egzamin i pozycja strony poprawiła się po testach? A może została na tym samym miejscu? Zachęcam do przeczytania dalszej części wpisu aby przekonać się jak wygląda sprawa.<span id="more-233"></span></p>
<p>Jak wspominałem wcześniej nie jestem ekspertem w pozycjonowaniu, więc moje odczucia i opinia jest w pełni subiektywna. W poprzednim wpisie pisałem o tym, że wyniki pozycjonowania będę sprawdzać dodatkiem do przeglądarki Chrome o nazwie SEO SERP. Tak też uczyniłem. Testy pozycjonowania dokonałem na 7 słowach kluczowych. Ich początkowa pozycja jest przedstawiona na obrazku poniżej:</p>
<p><img src="http://www.baruch.pl/wp-content/uploads/2012/04/seopilot-test.png" alt="" title="SeoPilot.pl - rozpoczęcie wyników" width="217" height="183" class="size-full wp-image-175" /></p>
<p>Poniżej przedstawiam wyniki po zakończeniu pozycjonowania:</p>
<p><img src="http://www.baruch.pl/wp-content/uploads/2012/05/seopilot-podsumowanie.png" alt="" title="SeoPilot.pl - wynik końcowy" width="211" height="181" class="size-full wp-image-234" /></p>
<p>Jak pokazuje powyższy obrazek przyrost pozycji jest bezapelacyjny i znaczący. Nie pozostaje mi nic innego jak w pełni potwierdzić fakt, że system <a href="http://www.seopilot.pl/webmaster/?session=39305955febcc3eab1e1544332002805" title="SeoPilot.pl" target="_blank">SeoPilot.pl</a> działa i przynosi satysfakcjonujące efekty. Po miesięcznym teście nie mogę nic więcej napisać jak tylko kilka słów podziękowania za danie mi możliwości przetestowania systemu oraz za poprawienie wyników strony w rankingu Google.</p>
<p>Jeśli chodzi o sam interface pozycjonera to w ciągu tego miesiąca uległ zmianie. Co prawda usunięto jedną funkcjonalność a mianowicie wykres pokazujący przyrost strony w rankingu. W zamian tego pojawiła się opcja ręcznego trybu, pozwalającego na tworzenie własnoręczne strategii pozycjonowania.</p>
<p>Jeśli ktoś ma jeszcze jakiekolwiek wątpliwości dotyczące wyboru systemu do pozycjonowania to gorąco polecam system <a href="http://www.seopilot.pl/webmaster/?session=39305955febcc3eab1e1544332002805" title="SeoPilot" target="_blank">SeoPilot.pl</a>, dzięki któremu nasza strona znajdzie się dużo wyżej w rankingu Google już po pierwszym miesiącu pozycjonowania.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baruch.pl/2012/05/seopilot-podsumowanie-testow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aktualizacja dodatków dla WHT.pl</title>
		<link>http://www.baruch.pl/2012/04/aktualizacja-dodatkow-dla-wht-pl/</link>
		<comments>http://www.baruch.pl/2012/04/aktualizacja-dodatkow-dla-wht-pl/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 11:33:54 +0000</pubDate>
		<dc:creator>Dawid Baruch</dc:creator>
				<category><![CDATA[Firma]]></category>
		<category><![CDATA[IP.Board]]></category>
		<category><![CDATA[aplikacje]]></category>
		<category><![CDATA[company]]></category>
		<category><![CDATA[directory]]></category>
		<category><![CDATA[dodatek]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[ip.board]]></category>
		<category><![CDATA[ipsbeyond.pl]]></category>
		<category><![CDATA[katalog]]></category>
		<category><![CDATA[moduł]]></category>
		<category><![CDATA[modyfikacja]]></category>
		<category><![CDATA[opinie]]></category>
		<category><![CDATA[sd32]]></category>
		<category><![CDATA[solutiondevs]]></category>
		<category><![CDATA[testimonials]]></category>
		<category><![CDATA[wht]]></category>
		<category><![CDATA[wht.pl]]></category>
		<guid isPermaLink="false">http://www.baruch.pl/?p=230</guid>
		<description><![CDATA[Dzisiejszy wpis będzie odrobinę inny, bo będzie dotyczyć prac, które mam do wykonania w celu zaktualizowania dodatków (DB31) Company Testimonials oraz (DB31) Company Directory do nowszych wersji. Jeśli chodzi o dodatek (DB31) Company Testimonials to aktualizacja polega między innymi na zmianie algorytmu sortowania opinii oraz dodaniu kilku nowych funkcjonalności. Funkcjonalności jakie zostaną dodane to uproszczenie [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.baruch.pl/wp-content/uploads/2012/04/BannerBig-e1333439330767-150x135.png" alt="" title="Aktualizacja dodatków dla WHT.pl - SolutionDEVs" width="150" height="135" class="alignleft size-thumbnail wp-image-152" /> Dzisiejszy wpis będzie odrobinę inny, bo będzie dotyczyć prac, które mam do wykonania w celu zaktualizowania dodatków <a href="http://www.solutiondevs.pl/pl/modification/4-db31-company-testimonials/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="(DB31) Company Testimonials - SolutionDEVs" target="_blank">(DB31) Company Testimonials</a> oraz <a href="http://www.solutiondevs.pl/pl/modification/1-db31-company-directory/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="(DB31) Company Directory - SolutionDEVs" target="_blank">(DB31) Company Directory</a> do nowszych wersji.<span id="more-230"></span></p>
<p>Jeśli chodzi o dodatek <strong>(DB31) Company Testimonials</strong> to aktualizacja polega między innymi na zmianie algorytmu sortowania opinii oraz dodaniu kilku nowych funkcjonalności. Funkcjonalności jakie zostaną dodane to uproszczenie rejestracji oraz kilka około systemowych zmian, których zwykły użytkownik nie będzie w stanie zobaczyć w związku z tym nie ma sensu się zbytnio rozpisywać na ten tematu, chyba, że ktoś z czytelników jest tym zainteresowany.</p>
<p>Aplikacja <strong>(DB31) Company Directory</strong> zostanie wyposażona w wyszukiwarkę firm w katalogu, który obecnie nie posiada takowej funkcjonalności. W tym celu zostanie użyty domyślny mechanizm <a href="http://www.ipsbeyond.pl/forum/6-ipboard-support/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="IP.Board - Support IP.Board" target="_blank"><strong>IP.Board</strong></a> do wyszukiwania treści w systemie. Dzięki takiemu rozwiązaniu wyszukiwanie będzie dostępne w globalnej wyszukiwarce forum.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baruch.pl/2012/04/aktualizacja-dodatkow-dla-wht-pl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LDAP i IP.Board 3.3.1</title>
		<link>http://www.baruch.pl/2012/04/ldap-ip-board-3-3-1/</link>
		<comments>http://www.baruch.pl/2012/04/ldap-ip-board-3-3-1/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 14:04:57 +0000</pubDate>
		<dc:creator>Dawid Baruch</dc:creator>
				<category><![CDATA[Firma]]></category>
		<category><![CDATA[IP.Board]]></category>
		<category><![CDATA[autoryzacja]]></category>
		<category><![CDATA[instalacja]]></category>
		<category><![CDATA[ip.board]]></category>
		<category><![CDATA[ipb]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[logowanie]]></category>
		<category><![CDATA[zlecenie]]></category>
		<guid isPermaLink="false">http://www.baruch.pl/?p=227</guid>
		<description><![CDATA[W ostatnich dniach zgłosił się do mnie klient, który poprosił o instalację forum oraz skonfigurowanie po LDAP bazy użytkowników. Przyznałem, że nigdy nie konfigurowałem LDAP, ale postanowiłem spróbować, w końcu zawsze można się czegoś nowego nauczyć. Nie było się zbytnio nad czym zastanawiać więc od razu przeszedłem do działania. Instalacja forum &#8211; żaden problem. Poustawianie [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.baruch.pl/wp-content/uploads/2012/04/BannerBig-e1333439330767-150x135.png" alt="" title="LDAP i IP.Board 3.3.1 - SolutionDEVs" width="150" height="135" class="alignleft size-thumbnail wp-image-152" /> W ostatnich dniach zgłosił się do mnie klient, który poprosił o instalację forum oraz skonfigurowanie po LDAP bazy użytkowników. Przyznałem, że nigdy nie konfigurowałem LDAP, ale postanowiłem spróbować, w końcu zawsze można się czegoś nowego nauczyć.<span id="more-227"></span></p>
<p>Nie było się zbytnio nad czym zastanawiać więc od razu przeszedłem do działania. Instalacja forum &#8211; żaden problem. Poustawianie wszystko i lecimy dalej&#8230; Schody zaczęły się przy konfiguracji LDAP. Dane wpisałem wydaje się prawidłowo, ale przy próbie logowania mam cały czas błąd, nieprawidłowa nazwa użytkownika lub hasło&#8230; Zacząłem więc sprawdzać inne możliwości ustawienia połączenia. Po przetestowaniu wszystkiego błąd nadal był widoczny&#8230;</p>
<p>Skoro wszystkie metody zawiodły, trzeba zacząć debugować&#8230; I tak okazało się, że połączenie jest nawiązywane z serwerem więc połowa sukcesu już jest, ale&#8230;</p>
<p>Wtyczka do logowania korzysta z metody:
<pre class="brush: php; title: ; notranslate">authenticate( $username, $email_address, $password)</pre>
<p> i co się okazuje, ponieważ logowanie odbywa się poprzez podanie emaila, zmienna $username przyjmuje wartość pustą, a co za tym idzie próbujemy się logować na użytkownika, bez loginu tylko z jakimś hasłem&#8230; Posprawdzałem i okazuje się, że w wersji <a href="http://www.ipsbeyond.pl/forum/101-ipboard-33x/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="IP.Board 3.3.x - Support IP.Board" target="_blank">3.3.1</a> należy ręcznie poprawić ten błąd. W pliku /admin/sources/loginauth/ldap/auth.php w linii 151 należy wstawić taki oto kod:</p>
<pre class="brush: php; title: ; notranslate">if( $real_username == '' )
{
    $real_username = $email_address;
}</pre>
<p>no cóż producent nie przewidział widocznie takiej możliwości, albo sypnęło się gdzieś wyżej, ale że nie chciało mi się dochodzić i przeprowadzać śledztwa, gdzie można to poprawić nałożyłem mały patch i wszystko działa ładnie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baruch.pl/2012/04/ldap-ip-board-3-3-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spolszczenie IP.Board 3.3.1 oraz IP.Content 2.3.1 &#8211; Wydane</title>
		<link>http://www.baruch.pl/2012/04/spolszczenie-ip-board-3-3-1-oraz-ip-content-2-3-1-wydane/</link>
		<comments>http://www.baruch.pl/2012/04/spolszczenie-ip-board-3-3-1-oraz-ip-content-2-3-1-wydane/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 09:56:00 +0000</pubDate>
		<dc:creator>Dawid Baruch</dc:creator>
				<category><![CDATA[IPSBeyond.pl]]></category>
		<category><![CDATA[ip.board]]></category>
		<category><![CDATA[ip.content]]></category>
		<category><![CDATA[ipb]]></category>
		<category><![CDATA[ipsbeyond]]></category>
		<category><![CDATA[ipseyond.pl]]></category>
		<category><![CDATA[spolszczenie]]></category>
		<category><![CDATA[tłumaczenie]]></category>
		<guid isPermaLink="false">http://www.baruch.pl/?p=224</guid>
		<description><![CDATA[W dniu wczorajszym zakończyłem tłumaczenie nowej wersji IP.Board oraz dodatków. Jak zawsze najwięcej czasu zajmuje tłumaczenie IP.Content, ale nie ma tego co by na dobre nie wyszło. Dzięki temu znalazłem w końcu czas, na przejrzenie całego tłumaczenia i przetłumaczeniu niektórych zasobów od nowa. Poświęcając wiele godzin na tłumaczenie nowej wersji uzyskałem coś do czego dążyłem, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.baruch.pl/wp-content/uploads/2012/04/FB-IPSB-e1334135508176.png" alt="" title="Spolszczenia IP.Board oraz IP.Content - IPSBeyond.pl" width="150" height="150" class="alignleft size-full wp-image-209" /> W dniu wczorajszym zakończyłem tłumaczenie nowej wersji <a href="http://www.ipsbeyond.pl/forum/101-ipboard-33x/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="IP.Board 3.3.x - Support IP.Board" target="_blank">IP.Board</a> oraz dodatków. Jak zawsze najwięcej czasu zajmuje tłumaczenie <a href="http://www.ipsbeyond.pl/forum/74-ipcontent/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="IP.Content - Support IP.Board" target="_blank">IP.Content</a>, ale nie ma tego co by na dobre nie wyszło. Dzięki temu znalazłem w końcu czas, na przejrzenie całego tłumaczenia i przetłumaczeniu niektórych zasobów od nowa.<span id="more-224"></span></p>
<p>Poświęcając wiele godzin na tłumaczenie nowej wersji uzyskałem coś do czego dążyłem, a mianowicie powstało najdokładniejsze spolszczenie IP.Board. Niewiele osób przywiązuje do tego wagę, ale najważniejsza jest dokładność tłumaczenia dlatego zapraszam do pobierania nowych wersji:<br />
<a href="http://www.ipsbeyond.pl/files/file/225-spolszczenie-ipboard-33x/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="Spolszczenie IP.Board 3.3.x - IPSBeyond.pl" target="_blank">Spolszczenie IP.Board 3.3.1</a> oraz <a href="http://www.ipsbeyond.pl/files/file/224-spolszczenie-do-ipcontent-23x/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="Spolszczenie do IP.Content 2.3.x - IPSBeyond.pl" target="_blank">Spolszczenie do IP.Content 2.3.1</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.baruch.pl/2012/04/spolszczenie-ip-board-3-3-1-oraz-ip-content-2-3-1-wydane/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced Reputation System 2.0.0 &#8211; rozpoczęcie prac</title>
		<link>http://www.baruch.pl/2012/04/advanced-reputation-system-2-0-0-rozpoczecie-prac/</link>
		<comments>http://www.baruch.pl/2012/04/advanced-reputation-system-2-0-0-rozpoczecie-prac/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 11:51:32 +0000</pubDate>
		<dc:creator>Dawid Baruch</dc:creator>
				<category><![CDATA[IP.Board]]></category>
		<category><![CDATA[IPSBeyond.pl]]></category>
		<category><![CDATA[Advanced Reputation System]]></category>
		<category><![CDATA[aplikacja]]></category>
		<category><![CDATA[dodatek]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[ip.board]]></category>
		<category><![CDATA[ipb]]></category>
		<category><![CDATA[ipsbeyond]]></category>
		<category><![CDATA[ipsbeyond.pl]]></category>
		<category><![CDATA[modyfikacja]]></category>
		<category><![CDATA[sd33]]></category>
		<guid isPermaLink="false">http://www.baruch.pl/?p=219</guid>
		<description><![CDATA[Dodatek Advanced Reputation System jest już zapewne wszystkim znany. Właśnie zaczynają się prace nad nową wersją oznaczoną numerkiem 2.0.0. Nowa wersja przyniesie parę bardzo ciekawych zmian, które powinny przypaść do gustu wszystkim użytkownikom&#8230; Nowa odsłona dodatku przyniesie kilka ciekawych zmian. Miedzy innymi zostanie napisana z myślą o najnowszej wersji IP.Board 3.3.x. Następnymi zmianami jakie się [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.baruch.pl/wp-content/uploads/2012/04/FB-IPSB-e1334135508176.png" alt="" title="Advanced Reputation System 2.0.0" width="150" height="150" class="alignleft size-full wp-image-209" /> Dodatek <a href="http://www.solutiondevs.pl/pl/modification/6-db31-advanced-reputation-system/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="Advanced Reputation system - SolutionDEVs" target="_blank">Advanced Reputation System</a> jest już zapewne wszystkim znany. Właśnie zaczynają się prace nad nową wersją oznaczoną numerkiem 2.0.0. Nowa wersja przyniesie parę bardzo ciekawych zmian, które powinny przypaść do gustu wszystkim użytkownikom&#8230;<span id="more-219"></span></p>
<p>Nowa odsłona dodatku przyniesie kilka ciekawych zmian. Miedzy innymi zostanie napisana z myślą o najnowszej wersji <a href="http://www.ipsbeyond.pl/forum/101-ipboard-33x/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="IP.Board 3.3.x - Support IP.Board" target="_blank">IP.Board 3.3.x</a>. Następnymi zmianami jakie się pojawią względem obecnej wersji to to, że nie trzeba będzie już dokonywać żadnych edycji plików. Wszystko zostanie zautomatyzowane.</p>
<p>Dodatkowo co stanowi nowość dodana zostanie możliwość dania powodu przyznawanego plusa lub minusa znana z innego mojego dodatku&#8230; Ale to jeszcze nie wszysto dodatkowo zmieniona zostanie cena dodaktu. Stanie się on tańszy, przez co więcej użytkowników będzie sobie mogło pozwolić na kup tego dodatku&#8230; ale to już niedługo, narazie zabieram się do pracy za owy dodatek.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baruch.pl/2012/04/advanced-reputation-system-2-0-0-rozpoczecie-prac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(SD32) Advanced Topics Functions &#8211; wydana wersja 1.0.1</title>
		<link>http://www.baruch.pl/2012/04/sd32-advanced-topics-functions-wydana-wersja-1-0-1/</link>
		<comments>http://www.baruch.pl/2012/04/sd32-advanced-topics-functions-wydana-wersja-1-0-1/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 07:37:40 +0000</pubDate>
		<dc:creator>Dawid Baruch</dc:creator>
				<category><![CDATA[IP.Board]]></category>
		<category><![CDATA[Advanced Topics Functions]]></category>
		<category><![CDATA[aplikacje]]></category>
		<category><![CDATA[dodatek]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[ip.board]]></category>
		<category><![CDATA[ipsbeyond.pl]]></category>
		<category><![CDATA[moduł]]></category>
		<category><![CDATA[modyfikacja]]></category>
		<category><![CDATA[sd32]]></category>
		<category><![CDATA[solutiondevs]]></category>
		<guid isPermaLink="false">http://www.baruch.pl/?p=217</guid>
		<description><![CDATA[W miniony piątek ukazała się druga już odsłona aplikacji (SD32) Advanced Topics Functions oznaczona numerkiem 1.0.1. Wersja ta nie przynosi co prawda jakichś rewolucyjnych zmian ale w stosunku do wersji 1.0.0 jest kilka drobnych zmian. Zmiany w stosunku do wersji 1.0.0 jest zaledwie kilka i zaliczają się do nich: Wysyłanie PW po odpowiedzi na temat [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.baruch.pl/wp-content/uploads/2012/04/BannerBig-e1333439330767-150x135.png" alt="" title="(SD32) Advanced Topics Functions - SolutionDEVs" width="150" height="135" class="alignleft size-thumbnail wp-image-152" /> W miniony piątek ukazała się druga już odsłona aplikacji (SD32) Advanced Topics Functions oznaczona numerkiem 1.0.1. Wersja ta nie przynosi co prawda jakichś rewolucyjnych zmian ale w stosunku do wersji 1.0.0 jest kilka drobnych zmian.<span id="more-217"></span><br />
Zmiany w stosunku do wersji 1.0.0 jest zaledwie kilka i zaliczają się do nich:</p>
<ul>
<li>Wysyłanie PW po odpowiedzi na temat ajaksowym edytorem  szybkiej odpowiedzi</li>
<li>Wymuszenie wysyłki PW nawet jeśli użytkownik osiągnął już swój limit</li>
<li>Poprawa nieprzechwyconych wyjątków</li>
</ul>
<p>Sama modyfikacja sprawuje się dość dobrze i mam nadzieję, że tak też pozostanie</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baruch.pl/2012/04/sd32-advanced-topics-functions-wydana-wersja-1-0-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IP.Board 3.3.1 &#8211; wydane!!!</title>
		<link>http://www.baruch.pl/2012/04/ip-board-3-3-1-wydane/</link>
		<comments>http://www.baruch.pl/2012/04/ip-board-3-3-1-wydane/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 07:57:29 +0000</pubDate>
		<dc:creator>Dawid Baruch</dc:creator>
				<category><![CDATA[IP.Board]]></category>
		<category><![CDATA[IPSBeyond.pl]]></category>
		<category><![CDATA[3.3.x]]></category>
		<category><![CDATA[ip.board]]></category>
		<category><![CDATA[ipb]]></category>
		<category><![CDATA[ipsbeyond]]></category>
		<category><![CDATA[ipsbeyond.pl]]></category>
		<guid isPermaLink="false">http://www.baruch.pl/?p=214</guid>
		<description><![CDATA[W dniu wczorajszym w godzinach popołudniowych naszego czasu wydana została nowa wersja skryptu forum internetowego IP.Board oznaczona numerkiem 3.3.1. Sama wersja 3.3.1 nie wprowadza żadnych znaczących zmian, wszystkie ciekawe zmiany ostały wprowadzone w wersji 3.3.0 a ta wersja &#8222;łata&#8221; niejako błędy, których nie zauważył producent. Do nowości w wersji IP.Board z serii 3.3.x należy zaliczyć [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.baruch.pl/wp-content/uploads/2012/04/FB-IPSB-e1334135508176.png" alt="" title="FB IPSB" width="150" height="150" class="alignleft size-full wp-image-209" />W dniu wczorajszym w godzinach popołudniowych naszego czasu wydana została nowa wersja skryptu forum internetowego <a href="http://www.ipsbeyond.pl/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="Polskie wsparcie IP.Board" target="_blank">IP.Board</a> oznaczona numerkiem 3.3.1.<span id="more-214"></span> </p>
<p>Sama wersja 3.3.1 nie wprowadza żadnych znaczących zmian, wszystkie ciekawe zmiany ostały wprowadzone w wersji 3.3.0 a ta wersja &#8222;łata&#8221; niejako błędy, których nie zauważył producent. Do nowości w wersji IP.Board z serii 3.3.x należy zaliczyć przede wszystkim zmiany związane z SEO.</p>
<p>Nie może być też inaczej, aby Polskie wsparcie IP.Board nie miało odpowiednich działów, dlatego też powstał dział dla <a href="http://www.ipsbeyond.pl/forum/101-ipboard-33x/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="IP.Board 3.3.x - Support IP.Board" target="_blank">IP.Board 3.3.x</a>. Dodatkowo także zaprzestajemy wspierania raz na zawsze wersji oznaczonych numerkiem 2.x.x. Z nowości na forum można także zaliczyć powstanie nowego działu dla dodatku <a href="http://www.ipsbeyond.pl/forum/102-ipcalendar/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="IP.Calendar - Support IP.Board" target="_blank">IP.Calendar</a>, w którym można uzyskać pomoc związaną z tym dodatkiem. W dniu dzisiejszym przewidziana jest także aktualizacja IPSBeyond.pl do nowej wersji oraz prace nad aktualizacją spolszczenia do najnowszej wersji</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baruch.pl/2012/04/ip-board-3-3-1-wydane/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Płatności AlertPay już dostępne dla IP.Nexus</title>
		<link>http://www.baruch.pl/2012/04/platnosci-alertpay-juz-dostepne-dla-ip-nexus/</link>
		<comments>http://www.baruch.pl/2012/04/platnosci-alertpay-juz-dostepne-dla-ip-nexus/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 07:21:59 +0000</pubDate>
		<dc:creator>Dawid Baruch</dc:creator>
				<category><![CDATA[IP.Board]]></category>
		<category><![CDATA[IPSBeyond.pl]]></category>
		<category><![CDATA[alertpay]]></category>
		<category><![CDATA[bramka]]></category>
		<category><![CDATA[dodatek]]></category>
		<category><![CDATA[ip.board]]></category>
		<category><![CDATA[ip.nexus]]></category>
		<category><![CDATA[ipsbeyond.pl]]></category>
		<category><![CDATA[płatności]]></category>
		<guid isPermaLink="false">http://www.baruch.pl/?p=212</guid>
		<description><![CDATA[W dniu wczorajszym zakończone zostały prace nad bramką płatności AletPay dla IP.Nexus. Prace nad bramką trwały kilka dni ale zakończyły się powodzeniem. Dzięki czemu już od wczoraj możliwy jest zakup w/w bramki dla IP.Nexus&#8217;a. Bramkę można zakupić za kwotę 200zł brutto bezpośrednio na stronie Polskiego wsparcia IP.Board. Instalacja bramki jest w zasadzie bardzo prosta bo [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.baruch.pl/wp-content/uploads/2012/04/247839_147665558639167_147664075305982_301640_903728_n-150x150.jpg" alt="" title="AlertPay" width="150" height="150" class="alignleft size-thumbnail wp-image-200" />W dniu wczorajszym zakończone zostały prace nad bramką płatności AletPay dla <a href="http://www.ipsbeyond.pl/forum/83-ipnexus/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="IP.Nexus - Support IP.Board" target="_blank">IP.Nexus</a>. Prace nad bramką trwały kilka dni ale zakończyły się powodzeniem. Dzięki czemu już od wczoraj możliwy jest zakup w/w bramki dla IP.Nexus&#8217;a.<span id="more-212"></span><br />
Bramkę można zakupić za kwotę 200zł brutto bezpośrednio na stronie <a href="http://www.ipsbeyond.pl/files/file/221-bramka-alertpay/?utm_source=baruch.pl&#038;utm_medium=post&#038;utm_campaign=blog" title="Bramka AlertPay 1.0.0 - IP.Board" target="_blank">Polskiego wsparcia IP.Board</a>. Instalacja bramki jest w zasadzie bardzo prosta bo ogranicza się tylko do wgrania plików na serwer i odpaleniu instalatora.</p>
<p>Zachęcam wszystkich do zakupów bramki. Jeśli ktoś jest zainteresowany jakimś innym systemem płatności to proszę o kontakt to napewno napiszę kolejne bramki&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baruch.pl/2012/04/platnosci-alertpay-juz-dostepne-dla-ip-nexus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

