Jump to main content Jump to doc navigation

xPDOObject::save()

Сохраняет новые или измененные объекты в контейнере базы данных. Также будет каскадно и сохранять любые объекты, которые были добавлены к нему с помощью методов добавления связанных объектов (addOne, addMany).

Синтаксис

API Docs: http://api.modxcms.com/xpdo/om/xPDOObject.html#save

boolean save ([boolean|integer $cacheFlag = null])

Примеры

Спасите палочку вместе с ее владельцем и запчастями.

$owner = $xpdo->newObject('Wizard');
$owner->set('name','Harry Potter');
$parts = array();
$parts[1] = $xpdo->newObject('WandPart');
$parts[1]->set('name','Phoenix Feather');
$parts[2] = $xpdo->newObject('WandPart');
$parts[2]->set('name','Holly Branch');
$wand = $xpdo->newObject('Wand');
$wand->addOne($owner);
$wand->addMany($parts);
if ($wand->save() == false) {
   echo 'Oh no, the wand failed to save!';
}

Это может быть немного сложнее при работе со связанными объектами, но вы можете пропустить несколько шагов (при условии, что вы правильно определили свое отношение). Например, обычно при работе с таблицами объединения вам необходимо знать первичный ключ из связанных таблиц, прежде чем вы сможете добавить туда строку. Однако с xPDO вы можете опустить первичный ключ из одной таблицы, когда ссылаетесь на связанную таблицу с помощью addMany() или addOne().

$Product = $modx->newObject('Product');
$ProductImage = $modx->newObject('ProductImage');
$ProductImage->set('image_id', 123);
//$ProductImage->set('product_id', $lastInsertId); // You can skip this
$related = array();
$related[] = $ProductImage;
$Product->addMany($related);
$Product->save();

Если операция создала новую запись (вместо обновления существующей), вы можете связать методом PDO::lastInsertId():

$modx->lastInsertId();
// OR
$object->getPrimaryKey();
// OR
$object->get('id'); // <-- или как называется основное поле

Успех может варьироваться в зависимости от основного драйвера.

Сообщения проверки

Вы можете сделать больше, чем просто реагировать на логическое yes/no, правильно ли сохранен ваш объект. Вы также можете вернуть некоторые сообщения о том, что именно было проблематично.

// сохранить объект и сообщить об ошибках проверки
if (!$object->save()) {
    // @var modValidator $validator
    $validator = $object->getValidator();
    if ($validator->hasMessages()) {
        foreach ($validator->getMessages() as $message) {
            $this->addFieldError($message['field'],$this->modx->lexicon($message['message']));
        }
    }
}

В конечном итоге, добавление поля error добавляет сообщения в стек ошибок MODX ($modx->errors). Каждое сообщение представляет собой ассоциативный массив с идентификатором и сообщением.

Вы можете быть немного более краткими, используя такой код (необходима очистка):

if ($object->save() == false) {
    $modx->error->checkValidation($object);
    return $this->failure($modx->lexicon($objectType.'_err_save'));
}

Смотрите modProcessor::addFieldError() в modprocessor.class.php и modError::addField() в error/moderror.class.php

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
  • Following Sea
  • Sepia River Studios
  • Anton Tarasov
  • Lefthandmedia
  • Nick Clark
  • Chris Fickling
  • Murray Wood
  • YJ
  • CrewMark
  • Richard

Budget

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

Learn more