#php #mysql #internationalization #multilingual
#php #mysql #интернационализация #многоязычный
Вопрос:
Мне любопытно, какая хорошая структура модели подходит для многоязычной среды. Я буду использовать базу данных продуктов в качестве примера….
products
----------------------------------------------------------------
products_id | products_customizer_id | date_added
products_description
----------------------------------------------------------------
id | language_id | sku | description
Я бы хотел использовать геттеры и сеттеры… Я застрял в вопросе: должен ли я иметь 1 модель продукта или одну для описания, а другую для продуктов?
обновление Чтобы было ясно, я вынужден использовать эту структуру базы данных… Мне интересно, как настроить мои php-модели… Я хотел бы иметь возможность делать…
$product->setCustomizerId(4);
$product->setSku('BJKDJ423');
$product->setDescription('A spanish walrus');
$product->save();
И разумно сохранять каждое поле в каждой базе данных …. это хорошая / плохая идея, почему или почему нет?
Комментарии:
1. Нет, он говорит о моделях, а не о структуре базы данных
Ответ №1:
Это не так уж далеко от того, как я бы это сделал… Я, как правило, придерживаюсь формата, хотя, например, с суффиксом для всех таблиц, специфичных для языка _lang
. Итак, у меня было бы 3 таблицы (используя InnoDB с внешними ключами для ссылочной целостности).
product
----------------------------------------------------------------
id | ... fields ...
language
----------------------------------------------------------------
id | ... fields ...
product_lang
----------------------------------------------------------------
language_id | product_id | name | description | ... etc ...
Я бы, вероятно, использовал строку ISO для идентификатора языка, например en-GB
, и автоматически добавляемый INT для идентификатора продукта. Первичный ключ в product_lang
таблице будет составным ключом, созданным из полей language_id
and product_id
— таким образом, вы избежите ненужного поля и любых ограничений INT, которые могли бы иметь.
В противном случае да, вы в значительной степени там.
—- РЕДАКТИРОВАТЬ, ЧТОБЫ ОТРАЗИТЬ ОБНОВЛЕННЫЙ ВОПРОС —-
Хорошо — модель…
Ваша модель должна отражать то, как вы будете использовать ее в бизнес-смысле, а не в смысле базы данных… У меня была бы модель продукта, которая обертывает данные по мере их использования, поэтому что-то вроде:
class MyProduct {
private $_id;
private $_sku;
private $_name;
private $_description;
...
public function setId($iId) {
$this->_id = (int) $iId;
}
public function getId() {
return $this->_id;
}
... and so on ...
}
Я бы установил язык в соединителе базы данных, возможно, статически, если вы не меняете его часто, и попросил бы его извлекать соответствующие данные из таблиц для распространения вашего объекта… Я не очень верю в активные записи — создавайте объектные модели, которые отображают бизнес-объекты и базу данных, которая хранит данные в реляционной, нормализованной форме. Используйте уровень абстракции базы данных для преобразования одного в другое.
Помимо загрузки в настройках i18n
Обычно я бы хранил определенные переменные для всего сайта в одноэлементном объекте приложения, который загружается на каждой странице — именно там я бы хранил идентификатор языка и все данные для загрузки приложения, чтобы оно подключалось к базе данных, запускало сеанс, создавало экземпляр пользовательского объекта, назначало им корзину ии так далее и тому подобное — все, что используется глобально.
Поскольку язык будет установлен в этом MyApp
объекте, и этот объект также будет содержать ваш соединитель базы данных, вы можете просто заставить этот объект автоматически устанавливать статический MyDBConnector::setLang($sLang)
параметр при создании экземпляра.
Таким образом, чтобы запустить все приложение на любой странице, вам нужно просто сделать что-то вроде
require_once '/path/to/app.ini.php';
$oApp = MyApp::getInstance();
Ответ №2:
Я использую полностью гибкую структуру модели, которая предоставляет описание, имя, заголовок в виде массива в моих моделях, таких как:
class Models_Product {
public function getNames(){ return $this->names; }
public function getName($lang){ return $this->name[$lang]; }
}
Промойте и повторите для всех свойств.
Примечание: для настройки версии «setNames (array $ values)» мало пользы, ИМО должно быть создано только setName ($ lang, $value).