Задача: Вывести все файлы из дирректории tabs, как вкладки панели вкладок (объект из extJS). Решение: 1)Использовать возможность автоматического создания вкладок 2)Вывести содержимое файлов в соответствующие <div>: main.php PHP: <?php function tabsFromFiles($dir){ tabsFromArrFiles(getPHPFiles($dir)); } function tabsFromArrFiles($arr){ foreach ($arr as $file){ $name=ucfirst(substr(basename($file),0,-4)); // обрезаем имя папки, расширение и делаем первую букву заглавной echo "<div class='x-tab' title='$name'>"; include($file); echo "</div>"; } } function getPHPFiles($dir){ return glob($dir."/*.php"); } $tpl= new Template("body.tpl"); echo $tpl; ?> body.tpl HTML: <div id="tabDiv"> <?php tabsFromFiles("tabs");?> </div> Вопросы: 1) Стоит ли заморачиваться на шаблонизацию в функции tabsFromArrFiles? Если да, то как реализовать в шаблоне include($file)? 2) Стоит ли переделывать вызов tabsFromFiles() в вывод переменной шаблона? Т.е.: body.tpl HTML: <div id="tabDiv"> <?php echo $tabsFromFiles;?> </div> main.php PHP: <?php ... $tpl= new Template("body.tpl"); $tpl->tabsFromFiles=tabsFromFiles("tabs"); ... ?> 3) Или может стоит вообще решить задачу по другому? Например: PHP: <?php // Создаем массив имен и содержания вкладок $arrFiles=getPHPFiles("tabs"); foreach($arrfiles as file){ ob_start(); include($file); $rezArr[]=array(ucfirst(substr(basename($file),0,-4)), ob_get_clean()); } //Подключаем шаблон и работаем с rezArr ... ?>
1) Их будет неудобно просматривать в виде вкладок. 2) Загрузка страницы будет сильно тормозить. Если вообще сможет загрузиться. Только с чего это им там так плодится?
Volt(220) Ну тебе виднее Ты делаешь универсальный компонент? Или конкретное решение? Во втором случае почему их(табы-файлы) просто не перечислить где-то в конфиге?
Я решаю конкретную задачу. Однако если я могу сделать универсальное решение малыми силами, то почему нет? А что мне это даст? Я опять получу массив с именами файлов, только не через функцию, а вбитый ручками.
Volt(220) ? кто-то мешает в конфиг записать яваскрипт? Шаблонизацию стоит делать для отдельного файла. И затем обрабатывать всех скопом. например Код (Text): $arr = array('file1' => 'tpl1', 'file2' => 'tpl2', 'file3' => null); можно принять за умолчание что значение пары Код (Text): '*' => 'defaulttpl' применяется ко всем элементам массива, где value = null Отдельный общий шаблон (layout) для самой панели с табами тоже можно сделать. В общем случае у тебя есть шаблон панели, шаблон(ы) для табов являются подшаблонами. Рендер происходит рекурсивно - т.е. ты вызваешь рендер панели, а она в свою очередь вызывает рендер всех элементов внутри себя.
Что-то я не понимаю твою идею... У меня есть: Шаблоны: Основной шаблон (body.tpl) и шаблоны для каждой вкладки (tpl1, tpl2...) Скрипты: Основной скрипт (main.php) и скрипты для вкладок (file1, file2, file3...). Ты предлагаешь сопоставить с помощью массива скрипты для вкладок и шаблоны для них? И как их обработать скопом? Считать каждый скрипт шаблоном и пропустить через шаблонизатор, тогда это получится нечто вроде варианта кода в вопросе №3. UPD: Для правильного рендера подшаблонов придется перенести код файлов (тех самых из дирректории tabs) в основной скрипт.
Да. При этом ты можешь просто прописать в значение null и тогда для вкладки будет использоваться дефолтный шаблон. Более того в качестве ключей массива, может же быть не только имя файла, а и вообще произвольная строка урл. И тогда у тебя вкладки автоматом можно сделать аяксовыми. Ну раз у тебя есть шаблонизатор, то и занимайся реиспользованием кода. Тут в другом топике vs приводил свою реализацию шаблонизатора с автоматическим рендеренгом под-шаблонов. Как мне кажется - это вполне удобный вариант. При этом мы всегда имеем возможность отренедрить и отдельный подшаблон.
Его и использую. =) Потому что эти скрипты генерируют нужные переменные для шаблонов. Дополним пример выше тремя файлами: 1) table.tpl - шаблон отрисовки таблицы. Использует ключи и значения массива $tabArr. 2) auth.php - запрашивает из базы таблицу авторов, формирует массив $tabArr, подключает шаблон table.tpl и выводит его PHP: <?php $DB=MySQLDB::getDB(); $tabArr=$DB->getTable("select fio, country from authors limit 0,30"); $tpl=new Template("table.tpl"); $tpl->tabArr=$tabArr; echo $tpl; ?> 3) izd.php - аналогичен файлу по авторам, но выполняет запрос к другой таблице. соответственно auth.php и izd.php лежат в папке tabs. Если не выполнить этих скриптов, то подшаблоны отрендерятся неверно. (Кстати, надо еще не забыть проверить что-там с одинаковыми именами переменных будет происходить.) Это следующий шаг над которым я буду думать, но сейчас мне хотелось бы довести до конца текущую идею.
Я бы сделал примерно так PHP: <?php $layout = new Template('layout.tpl'); $tplAuth = new Template('table.tpl'); $tplIzd = new Template('table.tpl'); $layout->auth = $tplAuth; $layout->izd = $tplIzd; $auth = new Auth(); $izd = new Izd(); $tplIzd->tabArr = $izd->getArray(); $tplAuth->tabArr = $auth->getArray(); echo $layout; Как привинтить тут массив с шаблонами и моделями, и затем подключить все к $layout думаю очевидно.
Можно сделать немного иначе PHP: <?php $auth = new Auth(new Template('table.tpl')); $izd = new Izd(new Template('table.tpl')); $layout->auth = $tplAuth; $layout->izd = $tplIzd; echo $layout; У моделей Auth, Izd должен быть метод render() и прокси к нему __toString() примерно такого содержания PHP: <?php public function render(Template $tpl = null) { if($tpl) { $this->tpl = $tpl; } $this->tpl->tabArr = $this->getArray(); return $this->tpl; }
Т.е главная идея обернуть код в скриптах в классы. Т.е. есть массив, в котором: файл шаблона, имя класса, файл с классом. Возможны вариации, типа: вычислять имя класса по имени файла, использовать автозагрузчик, вычислять имя шаблона, и имя класса по имени файла, а массив файлов получать той же самой getPHPFiles. Мне приходила в голову идея обернуть код в методы, я не додумал ее до вызова метода по имени в переменной. Ну и доводя до конца: PHP: <?php $tplAuth = new Template('table.tpl'); $tplIzd = new Template('table.tpl'); $auth = new Auth(); $izd = new Izd(); $tplIzd->tabArr = $izd->getArray(); $tplAuth->tabArr = $auth->getArray(); // Создаем массив вкладок $arrTabs[]=$tplAuth; $arrTabs[]=$tplIzd; $layout = new Template('layout.tpl'); $layout->arrTabs= $arrTabs; ?> Иначе придется при добавлении нового файла менять главный шаблон.
можешь обернуть в функции - не в этом суть Суть в организации работы так, чтобы все выполнилось тогда, когда это нужно. если напишешь автозагрузчик, то файл класса - излишен. я просто показал идею, детали реализации - как тебе удобнее
Самое интересное, что конкретных ответов на поставленные вопросы так и не мы так и не написали... =))
Конкретный ответ на поставленный вопрос - это готовое решение А готовые решения я не люблю бесплатно давать Но в твоем случае, вполне очевидно, что пошли по 3му варианту