/**
  * @return bool
  */
 public function saveObject()
 {
     if (!$this->fillObject()) {
         return false;
     }
     if ($this->placeholder->getId()) {
         $this->placeholder->update();
     } else {
         $this->placeholder->create();
         if ($this->getInput('update_definitions')) {
             $type = $this->placeholder->getCertificateType();
             $definitions = srCertificateDefinition::where(array('type_id' => $type->getId()))->get();
             /** @var $def srCertificateDefinition */
             foreach ($definitions as $def) {
                 $phv = srCertificatePlaceholderValue::where(array('definition_id' => $def->getId(), 'placeholder_id' => $this->placeholder->getId()))->first();
                 if (!is_null($phv)) {
                     continue;
                     // Extra check... should never be the case
                 }
                 $phv = new srCertificatePlaceholderValue();
                 $phv->setDefinitionId($def->getId());
                 $phv->setPlaceholderId($this->placeholder->getId());
                 foreach ($type->getLanguages() as $lang_code) {
                     $phv->setValue($this->getInput("default_value_{$lang_code}"), $lang_code);
                 }
                 $phv->create();
             }
         }
     }
     return true;
 }
<#2>
    <?php 
/*
 * Create tables
 */
require_once './Customizing/global/plugins/Services/UIComponent/UserInterfaceHook/Certificate/classes/Type/class.srCertificateType.php';
require_once './Customizing/global/plugins/Services/UIComponent/UserInterfaceHook/Certificate/classes/Definition/class.srCertificateDefinition.php';
require_once './Customizing/global/plugins/Services/UIComponent/UserInterfaceHook/Certificate/classes/Placeholder/class.srCertificatePlaceholder.php';
require_once './Customizing/global/plugins/Services/UIComponent/UserInterfaceHook/Certificate/classes/Placeholder/class.srCertificatePlaceholderValue.php';
require_once './Customizing/global/plugins/Services/UIComponent/UserInterfaceHook/Certificate/classes/Certificate/class.srCertificate.php';
require_once './Customizing/global/plugins/Services/UIComponent/UserInterfaceHook/Certificate/classes/Definition/class.srCertificateDefinitionSetting.php';
require_once './Customizing/global/plugins/Services/UIComponent/UserInterfaceHook/Certificate/classes/Type/class.srCertificateTypeSetting.php';
srCertificateType::installDB();
srCertificateDefinition::installDB();
srCertificatePlaceholder::installDB();
srCertificatePlaceholderValue::installDB();
srCertificate::installDB();
srCertificateTypeSetting::installDB();
srCertificateDefinitionSetting::installDB();
?>
<#3>
    <?php 
require_once './Customizing/global/plugins/Services/UIComponent/UserInterfaceHook/Certificate/classes/Certificate/class.srCertificate.php';
srCertificate::updateDB();
?>
<#4>
    <?php 
/*
 * Add new setting "notification_user" to certificate types and every existing definitions
 */
require_once './Customizing/global/plugins/Services/UIComponent/UserInterfaceHook/Certificate/classes/Definition/class.srCertificateDefinition.php';
 /**
  * @return array
  */
 public function getPlaceholderValues()
 {
     if (is_null($this->placeholder_values)) {
         $this->placeholder_values = srCertificatePlaceholderValue::where(array('definition_id' => $this->getId()))->orderBy('placeholder_id')->get();
     }
     return $this->placeholder_values;
 }
 /**
  * @param srCertificatePlaceholderValue $placeholder_value
  * @param $lang
  * @return ilTextInputGUI
  */
 protected function getInputField($placeholder_value, $lang)
 {
     //        $label = $placeholder_value->getPlaceholder()->getLabel("en");
     $placeholder = $placeholder_value->getPlaceholder();
     //$postvar = "placeholder[" . $placeholder_value->getId(). "][" . $lang . "]";
     $postvar = "placeholder_" . $placeholder_value->getId() . "_" . $lang;
     $label = mb_strtoupper($lang);
     if ($placeholder->getMaxCharactersValue() > self::MAX_CHARACTERS_TEXT) {
         $input = new ilTextAreaInputGUI($label, $postvar);
     } else {
         $input = new ilTextInputGUI($label, $postvar);
         $input->setMaxLength($placeholder->getMaxCharactersValue());
     }
     //        $input->setInfo("[[" . mb_strtoupper($placeholder_value->getPlaceholder()->getIdentifier()) . "]]");
     $input->setDisabled(!$placeholder_value->isEditable());
     $input->setValue($placeholder_value->getValue($lang));
     $input->setRequired($placeholder->getIsMandatory());
     return $input;
 }
 public function delete()
 {
     // By deleting a placeholder, all placeholder values of existing definitions are deleted as well!
     foreach (srCertificatePlaceholderValue::where(array('placeholder_id' => $this->getId()))->get() as $value) {
         /** @var $value srCertificatePlaceholderValue */
         $value->delete();
     }
     parent::delete();
 }