PHP hook, building hooks in your application
Introduction
One of the real challenges in building any type of framework, core or application is making it possible for the developers to hook into the business logic at specific points. Since PHP is not event based, nor it works with interrupts you have to come up an alternative.
The test case
Lets assume we are the main developers of a webshop framework. Programmers can use our framework to build complete webshops. Programmers can manage the orders that are placed on the webshop with the order class. The order class is part of our framework and we don’t want it to be extended by any programmer. However we don’t want to limit to programmers in their possibilities to hook into the orders process.
For example programmers should be able to send an email to the webshopowner if an order changes from one specific delivery status to another. This functionality is not part of the default behavior in our framework and is custom for the progammers webshop implementation.
Like said before, PHP doesn’t provide interrupts or real events so we need to come up with another way to implement hooks into our application. Lets take a look at the observer pattern.
Implementing the Observer pattern
The observer pattern is a design-pattern that describes a way for objects to be notified to specific state-changes in objects of the application.
For the first implementation we can use SPL. The SPL provides in two simple objects:
SPLSubject
- attach (new observer to attach)
- detach (existing observer to detach)
- notify (notify all observers)
SPLObserver
- update (Called from the subject (i.e. when it’s value has changed).
iOrderRef = $iOrderRef;
// Get order information from the database or an other resources
$this->iStatus = Order::STATUS_SHIPPED;
}
/**
* Attach an observer
*
* @param SplObserver $oObserver
* @return void
*/
public function attach(SplObserver $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (isset($this->aObservers[$sHash])) {
throw new Exception('Observer is already attached');
}
$this->aObservers[$sHash] = $oObserver;
}
/**
* Detach observer
*
* @param SplObserver $oObserver
* @return void
*/
public function detach(SplObserver $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (!isset($this->aObservers[$sHash])) {
throw new Exception('Observer not attached');
}
unset($this->aObservers[$sHash]);
}
/**
* Notify the attached observers
*
* @param string $sEvent, name of the event
* @param mixed $mData, optional data that is not directly available for the observers
* @return void
*/
public function notify()
{
foreach ($this->aObservers as $oObserver) {
try {
$oObserver->update($this);
} catch(Exception $e) {
}
}
}
/**
* Add an order
*
* @param array $aOrder
* @return void
*/
public function delete()
{
$this->notify();
}
/**
* Return the order reference number
*
* @return int
*/
public function getRef()
{
return $this->iOrderRef;
}
/**
* Return the current order status
*
* @return int
*/
public function getStatus()
{
return $this->iStatus;
}
/**
* Update the order status
*/
public function updateStatus($iStatus)
{
$this->notify();
// ...
$this->iStatus = $iStatus;
// ...
$this->notify();
}
}
/**
* Order status handler, observer that sends an email to secretary
* if the status of an order changes from shipped to delivered, so the
* secratary can make a phone call to our customer to ask for his opinion about the service
*
* @package Shop
*/
class OrderStatusHandler implements SplObserver
{
/**
* Previous orderstatus
* @var int
*/
protected $iPreviousOrderStatus;
/**
* Current orderstatus
* @var int
*/
protected $iCurrentOrderStatus;
/**
* Update, called by the observable object order
*
* @param Observable_Interface $oSubject
* @param string $sEvent
* @param mixed $mData
* @return void
*/
public function update(SplSubject $oSubject)
{
if(!$oSubject instanceof Order) {
return;
}
if(is_null($this->iPreviousOrderStatus)) {
$this->iPreviousOrderStatus = $oSubject->getStatus();
} else {
$this->iCurrentOrderStatus = $oSubject->getStatus();
if($this->iPreviousOrderStatus === Order::STATUS_SHIPPED && $this->iCurrentOrderStatus === Order::STATUS_DELIVERED) {
$sSubject = sprintf('Order number %d is shipped', $oSubject->getRef());
//mail('secratary@example.com', 'Order number %d is shipped', 'Text');
echo 'Mail sended to the secratary to help her remember to call our customer for a survey.';
}
}
}
}
$oOrder = new Order(26012011);
$oOrder->attach(new OrderStatusHandler());
$oOrder->updateStatus(Order::STATUS_DELIVERED);
$oOrder->delete();
?>
There are several problems with the implementation above. To most important disadvantage is that we have only one update method in our observer. In this update method we don’t know when and why we are getting notified, just that something happened. We should keep track of everything that happens in the subject. (Or use debug_backtrace… just joking, don’t even think about using it that way ever!).
Taking it a step further, events
Lets take a look at the next example, we will extend the Observer implementation with some an additional parameter for the eventname that occured.
Finishing up, optional data
iOrderRef = $iOrderRef;
// Get order information from the database or something else...
$this->iStatus = Order::STATUS_SHIPPED;
}
/**
* Attach an observer
*
* @param Observer_Interface $oObserver
* @return void
*/
public function attachObserver(Observer_Interface $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (isset($this->aObservers[$sHash])) {
throw new Exception('Observer is already attached');
}
$this->aObservers[$sHash] = $oObserver;
}
/**
* Detach observer
*
* @param Observer_Interface $oObserver
* @return void
*/
public function detachObserver(Observer_Interface $oObserver)
{
$sHash = spl_object_hash($oObserver);
if (!isset($this->aObservers[$sHash])) {
throw new Exception('Observer not attached');
}
unset($this->aObservers[$sHash]);
}
/**
* Notify the attached observers
*
* @param string $sEvent, name of the event
* @param mixed $mData, optional data that is not directly available for the observers
* @return void
*/
public function notifyObserver($sEvent, $mData=null)
{
foreach ($this->aObservers as $oObserver) {
try {
$oObserver->update($this, $sEvent, $mData);
} catch(Exception $e) {
}
}
}
/**
* Add an order
*
* @param array $aOrder
* @return void
*/
public function add($aOrder = array())
{
$this->notifyObserver('onAdd');
}
/**
* Return the order reference number
*
* @return int
*/
public function getRef()
{
return $this->iOrderRef;
}
/**
* Return the current order status
*
* @return int
*/
public function getStatus()
{
return $this->iStatus;
}
/**
* Update the order status
*/
public function updateStatus($iStatus)
{
$this->notifyObserver('onBeforeUpdateStatus');
// ...
$this->iStatus = $iStatus;
// ...
$this->notifyObserver('onAfterUpdateStatus');
}
}
/**
* Order status handler, observer that sends an email to secretary
* if the status of an order changes from shipped to delivered, so the
* secratary can make a phone call to our customer to ask for his opinion about the service
*
* @package Shop
*/
class OrderStatusHandler implements Observer_Interface
{
protected $iPreviousOrderStatus;
protected $iCurrentOrderStatus;
/**
* Update, called by the observable object order
*
* @param Observable_Interface $oObservable
* @param string $sEvent
* @param mixed $mData
* @return void
*/
public function update(Observable_Interface $oObservable, $sEvent, $mData=null)
{
if(!$oObservable instanceof Order) {
return;
}
switch($sEvent) {
case 'onBeforeUpdateStatus':
$this->iPreviousOrderStatus = $oObservable->getStatus();
return;
case 'onAfterUpdateStatus':
$this->iCurrentOrderStatus = $oObservable->getStatus();
if($this->iPreviousOrderStatus === Order::STATUS_SHIPPED && $this->iCurrentOrderStatus === Order::STATUS_DELIVERED) {
$sSubject = sprintf('Order number %d is shipped', $oObservable->getRef());
//mail('secratary@example.com', 'Order number %d is shipped', 'Text');
echo 'Mail sended to the secratary to help her remember to call our customer for a survey.';
}
}
}
}
$oOrder = new Order(26012011);
$oOrder->attachObserver(new OrderStatusHandler());
$oOrder->updateStatus(Order::STATUS_DELIVERED);
$oOrder->add();
?>
Now we are able to take action on different events that occur.
Disadvantages
Although this implementation works quite well there are some drawbacks. One of those drawbacks is that we need to dispatch an event in our framework, if we don’t programmers can’t hook into our application. Triggering events everywhere give us a small performance penalty however I do think this way of working gives the programmers a nice way to hook into your application on those spots that you want them to hook in.
Just for the record
Notice that this code is just an example and can still use some improvements, for example: each observer is initialized even it will maybe never be notified, therefore I suggest to make use of lazy in some cases for loading the objects. There are other systems to hook into an application, more to follow!
взять +в аренду экскаватор [url=http://arenda-mini-ekskavatora-v-moskve-2.ru/]http://arenda-mini-ekskavatora-v-moskve-2.ru/[/url] .
arenda mini ekskavatora v moskve_vyKt
14 Oct 25 at 12:33 pm
купить диплом в гатчине [url=rudik-diplom5.ru]rudik-diplom5.ru[/url] .
Diplomi_txma
14 Oct 25 at 12:34 pm
согласование проекта перепланировки нежилого помещения [url=https://pereplanirovka-nezhilogo-pomeshcheniya9.ru]https://pereplanirovka-nezhilogo-pomeshcheniya9.ru[/url] .
pereplanirovka nejilogo pomesheniya_dsKl
14 Oct 25 at 12:35 pm
купить диплом в тамбове [url=https://www.rudik-diplom4.ru]купить диплом в тамбове[/url] .
Diplomi_lbOr
14 Oct 25 at 12:35 pm
перепланировка в нежилом помещении [url=www.pereplanirovka-nezhilogo-pomeshcheniya10.ru/]www.pereplanirovka-nezhilogo-pomeshcheniya10.ru/[/url] .
pereplanirovka nejilogo pomesheniya_rySr
14 Oct 25 at 12:35 pm
provera online
provera online
14 Oct 25 at 12:36 pm
потолочкин ру самара [url=https://www.natyazhnye-potolki-samara-2.ru]https://www.natyazhnye-potolki-samara-2.ru[/url] .
natyajnie potolki samara_duPi
14 Oct 25 at 12:36 pm
We stumbled over here coming from a different web address and thought
I might as well check things out. I like what I see so now i
am following you. Look forward to going over your web page repeatedly.
강남도파민
14 Oct 25 at 12:36 pm
купить бланк диплома [url=http://rudik-diplom3.ru]купить бланк диплома[/url] .
Diplomi_pyei
14 Oct 25 at 12:37 pm
medex without prescription
medex without prescription
14 Oct 25 at 12:37 pm
I don’t even know how I ended up here, but
I thought this post was great. I do not know who
you are but certainly you’re going to a famous blogger if you are not
already 😉 Cheers!
Entrümpelung Berlin
14 Oct 25 at 12:40 pm
купить диплом товароведа [url=https://www.rudik-diplom4.ru]купить диплом товароведа[/url] .
Diplomi_biOr
14 Oct 25 at 12:40 pm
Hey hey, Singapore moms аnd dads, mathematics іs probaЬly the extremely imⲣortant primary topic, fostering creativity f᧐r probⅼem-solving to innovative careers.
Hwa Chong Institution Junior College іs renowned for its integrated program that flawlessly inregrates academic rigor ԝith character development, producing global scholars ɑnd leaders.
Fiгst-rate centers ɑnd professional faculty assistance quality іn reseаrch, entrepreneurship,
and bilingualism. Students benefit from substantial international exchanges ɑnd competitions, broadening perspectives ɑnd
sharpening skills. The organization’ѕ focus on innovation and service cultivates
durability аnd ethical values. Alumni networks ⲟpen doors to top universities and
prominent professions worldwide.
National Junior College, holding tһe difference as Singapore’s firѕt junior college,
оffers exceptional avenues fοr intellectual expedition аnd management growing within a historic аnd
motivating school tһɑt blends custom ᴡith modern-Ԁay instructional quality.
Тһe distinct boarding program promotes ѕeⅼf-reliance and a sense of neighborhood, ᴡhile modern reѕearch centers and specialized laboratories mаke it pоssible for students fгom diverse
backgrounds tо pursue innovative studies іn arts, sciences,
and humanities ѡith optional choices for customized knowing paths.
Innovative programs encourage deep scholastic immersion, ѕuch as
project-based гesearch and interdisciplinary seminars that sharpen analytical skills ɑnd
foster imagination amongst ambitious scholars. Тhrough substantial worldwide
collaborations, consisting оf student exchanges, global symposiums, and collective initiatives with overseas universities, students develop broad networks аnd a nuanced understanding
of worldwide concerns. Ꭲhe college’ѕ alumni, whⲟ
often presume prominent roles іn federal government, academic community,
ɑnd industry, exemplify National Junior College’ѕ enduring contribution to nation-building аnd the advancement ᧐f visionary,
impactful leaders.
Mums ɑnd Dads, competitive mode engaged lah,
robust primary mathematics leads іn improved STEM understanding
рlus construction dreams.
Օh dear, minus robust mathematics Ԁuring Junior College, гegardless leading school kids
ϲould stumble іn high school algebra, ѕо develop thіs
ρromptly leh.
Hey hey, Singapore parents, maths іs probably the highly іmportant primary
topic, fostering innovation іn challenge-tackling tο creative careers.
Aᴠoid tаke lightly lah, combine a excellent Junior Colleg with mathematics
superiority іn order to assure superior Α Levels marks plus smooth сhanges.
Parents, fear tһe difference hor, maths groundwork іs critical dսring Junior College tο comprehending іnformation,
crucial wіtһin modern tech-driven economy.
Folks, competitive mode engaged lah, robust primary math guides tօ betteг scientific
comprehension ⲣlus engineering aspirations.
Wah, maths acts ⅼike the groundwork pillar fߋr primary
schooling, assisting children fоr dimensional thinking tо design paths.
Ᏼe kiasu and join Matth cⅼubs in JC for
extra edge.
Wah, mathematics іѕ the base pillar in primary education,
helping youngsters ԝith geometric analysis fоr building careers.
Օh dear, without strong math during Junior College, eѵen toр institution youngsters mіght falter
іn neⲭt-level equations, tһսs cultivate this prօmptly leh.
Here is my webpage … junior colleges singapore
junior colleges singapore
14 Oct 25 at 12:41 pm
потолки [url=https://stretch-ceilings-samara.ru]https://stretch-ceilings-samara.ru[/url] .
natyajnie potolki samara_owkl
14 Oct 25 at 12:43 pm
купить диплом техникума цена [url=http://educ-ua7.ru]http://educ-ua7.ru[/url] .
Diplomi_uyea
14 Oct 25 at 12:43 pm
Эта статья сочетает в себе как полезные, так и интересные сведения, которые обогатят ваше понимание насущных тем. Мы предлагаем практические советы и рекомендации, которые легко внедрить в повседневную жизнь. Узнайте, как улучшить свои навыки и обогатить свой опыт с помощью простых, но эффективных решений.
Погрузиться в детали – http://stitcheryprojects.com/forums/topic/%D1%81%D1%82%D0%B0%D1%82%D1%8C%D1%8F-%D0%BE-%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5-%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8
ThomasFep
14 Oct 25 at 12:44 pm
услуги мини-экскаватора [url=www.arenda-mini-ekskavatora-v-moskve-2.ru]www.arenda-mini-ekskavatora-v-moskve-2.ru[/url] .
arenda mini ekskavatora v moskve_ntKt
14 Oct 25 at 12:44 pm
MelStroy Casino предлагает более 1000 игр, включая слоты, рулетку и живые столы. Быстрые выплаты, круглосуточная поддержка и щедрые бонусы для новичков и постоянных игроков mellstroy casino
Walterhek
14 Oct 25 at 12:45 pm
купить диплом фармацевта [url=https://rudik-diplom13.ru]купить диплом фармацевта[/url] .
Diplomi_chon
14 Oct 25 at 12:45 pm
купить диплом биолога [url=http://www.rudik-diplom3.ru]купить диплом биолога[/url] .
Diplomi_liei
14 Oct 25 at 12:45 pm
проект перепланировки нежилого помещения стоимость [url=https://www.pereplanirovka-nezhilogo-pomeshcheniya10.ru]https://www.pereplanirovka-nezhilogo-pomeshcheniya10.ru[/url] .
pereplanirovka nejilogo pomesheniya_wtSr
14 Oct 25 at 12:45 pm
Just bought $MTAUR; seamless swap. Vesting extensions smart. Maze treasures tempting.
mtaur token
WilliamPargy
14 Oct 25 at 12:46 pm
купить диплом в реестр [url=https://frei-diplom6.ru]купить диплом в реестр[/url] .
Diplomi_pbOl
14 Oct 25 at 12:46 pm
купить диплом в копейске [url=www.rudik-diplom6.ru/]купить диплом в копейске[/url] .
Diplomi_afKr
14 Oct 25 at 12:46 pm
натяжные потолки официальный сайт самара [url=http://natyazhnye-potolki-samara-2.ru]натяжные потолки официальный сайт самара[/url] .
natyajnie potolki samara_zhPi
14 Oct 25 at 12:49 pm
электрокарнизы [url=karniz-shtor-elektroprivodom.ru]электрокарнизы[/url] .
karniz dlya shtor s elektroprivodom_yjer
14 Oct 25 at 12:49 pm
жалюзи с электроприводом купить [url=http://zhalyuzi-s-elektroprivodom77.ru]жалюзи с электроприводом купить[/url] .
jaluzi na okna s elektroprivodom_whpa
14 Oct 25 at 12:49 pm
Welcome to cutting-edge wellness products at the Neuroxen store.
Whether you’re looking for wellness aids, you’ll find a range of choices to
support your goals.
Take a look at some bestsellers that people are loving.
Start your journey today! Visit [buy.neuroxen-usa.com](https://buy.neuroxen-usa.com) for special
discounts.
neuroxen
14 Oct 25 at 12:50 pm
согласование перепланировки нежилых помещений [url=https://pereplanirovka-nezhilogo-pomeshcheniya9.ru]https://pereplanirovka-nezhilogo-pomeshcheniya9.ru[/url] .
pereplanirovka nejilogo pomesheniya_snKl
14 Oct 25 at 12:50 pm
купить свидетельство о разводе [url=https://www.rudik-diplom3.ru]купить свидетельство о разводе[/url] .
Diplomi_vmei
14 Oct 25 at 12:51 pm
пластиковые жалюзи с электроприводом [url=https://zhalyuzi-s-elektroprivodom77.ru/]zhalyuzi-s-elektroprivodom77.ru[/url] .
jaluzi na okna s elektroprivodom_ompa
14 Oct 25 at 12:51 pm
электрокарнизы для штор цена [url=https://www.karniz-shtor-elektroprivodom.ru]электрокарнизы для штор цена[/url] .
karniz dlya shtor s elektroprivodom_njer
14 Oct 25 at 12:51 pm
потолочкин ру самара [url=https://www.stretch-ceilings-samara-1.ru]https://www.stretch-ceilings-samara-1.ru[/url] .
natyajnie potolki samara_zysl
14 Oct 25 at 12:52 pm
потолочкин натяжные потолки самара отзывы клиентов [url=https://natyazhnye-potolki-samara-1.ru/]https://natyazhnye-potolki-samara-1.ru/[/url] .
natyajnie potolki samara_auor
14 Oct 25 at 12:54 pm
сайт натяжной потолок [url=https://stretch-ceilings-samara.ru]https://stretch-ceilings-samara.ru[/url] .
natyajnie potolki samara_vxkl
14 Oct 25 at 12:56 pm
bs market Интересуешься, что происходит в тёмных уголках сети? Blacksprut — это не просто название, это гарантия анонимности, высокой скорости и надежности. Переходи на bs2best.at — там ты найдёшь то, о чём другие умалчивают. Тебе откроется доступ к информации, которую скрывают от большинства. Только для тех, кто понимает. Без компрометирующих следов. Без уступок. Только Blacksprut. Не упусти шанс узнать первым — bs2best.at уже готов открыть свои двери. Дерзнешь ли ты взглянуть правде в глаза?
Armandnum
14 Oct 25 at 12:56 pm
The $MTAUR ICO raffle tempts big. Token’s role in mini-games deep. Momentum unstoppable.
minotaurus ico
WilliamPargy
14 Oct 25 at 12:57 pm
аренда мини экскаватора цена [url=https://www.arenda-mini-ekskavatora-v-moskve-2.ru]https://www.arenda-mini-ekskavatora-v-moskve-2.ru[/url] .
arenda mini ekskavatora v moskve_evKt
14 Oct 25 at 12:58 pm
купить диплом с реестром киев [url=www.frei-diplom4.ru/]www.frei-diplom4.ru/[/url] .
Diplomi_dxOl
14 Oct 25 at 12:58 pm
согласование перепланировки нежилого помещения в жилом доме [url=www.pereplanirovka-nezhilogo-pomeshcheniya10.ru]www.pereplanirovka-nezhilogo-pomeshcheniya10.ru[/url] .
pereplanirovka nejilogo pomesheniya_esSr
14 Oct 25 at 12:58 pm
карнизы для штор с электроприводом [url=https://www.elektrokarnizy797.ru]карнизы для штор с электроприводом[/url] .
elektrokarnizi_fqMl
14 Oct 25 at 12:59 pm
Mums ɑnd Dads, dread the disparity hor, math groundwork іs essential in Junior College
іn understanding data, vital fοr current tech-driven system.
Wah lao, even th᧐ugh school іs atas, maths serves аs
the critical subject іn cultivating confidence
гegarding figures.
Jurong Pioneer Junior College, formed from a tactical merger, рrovides a forward-thinking education tһat stresses China preparedness ɑnd worldwide
engagement. Modern schools supply excellent resources fⲟr commerce,
sciences, аnd arts, cultivating ᥙseful skills and creativity.
Students enjoy enriching programs ⅼike global partnerships ɑnd character-building efforts.
Τhе college’ѕ helpful community promotes durability
ɑnd leadership tһrough varied co-curricular activities.
Graduates ɑre fully equipped fߋr vibrant professions, embodying care аnd constant enhancement.
St. Joseph’s Institution Junior College supports valued Lasallian traditions ߋf faith, service, аnd intellectual curiosity,
developing ɑn empowering environment wherе students puirsue understanding wіth passion and dedicate tһemselves tο uplifting otһers through caring actions.
Ƭhе integrated program makes sᥙre a fluid development from secondary tօ pre-university levels, ԝith a focus ߋn multilingual efficiency
аnd innovative curricula supported by centers ⅼike advanced performing arts
centers аnd science rеsearch laboratories tһat inspire imaginative аnd analytical excellence.
Global immersion experiences, consisting ⲟf global service trips ɑnd cultural exchange programs, broaden trainees’ horizons, enhance
linguistic skills, ɑnd promote a deep gratitude fοr varied worldviews.
Opportunities fоr innovative research,
management roles in student companies, andd mentorship fгom accomplished professors build ѕelf-confidence, crucial thinking, аnd a dedication tο long-lasting learning.
Graduates arе known foг tһeir empathy and higһ accomplishments,
protecting locations іn prestigious universities ɑnd excelling іn
professions that align with the college’ѕ principles of service
аnd intellectual rigor.
Hey hey, steady pom ρi pi, maths rеmains аmong of the leading subjects dᥙrіng Junior College, laying foundation tⲟ A-Level hіgher calculations.
Bеsіdes fгom school facilities, emphasize ⲟn maths fοr avoiԀ common mistakes including inattentive blunders іn tests.
Mums ɑnd Dads, worry abⲟut the difference hor, maths groundwork іs vital in Junior
College tߋ comprehending data, crucial in current tech-driven ѕystem.
Goodness, гegardless іf establishment proves fancy, math
acts ⅼike thе critical topic foг building assurance regaгding calculations.
Alas, primary math educates practical implementations ѕuch as financial planning, ѕo
make sure your youngster masters it properly ƅeginning уoung age.
Listen up, calm pom pi pi, maths remains part frоm
the leading disciplines dᥙring Junior College, laying groundwork t᧐ A-Level calculus.
Ꮐood Ꭺ-levels mean smoother transitions tο uni life.
Listen սp, steady pom pi ρі, mathematics proves ɑmong fгom the highest subjects іn Junior College, establishing groundwork іn A-Level calculus.
Іn addition from establishment resources, emphasize ᥙpon math in оrder to prevent common pitfalls including
inattentive mistakes іn tests.
My webpage: Math tuition agency singapore
Math tuition agency singapore
14 Oct 25 at 1:00 pm
The other day, while I was at work, my cousin stole my apple ipad and tested to see if it can survive a thirty foot drop, just so she can be a youtube sensation. My iPad is now destroyed and she has 83 views. I know this is completely off topic but I had to share it with someone!
банзай казино
IsmaelNek
14 Oct 25 at 1:00 pm
Wow, that’s what I was seeking for, what a information! existing
here at this blog, thanks admin of this web page.
เว็บสล็อต
14 Oct 25 at 1:00 pm
купить диплом в кунгуре [url=http://rudik-diplom14.ru]http://rudik-diplom14.ru[/url] .
Diplomi_urea
14 Oct 25 at 1:00 pm
пластиковые жалюзи с электроприводом [url=https://www.zhalyuzi-s-elektroprivodom77.ru]https://www.zhalyuzi-s-elektroprivodom77.ru[/url] .
jaluzi na okna s elektroprivodom_ilpa
14 Oct 25 at 1:01 pm
электрические гардины [url=www.elektrokarnizy797.ru/]электрические гардины[/url] .
elektrokarnizi_elMl
14 Oct 25 at 1:03 pm
перепланировка офиса согласование [url=www.pereplanirovka-nezhilogo-pomeshcheniya9.ru/]www.pereplanirovka-nezhilogo-pomeshcheniya9.ru/[/url] .
pereplanirovka nejilogo pomesheniya_hfKl
14 Oct 25 at 1:06 pm
электрокарнизы для штор [url=karniz-shtor-elektroprivodom.ru]электрокарнизы для штор[/url] .
karniz dlya shtor s elektroprivodom_crer
14 Oct 25 at 1:06 pm
потолочник натяжные потолки самара [url=http://www.natyazhnye-potolki-samara-1.ru]http://www.natyazhnye-potolki-samara-1.ru[/url] .
natyajnie potolki samara_vcor
14 Oct 25 at 1:07 pm