Помимо метода 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
То, что нужно.
Задание со *, пишем свой плагин и вешаем его на событие OnDocFormSave:
Чтобы повесить плагин на данной событие нужно перейти во вкладку «Системные события» (ModX Revo v.2.5.4)
При создании с помощью mysql можно использовать функцию mysql_insert_id();
Нужен аналог для получения ID только что созданного объекта.
Заранее спасибо :)
Что делаю не так
P. S. Как только удаляю строку
Console возвращает ID 7.
P. S.S
При изменении других полей ресурса, изменения сохраняются.
Серьезно, очень интересно…
Ситуация была в следующем:
При помощи PDO Tools вытаскивал несколько дочерних ресурсов. Потом возникла необходимость последний ресурс при выдачи поставить на место второго. И почему-то начал копать в сторону смены Id, хотя стоило сразу разобраться в сортировке. Собственно задачу решил, а вопрос остался открытым )