|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
|
SergV |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 197 Регистрация: 4.8.2006 Где: Германия Репутация: нет Всего: 1 |
Делаю шаблон для сайта, решил его сделать на отдельных макетах и блоках, так как сложный, и запнулся с ошибкой.
Ситуация следующая, имеется файл индексный, в котором в самом начале подключаю файл с настройками, а в нём подключаю файл с классом, и этот клас инициализирую в файле настроек. Дальше всё просто, в индексном файле вызываю функцию подключение макета - $tpl->loadLayout('xxx'), и в подключенном макете вызываю функцию подключения блока(в) - $tpl->loadBlock('xxx'). Так вот, в индексном файле всё норм, вызываются функции без проблем, а в подключенном файле макета функция выдаёт ошибку, но при статическом вызове TPL::$tpl->loadBlock('xxx'), всё работает нормально. Пытался разобраться сам, но чего то не пойму, почему не передаётся объект в другой файл, который подключил... Я уже давно с пыхом не работал, а с классами и вообще подавно, и нагуглить чёт не вышло, английского не знаю, а на русском всё не по теме. Мож кто подскажет где проблема, чего не так делаю? ПС. Пых 5.4, локальный сервер OpenServer. Класс стандартный, с "парой" публичных функций, думаю смысла нет приводить, так как там не чего особо нет, кроме пары строк в каждой, да и всё работает в общем то, кроме файла макета... |
|||
|
||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
очевидно, что файл с классом подключился, а переменная-объект в нужном месте в нужное время отсутствует.
без исходников о деталях можно только гадать Добавлено через 1 минуту и 26 секунд
а $tpl где родится? а в подключенном файле макета она доступна? |
|||
|
||||
SergV |
|
||||
Бывалый Профиль Группа: Участник Сообщений: 197 Регистрация: 4.8.2006 Где: Германия Репутация: нет Всего: 1 |
Имеется основной файл index.php шаблона...
В нём инклюдится файл настроек, в котором константы и т.д., и инклюд класса.
Там же в config.php и инициализация класса - $tpl = new TPL; Вызов идёт из index.php - $tpl->loadLayout('layout-name') В "layout-name" хтмл вёрстка и вызов блока - $tpl->loadBlock('block-name'), где оствшаяся хтмл вёрстка. Вот тут и выходит ошибка вызова функции, но если вызывать как TPL::$tpl->loadBlock('xxx'), то всё норм. Суть в том, что до переноса в класс, в config.php были просто две функции, и они вызывались без проблем, а в классе такая вот байда вышла... :( Это сообщение отредактировал(а) SergV - 21.8.2014, 17:26 |
||||
|
|||||
baldina |
|
||||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
$tpl недоступен отсюда. его надо передать в параметрах или, если он глобальный,
Добавлено через 38 секунд однако он будет доступен и так, только не через $tpl а через $this Добавлено через 10 минут и 33 секунды т.е.
|
||||||
|
|||||||
SergV |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 197 Регистрация: 4.8.2006 Где: Германия Репутация: нет Всего: 1 |
Спасибо, чёт ступил, не попробовал через $this вызывать, думал не прокатит, тепрь работает.
А попутный вопрос, можно как то так через $tpl делать, но не использовать global $tpl, так как вроде по старой памяти, глобалки не советуют из за проблем с защищённостью или чего там ещё? ПС. Интересно вообще, как функция в $this попала, если я класс инитиализировал как $tpl..., и не где не переопределял, и клас не наследуется не от какого другого. ПС2. Приколы, $this работает только для вызова из файла блоков в макете, а в индексном файле выдаёт туже ошибку. Мда..., хочется вызывать одинаково, а то там одно, тут другое. Это сообщение отредактировал(а) SergV - 21.8.2014, 18:08 |
|||
|
||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
SergV,
передать в качестве параметра. но... не надо через $tpl, логика следующая: контроллер создает $tpl - экземпляр TPL и работает с ним. $tpl - шаблон с исполняемым кодом, то есть view. код в partial temlates, подключаемых через loadLayout() и loadBlock() - суть часть кода view, поэтому ему логично обращаться к объекту шаблона (типа TPL), а значит view, как к себе, через $this Добавлено через 2 минуты и 22 секунды
ну естественно. блоки становятся частью кода функции-члена, а индексный файл - внешняя создающая и вызывающая среда. индексный файл - controller, блоки - часть view. view целиком представлен в индексном файле как $tpl |
|||
|
||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Если я правильно понял, TPL - классический синглтон класс. Нужно и работать с ним как с синглтоном.
в нужных местах писать $tpl=TPL::getTpl() или TPL::getTpl()->do_something(); -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
Aliance |
|
|||
I ♥ <script> Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
ksnk, лучше наверное такой синглтон пометить как final, либо заменить self на static ;)
|
|||
|
||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Aliance, Если разработчики php будут и дальше толкать язык в сторону Java - то нет, на static заменять не стоит final - да, для дополнительного лоска - можно добавить.
Текст стырен откуда-то, вероятно с википедии, так что мопед не мой я на нем только катаюсь... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
SergV |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 197 Регистрация: 4.8.2006 Где: Германия Репутация: нет Всего: 1 |
baldina, сказать честно, понял через слово, совсем уже забыл что к чему в пхп, занимаясь 3д дизайном.
Так или иначе, нашёл шаблон один, где подобная иеархия с подключением, правдо там всё идет через плагин(класс в плагине сидит), но в шаблоне везде вызов на подключение идёт как я писал... Попробую там подсмотреть что и как делается, и вытянуть что надо из плагина в шаблон. ksnk, спасибо за пример, но я с классами давным давно начинал работать, но так и не освоил толком, да и уже забыл что к чему. В общем придётся пока делать обходным путём, вызывая блоки через $this, и постепенно разбираться с найденным шаблоном и его плагином... Не вышло по быстрому сделать нормально, думал тряхну стариной, раз раз и на матрац, а $тут-> ПС. Глючит меня с утра, в найденом шаблоне точно так же, вызов макета через объявление класса и т.д., а подключение блоков через $this... В общем вопрос снимается, всем спасибо за ответы. Это сообщение отредактировал(а) SergV - 22.8.2014, 11:32 |
|||
|
||||
baldina |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
||||
|
||||
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |