Для того, чтобы создать объект мы будем пользоваться методом newObject()
newObject() — создает новый объект указанного класса.Но не забывайте сохранять объекты — здесь как с файлами — сначала создаем новый файл, потом наполняем его содержимым и сохраняем на диск.
Давайте, поработаем с чем-то еще, кроме ресурсов. Например, создадим новую категорию элементов:
$category = $modx->newObject('modCategory'); // название категорий хранится в поле category $category->set('category','helloWorldCategory'); $category->save();
Выполните этот код и найдите только что созданную категорию во вкладке «Элементы». Если нашли, то давайте посмотрим, как создаются связи между объектами. Обычно, если у объекта есть дочерние или родительские объекты (как например, ресурс — у него могут быть дочерние ресурсы, и может быть родительский ресурс), это значит, что два объекта связаны друг с другом. То есть, мы можем получить объект родительского ресурса так:
$child = $modx->getObject('modResource', 43); // опять смотрим правильный алиас связи (в этот раз - "Parent") $parent = $child->getOne('Parent'); return $parent->get('pagetitle');Значит, если мы хотим создать чанк «в нашей категории», мы должны сначала создать чанк как объект, а потом создать связь между чанком и категорией. Для создания связей между объектами (в случае, если тип связей уже известен MODX'у) используются методы addOne и addMany.
addOne() — создает связь между двумя объектами. Используется, когда связь «Один — к одному»Немножко непонятно написал про addMany. Суть в том, что addMany прежде чем создать связь проходит по массиву. В итоге создается связь нашего объекта с каждым из объектов-элементов массива.
addMany() — создает связи между объектом и каждым из элементов массива. Используется, когда связь «Один — ко многим»
Но тут лучше привести пример. Сейчас создадим один чанк и свяжем его с нашей категорией. А потом сделаем то же самое с целой пачкой чанков)))
$where = array('category' => 'helloWorldCategory'); $category = $modx->getObject('modCategory', $where); $chunk = $modx->newObject('modChunk'); $chunk->set('name','helloWorldChunk'); $chunk->addOne($category); $chunk->save();Чанк может находится только в одной категории, а значит, связь «один — к одному» и мы используем addOne.
Следующий пример — давайте создадим сразу несколько чанков в цикле. Тут есть два варианта действий: либо для каждого нового чанка вызывать addOne, либо помещать все чанки в массив и потом один раз для категории вызывать addMany. Первый вариант:
$where = array('category' => 'helloWorldCategory'); $category = $modx->getObject('modCategory', $where); for ($i=1; $i<=3; $i++) { $chunk = $modx->newObject('modChunk'); $chunk->set('name', 'helloWorldChunk.'.$i); $chunk->addOne($category); $chunk->save(); }Второй вариант:
$where = array('category' => 'helloWorldCategory'); $category = $modx->getObject('modCategory', $where); $chunks = array(); for ($i=1; $i<=3; $i++) { $chunk = $modx->newObject('modChunk'); $chunk->set('name', 'helloWorldChunk.'.$i); $chunks[] = $chunk; } $category->addMany($chunks); $category->save();Как видите, во втором варианте мы работаем с массивом объектов. В одной категории может быть много чанков, значит связь «Один — ко многим» (что подтверждается здесь), и мы используем addMany.
Как узнать, какой из вариантов предпочтительнее? Обратите внимание на вызовы метода save() — в первом случае save() вызывается для каждого из чанков, а во втором — только однажды, в конце кода и вызывается он для категории. Как же так, спросите вы — ведь каждый объект должен быть сохранён? Да, совершенно верно, но в методе save() происходит сохранение не только самого объекта, но и объектов, связанных с ним. Поэтому нам во втором случае не нужно каждый раз для каждого чанка прописывать save(). И именно поэтому второй вариант предпочтительнее, так как мы не вызываем один и тот же метод не по нескольку раз, а только однажды — и он пачкой обрабатывает все объекты.
Теперь давайте, подчистим за собой и удалим наши чанки и категорию. Для удаления объекта существует метод remove()
remove() — удаляет объект и все объекты, связанные с ним связью «composite», если у объекта в описаниях связи указано «owner => local»Как я говорил, существует два вида связей — composite и agregate. Так вот, есть у нас объект, например, категория. И есть у нас несколько дочерних объектов, например, есть одна подкатегория и два чанка. Если посмотрим в описание объекта modCategory то увидим, что есть такая запись:
[composites] [Children] [class] => modCategory [local] => id [foreign] => parent [cardinality] => many [owner] => localи такая запись
[aggregates] [Chunks] [class] => modChunk [key] => id [local] => id [foreign] => category [cardinality] => many [owner] => localТак вот, если вы выполните метод remove() по отношению к категории, то все дочерние категории будут удалены вместе с ней (связь composite, [owner] => local). Но чанки (как и другие элементы) удалены не будут (хоть и [owner] => local, но связь-то aggregate).
Поэтому чтобы удалить все чанки в како-то категории нужно сначала их все удалить, а потом удалять саму категорию:
$where = array('category' => 'helloWorldCategory'); $category = $modx->getObject('modCategory', $where); $chunks = $category->getMany('Chunks'); foreach ($chunks as $chunk) { $chunk->remove(); } $category->remove();После выполнения этого кода консоль выведет вам информацию о том, что объекты удалены. Не пугайтесь — это не ошибки, а просто лог удаленных объектов.
Задание. Напишите сниппет, который создает ресурс в каком-либо разделе. Значения полей будут передаваться в сниппет как параметры:Оригинал статьи community.modx-cms.ru/blog/modx-xpdo/10275.html[[createResource? &pagetitle=`Заголовок` &parent=`12` ... ]]Поля parent, createdby, template не заполняйте с помощью set(), а создавайте связь с нужными объектами.
подскажите, если я создаю пользователя, могу ли я задать ему ID? из обьектной модели я понял что у меня нет опции добраться до айди и он генерируется сам.
Просто, у меня есть импорт пользователей, и глупо иметь два, по сути дублирующихся, поля.
пробовал так, но, как я предполагал, это не сработало:
Заранее спасибо за совет
Пока не совсем разобрался как создавать Плагины, какие особенности, где брать информацию о событиях и как их обрабатывать. Может поделитесь какой-нибудь ссылкой, где это описывается, или напишите еще одну статью)
И не получается создать связь с родителем, что-то делаю не так.
Буду благодарен за ответ)
Чтобы понять, какое событие за что отвечает, можно поискать его в документации https://rtfm.modx.com/revolution/2.x/developing-in-modx/basic-development/plugins/system-events/ или прямо в исходном коде MODX на GitHub.
почему-то никак не работает следующий код
Выдает ошибку связи.
Пишу такой код:
В результате получаю ошибку: «Fatal error: Call to a member function remove() on array in /core/components/console/processors/exec.class.php(24): eval()'d code on line 19»
У меня есть задача что бы пользователи с фронтенда могли удалять или снимать с публикации созданные ими ресурсу.
пока тут дождёшься)))
А можно этот код переделать на снятие с публикации ресурса miniShop2?
При нажатии кнопки.