Использование ORM для многоязычного сайта - PullRequest
0 голосов
/ 25 мая 2011

Я хотел бы попросить рекомендации с использованием ORM (поверх MySQL) и PHP.До сегодняшнего дня я был пользователем CodeIgniter, но теперь я хочу кодировать с FUEL (http://fuelphp.com), и у них есть ORM.

. Моя проблема в том, что 75% сайтов, для которых я должен кодировать, имеют 2 или более языкаи данные повторяются (название для lang1, 2, 3 ... описание для lang1, 2, 3 ...). На самом деле я делаю это с CodeIgniter:

$data = $this->db->where('id', $id)->get('pages')->row();

if(false == $data)
    return false;

$this->db->where('module', 'pages')->where('pk', $data->id)->where("locale", $locale);

$query = $this->db->get("translations");

foreach($query->result() as $row)
    $result->{$row->label} = $row->value;

$result->_data = $data;

Использование структуры MySQL:

CREATE  TABLE IF NOT EXISTS `pages` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `id_user` MEDIUMINT(8) UNSIGNED NOT NULL ,
  `id_parent` INT NULL DEFAULT 0 ,
  `order` INT NULL DEFAULT 0 ,
  `template` INT NULL DEFAULT 1 ,
  `image` VARCHAR(125) NULL ,
  `flag_active` TINYINT NOT NULL DEFAULT 1 ,
  `flag_shop` TINYINT NOT NULL DEFAULT 0 ,
  `modified` INT NULL ,
  `created` INT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `translations` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `id_user` MEDIUMINT(8) UNSIGNED NOT NULL ,
  `locale` VARCHAR(45) NOT NULL ,
  `module` VARCHAR(45) NOT NULL ,
  `pk` INT NOT NULL ,
  `label` VARCHAR(45) NOT NULL ,
  `value` TEXT NULL ,
  `modified` INT NULL ,
  `created` INT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;

Я думаю, что это самоописательно, но сначала я добавляю страницу, а затем, для каждой страницы, я добавляю запись перевода с модулем = table_name, locale = language, pk = id_page, label = title/ description / ..., value = value.

Я хотел бы развить это и посмотреть, как лучше справиться с использованием ORM, каков наилучший способ быстрой разработки и т. д.

Заранее спасибо!

1 Ответ

1 голос
/ 25 мая 2011

Чтобы настроить это с помощью нашего Orm, вам сначала нужно будет создать модели. При использовании MySQL не обязательно настраивать свойства, но я все равно это сделаю, потому что он сохраняет запрос для каждой модели, чтобы выяснить их.

Model_Page

class Model_Page extends Orm\Model {

    protected static $_properties = array(
        'id',
        'id_user',
        'id_parent' => array('default' => 0),
        'order' => array('default' => 0),
        'template' => array('default' => 1),
        'image',
        'flag_active' => array('default' => 1),
        'flag_shop' => array('default' => 0),
        'modified',
        'created'
    );

    protected static $_has_many = array(
        'translations' => array(
            'key_to' => 'pk',
        ),
    );

    protected static $_belongs_to = array(
        'parent' => array(
            'model_to' => 'Model_Page',
            'key_from' => 'id_parent',
        ),
    )
}

Model_Translation

class Model_Page extends Orm\Model {

    protected static $_properties = array(
        'id',
        'id_user',
        'locale',
        'module',
        'pk',
        'label',
        'value',
        'modified',
        'created'
    );

    protected static $_belongs_to = array(
        'page' => array(
            'key_from' => 'pk',
        ),
    )
}

И ваш запрос становится таким:

$page = Model_Page::query()
    ->related('translations')
    ->where('id', $id)
    ->where('translations.module', 'pages')
    ->where('translations.locale', $locale)
    ->get();

if (empty($page))
{
    return false;
}

$result = array();
foreach ($page->translations as $t)
{
    $result[$t->label] = $t->value;
}
$result['_data'] = $page;

Проверьте документы для более подробного объяснения и примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...