#silverstripe #data-objects
#silverstripe #данные-объекты
Вопрос:
Может кто-нибудь, пожалуйста, направить меня к примеру того, как очистить поле из DataObject ДО того, как оно будет сброшено в БД?
Я не знаю, где искать.
Я хочу очистить некоторый пользовательский ввод, прежде чем он будет сохранен в SiteConfig.
Комментарии:
1. Как правило, вы не хотите экранировать данные перед их записью — вместо этого вы должны экранировать их перед выводом. У вас есть дополнительная информация о вашем варианте использования?
2. @ajshort Я хочу преобразовать в нижний регистр и обрезать не альфа-символы перед переходом в БД.
3. @ajshort с целью сохранения хэштегов Twitter для проверки при анализе возврата api
4. Это относится к CMS или к интерфейсной форме?
Ответ №1:
Вы можете настроить поведение сохранения a Page
DataObject
или SiteConfig
с помощью onBeforeWrite
функции.
Функция запускается при вызове write()
для сохранения объекта в базе данных. Это включает в себя сохранение страницы в CMS или изменение записи ModelAdmin.
Вот пример для Silverstripe 3.1 использования onBeforeWrite
расширения SiteConfig для удаления символов и преобразования символов в нижний регистр в текстовом поле:
SiteConfig onBeforeWrite пример
class CustomSiteConfig extends DataExtension {
private static $db = array(
'TwitterUsername' => 'Text'
);
public function updateCMSFields(FieldList $fields) {
$fields->addFieldToTab('Root.Main', new TextField('TwitterUsername', 'Twitter Username'));
}
public function onBeforeWrite() {
$this->owner->TwitterUsername = strtolower($this->owner->TwitterUsername);
$this->owner->TwitterUsername = preg_replace("/[^a-z0-9]/", '', $this->owner->TwitterUsername);
parent::onBeforeWrite();
}
}
Примечание: Для приведенного выше примера для работы CustomSiteConfig
расширения должны быть применены к SiteConfig
. Это можно сделать либо с помощью файла конфигурации yml, либо с помощью _config.php досье.
mysite/_config/config.yml
---
Name: site
After: 'framework/*','cms/*'
---
# ...
# SiteConfig Extension
SiteConfig:
extensions:
- CustomSiteConfig
# ...
Или
mysite/_config.php
global $project;
$project = 'mysite';
// ...
SiteConfig::add_extension('CustomSiteConfig');
// ...
Комментарии:
1. Не забывайте, это не будет выполняться автоматически. Вам нужно загрузить его из _config.php на моем сайте или в одном из ваших модулей, т.Е.: SiteConfig::add_extension(‘CustomSiteConfig’); Вы также можете загрузить его через файл yml внутри папки _config.
2. Спасибо @elliot_at_silverstripe. Я добавил это примечание в свой ответ.
Ответ №2:
Это делается автоматически.
$dataObject->Title = 'te"st'; // This will become "te"st"
$dataObject->write();
Более подробную информацию об этом можно найти в документах: http://doc.silverstripe.com/framework/en/topics/security