Jump to main content Jump to doc navigation

Кодовая база в Revolution переключилась на xPDO, инструмент для моделирования объектно-реляционных мостов, созданный Джейсоном Ковардом. С точки зрения непрофессионала, это означает, что все таблицы базы данных теперь представлены объектами PHP (как обычно для любого ORM). Чанки представлены объектами 'modChunk', сниппеты объектами 'modSnippet' и так далее.

Простое как

Итак, как на самом деле получить объект в новом modx? Ну, вы привыкли полагаться на несколько различных функций:

// Старый способ работы в MODx 1.x и более ранних версиях
$doc = $modx->getDocument(23);
$doc = $modx->getDocument(45,'pagetitle,introtext');
$chunk = $modx->getChunk('chunkName');

// или даже более запутанный
$res = $modx->db->select('id,username',$table_prefix.'.modx_manager_users');
$users = array();
if ($modx->db->getRecordCount($res)){
    while ($row = $modx->db->getRow($res)) {
        array_push($users,$row);
    }
}
return $users;

Уже нет. Все гораздо проще, и на самом деле вам нужно всего несколько функций. Давайте посмотрим на некоторые примеры:

// получение чанка с ID 43
$chunk = $modx->getObject('modChunk',43);

// получение чанка с именем 'TestChunk'
$chunk = $modx->getObject('modChunk',array(
    'name' => 'TestChunk'
));

// получить коллекцию объектов чанка, затем вывести их имена
$chunks = $modx->getCollection('modChunk');
foreach ($chunks as $chunk) {
    echo $chunk->get('name')."<br />\n";
}

// получение ресурса (то есть страницы), который публикуется с псевдонимом «test»
$document = $modx->getObject('modResource',array(
    'published' => 1,
    'alias' => 'test',
));

Модель

Итак, вы, вероятно, спрашиваете, где находится список имен таблиц для сопоставления имен объектов? Его можно найти в «core/model/schema/modx.mysql.schema.xml». (Обратите внимание на «mysql» - да, это означает, что MODX в ближайшем будущем будет поддерживать другие базы данных). Оттуда вы можете просмотреть XML-представление всех таблиц MODX DB.

Например, modChunk:

<object class="modChunk" table="site_htmlsnippets" extends="modElement">
    <field key="name" dbtype="varchar" precision="50" phptype="string" null="false" default="" index="unique" />
    <field key="description" dbtype="varchar" precision="255" phptype="string" null="false" default="Chunk" />
    <field key="editor_type" dbtype="int" precision="11" phptype="integer" null="false" default="0" />
    <field key="category" dbtype="int" precision="11" phptype="integer" null="false" default="0" />
    <field key="cache_type" dbtype="tinyint" precision="1" phptype="integer" null="false" default="0" />
    <field key="snippet" dbtype="mediumtext" phptype="string" />
    <field key="locked" dbtype="tinyint" precision="1" attributes="unsigned" phptype="boolean" null="false" default="0" />
    <aggregate alias="Category" class="modCategory" key="id" local="category" foreign="id" cardinality="one" owner="foreign" />
</object>

Вы также можете определить свои собственные схемы для своих компонентов и добавить их в виде пакетов - подробнее об этом в следующей статье. Давайте перейдем в схему:

<object class="modChunk" table="site_htmlsnippets" extends="modElement">

Свойство class сообщает вам, каким будет имя класса. Свойство table показывает фактическую таблицу MySQL, а extends показывает, какой объект он расширяет. modElement является базовым классом для всех элементов в MODX - сниппетов, модулей, блоков, шаблонов и т.д.

<field key="name" dbtype="varchar" precision="50" phptype="string" null="false" default="" index="unique" />

Этот тег представляет столбец в базе данных. Большинство из этих атрибутов довольно просты.

<aggregate alias="modCategory" class="modCategory" key="id" local="category" foreign="id" cardinality="one" owner="foreign" />

Хорошо, вот где мы вступаем в отношения с БД. Отношение Aggregate - это отношение, в котором, с точки зрения непрофессионалов, если бы вы удалили этот чанк, он не удалил бы категорию, к которой он относится. Если бы это были Композитные отношения, это было бы. В составных отношениях есть «зависимость», которая связана с другим объектом. Для примера, давайте получим все modContextSettings для modContext:

$context = $modx->getObject('modContext','web');
$settings = $context->getMany('ContextSetting');
foreach ($settings as $setting) {
    echo 'Setting name: '.$setting->get('key').' <br />';
    echo 'Setting value: '.$setting->get('value').' <br />';
}

Довольно легко, да? Мы займемся созданием и удалением объектов, а также более сложными запросами, такими как внутренние объединения, ограничения, сортировка и другие, в следующей статье.

Смотри также

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

Backers

  • modmore
  • modmore
  • Jens Wittmann – Gestaltung & Entwicklung
  • Raffy
  • eydolan
  • Digital Penguin
  • Fabian Christen
  • Dannevang Digital
  • deJaya
  • Sepia River Studios
  • Following Sea
  • Anton Tarasov
  • Lefthandmedia
  • Nick Clark
  • Chris Fickling
  • Murray Wood
  • YJ
  • CrewMark
  • Richard

Budget

$305 per month—let's make that $500!

Learn more