Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 19.08.2017
Сообщений: 44
1

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

02.05.2018, 02:30. Просмотров 520. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2018, 02:30
Ответы с готовыми решениями:

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

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

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

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

4
291 / 243 / 65
Регистрация: 15.09.2017
Сообщений: 1,134
02.05.2018, 11:07 2
Код весьма посредственный.

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

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

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

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

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

Добавлено через 14 минут
Постойте. У вас там в качестве параметра предполагается id. Или найдите более подходящий метод, или напишите свой (перепишите имеющийся).
0
2 / 2 / 0
Регистрация: 19.08.2017
Сообщений: 44
02.05.2018, 18:18  [ТС] 5
Я извиняюсь, на стадии обучение ещё. Где именно и как примерно переписать метод, чтобы в ссылки категории было значение из $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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2018, 18:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.