Категории

[FAQ] Часто задаваемые вопросы и ответы

Проблемы и решения

Ошибки и исправления

Общие вопросы

Расширения

Установка и обновление

Модули

Шаблоны

Локализация интерфейса

Коммерческие предложения

Учимся бизнесу

Бизнес книги

Поисковая оптимизация (SEO)

Магазины на ShopOS

Хостинг для ShopOS

Предложения и пожелания

Курилка

Вопросы по 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 была, уже не вспомню...


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


Да. не получилось что-то так сделать. Сделал просто записать активных модулей в файл. и там проверяю какой активный, а какой нет)


Источник



Copyright ShopOS