Как реализовать сайт с несколькими городами?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Как реализовать сайт с несколькими городами?

Сообщение myks1992@mail.ru »

Люди добрые! Подскажите как реализовать сайт с несколькими городами? Ранее задавал вопрос на тостер, но не понял как это делать. Недавно начал изучать этот фреймворк. Будет здорово если где-то есть подробное описание. Благодарю!
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как реализовать сайт с несколькими городами?

Сообщение Nex-Otaku »

А в чём у вас сложности? Можно миллионом способов сделать, выберите любой и реализуйте. Смотрите, как на любом из знакомых вам сайтов сделано.
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: Как реализовать сайт с несколькими городами?

Сообщение Йож »

myks1992, Вы хотите сделать с изменение урлов при выборе города или без?
Автовыбор города по IP нужен? Россия?
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Как реализовать сайт с несколькими городами?

Сообщение myks1992@mail.ru »

Nex-Otaku писал(а): 2017.11.16, 09:29 А в чём у вас сложности? Можно миллионом способов сделать, выберите любой и реализуйте. Смотрите, как на любом из знакомых вам сайтов сделано.
Вроде бы не дурак, но никак не могу допереть как. Знаю, что просто)) Вот какой вопрос задавал на тостере... https://toster.ru/q/466467
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Как реализовать сайт с несколькими городами?

Сообщение myks1992@mail.ru »

Йож писал(а): 2017.11.16, 18:07 myks1992, Вы хотите сделать с изменение урлов при выборе города или без?
Автовыбор города по IP нужен? Россия?
В идеальности да, но сейчас хотя бы просто сделать по городам. Не могу допереть :oops: :?

Вопрос задавал уже на тостере. Все отвечают как-то обобщённо и какими-то отрывками. Неужели такой часто используемый метод нигде не описан((

Вопрос на тостере:
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Как реализовать сайт с несколькими городами?

Сообщение Dominus »

Город - это категория, в каждой категории свои посты.
Со странами тоже самое, страна - это категория, город - подкатегория, в каждой подкатегории свои посты.
Автоопределение, это уже другая задача, которая решается после выполнения первой.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Как реализовать сайт с несколькими городами?

Сообщение maleks »

Смысл чтобы
1) по вашему урлу поняло что за город, и везде могло подставить
2) чтобы у вас создавались урлы с вот этой приставкой текущего города

Можете почитать советы про многоязычность, их много, там задачи такие же.
Yii2 universal module sceleton - for basic and advanced templates
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как реализовать сайт с несколькими городами?

Сообщение Nex-Otaku »

Ну это вообще элементарно, если на таком уровне.

Создаём правило обработки URL
/config/main.php

Код: Выделить всё

'<cityUrl:[0-9a-zA-Z\-]+>/post' => 'post/index',
'<cityUrl:[0-9a-zA-Z\-]+>/user' => 'user/index',
В контроллере по слагу получаем город

Код: Выделить всё

class PostController extends Controller
{
...
public function actionIndex($cityUrl) {
    $city = City::findOne(['url' => $cityUrl]);
    if (empty($city)) {
        // Бросаем исключение 404
    }
    $posts = Post::findAll(['city_id' => $city->id]);
    $this->render('index', ['posts' => $posts, 'cityUrl' => $cityUrl);
}
Далее, если во вьюшке нужно построить ссылку с использованием города, используем уже известный $cityUrl:

Код: Выделить всё

<a href="<?= Url::to(['/user/index', 'cityUrl' => $cityUrl]) ?>">Список пользователей</a>
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: Как реализовать сайт с несколькими городами?

Сообщение Йож »

maleks писал(а): 2017.11.17, 07:55 Можете почитать советы про многоязычность, их много, там задачи такие же.
Правильно maleks говорит. Я недавно сделал такую систему на базе https://github.com/codemix/yii2-localeurls
Взаимодействие происходит с помощью урлов и сессий.

В базе для нужных моделей добавлен параметр dealer_id.

При выводе на страницах выбирается с помощью andFilterWhere:
viewtopic.php?f=34&t=44852&p=223734#p223735
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Как реализовать сайт с несколькими городами?

Сообщение myks1992@mail.ru »

Nex-Otaku писал(а): 2017.11.17, 10:00 Ну это вообще элементарно, если на таком уровне.

Создаём правило обработки URL
/config/main.php

Код: Выделить всё

'<cityUrl:[0-9a-zA-Z\-]+>/post' => 'post/index',
'<cityUrl:[0-9a-zA-Z\-]+>/user' => 'user/index',
В контроллере по слагу получаем город

Код: Выделить всё

class PostController extends Controller
{
...
public function actionIndex($cityUrl) {
    $city = City::findOne(['url' => $cityUrl]);
    if (empty($city)) {
        // Бросаем исключение 404
    }
    $posts = Post::findAll(['city_id' => $city->id]);
    $this->render('index', ['posts' => $posts, 'cityUrl' => $cityUrl);
}
Далее, если во вьюшке нужно построить ссылку с использованием города, используем уже известный $cityUrl:

Код: Выделить всё

<a href="<?= Url::to(['/user/index', 'cityUrl' => $cityUrl]) ?>">Список пользователей</a>
Вот это правда понятно и элементарно) Меня все посылали на длинные коды с другим примером. А по вашему коду стало понятно как реализовывать) Скажите ещё. Для большого проекта может быть это вынести как-то в компонент? Потому что у каждого action это намучаешься вставлять... А в целом то что нужно. Только не хочется каждый раз вставлять в action город и обрабатывать его. Практически все записи и action будут иметь город
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как реализовать сайт с несколькими городами?

Сообщение Nex-Otaku »

Конечно, выносите )
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Как реализовать сайт с несколькими городами?

Сообщение myks1992@mail.ru »

Nex-Otaku писал(а): 2017.11.18, 18:13 Конечно, выносите )
А как вкратце это сделать правильней. Я имею ввиду вынести в компонент...
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как реализовать сайт с несколькими городами?

Сообщение Nex-Otaku »

Десятком способов можно сделать, в зависимости от личных предпочтений и структуры проекта.
Но в целом так:

1. Создаёшь класс, который будет дёргать город из БД и предоставлять его твоим скриптам.
2. Регистрируешь его в бутстрапе на событие "beforeAction" либо другое подходящее.
3. Прописываем обработчик "beforeAction".
4. К моменту вызова "beforeAction" правило URL уже обработано, поэтому в обработчике выдёргиваем параметр URL города, достаём город и записываем его в свойство класса.
5. Пишем метод для чтения этого свойства.
6. В любом другом месте кода обращаемся к методу, например "$city = CityHelper::getCurrentCity();"

Также учесть при разработке:
1. Не во всех URL будет город, например, на главной странице. Обдумать, что сделать с этим, может сделать "город по умолчанию".
2. При попытке чтения города из компонента до момента его заполнения, бросать исключение, либо возвращать "null".
Ответить