Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызвать метод в классе перед необходимым методом 
V
    Опции темы
neoks
Дата 27.9.2012, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Например, есть класс с несколькими методами и есть в нем один метод который вызывается постоянно перед тем как вызвать необходимый для какой та проверки, например проверить есть ли соединения с БД, если есть то продолжить вызов метода если нет то прервать )

Например:

Код

classs test{
    function a(){
         return 'a';
    }
    function b(){
         return 'b';
    }

    function __init_method(){
         global $test;
         if($test) return true;
         else echo 'lol';
    }
}

$b = new test;
$b->a(); // результат lol так как $test в __init_method равна false


Возможно ли такое ?, если нет то придется по старинке проверять в каждом методе необходимые параметры ))
PM MAIL   Вверх
bars80080
Дата 27.9.2012, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Код

classs test{
    function a(){
         $this->__init_method();
         return 'a';
    }
    function b(){
         return 'b';
    }
    function __init_method(){
         global $test;
         if($test) return true;
         else echo 'lol';
    }
}


а так нельзя?
PM MAIL WWW   Вверх
ksnk
Дата 27.9.2012, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

classs test{
    function _a(){
         return 'a';
    }
    function _b(){
         return 'b';
    }

    function __call($methos,$args){
        if(is_callable(array($this,'_'.$method)) {
           if ($this->__init_method()===true) {
              call_user_func_array(array($this,'_'.$method),$arg)
           }
        }
    }

    function __init_method(){
         global $test;
         if($test) return true;
         else echo 'lol';
    }
}
$b = new test;
$b->a(); // результат lol так как $test в __init_method равна false



или так

Это сообщение отредактировал(а) ksnk - 27.9.2012, 15:49


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 27.9.2012, 16:18 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



__construct()

Добавлено через 45 секунд
а для прерывания конечно же throw Exception


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 27.9.2012, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Код

function __call($methos,$args){
        if(is_callable(array($this,'_'.$method)) {
           if ($this->__init_method()===true) {
              call_user_func_array(array($this,'_'.$method),$arg)
           }
        }
    }


Работает только если перед методом стоит знак ( _ ) почему так ? переписывать все методы как-то не особо хочется ))


Цитата(Fortop @  27.9.2012,  16:18 Найти цитируемый пост)
__construct()

Не пойму а как он может определить, вызывается только один раз, как вариант писать какую-та переменную с статусом true/false и потом в каждом методе проверять ее )
PM MAIL   Вверх
Sanchezzz
Дата 27.9.2012, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



__construct() вызывается при new class();
__call
Вызывается всегда когда к методу нетe доступа извне грубо говоря
Код

class A {

protected function a(){
  print 'method run a<br>'
}

function __call(){
 PRINT 'call me<br>';
 }

}

A::A();


Это сообщение отредактировал(а) Sanchezzz - 27.9.2012, 17:20


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
baldina
Дата 27.9.2012, 17:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата
__construct()

Цитата(neoks @  27.9.2012,  17:06 Найти цитируемый пост)
Не пойму а как он может определить

речь идет о том, что конструирование объекта нужно возложить на конструктор. если объект создан, то он в находится в "правильном" состоянии, например, БД заведомо открыта.

PM MAIL   Вверх
Sanchezzz
Дата 27.9.2012, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



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

class bd  {
 public static $bd = null;
 public static function init(){
      if(is_null(self::$bd)){
         self::$bd  =  mysql_connect  ...     // mysqli   // PDO(
      }
      return self::$bd;
 }





class a {

function getUser($id){
  $pdo = bd::init();
  $pdo->prepare('select * from user where id=:id');
  //...

}

}



Этот метод даст вам обращаться к функциям класса неявно что добавляет удобность на мой взгляд.
a::getUser(1);
Конечно придется там где используется Бд везде воткнуть bd::init(); в функцией я обычно решаю такой вопрос поиском и заменой

Это сообщение отредактировал(а) Sanchezzz - 27.9.2012, 17:56


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
neoks
Дата 27.9.2012, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Ну как я читал как я пробовал
__construct()  вызывается когда создается новый класс
__call вызывается когда в классе нет того метода который мне нужен, я пользуюсь им что ошибки не вылазили, но не вызывается когда метод есть в классе ))

Задача как я писал нужно в каждом методе проверить есть соединения с бд или еше че )) то есть сейчас я везде в методах пишу типа

Код

if(!$this->ajaxLoad) return;
if($this->sl->fn->check_ac('admin')) return;
if(!$this->sl->db->connect(false)) return;


И так в каждом почти методе почти в каждом классе, хотелось бы упростить эту задачу всего одной функцией
Как показал ksnk работает тока если во всех методах дописать знак (_) то есть _a() _b() _show() логику я понял )
Но как быть если я сделаю так ?

Код

$test->_a();


То тут __call() уже не сработает так как вызвал правильно и не будет не какой проверки )

PM MAIL   Вверх
baldina
Дата 27.9.2012, 17:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(neoks @  27.9.2012,  17:53 Найти цитируемый пост)
if(!$this->ajaxLoad) return;
if($this->sl->fn->check_ac('admin')) return;
if(!$this->sl->db->connect(false)) return;

почему бы не проверить это один раз где-нить в начале скрипта? в конструкторе? каждая функция - не подходящее место
PM MAIL   Вверх
neoks
Дата 27.9.2012, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Цитата(baldina @  27.9.2012,  17:56 Найти цитируемый пост)

почему бы не проверить это один раз где-нить в начале скрипта? в конструкторе? 

Вот именно это мне и нужно, нужно проверить как-то один раз, а как я хз, у меня класс это модуль загружаемый с адресной строки, я могу вбить там любой модуль и любой метод ) и все это мне нужно проверять чтоб умники там не хулиганили smile
PM MAIL   Вверх
ksnk
Дата 27.9.2012, 18:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(neoks @  27.9.2012,  17:06 Найти цитируемый пост)
Работает только если перед методом стоит знак ( _ ) почему так ? переписывать все методы как-то не особо хочется ))

Это нужно было, чтобы сработал сам метод call, иначе выполнится собственный метод. Можно его сделать private, но это тоже означает переписывание кода.

Цитата(neoks @  27.9.2012,  18:13 Найти цитируемый пост)
у меня класс это модуль загружаемый с адресной строки, я могу вбить там любой модуль и любой метод ) и все это мне нужно проверять чтоб умники там не хулиганили

Ну тогда нужно вставить проверку и запуск прямо в этот самый вызов

Код

$class,$method,$arg ;// входные параметры

$x=new class();
        if(is_callable(array($x,$method)) {
           if(is_callable(array($x,'__init_method')) {
               call_user_func(array($this,'__init_method');
           }
           call_user_func_array(array($x,$method),$arg)
        }
    


Это сообщение отредактировал(а) ksnk - 27.9.2012, 18:48


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
neoks
Дата 27.9.2012, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



А решил по другому сделать, не знаю почему сразу не подумал, у меня при автозагрузки класса вызывается метод init(), добавил еше init_member() равносильно __construct(), ну проверять все же приходится но теперь вместо с десяток строк мона написать одну )

Но все же хотелось бы ка кто вообще без проверки в методах сделать чтоб какой та отдельный метод все проверял )
PM MAIL   Вверх
skyboy
Дата 27.9.2012, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(neoks @  27.9.2012,  16:06 Найти цитируемый пост)
Работает только если перед методом стоит знак ( _ ) почему так ? переписывать все методы как-то не особо хочется ))

переименовать и все.
можно сделать это динамически через какой-то classkit. но нестабильно-экспериментально-нафига?
архитектурно это можно решить, работая с исключениями. на верхнем уровне — перехват. на нижнем — подавление/дополнительная работа только в случае необходимости.
вот, дискуссия была: Какой смысл в исключениях (Exeption)? 
PM MAIL   Вверх
Fortop
Дата 28.9.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  27.9.2012,  18:13 Найти цитируемый пост)
 у меня класс это модуль загружаемый с адресной строки

Ну и что?

Цитата(neoks @  27.9.2012,  18:13 Найти цитируемый пост)
нужно проверить как-то один раз, а как я хз

Написали же.
В конструкторе.
Именно этим, кстати, неудобны статические методы. Ты постоянно в каждом методе должен думать о том, готово и валидно ли окружение у тебя (есть ли коннект, хватает ли места на диске и т.д.).
В обычном случае, для вызова любого метода любого объекта вам потребуется сначала инстанцировать сам объект.

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



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 28.9.2012, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Просто у меня так получилось что __construct(),не работает )) пришлось немного помудрить чтоб сделать типа свой __construct(), но конструктор это все же запускается всего один раз ) он не как бы не подходит, так все равно мне нуно в какую-та var писать мов доступ запрещен и потом в каждом методе все равно проверять эту var разрешено или нет

Но темнемение __construct() удобен тем что в нем мона все проверить и потом назначить какой-та var true или false нежели в каждом методе проверять все параметры, а так нуно будет проверить одну var ))

Но мне интересовало возможно ли вообще обойтись без проверки в методах ? чтоб за них делал какой-та специальный метод ? как я показал в примере, видимо это нереально, ну тогда буду значить и дальше проверять везде ))
PM MAIL   Вверх
Fortop
Дата 28.9.2012, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  28.9.2012,  15:24 Найти цитируемый пост)
та var писать мов доступ запрещен и потом в каждом методе все равно проверять эту var разрешено или нет

Зачем?

У вас на каждое посещение адреса будет инстанцирование объекта, а значит вызовется конструктор.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 28.9.2012, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Цитата(Fortop @  28.9.2012,  15:55 Найти цитируемый пост)
У вас на каждое посещение адреса будет инстанцирование объекта, а значит вызовется конструктор. 


Ну а что толку мне от него ?

вызываю модуль с адресной строки http://site.ru/МОДУЛЬ ТО ЕСТЬ CLASS/МЕТОД ТО ЕСТЬ ЛЮБОЙ/ПАРАМЕТРЫ

а значит вот что ))

Код

class test{
    var $stop = false;

    function __construct(){
        // и что мне тут делать ? могу тока некоторый проверки сделать и вписать $this->stop = true;
    }
    function a(){
        // ну и как мне узнать разрешено или нет ? все работает или нет ? могу только проверить if($this->stop) return; значит что то пошло не так и мне сюда нельзя
        return 'full accsec';
    }
}


В результате если я не буду использовать $this->stop то по этому адресу http://site.ru/test/a вернет мне результат full access что значит не какой проверки не было и кто угодно может что угодно сделать без ведома админа ))

Меня интересует именно метод без проверки на if($this->stop) return;  smile 

Это сообщение отредактировал(а) neoks - 28.9.2012, 18:40
PM MAIL   Вверх
Fortop
Дата 28.9.2012, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  28.9.2012,  18:38 Найти цитируемый пост)
Ну а что толку мне от него ?

Цитата(neoks @  28.9.2012,  18:38 Найти цитируемый пост)
В результате если я не буду использовать $this->stop то по этому адресу http://site.ru/test/a вернет мне результат full access что значит не какой проверки не было и кто угодно может что угодно сделать без ведома админа ))

 smile 
феерично
Вот в который раз убеждаюсь, что люди ищут не ответ на вопрос, а черти что.

Ознакомьтесь
Код

class Sample {
    public function __construct() {
        if (!checkUserRights) {
            throw new Exception("Что-то пошло не так");
        }
    }
    public function someMethod() {

    }
}


В качестве checkUserRights может стоять проверка в ACL - имеет ли доступ пользователь данной сессии к данному урлу.
Но ваши проблемы проверки прав доступа к данному вопросу вообще не относятся.

Поскольку более правильным будет другой подход.
Т.е. у вас имеется приложение следующего вида:
  • Точка входа (роутер/контроллер и т.д.)
  • Модули.


Вопрос имеет ли право данный пользователь получить доступ к данному URL решается на этапе роутинга при помощи ACL
Модулям должно быть вообще безразлично кто и какие права имеет.

Соответственно, если проверка прав доступа провалена, то никакой модуль и метод не вызывается.




Это сообщение отредактировал(а) Fortop - 28.9.2012, 19:44


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 28.9.2012, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Цитата(Fortop @  28.9.2012,  19:42 Найти цитируемый пост)
Вот в который раз убеждаюсь, что люди ищут не ответ на вопрос, а черти что.

Как говорится лучше один раз увидеть чем сто раз ему объяснять что иди вон туда и гугли че тебе там нуно и не парь нам тут мозги ))
Разуется для меня эти исключения что то новое и пока вообше непонятно что это такое ? пока погуглил немного прочитал и мой мозг пока это все еше не пережувал.

Попробовал и мне выбело вот такую ошибку 
Fatal error: Uncaught exception 'Exception' with message 'Что-то пошло не так'

Это что то не так написано или так и должно быть ?  smile 
Вижу Exception' with message значит наверно так и должно быть, а как теперь избавится от этого сообщения ? )

Добавлено через 3 минуты и 30 секунд
Цитата(Fortop @  28.9.2012,  19:42 Найти цитируемый пост)
Вопрос имеет ли право данный пользователь получить доступ к данному URL решается на этапе роутинга при помощи ACL

Движок полностью модульный и роутер не имеет не каких php функций, все делают модули, + не на всех модулях нужно проверять а также помимо доступа нуно проверить и другие параметры если понадобится ) например работает ли БД и тд
PM MAIL   Вверх
Fortop
Дата 28.9.2012, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  28.9.2012,  20:07 Найти цитируемый пост)
 а как теперь избавится от этого сообщения ? )


Код

try {
    //тут наш код
} catch (Exception $e) {
    //тут обработка ошибок
}





Цитата(neoks @  28.9.2012,  20:07 Найти цитируемый пост)
Движок полностью модульный и роутер не имеет не каких php функций, все делают модули, + не на всех модулях нужно проверять а также помимо доступа нуно проверить и другие параметры если понадобится ) например работает ли БД и тд 

Подключение к БД - в конструктор.
А роутер переписать будет достаточно легко.
И это будет намного проще чем пытаться внедрить все эти проверки в каждый ваш модуль.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 28.9.2012, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Набросал пример для теста какой та из того что понял что эта такое ))

Код

class Sample {
    public function __construct() {
try {

    $fh = fopen("contacts.txt", "r");
    if (! $fh) {
        throw new Exception("Could not open the file!");
    }
}
catch (Exception $e) {
    echo "Error (File: ".$e->getFile().", line ".
          $e->getLine()."): ".$e->getMessage();
}
    }
    public function someMethod() {
        return 'test result oblom ))';
    }
}

$a = new Sample;

echo $a->someMethod();


Все также, вернуло  Error (File: C:\Winginx\home\roki.com\public_html\index.php, line 54): Could not open the file !test result oblom ))
Где test result oblom )) это результат метода someMethod


Цитата(Fortop @  28.9.2012,  21:22 Найти цитируемый пост)
И это будет намного проще чем пытаться внедрить все эти проверки в каждый ваш модуль.

В этом и дело, из 10 модулей понадобится 2м проверка БД, МОДУЛЯ БД !!, модулю БД может понадобится проверка права доступа, другому модулю может понадобится проверить то и то, другим вообше что та другое и так далее )

Я не знаю кому что может понадобится проверить и следовательно в роутер я не могу впихнуть куча проверок )

PM MAIL   Вверх
Fortop
Дата 29.9.2012, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



 smile жесть

Код

try {
  $module = new Module();
 $module->method();
} catch (Exception $e) {

}



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 29.9.2012, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Ладно, буду дальше проверять как и проверял, пока в этот try cath не врубаюсь зачем оно нуно так как любой пример у меня не пашет, смысл не понятен  smile 

Вот грубый тест
Код

class Module{
    function __construct(){
        return false;
    }
    function method(){
        echo 'test module';
    }
}


try {
  $module = new Module();
 $module->method();
} catch (Exception $e) {
    echo 'error';
}


Вернуло test module или я снова чет напутал ? ))
PM MAIL   Вверх
Fortop
Дата 29.9.2012, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Из конструктора нужно бросать исключение


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 29.9.2012, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Ну вот снова и таже история
Цитата(Fortop @  29.9.2012,  15:07 Найти цитируемый пост)
Из конструктора нужно бросать исключение 


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

Мона один но нормальный пример показать ?  smile  нечего удивительно что на форумах разводят такой флуд как я ша развожу )) ибо пример я не скоро увижу а буду пытаться чет химичить и по сто раз спрашивать что на сей раз и тд пока наконец то не увижу полноценный нормальный пример )

PM MAIL   Вверх
Fortop
Дата 29.9.2012, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  29.9.2012,  15:22 Найти цитируемый пост)
Как там бросить ? че нуно сделать ? каким макаром ?

В мануал.
И изучаем синтаксис, как бросать исключения.

выше уже были примеры.

У вас очень простая схема.
  • Пришел урл, проверили, имеет ли доступ к нему человек 
  • если имеет, то в блоке try/catch создали класс модуля, где в кострукторе установили/проверили наличие подключения БД
    •  если подключение есть - ок
    •  если подключения нет - то бросили исключение
  • если не имеет, то завернули еще до вызова модуля.

И вопрос собственно не в форумах и даже не в примерах, которых было достаточно. А в типах людей.
Есть люди, способные сами решить вопрос и за ниточку распутать весь клубок, а есть люди, которые думать не хотят, но умеют копировать шаблоны.
Вот вы к сожалению хотите идти по второму пути.



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 29.9.2012, 17:05 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Цитата(Fortop @  29.9.2012,  16:31 Найти цитируемый пост)
Пришел урл, проверили, имеет ли доступ к нему человек 

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

У меня все же напротив, у меня есть роутер и автозагрузка класса, вот и весь движок, всего 2 файла не превышающие 140 строчек кода, а все остальное это самостоятельные модули.

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

Разумеется зачем мне это нужно ? когда модуль сам может самостоятельно все отсечь без вмешательств со стороны, вопрос как его заставить чтоб в каждом методе не проверять
И да, мануалы я читал и примеры тестил, логику я пока не понял, что эта такое и зачем оно нужно мне не понятно, взял пример с проверкой соединения с базой данных, не знаю чем оно лучше if(), if() хоть правильно проверил а try cath даже не пискнул  smile 

Следовательно здесь я хоть спросил как это сделать на примере чтоб врубится для чего же оно, в мануалах я уже второй день читаю и не вкуриваю, куча примеров перебробывал и все они почти не работают, как по мне лучше все таки if() юзать чем это  smile 
PM MAIL   Вверх
Fortop
Дата 29.9.2012, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  29.9.2012,  17:05 Найти цитируемый пост)
Ну вот в этом и все дело, я не могу там цеплять проверки всякие

Кто сказал что не можете?

А как вы вообще планируете реализовывать ACL?

Добавлено через 1 минуту и 6 секунд
Цитата(neoks @  29.9.2012,  17:05 Найти цитируемый пост)
когда модуль сам может самостоятельно все отсечь без вмешательств со стороны

И ваша система заслуженно будет считаться дырявой.



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 29.9.2012, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Ну вот скажем роутер
Код

$uri = $_SERVER["REQUEST_URI"];

$realPathS = str_replace('index.php','',$_SERVER['SCRIPT_NAME']);

$uri = substr($uri,strlen($realPathS),strlen($uri));

$uri = preg_replace("'([/]+)'si",'/',$uri);

if($uri[0] == '/') $uri = substr($uri,1,strlen($uri));

$xp = explode('/',$uri);

$ajaxLoad = $xp[0] == 'ajax' ? true : false;

if($ajaxLoad) array_shift($xp);

$uri_r = implode('/',$xp);

/**
 * Параметры модуля
 */
 
$modul  = preg_replace("'[^a-z0-9_]'si",'',$xp[0]);
$action = preg_replace("'[^a-z0-9_]'si",'',$xp[1]);
$params = array_slice($xp,2);

foreach($params as $pk=>$pv) $params[$pk] = urldecode($pv);

if($modul && !$action) $action = 'show';

$moduleInfo = [$modul,$action,$params,$ajaxLoad,true,false];

/**
 * Параметры шаблона
 */

$tpl = $sl->settings->get('tpl_name');
 
define('TPL_NAME',$tpl == '' ? 'default' : $tpl);
define('TPL_DIR',SL_DIR.DIR_SEP.'tpl'.DIR_SEP.TPL_NAME);
define('TPL_ALT_DIR','/tpl/'.TPL_NAME);

/**
 * Редирект на файл если есть
 */
 
if($uri !== '' && file_exists(TPL_DIR.DIR_SEP.$uri) && !strstr(end($xp),'php')){
    header('Location: ' . TPL_ALT_DIR.'/'.$uri);  
    die();
}
/**
 * Инициализация модулей
 */
$init_mod = $sl->fn->conf('get',SL_DATA.DIR_SEP.'init_modules');

foreach((is_array($init_mod) ? $init_mod : []) as $key=>$arr){
    $findEx = false;
    
    if($key != '' && $arr['method'] != '' && $arr['status'] == 1){
        $excluded = explode("\n",trim($arr['excluded']));
        
        foreach($excluded as $goex){
            $goex = trim($goex);
            if($goex !== ''){
                if(@substr($uri_r,0,strlen($goex)) == $goex){
                    $findEx = true;
                    break;
                }
            }
        }
        if(!$findEx){
            if(($arr['type'] == 2 || $arr['type'] == 4) || (($arr['type'] == 3 || $arr['type'] == 5) && !$ajaxLoad)){
                
                if($arr['is_module'] !== ''){
                    $is_m_ex = explode("\n",trim($arr['is_module']));
                    
                    foreach($is_m_ex as $ifex){
                        if(@substr($uri_r,0,strlen($ifex)) == $ifex){
                            $sl->$key->$arr['method']();
                            break;
                        }
                    }
                }
                else $sl->$key->$arr['method']();
            }
        }
    } 
}
/**
 * Загрузка модуля
 */
if($modul !== '' and $action !== '' and !$sl->stopModule){
    
    if($sl->fn->infomod($modul)['status'] == 'on' || $modul == 'fn'){
        if($sl->$modul()){
            if(method_exists($sl->$modul, $action)){
                if(!$ajaxLoad) $sl->$modul->modInfo[5] = true;
                
                $sl->content = call_user_func_array([$sl->$modul, $action], $params);
                
                /**
                 * ILINK
                 */
                 
                $ilink = $sl->fn->conf('get',SL_DATA.DIR_SEP.'ilink');
                
                foreach($ilink as $imod){
                    if($imod['status']){
                        if(@substr($uri_r,0,strlen(trim($imod['module']))) == trim($imod['module'])){
                            $iac_ex = explode('/',trim($imod['action']));
                            
                            if($iac_ex[0] && $iac_ex[1]) $sl->content .= $sl->$iac_ex[0]->$iac_ex[1](array_slice($params,intval($imod['offset'])),explode("\n",trim($imod['params'])));
                        }
                    }
                }
            } 
        }
    }
    else{
        if($ajaxLoad) $sl->fn->info('Модуль ('.$modul.') отключен');
        else $sl->content = $sl->stpl->module_off($modul);
    }
}

if($sl->stopModule){
    if($ajaxLoad) $sl->fn->info('Модуль ('.$modul.') был остановлен по требованию инсталляционного модуля');
    else $sl->content = $sl->stpl->stop_module('Модуль ('.$modul.') был остановлен по требованию инсталляционного модуля');
}

if($ajaxLoad){
    echo is_array($sl->content) ? json_encode($sl->content) : $sl->content; die();



Как мне тут реализовать ?  smile 

Цитата(Fortop @  29.9.2012,  17:27 Найти цитируемый пост)
А как вы вообще планируете реализовывать ACL?

Очень просто, через Инициализацию модулей которая настроена по стандарту, я настроил и забыл
Модули успешно все отсекают если все проверять в каждом методе как я ша и делаю, просто мне интересовал метод чтоб не писать проверку в каждом методе чтоб все проверял только один метод )
PM MAIL   Вверх
Fortop
Дата 29.9.2012, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  29.9.2012,  18:57 Найти цитируемый пост)
просто мне интересовал метод чтоб не писать проверку в каждом методе чтоб все проверял только один метод

Это и делает ACL на этапе роутинга или сразу после него.

Цитата(neoks @  29.9.2012,  18:57 Найти цитируемый пост)
Как мне тут реализовать ?  

Вот после 26й строки и делайте проверку в ACL
А дальше у вас все идет как обычно или доступ отказан.
Реализовывать это в каждом модуле, который может и не знать имеет ли пользователь права для доступа к нему - нет смысла.

Цитата(neoks @  29.9.2012,  18:57 Найти цитируемый пост)
$realPathS = str_replace('index.php','',$_SERVER['SCRIPT_NAME']);

Это вообще что? smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Sanchezzz
Дата 29.9.2012, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Цитата

Это вообще что?  

попытка получить путь к файлу когда можно использовать pathinfo или realpath
интересно а расширение файла как проверяются  substr до первой точки? 









--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
neoks
Дата 29.9.2012, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Цитата(Fortop @  29.9.2012,  19:05 Найти цитируемый пост)
А дальше у вас все идет как обычно или доступ отказан.

А дальше у меня идет /** Инициализация модулей **/ это тот же ACL тока расширенный, могу любой модуль запустить а он уже решит что ему там нуно проверить помимо авторизации или доступа, много чего он может проверить и решит дать мне доступ к другому модулю или нет например за доступ отвечает модуль auth, но вот и прикол, я могу удалить это модуль если он мне не нужен  smile 

То есть избавится от лишней проверки и нагрузки на сервак, например замутить какойта парсер где и не нужна проверка )
Меня интересует не тока авторизация и доступ, например проверка бд, что тоже там ставить на проверку ? а если мне не нужна БД для моего скрипта, то есть об этом я все подумал  smile 

Все дело в том что если в /** Инициализация модулей **/ не включен модуль там какой-та проверки скажем БД да и вообше зачем мне везде проверять ? вот в чем смысл, скажем скрипт работает отлично без БД все работает как надо но вдруг я решил установил какой-та модуль с маркета и решил его запустить проигнорировал все его настройки или не почитав что там нуно настроить.

Так вот запускаю модуль а мне сразу вылазят ошибки что к БД нет доступа и тд, решение есть, сразу в методе сделать проверку работает бд или нет и если не пашет то завершить работу модуля и сообщить что так и так БД не пашет.

Все отлично и так но один минус есть, то что проверку нуно писать в каждом модуле или сказать пользователю что нуно его включить в /** Инициализация модулей **/  чтоб он проверил работает бд или нет и самое худшие если я включю а бд не будет работать то сайт сразу накроится и будет везде светится что бд не настроена.

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

Добавлено через 2 минуты и 17 секунд
Цитата(Fortop @  29.9.2012,  19:05 Найти цитируемый пост)
Это вообще что?

А это чтоб стереть index.php с адресной строки чтоб не определяло как модуль index.php ))
PM MAIL   Вверх
ksnk
Дата 29.9.2012, 20:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



neoks, Единственное здравое решение, которое мне приходит в голову ( это кроме "сжечь такие исходники и написать все заново"  smile ) - завести таблицу, в которой каждой паре класс-метод будет соответствовать список необходимых для корректной работы инициализаций. Возможно, можно сэкономить строчки таблицы, если методы одного класса нуждаются в одинаковом списке стартовых объектов. Просто описать их для пустого метода этого класса. При вызове пары - просто вызывать нужные проверки до вызова.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
neoks
Дата 29.9.2012, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



ksnk я понял о чем ты клониш и все это у меня реализовано только без таблиц чтоб не использовать БД даром
Вот как уменя стартуют модули до того как запустить необходимый модуль к которому обратился пользователь.

user posted image

Тут все я контролирую, какой метод при каком модули или какой исключить и где его запустить )
Мне тут настроить как два пальца об* но вот другие врятли так быстро вдуплят что и как, вот и хочется иметь страховочный вариант  smile 
PM MAIL   Вверх
Fortop
Дата 30.9.2012, 09:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  27.9.2012,  18:13 Найти цитируемый пост)
 у меня класс это модуль загружаемый с адресной строки, я могу вбить там любой модуль и любой метод ) и все это мне нужно проверять чтоб умники там не хулиганили 

Цитата(neoks @  29.9.2012,  17:05 Найти цитируемый пост)
когда модуль сам может самостоятельно все отсечь без вмешательств со стороны

Цитата(neoks @  29.9.2012,  20:07 Найти цитируемый пост)
но вот и прикол, я могу удалить это модуль если он мне не нужен  

Я не понимаю этого прикола
Либо он вам нужен чтобы умники не хулиганили, либо он вам не нужен.
Но вы, уж, батюшка либо трусы оденьте, либо крестик снимите...


Я вам собственно даже рассказывать уже что-либо опасаюсь.
Поскольку намеков вы не понимаете, язык, которым вы изъясняетесь, заставляет у меня шевелиться волосы в самых неожиданных частях тела при одной мысли, что вы еще и код пишете...


Но попробую...

Во-первых, вы путаете локальные требования модулей и глобальные требования приложения.
Права доступа определяются приложением, а не модулем. Поэтому проверка прав доступа выполняется "до" запуска сторонних модулей, но может быть возложена на обязательный "системный" модуль.
Во-вторых, необходимость подключения к БД или его отсутствия, если самому приложению не требуется, то идет на уровень конкретного модуля. Поэтому эта проверка выполняется на этапе конструирования объекта
в __construct()
В-третьих, для того чтобы не писать слишком много дублирующегося кода во втором случае, есть такая штука как наследование.

Код


abstract class AbstractModule {

}


abstract class ModuleWithDB {
    public function __construct($connect = false) {
        if (!$connect) {
            throw new Exception ('No connect');
        }
    }
}

abstract class ModuleWithoutDb {
}

class MySampleModuleWithDB extends ModuleWithDb {
    public function someMethod() {
        echo 'called';
    }
}

// тут у нас служебная инициализация всего что должно обязательно работать.
// роутинг
// проверка прав доступа


// а тут уже идет вызов конкретного модуля
try {
    $module = new MySampleModuleWithDB();
    $module->someMethod();
} catch (Exception $e) {
    die('error');
}



У нас есть некий абстрактный модуль AbstractModule.
Далее этот модуль может либо требовать наличие БД ModuleWithDB,
либо не требовать ModuleWithoutDb

Все модули которым нужна БД у нас должны расширять класс ModuleWithDB (как MySampleModuleWithDB)
Если модулю не требуется наличие БД, то он будет расширять класс ModuleWithoutDb 


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


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 30.9.2012, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Цитата(Fortop @  30.9.2012,  09:51 Найти цитируемый пост)
обязательный "системный" модуль.

Нету у меня системных модулей вообще которых нельзя удалить, вот он в чем прикол, могу подчистую все модули удалить и не каких проблем не будет и движок дальше будет работать )

Ух переписывать все это как то не вариант  smile 
Плюс скажем я хочу вызвать модуль в шаблоне, например тот же код что и в try
Код

$module = new MySampleModuleWithDB();
$module->someMethod();


Вылетит птичка Fatal error: Uncaught exception 'Exception' with message 'No connect' что есть не гуд так как это считается уязвимость, пихать в try cath ради одного модуля не вариант, + еше не понял как с него сделать автозагрузку модулей чтоб не писать постоянно new MySampleModuleWithDB() как я себе сделал ))

Для примера вот мой автозагрузчик

Код

class sl{
    var $ajaxLoad = false;
    var $content = '';
    var $header  = '';
    var $stopModule = false;
    
    function load($class,$params = false){
        global $ajaxLoad,$moduleInfo;
        
        $classFile = SL_DIR.'/modules/' . $class . '/class.php';
        
        if (!class_exists($class)) {
            if (is_file ($classFile)){
                require_once ($classFile);
                
                $_class = new $class($params);
                
                $this->$class = $_class;
                
                /**
                 * Ишим название классов
                 */
                
                $arr = (array)$this;
                
                foreach($arr as $name=>$obj) $buldName[] = $name;
                
                $buldName = array_unique($buldName);
                
                /**
                 * Переписываем глобальный класс во всех классах
                 */
                
                foreach($buldName as $obj) if(method_exists($this->$obj, 'init')) $this->$obj->init($this,($moduleInfo && $moduleInfo[0] == $obj ? array_merge($moduleInfo,[0=>$obj]) : [$obj]),$obj == $moduleInfo[0] && !empty($moduleInfo[3]) ? 1 : 0,$ajaxLoad);
                
                /**
                 * Вызываем функцию типа __construct()
                 */
                 
                if(method_exists($_class, 'init_member')) $this->$class->init_member();
            }
            else{
                if($moduleInfo[0] == $class){
                    if($ajaxLoad) echo json_encode(['error'=>'Класс ('.$class.') не найден'])."\n";
                    else echo $this->stpl() ? $this->stpl->class_error($class) : '<div class="classError">Класс ('.$class.') не найден</div>';
                }
                return false;
            }
        }
        return true;
    }
    function __call($class, $params = false) {
        return $this->load($class,$params);
    }
    function __get($class){
        if($this->load($class)) return $this->$class;
        else return $this;
    }
    public function __toString(){
        return $this->content;
    }
}

$sl = new sl();


Конечно стоило как то пошаманить с статическим классом но на тот момент я пока не разбирался ))
PM MAIL   Вверх
Fortop
Дата 30.9.2012, 12:03 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  30.9.2012,  11:21 Найти цитируемый пост)
, + еше не понял как с него сделать автозагрузку модулей чтоб не писать постоянно new MySampleModuleWithDB() как я себе сделал ))

PHP это динамический язык
поэтому допускаются конструкты вида
Код

new $moduleName;

где $moduleName содержит имя класса.

Цитата(neoks @  30.9.2012,  11:21 Найти цитируемый пост)
пихать в try cath ради одного модуля не вариант

Цитата(neoks @  30.9.2012,  11:21 Найти цитируемый пост)
Вылетит птичка Fatal error: Uncaught exception 'Exception' with message 'No connect' что есть не гуд так как это считается уязвимость

После такого перла я, пожалуй, пас.

А вам читать... долго и упорно.

Шлосснейгл "Профессиональное программирование на PHP"
http://habrahabr.ru/post/30399/
http://www.phpfaq.ru/debug2
http://www.phpfaq.ru/debug3

Добавлено через 5 минут и 9 секунд
Ах, да.
А самый цимес в том, что в моем случае не возникает никаких ваших проблем.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.