Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 23

PHP и MVC - генерация различных меню для авторизованных пользователй и гостей

01.11.2016, 06:50. Показов 2514. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
в общем начал изучать патерн MVC, все вроде бы хорошо, но не могу понять, где сделать генерацию меню, то есть для зарегистрированых пользователей она одна для не зарегистрированных другая, в главном файле template_view.php не вариант, лишний мусор там на мой взгляд, то там работает. может кто сталкивался с таким и подскажет новичку?) заранее спасибо)))
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.11.2016, 06:50
Ответы с готовыми решениями:

Система комментариев для гостей и авторизованных пользователей
Здравствуйте. У меня такая проблема: на одной из страниц сайта мне нужно сделать систему комментариев в которой будут отписываться гости и...

Как скрыть пункты меню от гостей?
Как скрыть пункты меню от гостей? Сейчас у меня это работает так <?if(isset($_SESSION) && isset($_SESSION)){?> <a...

Доступ только для авторизованных пользователей
Всем привет! Подскажите пожалуйста как сделать доступ к странице только авторизованным пользователям. И как для этого правильно...

17
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
01.11.2016, 07:55
Hy_ok, У меня генерацией меню занимается Вьюха
Кусок кода из view.php , это конечно не продакшн но это работает, просто , динамично
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
public function renderMenu($page,$language){
        $menu = array('news' => ['link'     => '/news',
                                 'class'    => 'news',
                                 'title'    => ['ru' => 'Новости',
                                                'eu' => 'News',
                                               ],
                                 'name'     => ['ru' => 'Новости',
                                                'eu' => 'News',
                                               ],
                                 'visible'  => true
                                ],
                      'lottery' => ['link'  => '/lottery',
                                    'class' => 'tickets',
                                    'title' => ['ru' => 'Лотерея',
                                                'eu' => 'Lottery'
                                                ],
                                    'name'  =>  ['ru' => 'Лотерея',
                                                'eu' => 'Lottery'
                                                ],
                                    'visible'   => true
                                    ],
                      'cases' => ['link'    => '/cases',
                                 'class'    => 'cases',
                                 'title'    => ['ru' => 'Кейсы',
                                                'eu' => 'Cases',
                                               ],
                                 'name'     => ['ru' => 'Кейсы',
                                                'eu' => 'Cases',
                                               ],
                                 'visible'  => true
                                ],
                      'bets' => ['link'     => '/bets',
                                 'class'    => 'bet',
                                 'title'    => ['ru' => 'Ставки',
                                                'eu' => 'Bets',
                                               ],
                                 'name'     => ['ru' => 'Ставки',
                                                'eu' => 'Bets',
                                               ],
                                 'visible'  => true
                                ],
                      'games' => ['link'    => '/games',
                                 'class'    => 'games',
                                 'title'    => ['ru' => 'Игры',
                                                'eu' => 'Game',
                                               ],
                                 'name'     => ['ru' => 'Игры',
                                                'eu' => 'Game',
                                               ],
                                 'visible'  => true
                                ],
 
                     );
        $sections = '';
        foreach ($menu as $key => $value) {
            if($value['visible'] === true){
                if($key == $page){
                    $active = 'hover';
                }else{
                    $active = '';
                }  
                $sections .= '
                    <div class="ml-link '.$value['class'].' '.$active.'">
                        <a href="'.$value['link'].'" title="'.$value['title'][$language].'" class="ml-ref"></a>
                        <div class="back"></div>
                        <div class="container">
                          <div class="icon"></div>
                          <span>'.$value['name'][$language].'</span>
                        </div>
                    </div>
                ';
            }
        }
 
        return $sections;
    }
0
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 23
01.11.2016, 08:14  [ТС]
maruo, я вот тоже посидел подумал) и решил во втюху запилить его) а вывод ты как делаешь?) через foreach?

Добавлено через 5 минут
maruo, я вот тоже посидел подумал) и решил во вьюху запилить его) а вывод ты как делаешь?) через foreach?

Добавлено через 1 минуту
я вот тоже посидел подумал) и решил во вьюху запилить его) а вывод ты как делаешь?) через foreach?
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
01.11.2016, 08:20
Лучший ответ Сообщение было отмечено Hy_ok как решение

Решение

Hy_ok, return $sections; отдается уже сгенерированое меню которое потом можно просто через echo вывести
0
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 23
01.11.2016, 08:32  [ТС]
Спасибо))) очень помог))))
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
01.11.2016, 08:40
А я бы так не смешивал. Я бы полностью разделил генерацию и вывод, либо изначально делал бы в шаблоне.
0
0 / 0 / 0
Регистрация: 21.10.2016
Сообщений: 23
01.11.2016, 08:51  [ТС]
в шаблоне все работает, не красиво всеравно как то когда там есть подобные выводы и проверки, по этому я и спрашивал куда лучше перенести это
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
01.11.2016, 10:51
вообще ничего такого плохого нет в том, чтобы добавить в шаблон простую проверку условия. Если не хочется и этого - создаете две разных вьюхи с менюшками - одну для гостей, другую для авторизованных, и подключаете нужную.
А вообще, если верстка одна и та же, то обычно для пунктов меню просто дают возможность указать видимость Только не так, как здесь - в функции жестко все забито, да и еще и html-код внутри, а нормально, с передачей массива параметров/установкой свойств (если это класс-формировщик меню)..
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
02.11.2016, 00:34
KOPOJI, про функцию вы имеете ввиду мою? а что в ней смущает вас?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.11.2016, 01:32
Вывод html и жестко зашитый массив внутри. Вроде же я написал про это. Например, такая ситуация - у вас есть верхнее меню и нижнее, с одинаковой версткой, но разными пунктами меню. И некоторые из пунктов видны только админу, например. Используя ваш код, понадобится четыре разные функции с дублированием кода (даже если забыть про прописанные жестко видимости - верстка и алгоритм вывода ведь один и тот же)
1
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
02.11.2016, 02:10
KOPOJI, почему же 4? 1го или максимум 2
Видимость можно не через массив определять а например передать в функцию параметр "статус авторизации" или "ранк пользователя" и от этого генерировать пункты.
А вывод html не понял а как иначе? отдавать данные js а тот будет работать с ними и формировать ? и зачем? если мне нужно что бы меню было сгенерировано до того как подгрузятся картинки и прочее.
Честно про вывод html я вас плохо понял, в методе не выводится меню оно лишь формирует его, отдает обычную переменную. Где потом я могу ее в любом месте вызвать через echo $menu;

И все же я сказал это не продакшн набросал основы. А дальше можно доработать.
Мне такое меню удобнее, под мою задачу . У меня пункты для всех одинаковые .
pS: да другой вопрос если придется переделывать...

PpS: Да проблема может быть если мне нужно будет 10 разных меню и придется лепить 10 функций для меню. Ну тут я думаю проще будет создать класс отдельный?
Ну и да, я только познаю основы ООП и MVC могу нести небольшой бред... Но уверен что не полный
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.11.2016, 10:20
maruo, не вывод, накапливание кода HTML в переменную, я не правильно выразился, прошу прощения.
Я не говорю именно про то, что формирование html в функции это плохо (хотя, имхо, лучше это вынести в шаблон).
Ну а теперь смотрите. Пускай даже две функции будет. И вот у вас редизайн, и вам надо изменить верстку меню. Из-за дублирования кода вы должны будете по всем функциям пробежаться и заменить эту верстку. Согласитесь, это лишняя трата времени, которую легко можно избежать?
А ведь частенько бывает куда больше типов меню. Например: верхнее, нижнее, левое. А к ним еще другие менюшки - меню одного раздела, меню другого (например, меню каталога собирается из разделов товара, при заходе внутрь оно меняется на новое и т.д., в разделе "О компании" еще какие-то подпункты). Это все взято из реальных проектов. Представьте, сколько вам придется запилить этих функций?
Ради примера того, как это можно сделать нормально - посмотрите, например, реализацию этого в Yii http://www.yiiframework.com/doc/api/1.1/CMenu. То, что там используется виджет и класс, это не так важно, главное сам способ реализации - передается массив параметров, где все и указывается. Даже если сделать передачу пунктов меню в функцию через параметр, наподобие того, как это сделано по ссылке
PHP
1
2
3
4
5
6
7
8
9
10
11
'items'=>array(
        // Important: you need to specify url as 'controller/action',
        // not just as 'controller' even if default action is used.
        array('label'=>'Home', 'url'=>array('site/index')),
        // 'Products' menu item will be selected no matter which tag parameter value is since it's not specified.
        array('label'=>'Products', 'url'=>array('product/index'), 'items'=>array(
            array('label'=>'New Arrivals', 'url'=>array('product/new', 'tag'=>'new')),
            array('label'=>'Most Popular', 'url'=>array('product/index', 'tag'=>'popular')),
        )),
        array('label'=>'Login', 'url'=>array('site/login'), 'visible'=>Yii::app()->user->isGuest),
    ),
то уже половина проблем пропадет (с html внутри без дублирования кода еще можно смириться). Ну а если не хотите видеть этого массива в верстке - сделайте функцию/метод, которая возвращает этот массив. Или даже проще: создаете файл (например, main_menu.php), в нем возвращаете этот массив - а затем его подключаете в переменную. Пример такого способа есть здесь по ссылке http://php.net/manual/ru/funct... xample-175
1
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
02.11.2016, 15:31
KOPOJI, пример наглядный, Но вот сразу обратил внимания нету мультиязычности, а вот мне она 100% нужна как ни крути(хотя и тут не сложно добавить еще пару элементов в массив.

Погодите так вы имеете в виду о том что у меня в функции хранится сам массив меню? $menu
блин только сейчас понял.
Дружище я ээто знаю я для примера показал и писал что это только на время не продакшен же)Да потом будет передача массива как параметр в функцию)
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.11.2016, 15:40
Ну да, я именно про это и говорил
Цитата Сообщение от KOPOJI Посмотреть сообщение
Вывод html и жестко зашитый массив внутри
Цитата Сообщение от maruo Посмотреть сообщение
хотя и тут не сложно добавить еще пару элементов в массив
именно так. Но обычно все это реализуется здесь же. Пишется функция для вывода сообщения на нужном языке, который берется из текущего языка сайта. И просто она везде подставляется. Например, в Yii (раз уж я привел пример на нем) это выглядело бы как-то так
PHP
1
2
3
4
5
6
7
8
9
10
11
'items'=>array(
        // Important: you need to specify url as 'controller/action',
        // not just as 'controller' even if default action is used.
        array('label'=>Yii::t('Home'), 'url'=>array('site/index')),
        // 'Products' menu item will be selected no matter which tag parameter value is since it's not specified.
        array('label'=>Yii::t('Products'), 'url'=>array('product/index'), 'items'=>array(
            array('label'=>Yii::t('New Arrivals'), 'url'=>array('product/new', 'tag'=>'new')),
            array('label'=>Yii::t('Most Popular'), 'url'=>array('product/index', 'tag'=>'popular')),
        )),
        array('label'=>Yii::t('Login'), 'url'=>array('site/login'), 'visible'=>Yii::app()->user->isGuest),
    ),
http://www.yiiframework.com/do... opics.i18n
0
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
02.11.2016, 15:59
KOPOJI, насчет язычности плохо понял как у Yii это работает. что я смог придумать это такой громадный метод
И он будет разрастаться в высоту до бесконечности. От этого можно избавиться?)

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public function return_message($type,$params = array()){
        if($this->language == 'RUS'){
            switch ($type) {
                case 'item_not_found':
                    $data['message'] = 'Ошибка! Предмет не найден.';
                    break;
                case 'missing_trade_link':
                    $data['message'] = 'Ошибка! Вставьте ссылку на трейд.';
                    break;
                case 'item_sent':
                    $data['message'] = 'предмет отправлен';
                    break;
                case 'action_not_found':
                    $data['message'] = 'Ошибка! Действие не найдено.';
                    break;
                case 'item sold':
                    $data['message'] = 'Продано';
                    break;
                
                default:
                    $data['message'] = 'Неизвестная Ошибка! Попробуйте позже';
                    break;
            }
        }elseif($this->language == 'USA'){
            switch ($type) {
                case 'item_not_found':
                    $data['message'] = 'Error! The object is not found.';
                    break;
                case 'missing_trade_link':
                    $data['message'] = 'Error! Paste the link to trade.';
                    break;
                case 'item_sent':
                    $data['message'] = 'item sent';
                    break;
                case 'action_not_found':
                    $data['message'] = 'Error! The action is not found.';
                    break;
                
                default:
                    $data['message'] = 'Unknown Error! Please try again later';
                    break;
            }
        }elseif($this->language == 'ESP'){
            switch ($type) {
                case 'item_not_found':
                    $data['message'] = 'Error! Tema no se ha encontrado.';
                    break;
                
                default:
                    $data['message'] = 'Error Desconocido! Intente más tarde';
                    break;
            }
        }elseif($this->language == 'GER'){
            switch ($type) {
                case 'item_not_found':
                    $data['message'] = 'Fehler! Gegenstand wurde nicht gefunden.';
                    break;
                
                default:
                    $data['message'] = 'Unbekannter Fehler! Versuchen Sie es später';
                    break;
            }
        }
        return $data;   
    }
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.11.2016, 16:28
Конечно.
создаете директорию, например, "translates", а в ней соответствующие файлы rus.php, usa.php, esp.php, ger.php и т.п.
Внутри каждого из файлов размещаете код вида
PHP
1
2
3
4
5
6
<?php
return array(
    'item_not_found' => 'Ошибка! Предмет не найден.',
    'missing_trade_link' => 'Ошибка! Вставьте ссылку на трейд.',
....
);
Конечно же, значение пишете на том языке, к которому относится этот файл. Можете еще создать файл default.php, где разместить сообщения, выводящиеся в случае ошибки нахождения такого языка (например, перевод на английском). Или в функции заменять _ на пробелы и выводить это сообщение/бросать ошибку.
А в функции, если по-простому, буквально пара строчек:
PHP
1
2
3
4
5
6
7
8
9
public function return_message($type,$params = array())
{
    $file = 'путь к директории translates' . DIRECTORY_SEPARATOR . $this->language . '.php';
    if(!is_file($file))
        throw new \Exception('Translate file for language {' . $this->language . '} not found');
    $arr = include_once $file;
    $data['message'] = isset($arr[$type]) ? $arr[$type] : 'Неизвестная Ошибка! Попробуйте позже';
    return $data;
}
Добавлено через 9 минут
а, у вас еще чуть различаются данные (хотя это странно, т.к. все же должно быть одинаково). Тогда можно чуть переделать, таким образом:
PHP
1
2
3
4
5
6
return array(
    'item_not_found' => 'Ошибка! Предмет не найден.',
    'missing_trade_link' => 'Ошибка! Вставьте ссылку на трейд.',
....
    'default' => 'Дефолтное сообщение при не найденном значении',
);
PHP
1
2
3
4
5
6
7
8
9
10
11
12
public function return_message($type,$params = array())
{
    $file = 'путь к директории translates' . DIRECTORY_SEPARATOR . $this->language . '.php';
    if(!is_file($file))
        throw new \Exception('Translate file for language {' . $this->language . '} not found');
    $arr = include_once $file;
    if(isset($arr[$type]))
        $data['message'] = $arr[$type];
    else
        $data['message'] = isset($arr['default']) ? $arr['default'] : 'Неизвестная Ошибка! Попробуйте позже';
    return $data;
}
1
 Аватар для maruo
133 / 133 / 48
Регистрация: 26.04.2013
Сообщений: 1,356
02.11.2016, 16:42
ЧKOPOJI, Черт как же я не додумался файлы переводов в папках хранить)
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.11.2016, 16:46
если массив с данными для перевода в планах сильно разрастется, то имеет смысл создавать отдельные директории для каждого языка, и подключать нужный модуль для перевода (например, app.php, product.php и т.д.)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2016, 16:46
Помогаю со студенческими работами здесь

Как кастомизировать контекстное меню для различных обьектов?
Привет всем джедаям! Прошу помощи, с такой проблемой, имеем Form1 с 5-ю pictureBox каждый из которых присвоен tag от 1 до 5...

Как вернуть в меню пропавшую опцию добавления Контроллера и Представлений для MVC проекта?
Я столкнулась со следующей проблемой. При работе в VS2015 после установления Microsoft ASP.NET and Web Tools меня пропали опции...

Закрыть доступ к страницам для не авторизованных пользователей
Всем доброго времени суток. Разрабатываю систему для организации, которая будет находится на её внутреннем сайте, то есть доступ к ней...

Catalog.top не выводит товары для НЕ авторизованных пользователей
нужно что бы catalog.top выводил товары не только для авторизованных пользователей т.е и для простого гостя, в самом шаблоне нет условия по...

Как сделать доступ к страницам для авторизованных пользователей
Я сделал доступ к страницам для обычных пользователей, авторизованных, не авторизованных. И у меня получается доступ к ним только через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru