Skocz do zawartości
ircykk

[(STARY)TUTORIAL] Jak stworzyć moduł dla PrestaShop

Rekomendowane odpowiedzi

mam slider jgalleryview2 i chcę żeby pokazywał się nie tylko na pierwszej stronie ale także na stronie kategorii. Pomóżcie mi jak możecie bo sam tego nie dam rady ogarnąć. Wydaje mi się że to kwestia registerHook's, nie mam pojęcia jak to się ma do strony kategorii.

 

jgalleryview2.php wygląda tak:

 

<?php/** * Module jGalleryView2 * uses JavaScript from http://spaceforaname.com/galleryview * Creation author: Joel Gaujard * management inspired by module LinkSlideText by www.devedition.com * **/class JGalleryView2 extends Module{	protected $maxImageSize = 307200;	protected $imageDir = 'slides/';	protected $_defaultLanguage;	protected $_languages;	protected $_xml;	public function __construct()	{		$this->name = 'jgalleryview2';		$this->tab = 'Home';		$this->version = '1.3.2'; /* compatible PS 1.2.x, 1.3.x */		parent::__construct();		$this->page = basename(__FILE__,'.php');		$this->displayName = $this->l('jGallery View 2');		$this->description = $this->l('Add a jGallery View on your homepage.');		/* initiate values for translation */		$this->_defaultLanguage = intval(Configuration::get('PS_LANG_DEFAULT'));		$this->_languages = Language::getLanguages();		/* put xml in cache */		$this->_xml = $this->_getXml();	}	public function install()	{		if (!parent::install()				OR !$this->registerHook('home')				OR !$this->registerHook('header')			)			return false;		return true;	}	public function getContent()	{		$this->_html = '<h2>'.$this->displayName.' - '.$this->l('version').' '.$this->version.'</h2>';		$this->_html .= $this->_postProcess();		$this->_html .= $this->_displayForm();		return $this->_html;	}	protected function putContent($xml_data, $key, $field)	{		$field = stripslashes(htmlspecialchars($field,ENT_QUOTES,"UTF-8"));		if (!$field)			return 0;		return ("\n\t\t<".$key.">".$field."</".$key.">");	}	private function _postProcess()	{		if (Tools::isSubmit('submitUpdate'))		{			$newXml = '<'.'?'.'xml version="1.0" encoding="utf-8" '.'?'.'>';			$newXml .= "\n<items>";			$i = 0;			foreach (Tools::getValue('item') AS $item)			{				$newXml .= "\n\t<item>";				foreach ($item AS $key => $field)				{					if ($line = $this->putContent($newXml, $key, $field))						$newXml .= $line;				}				if (isset($_FILES['item_'.$i.'_img']) AND isset($_FILES['item_'.$i.'_img']['tmp_name']) AND !empty($_FILES['item_'.$i.'_img']['tmp_name']))				{					Configuration::set('PS_IMAGE_GENERATION_METHOD', 1);					if ($error = checkImage($_FILES['item_'.$i.'_img'], $this->maxImageSize))						return $error;					elseif (!$tmpName = tempnam(_PS_TMP_IMG_DIR_, 'PS') OR !move_uploaded_file($_FILES['item_'.$i.'_img']['tmp_name'], $tmpName))						return false;					elseif (!imageResize($tmpName, dirname(__FILE__).'/'.$this->imageDir.'slide'.$i.'.jpg'))						return $this->displayError($this->l('An error occurred during the image upload.'));					unlink($tmpName);				}				if ($line = $this->putContent($newXml, 'img', $this->imageDir.'slide'.$i.'.jpg'))					$newXml .= $line;				$newXml .= "\n\t</item>\n";				$i++;			}			$newXml .= "\n</items>\n";			if ($fd = @fopen(dirname(__FILE__).'/'.$this->getXmlFilename(), 'w'))			{				if (!@fwrite($fd, $newXml))					return $this->displayError($this->l('Unable to write to the editor file.'));				if (!@fclose($fd))					return $this->displayError($this->l('Can\'t close the editor file.'));			}			else				return $this->displayError($this->l('Unable to update the editor file. Please check the editor file\'s writing permissions.'));			/* refresh XML */			$this->_xml = $this->_getXml();			return $this->displayConfirmation($this->l('Items updated.'));		}	}	static private function getXmlFilename()	{		return 'data.xml';	}	private function _getXml()	{		$file = dirname(__FILE__).'/'.$this->getXmlFilename();		if (file_exists($file))		{			if ($xml = @simplexml_load_file($file))			{				return $xml;			}		}		return false;	}	public function _getFormItem($i, $last)	{		$divLangName = 'title'.$i.'¤cpara'.$i;		$output = '			<div class="item" id="item'.$i.'">				<h3>'.$this->l('Item #').($i+1).'</h3>				<label>'.$this->l('Label').'</label>				<div class="margin-form">';		foreach ($this->_languages as $language)		{			$output .= '					<div id="title'.$i.'_'.$language['id_lang'].'" style="display:'.($language['id_lang'] == $this->_defaultLanguage ? 'block' : 'none').';float: left;">						<input type="text" name="item['.$i.'][title_'.$language['id_lang'].']" id="item_title_'.$i.'_'.$language['id_lang'].'" size="64" value="'.(isset($this->_xml->item[$i]->{'title_'.$language['id_lang']}) ? stripslashes(htmlspecialchars($this->_xml->item[$i]->{'title_'.$language['id_lang']})) : '').'" />					</div>';		}		$output .= $this->displayFlags($this->_languages, $this->_defaultLanguage, $divLangName , 'title'.$i, true);		$output .= '					<div class="clear"></div>				</div>				<label>'.$this->l('Text').'</label>				<div class="margin-form">';		foreach ($this->_languages as $language)		{			$output .= '					<div id="cpara'.$i.'_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $this->_defaultLanguage ? 'block' : 'none').';float: left;">						<textarea cols="64" rows="3" name="item['.$i.'][text_'.$language['id_lang'].']" id="item_text_'.$i.'_'.$language['id_lang'].'">'.(isset($this->_xml->item[$i]-> {'text_'.$language['id_lang']}) ? stripslashes(htmlspecialchars($this->_xml->item[$i]-> {'text_'.$language['id_lang']})) : '').'</textarea>					</div>';		}		$output .= $this->displayFlags($this->_languages, $this->_defaultLanguage, $divLangName , 'cpara'.$i, true);		$output .= '					<div class="clear"></div>				</div>				<label>'.$this->l('Picture').'</label>				<div class="margin-form">					[img='.$this->_path.$this->imageDir.]					<input type="file" name="item_'.$i.'_img" />					<p style="clear: both"></p>				</div>				<label>'.$this->l('Link').'</label>				<div class="margin-form">					<input type="text" name="item['.$i.'][url]" size="64" value="'.(isset($this->_xml->item[$i]->url) ? stripslashes(htmlspecialchars($this->_xml->item[$i]->url)) : '').'" />					<p style="clear: both"></p>				</div>				<div class="clear pspace"></div>				'.($i > 0 ? '[url="javascript:{}"][img='._PS_ADMIN_IMG_.]l('delete').'" />'.$this->l('Delete this item').'[/url]' : '').'				<hr/>				'.($last ? '<a id="clone'.$i.'" href="javascript:cloneIt(\'clone'.$i.'\')" style="color:#488E41">[img='._PS_ADMIN_IMG_.]l('add').'" />[b]'.$this->l('Add a new item').'[/b]</a>' : '').'			</div>';		return $output;	}	public function _displayForm()	{		$output = '';		$xml = false;		if (!$xml = $this->_xml)			$output .= $this->displayError($this->l('Your data file is empty.'));		$output .= '		<script type="text/javascript">		function removeDiv(id)		{			$("#"+id).fadeOut("slow");			$("#"+id).remove();		}		function cloneIt(cloneId) {			var currentDiv = $("#"+cloneId).parent(".item");			var id = $(currentDiv).attr("id").match(/[0-9]+/gi);			var nextId = parseInt(id) + 1;			$.get("'._MODULE_DIR_.$this->name.'/ajax.php?id="+nextId, function(data) {				$(currentDiv).after(data);			});			$("#"+cloneId).remove();		}		</script>		<form method="post" action="'.$_SERVER['REQUEST_URI'].'" enctype="multipart/form-data">			<fieldset style="width: 900px;">				<legend>[img='.$this->_path.]'.$this->displayName.'</legend>';		$i = 0;		foreach ($xml->item as $item)		{			$last = ($i == (count($xml->item)-1) ? true : false);			$output .= $this->_getFormItem($i, $last);			$i++;		}		$output .= '				<div class="margin-form clear">					<input type="submit" name="submitUpdate" value="'.$this->l('Save').'" class="button" />				</div>			</fieldset>		</form>';		return $output;	}	function hookHeader($params)	{		return $this->display(__FILE__, 'header.tpl');	}	function hookHome($params)	{		if ($xml = $this->_xml)		{			global $cookie, $smarty;			$smarty->assign(array(				'xml' => $xml,				'title' => 'title_'.$cookie->id_lang,				'text' => 'text_'.$cookie->id_lang			));			return $this->display(__FILE__, $this->name.'.tpl');					}		return false;	}		private function _displayTranslators()	{		$translators = array(			"lt" => array(				"fullname" => "Evaldas Belevicius",				"url" => "mailto:evaboy@gmail.com"			)			,"tj" => array(			//"fa" => array(				"fullname" => "Roozbeh Aghabaighi",				"url" => "http://www.embed.ir/eshop"			)			,"it" => array(				"fullname" => "Di Giuseppe Luigi",				"url" => "http://www.libridipsicologia.it/"			)			,"pl" => array(				"fullname" => "Jakub Gzyl",				"url" => "mailto:jakub6@gmail.com"			)			,"tr" => array(				"fullname" => "Safa AL",				"url" => "mailto:safa_al18@hotmail.com"			)			,"fr" => array(				"fullname" => "Joël Gaujard",				"url" => "http://www.joelgaujard.info"			)		);		if (empty($translators) OR count($translators) < 1)			return '';		$output = '		<p>			<h3>'.$this->l('Translators list!').'</h3>			[list]';		foreach ($translators AS $lang_iso => $translator)		{			$output .= '			<li style="line-height: 24px;">				[img=http://www.google.com/images/flags/]				<a target="_blank" href="'.$translator["url"].'">[b]'.$translator["fullname"].'[/b] - '.preg_replace('/^mailto:/', '',$translator["url"]).'</a>';			$output .= '';		}		$output .= '[/list]		</p>		<p>			'.$this->l(' !').'		</p>		';		return $output;	}}?>

jqalleryview2.tpl wygląda tak:

 

<span class="syntaxhtml"><span class="syntaxdefault"></span><span class="syntaxkeyword"><!--</span><span class="syntaxdefault"> Module Editorial </span><span class="syntaxkeyword">--><</span><span class="syntaxdefault">link href</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"{$base_dir}themes/element/modules/jgalleryview2/prod.css"</span><span class="syntaxdefault"> rel</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"stylesheet"</span><span class="syntaxdefault"> type</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"text/css"</span><span class="syntaxdefault"> media</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"all"</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">/></span><span class="syntaxdefault"> </span><span class="syntaxkeyword"><!--</span><span class="syntaxdefault">     </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> blindX    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> blindY    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> blindZ    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> cover    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> curtainX    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> curtainY    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> fade    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> fadeZoom    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> growX    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> growY    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> scrollUp    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> scrollDown    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> scrollLeft    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> scrollRight    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> scrollHorz    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> scrollVert    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> shuffle    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> slideX    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> slideY    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> toss    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> turnUp    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> turnDown    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> turnLeft    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> turnRight    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> uncover    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> wipe    </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> zoom</span><span class="syntaxkeyword">--><!--</span><span class="syntaxdefault"> include Cycle plugin </span><span class="syntaxkeyword">--><</span><span class="syntaxdefault">script type</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"text/javascript"</span><span class="syntaxdefault"> src</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"http://cloud.github.com/downloads/malsup/cycle/jquery.cycle.all.2.74.js"</span><span class="syntaxkeyword">></span><span class="syntaxdefault"></script></span>{literal}<script type="text/javascript" charset="utf-8">        $(window).load(function()        {            init_slideshow()        })                init_slideshow = function()        {            $('#home_slides').cycle({                fx:'scrollRight',                timeout:12000,                pager:'#slide_navigation',                after:update_slide_caption,                before:fade_slide_caption            })        }                                        fade_slide_caption = function(next, previous)        {            caption_container = $('#project_caption')            caption_container.fadeOut('fast')        }                update_slide_caption = function(next, previous)        {            caption_container = $('#project_caption')            caption = $('span.slide_caption', previous)            caption_container.fadeIn('fast')            caption_container.html(caption.html())                    }</script>{/literal}<div id="home_slideshow"> <ul style="position: relative; width: 687px; height: 455px;" id="home_slides">  {foreach from=$xml->item item=my_item name=loop}  <li style="position: absolute; top: 0px; left: 0px; display: none; z-index: 2; opacity: 0;">    {if $my_item->img}<a href="{$my_item->url}">[img={$module_dir}{$my_item->img}]</a>{/if}    <span class="slide_caption">        {if $my_item->$title}                    <h3>                        {if $my_item->url}<a href="{$my_item->url}">{/if}                        {$my_item->$title}                        {if $my_item->url}</a>{/if}                    </h3>                    {/if}                    {if $my_item->$text}<p>{$my_item->$text}</p>{/if}   </span>     {/foreach}    [/list]    <div id="home_slideshow_violator" class="clearfix">     <div style="display: block;" id="project_caption"></div><div id="slide_navigation" class="clearfix"></div>    </div>  </div></span>

w pliku category.tpl umieściłem linijkę wywołującą zawartość pliku jgalleryview2.tpl:

 

<span class="syntaxdefault"></span><span class="syntaxkeyword">{</span><span class="syntaxdefault">include file</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">$tpl_dir</span><span class="syntaxkeyword">./</span><span class="syntaxdefault">modules</span><span class="syntaxkeyword">/</span><span class="syntaxdefault">jgalleryview2</span><span class="syntaxkeyword">/</span><span class="syntaxdefault">jgalleryview2</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">tpl</span><span class="syntaxkeyword">}</span><span class="syntaxdefault"> </span>

 

Na stronie kategorii pojawia się obszar w którym powinien pokazać się lider ale obrazy się nie pokazują

widać tylkko tyle:

<span class="syntaxdefault"></span><span class="syntaxkeyword"><</span><span class="syntaxdefault">div id</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"home_slideshow"</span><span class="syntaxkeyword">></span><span class="syntaxdefault"> </span><span class="syntaxkeyword"><</span><span class="syntaxdefault">ul id</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"home_slides"</span><span class="syntaxdefault"> style</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"position: relative; width: 687px; height: 455px;"</span><span class="syntaxkeyword">></span><span class="syntaxdefault">      </span><span class="syntaxkeyword"></</span><span class="syntaxdefault">ul</span><span class="syntaxkeyword">></span><span class="syntaxdefault">    </span><span class="syntaxkeyword"><</span><span class="syntaxdefault">div class</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"clearfix"</span><span class="syntaxdefault"> id</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"home_slideshow_violator"</span><span class="syntaxkeyword">></span><span class="syntaxdefault">     </span><span class="syntaxkeyword"><</span><span class="syntaxdefault">div id</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"project_caption"</span><span class="syntaxdefault"> style</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"display: block;"</span><span class="syntaxkeyword">></</span><span class="syntaxdefault">div</span><span class="syntaxkeyword">><</span><span class="syntaxdefault">div class</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"clearfix"</span><span class="syntaxdefault"> id</span><span class="syntaxkeyword">=</span><span class="syntaxstring">"slide_navigation"</span><span class="syntaxkeyword">></</span><span class="syntaxdefault">div</span><span class="syntaxkeyword">></span><span class="syntaxdefault">    </span><span class="syntaxkeyword"></</span><span class="syntaxdefault">div</span><span class="syntaxkeyword">></span><span class="syntaxdefault">  </span><span class="syntaxkeyword"></</span><span class="syntaxdefault">div</span><span class="syntaxkeyword">></span><span class="syntaxdefault"> </span>

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

ok, tutek jak większość chyba za bardzo nie zagłębia się i nie rozwodzi nad poważniejszymi rzeczami ;/ ma ktoś dostęp do jakiejś dokumentacji presty? bądź wie jak wykorzystać ObjectModel ? Potrzebuję zrobić poważny moduł, mam już w sumie instalacje, schemat bazy, jednakże ruszyć dalej jest prawie niemożliwe.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Tzn. jakaś tam pseudo jest, temat poruszony np. tutaj prestashop.com forum lecz z tego co patrzyłem do oprócz wy listowania hooków za dużo to tam nie ma

tutaj próba tłumaczenia pdfa można stąd też pobrać oryginał

 

a może by tak wspólnymi siłami coś stworzyć ?

 

 

tak na marginesie ciekawy tut opisujący minimalnie szerzej tworzenie modułu może też się komuś przyda

http://www.ecartservice.net/17072009/wr ... le-part-1/

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Proponowałbym te linki umieścić w pierwszym poście tak na marginesie ;-) A poza tym właśnie powstaje seria screencast'ów dotyczących tworzenia modułu od podstaw i tak:

tutaj jest spis treści - czyli co jest a co jeszcze dojdzie w niedługim czasie

a tutaj - bezpośredni link do playlisty na youtubie

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

ok, moduł na bazie obiektów prawie skończony.. ponad 1000 linii kodu bez głębszego re-faktoringu :? Pomimo tego ten stwór wydaje się być teraz podatniejszy na usprawnienia i modyfikacje, aniżeli było by wszystko zakodowane w samym module. Oprócz tego nasuwają się refleksje na temat czy nie dało by się łatwiej, otóż zauważyłem że prostsza droga wiodła by raczej poprzez AdminTab, niż sam Module. Z tego względu że AdminTab zdaję się z miejsca obsługiwać obiekty na bazie ObjectModule, tj. przekierowania po dodaniach, formularze na podstawie pól, itd. Bawił się ktoś z tym w ten sposób? Pozdrawiam

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Witam,Od tygodnia pracuję na Pestashop i podoba mi się. Aż do dzisiaj kiedy to chciałem wgrać ten moduł. Skopiowałem rozpakowany katalog do modułów i w Panelu mimo odświeżania, przelogowania nic nowego na liście modułów się nie pojawia.Dodam, że mam wymuszoną kompilację i wyłączony cache.Sprawa jest ważna, bo chciałem wychodząc od tego modułu dojść do bardziej zaawansowanego.Proszę o pomoc.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

irrcyk napisałeś na początku tematu

To w zasadzie tyle, mamy katalog obrazek w środku pliki obrazkek.php, obrazek.tpl oraz obrazek.jpgKatalog umieszczamy na serwerze w folderze modules i instalujemy w panelu.

jak się instaluje ten nowy moduł w prestashop , troszeczkę dokładniej proszę :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

witam

próbowałem na podstawie tego co tu zamieszczono zrobić moduł reklamowy dla seopilota, bo nie mają oni gotowej instrukcji dla presty więc kombinowałem kombinowałem i doszedłem do wniosku że moduł będzie najlepszy jednak mnie to przerasta

przypuszczam jednak że dla kogoś kto się zna będzie to chwilka

proszę o pomoc ewentualnie wskazówki

 

 

oto fragment który trzeba zamieścić opcja php

<?php

define('SEOPILOT_USER', 'af95a632e374c484018c489b154fb3xx');

require_once($_SERVER['DOCUMENT_ROOT'].'/'.SEOPILOT_USER.'/SeoPilotClient.php');

$o['charset'] = 'utf-8';//kodowanie strony

$seopilot = new SeoPilotClient($o);

unset($o);

echo $seopilot->build_links();

?>

są też inne opcjie dla

DataLife Engine

WordPress

PHP Fusion

Joomla

UMI.CMS

Nuke

NetCat

Drupal

myBB

IPB

 

otworzyłem również osobny temat

integracje-f21/modul-do-seopilot-t3456.html

bo może kogoś będą interesowały wyniki

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

W pierwszej wersji pliku obrazek.tpl jest błąd (bynajmniej u mnie Twoja wersja kodu nie działała). Poniżej zamieszczam poprawny kod:

<div class="block">

         <h4>Obrazek</h4>
         <div class="block_content" style="padding:0px;">
             </br>
         Mój pierwszy moduł PrestShop :)
         
         <url="http://www.prestadesign.pl/">
             <img src="{$module_dir}obrazek.jpg"</img>
          </url>
         </div>
      </div>
 
Obecnie bardziej interesuje mnie moduł wyprzedaży produktu... (który wyświetlałby treść na podstawie zaznaczenia checkboxa "wyprzedaż" w produkcie) czy ma ktoś może gdzieś link pod którym byłby taki moduł lub wskazał jak należy zmodyfikować " moduł obrazek " by uzyskać wspomnianą funkcjonalność?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.



  • Przeglądający

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

  • Aktywni użytkownicy

    Nikt jeszcze nie otrzymał reputacji w tym tygodniu.

  • Statystyki forum

    • Tematów
      7 825
    • Postów
      37 127
×