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

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

02.05.2018, 02:30. Просмотров 316. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2018, 02:30
Ответы с готовыми решениями:

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

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

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

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

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

4
Phantom-84
274 / 229 / 62
Регистрация: 15.09.2017
Сообщений: 1,092
02.05.2018, 11:07 2
Код весьма посредственный.

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

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

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

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

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

Добавлено через 14 минут
Постойте. У вас там в качестве параметра предполагается id. Или найдите более подходящий метод, или напишите свой (перепишите имеющийся).
0
cahe4a
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
02.05.2018, 18:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2018, 18:18

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

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

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


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

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

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