Доброго времени суток коллеги. Прошу помощи в ООП, так как оказалось я не особо силен в нем. Есть система, в ней есть контроллер страниц (главная, новости, аккаунт, регистрация и тд) Под каждый контроллер есть шаблон в котором есть возможность вывода виджетов - метод в контроллере Код (Text): protected function widget($wName, $params=array(), $returnData = false) { $widget = 'Widget'.$wName; $widget = new $widget; foreach ($params as $name => $value) $widget->$name = $value; $widget->init(); $out = $widget->run(); if($returnData) return $out; } Написал свой виджет статистики, который выводит какой-нибудь js в футере который пуляет запрос на мой обработчик, регистрируя пользователя или обновляет... И вот тут случилась загвоздка. В своем виджете я сохраняю данные в куки, а так как виджет стартует после вывода контета в браузер, то куки я сохранить не могу. Я могу пильнуть контроллер и инициализировать виджет свой где-нибудь до вывода. результат работы виджета(js код), соберу в буфер своего виджета. Затем в шаблоне напрямую обращусь к статичному свойству виджета, без инициализации самого виджета. В результате у меня получиться корявый код, так как везде я инициализирую виджет как: А теперь будет Как можно переписать метод widget в контроллере, что бы, если класс инициализирован, то не инициализировать его снова, а тупо взять вызвать метод run() ? Не знаю, может в каждом виджете запилить статическое свойство, которое до инициализации имеет 0, а после 1, и прежде создавать новый экземпляр класса чекнуть это свойство, и исходя из исхода либо стартануть виджет, либо... синглтон =) Я в замешательстве... Прошу вашей помощи...
MVC-базу сами писали? Покажите код, который вызывает событие в контроллере. Чтоб такие вещи срабатывали, он должен работать через ob_start()
По-моему, вы пытаетесь изобрести класс-синглтон. http://lifeexample.ru/php-primeryi-skriptov/php-singleton-singlton.html
Хыиуду, Вы невнимательно читаете. mkramer, Да, MVC сами писали. К сожалению код весь показать не могу, но логику попытаюсь изъяснить. В контроллере есть банальный рендер, который: Соответственно в require() попадает шаблон страницы .php в котором вшит код вызова виджета: Код (Text): <?php $this->widget('widget'); ?> Естественно он стартует в контроллере метод widget() и передает ему название виджета. И мы его инициализируем (код в первом посте) Собственно сабж в том, как сказать методу widget() в контроллере, что виджет который он должен инициализировать, уже был инициализирован ранее и нам нужно его просто выполнить. Не хотелось бы синглтонить в каждом виджете, очень не хотелось бы.
Всё, что интересно, показали. Поскольку вы используете ob_start(), реально первый echo, дающий какой-то вывод в браузер, в скрипте стоит гораздо позже кода формирования виджета, поэтому проблем с отправкой куков быть не должно. Если конечно до этого кода, который вы мне показали, не выполняется какой-нибудь echo (явный или не явный)