С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 19.08.2017
Сообщений: 50

Как вывести в адресную строку категории интернет магазина данные из переменной?

02.05.2018, 02:30. Показов 1104. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги, прошу прощение если не правильно поставил вопрос.

Разбираюсь в коде интернет магазина реализованного через MVC

Есть файл Router.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
/**
 * Класс Router
 * Компонент для работы с маршрутами
 */
class Router {
    
    private $routes; //массив, в котором будут храниться роуты
    
    public function __construct() {
        
        $routesPath = ROOT.'/config/routes.php'; //путь к роутам
        $this->routes = include($routesPath);
        
    }
    
    private function getURI() {
        
        if (!empty($_SERVER['REQUEST_URI'])) {
            return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    
    public function run() {
        
        //Получить строку запроса
        $uri = $this->getUri();
 
        //Проверка наличие такого запроса в routes.php
        foreach($this->routes as $uriPattern => $path) {  
            
            //Сравниваем $uriPattern и $uri
            if (preg_match("~^$uriPattern$~", $uri)) {
            
                //Получаем внутренний путь из внешнего согласно правилу
                $internalRoute = preg_replace("~$uriPattern~", $path, $uri);
                //Определить какой контроллер и метод обрабатывает запрос
                $segments = explode('/', $internalRoute);
                //Получить имя контроллера
                $controllerName = ucfirst(array_shift($segments)).'Controller';
                //Получить имя метода
                $actionName = 'action'.ucfirst(array_shift($segments));
                //Подключить файл класса контроллера
                $controllerFile = ROOT . '/controllers/' . $controllerName . '.php';
                if (file_exists($controllerFile)) {
                    include_once($controllerFile);
                }
                //Создать объект, вызвать метод
                $parameters = $segments;
                $controllerObject = new $controllerName;
                $result = call_user_func_array(array($controllerObject, $actionName), $parameters);
                if($result != null) {
                    break;
                }
            }
        }
    }
}
Затем есть кусок кода из файла routes.php - где конкретно интересует формирование ссылок категории:

PHP
1
2
3
4
5
6
return array(
// Категория товаров:
   
    '([0-9]+)' => 'catalog/category/$1', // actionCategory в CatalogController
 
);
В CatalogController.php идет обработка Action:

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
/**
 * Контроллер CatalogController
 * Каталог товаров
 */
class CatalogController {
 
 /**
     * Action для страницы "Категория товаров"
     */
    public function actionCategory($categoryId, $page = 1)
    {
        // Список категорий для левого меню
        $categories = Category::getCategoriesList();
 
        // Список товаров в категории
        $categoryProducts = Product::getProductsListByCategory($categoryId, $page);
        
 
        // Общее количетсво товаров (необходимо для постраничной навигации)
        $total = Product::getTotalProductsInCategory($categoryId);
 
        // Создаем объект Pagination - постраничная навигация
        $pagination = new Pagination($total, $page, Product::SHOW_BY_DEFAULT, 'page-');
 
        // Подключаем вид
        
        require_once(ROOT . '/views/catalog/category.php');
        
        return true;
    }
 
}
В файле category.php ссылки на категории формируются таким образом:

PHP
1
2
3
<?php foreach ($categories as $categoryItem): ?>
               <li><a href="<?php echo $categoryItem['id'];?>"class="<?php if ($categoryId == $categoryItem['id']) echo 'current'; ?>"><?php echo $categoryItem['name']; ?></a></li>
              <?php endforeach; ?>

В результате работы этого кода, ссылки в категориях получаются в таком виде: www.site.ru/13 а нужно чтобы были www.site.ru/kupit-apple Для этих целей я создал переменную $categoryItem['linkname']; куда с базы данных помещаю текст kupit-apple. Однако, когда я пытаюсь прописать в ссылке <?php echo $categoryItem['id'];?><?php echo $categoryItem['linkname''];?> чтобы ссылка категории была хотя бы www.site.ru/13kupit-apple - то перестают работать все foreach, которые выводят различные данные по категории.

Как сделать так, чтобы ссылки стали вида www.site.ru/kupit-apple или хотя бы www.site.ru/13kupit-apple ? Уже 3 дня пытаюсь по всякому переписывать роуты, контроллеры - не выходит... Вариант через htaccess как я понял, в данный ситуации не помогут. Буду очень признателен за помощь и с радостью готов обсудить все нюансы. С уважением, Александр!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.05.2018, 02:30
Ответы с готовыми решениями:

Передача переменной через адресную строку
Доброго времени суток! хочу сделать галлерею с использованием БД. Вобщем есть таблица categories (id, title) и ее перечень выводится...

В категории «Холодильники» интернет-магазина известна следующая статистика за месяц
Всем привет! Прощу прощения, если создал тему не там где нужно. Я самостоятельно изучаю контекстную рекламу. Просматриваю множество...

Данные из PHP кода в адресную строку браузера
Необходимо, чтобы из кода данные попадали в адресную строку, а после чего строка выполнялась (как по нажатию клавиши Enter), и затем данные...

4
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
02.05.2018, 11:07
Код весьма посредственный.

Прежде чем куда-то вставлять ЧПУ-элементы, добавьте соответствующий роут (маршрут).

И в будущем для числовых идентификаторов делайте хотя бы так: (1[0-9]*).
0
2 / 2 / 0
Регистрация: 19.08.2017
Сообщений: 50
02.05.2018, 11:25  [ТС]
Нужно прописать 1 дополнительный путь в routes.php ? Есть примерные намеки как это можно сделать?

Где можно узнать побольше о вариациях прописи (1[0-9]*) и т.д. ? Например чтобы отображались ID только от 1 до 100

С уважением, Александр!
0
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
02.05.2018, 12:22
Зачем дополнительный? Речь ведь идет о все тех же категориях. Замените цифровой диапазон на буквенный или добавьте его, а также добавьте малую черту (дефис) в начало или конец множества.

Цитата Сообщение от cahe4a Посмотреть сообщение
Где можно узнать побольше о вариациях прописи
Вы даже этого не знаете? Это называется "регулярными выражениями". Кстати, в приведенном выше выражении круглые скобки лишние. На посредственный код даже смотреть вредно

Добавлено через 14 минут
Постойте. У вас там в качестве параметра предполагается id. Или найдите более подходящий метод, или напишите свой (перепишите имеющийся).
0
2 / 2 / 0
Регистрация: 19.08.2017
Сообщений: 50
02.05.2018, 18:18  [ТС]
Я извиняюсь, на стадии обучение ещё. Где именно и как примерно переписать метод, чтобы в ссылки категории было значение из $categoryItem['linkname']; вместо $categoryItem['id'] и при этом категория работала. Сейчас если в ссылке у категории что-то кроме ID - то foreach категории не отрабатывают и категория не выводит нужных данных.

Пример кода из Category.php для вывода нужных данных в категории
PHP
1
2
3
<?php foreach ($categories as $categoryItem) {
                            if ($categoryItem['id']==$categoryId) {
                            echo $categoryItem['seotext'];} }?>
Добавлено через 4 часа 40 минут
Запихнул в переменную $categoryId данные из $categoryItem['linkname'] и поставил linkname на ссылки. Заработало. Спасибо за ответы!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.05.2018, 18:18
Помогаю со студенческими работами здесь

При методе post подставляются данные в адресную строку
Почему при методе post в адресную строку подставляются данные? Имеется небольшой скрипт, в котором имеется кнопка &quot;Удалить&quot;. ...

Нужен шаблон меню, который бы смог отображать категории и подкатегории каталога товаров из интернет магазина
Itachi261092, Помогите исходник для меню, нужен шаблон меню, который бы смог отображать категории и подкатегории каталога товаров из...

Как вывести кнопки «Купить», «В корзину» для интернет магазина Битрикс?
Знаю, что в Битриксе можно вывести кнопки &quot;Купить&quot;, &quot;Отложить&quot;, &quot;Добавить в корзину&quot;. Как лучше это сделать? Есть же какие-то...

Yii2 Шаблоны интернет-магазина / видеоуроки по созданию интернет-магазина
Доброго времени суток! Недавно начал изучать Yii2-framework. Точнее ище в том году начал, но потом забросил. По учебе понадобилось...

Как отслеживать адресную строку браузера
Как отслеживать адресную строку браузер - а ? Мне нужно получить текст, адрес вводимым пользователем. .


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru