Помимо метода get(), который получает значение, есть еще и метод set(), который это значение устанавливает. Мы можем поменять подряд сразу несколько значений, но после всех вызовов set() нужно объект сохранить. Сохраняет объект метод save().
set() — устанавливает значение одного из полей объекта.
save() — сохраняет все изменения в объекте.
Мы можем изменить ресурс прямо из консоли, вот так:
$res = $modx->getObject('modResource',22);
$res->set('pagetitle', 'Новости сайта');
$res->save();После выполнения этого кода, заголовок ресурса будет «Новости сайта». Как видите, чтобы что-то делать с объектом, нам нужно его сначала получить. Если нам нужно внести изменения в несколько объектов, мы можем воспользоваться методом getCollection():$titles = array(
'1' => 'Главная'
, '6' => 'О нас'
, '8' => 'Галерея'
, '11' => 'Контактная информация'
, '22' => 'Новости компании'
);
$resources = $modx->getCollection('modResource',array('parent' => 0));
foreach ($resources as $id => $res) {
if (!$titles[$id]) continue;
$res->set('pagetitle', $titles[$id]);
$res->set('longtitle', $titles[$id]);
$res->set('menutitle', $titles[$id]);
$res->set('hidemenu', 0);
$res->save();
}Как видите, save() вызывается после всех set(), однако для каждого объекта. Ведь нам надо каждый объект сохранить.Порой неудобно перечислять все поля, которые мы хотим изменить, да и код у нас становится нечитаемым. Можно, конечно, сделать так:
$titles = array(
'1' => 'Главная'
, '6' => 'О нас'
, '8' => 'Галерея'
, '11' => 'Контактная информация'
, '22' => 'Новости компании'
);
$resources = $modx->getCollection('modResource',array('parent' => 0));
foreach ($resources as $id => $res) {
if (!$titles[$id]) continue;
$fields = array(
'pagetitle' => $titles[$id]
, 'longtitle' => $titles[$id]
, 'menutitle' => $titles[$id]
, 'hidemenu' => 0
);
foreach ($fields as $field => $val) {
$res->set($field, $val);
}
$res->save();
}Но это необязательно — разработчики xPDO о нас позаботились и добавили метод fromArray(), который выполняет вышеприведенный код.fromArray() — по анологии с методом toArray() (который получает все значения в виде массива) устанавливает значения, перечисленные в массиве
$titles = array(
'1' => 'Главная'
, '6' => 'О нас'
, '8' => 'Галерея'
, '11' => 'Контактная информация'
, '22' => 'Новости компании'
);
$resources = $modx->getCollection('modResource',array('parent' => 0));
foreach ($resources as $id => $res) {
if (!$titles[$id]) continue;
$fields = array(
'pagetitle' => $titles[$id]
, 'longtitle' => $titles[$id]
, 'menutitle' => $titles[$id]
, 'hidemenu' => 0
);
$res->fromArray($fields);
$res->save();
}Как видите, ничего сложного нет. Теперь небольшое практическое задание по пройденной теме:
Задание. Представьте, что вы сделали клиенту сайт, он его заполнил, в раздел «Статьи» уже выложил около 50 статей, после чего звонит вам и просит, чтобы в разделе статьи URL были такими:Подсказка для тех, кто еще ни разу не писал своих плагинов/articles/23/то есть, чтобы псевдонимом у статей был id ресурса. Напишите код, который надо выполнить в консоли, чтобы у всех существующих статей исправить псевдонимы.
Для более продвинутых пользователей — напишите плагин, который будет устанавливать нужное значение для всех создаваемых документов в разделе «Статьи»
Решение задания
Оригинал статьи: community.modx-cms.ru/blog/modx-xpdo/10264.html G+
Объектная
Пример:
Копия Док1
Копия Док2
Копия Док3
Копия Док4
нужно заменить на:
Док1
Док2
Док3
Док4
$resources = $modx->getCollection('modResource',array('parent' => 12)); foreach ($resources as $res) { $pagetitle = str_replace('Копия ','',$res->get('pagetitle')); $res->set('pagetitle',$pagetitle); $res->save(); }То, что нужно.
<?php $output = ''; $collection = $modx->getCollection('modResource', ['parent' => $id]); foreach($collection as $id => $obj) { $obj->set('alias', 'articles/' . $id); $obj->save(); }Задание со *, пишем свой плагин и вешаем его на событие OnDocFormSave:<?php switch($modx->event->name) { case 'OnDocFormSave': if ($resource->get('parent') == $id_parent) { $resource->set('alias', 'article/' . $resource->get('id')); } break; }Чтобы повесить плагин на данной событие нужно перейти во вкладку «Системные события» (ModX Revo v.2.5.4)При создании с помощью mysql можно использовать функцию mysql_insert_id();
Нужен аналог для получения ID только что созданного объекта.
Заранее спасибо :)
<?php $res = $modx->getObject('modResource',7); $res->set('id', 15); $res->save(); $output = $res->toArray(); print "<pre>"; print_r($output);Добрый день. Пытаюсь изменить ID ресурса. Console выводит, что ID поменялся. По факту — это не так.Что делаю не так
P. S. Как только удаляю строку
$res->set('id', 15);Console возвращает ID 7.
P. S.S
При изменении других полей ресурса, изменения сохраняются.
Серьезно, очень интересно…
Ситуация была в следующем:
При помощи PDO Tools вытаскивал несколько дочерних ресурсов. Потом возникла необходимость последний ресурс при выдачи поставить на место второго. И почему-то начал копать в сторону смены Id, хотя стоило сразу разобраться в сортировке. Собственно задачу решил, а вопрос остался открытым )
$getResource = $modx->getCollection('modResource',array('parent'=>'10')); foreach($getResource as $key=>$get){ $alias=$get->get('alias'); $alias=$get->set('alias','/article/'.$key); $alias=$get->save(); }