Вопросы по PHP
Есть что-то плохое использовать switch в switch?
Т.е.
switch ($a) { case 'b': // 1 break;
case 'c':
switch ($d) { case 'e': // 2 break;
case 'f': // 3 break;
default:
}
break;
default:
}
Никогда не слышал что такое плохо. В связи с чем вопрос?
Это будут страницы: a, b ,c , d, e.... ну, не алфавит конечно) типа /page/page2/page3... для ЧПУ
В связи с чем вопрос? - Имел в виду: где-то было сообщение, что это плохо?
Я просто информации нигде не нашел об вложенности, и подумал, что может не очень правильно так делать. Но если все нормально, то - не волнуюсь)
Просто привел пример двойной, а на деле будет больше. До пяти вложенных свитчей будет, а то может и больше... Правда на хабре читал, что switch медленнее чем if, else, но последнее не подходит, к сожалению.
Как можно автоматизироват такой вот процесс?
Есть свитч в котором подключаются "моды"
Грубо говоря, что-то типа такого, в то же время, эти свитчи отвечают за ЧПУ (сайт/мод)
switch ($mod) { case 'mod1': include "mod1.php"; break;
case 'mod2': include "mod2.php"; break;
case 'mod3': include "mod3.php"; break; }
Моды лежат все в папке, каждый в своей mod/мод/файл_мода.php
Есть вариант как-то не добавлять постоянно кейсы, а чтобы автоматически как-то было? Спасибо.
Надо циклически перебрать подпапки папки mod. Примерно так:
$dir=opendir('mod'); while ($file=readdir($dir)) { if($mod==$file){ $file1=$directory."/".$file."/".$file.'.php'; include $file1; } }; closedir($dir);
Хех. Всю конструкцию заменил на
$mod = $url;
$dir = opendir(DIR_MOD); while ($file = readdir($dir)) { if ($mod == $file) { $module = DIR_MOD."/".$file."/".$file.'.php'; include $module; } }; closedir($dir);
if ($mod == 'page') include "page.php";
И все замечательно работает. Спасибо за решение!
Далее, решил поковыряться и Ваше решение привело к варианту без цикла Правда на сколько это все правильно - не знаю. но вроде работает нормально.
$mod = $url; // $url - при обращении site.ru/news вернет news
if (empty($mod)) // Если $mod пуст, то выводим главную { include "main.php"; } elseif ($mod == 'page') // $mod вернул page (если НЕ модуль надо подрубить) { include "page.php"; } else // тут уже модули { $file1 = DIR_MOD."/".$mod."/".$mod.'.php'; if (file_exists($file1)) // если файл есть, то подключаем его include $file1; else // если нет, то редиректим на главную (или на 404, или еще куда-то) Redirect(SITE_URL); }
Да, без цикла, конечно, проще и экономнее.
Как можно из такого массива выводить в цикле данные?
aList Object ( => Array ( => Array ( => уникальный код => 1 => SimpleXMLElement Object ( => уникальное имя => 1.0 => Название => Описание => Author => http://url.ru/ ) ) => Array ( => уникальный код => 1 => SimpleXMLElement Object ( => уникальное имя => 1.0 => Название => Описание => Author => http://url.ru/ ) ) => Array ( => уникальный код => 1 => SimpleXMLElement Object ( => уникальное имя => 1.0 => Название => Описание => Author => http://url.ru/ ) ) ) )
code и active присваиваются в методе класса.
Вызываю так $list = new aList; $list->List(); print_r($list);
получение данных идет из xml файлов
В итоге получить на руки code active name version title description author homepage
чтобы передать их в шаблон через smarty. В идеале в цикле не определять для smarty переменные, а сразу весь массив в шаблон и там уже обработать его.
Пока с массивами только начал разбираться, по этому много тупиковых ситуаций)
----- И еще такой вопрос Что конкретно делает функция os_db_prepare_input в шопосе? Я ее пробовал вместе с классом objectinfo В цикле пробовал $newsData = new objectinfo($row); (в $row приходит sql запрос) и потом спокойно можно использовать данные через $newsData->тут_что_тянем
типа повторения цикла? Потому как удобно очень, если надо какие-то данные использовать не только в цикле, но и где-то ниже по коду.
У меня в цикле получение новостей и ниже определения metatile, metadescription и т..д... и там как раз через "$newsData->тут_что_тянем" вывожу нужные мне данные. Сильно ли нагрузки добавляет? Как минимум не делать больше запросов. Это уже плюс.
Примерно в таком стиле:
$L=array();
foreach ($list->list as $k => $v) { $L=array( 'code' => $v['code'], 'active' => $v['active'], 'name' => $v['property']->name, 'version' => $v['property']->version, .......... );
} $module->assign('myLIST', $L);
grig, огромное спасибо! А есть вариант БЕЗ 'code' => $v['code'], 'active' => $v['active'], 'name' => $v['property']->name, 'version' => $v['property']->version,
чтобы в шаблоне уже {foreach from=$myLIST item=list} {$list.property->version}, {$list.property->name}, {$list.code} {/foreach}
То есть, чтобы весь массив передать в шаблон и там его уже разобрать.
->version,
чтобы в шаблоне уже {foreach from=$myLIST item=list} {$list.property->version}, {$list.property->name}, {$list.code} {/foreach}
То есть, чтобы весь массив передать в шаблон и там его уже разобрать.
Сейчас так и сделано. Строка $module->assign('myLIST', $L); Передает в шалон под одной переменной весь массив.
Ваш вариант в шаблоне работать не будет. В шаблоне надо разбирать так: {foreach from=$myLIST item=list} {$list.version}, {$list.name}, {$list.code} {/foreach}
Я понимаю, что $L передает по одной. Вот и хочу избавиться от назначения переменных в цикле foreach ($list->list as $k => $v), и перенести назначение уже в шаблоне. нужно для того, чтобы при необходимости добавить новое поле в XML, не править файл PHP, а только сам файл XML и в шаблон вывести новую переменную. то есть избежать правки PHP файла.
в каком-то движке видел именно такой вывод {$list.property->name} по этому и спросил. Правда, что за CMS была, уже не вспомню...
Пробуйте по-своему, может, будет работать. Не знаю, пропустит ли это шаблон, не встречался с таким.
Да. не получилось что-то так сделать. Сделал просто записать активных модулей в файл. и там проверяю какой активный, а какой нет)
Источник
|