/**
  * Update SiteConfig with the top level fields
  *
  * @param FieldSet $fields 
  * @return void
  */
 function updateCMSFields(&$fields)
 {
     $fields->addFieldsToTab("Root.Access", array(new HeaderField(_t('SiteConfigCMSWorkflow.PUBLISHAPPROVEDHEADER', "Who can publish requests inside the CMS?"), 2), $actionTypeField = new OptionsetField("CanPublishType", "", array("LoggedInUsers" => _t('SiteTree.EDITANYONE', "Anyone who can log-in to the CMS"), "OnlyTheseUsers" => _t('SiteTree.EDITONLYTHESE', "Only these people (choose from list)")), "OnlyTheseUsers"), $actionerGroupsField = new TreeMultiselectField("PublisherGroups", "Publisher groups")));
     if (!Permission::check('ADMIN')) {
         $fields->replaceField('CanPublishType', $actionTypeField->performReadonlyTransformation());
         $fields->replaceField('PublisherGroups', $actionerGroupsField->performReadonlyTransformation());
     }
 }
 public function updateCMSFields(FieldSet $fields)
 {
     $fields->replaceField('TrackedLinks', $tracked = new TableListField('LinkViews', 'NewsletterLinkView', null, '"NewsletterID" = ' . $this->owner->ID, '"Created" DESC'));
     $tracked->setPermissions(array('show', 'export'));
     $viewers = new TableListField('Views', 'NewsletterView', null, '"NewsletterID" = ' . $this->owner->ID, '"Created" DESC');
     $viewers->setPermissions(array('show', 'export'));
     $fields->addFieldsToTab('Root.ViewedBy', array(new LiteralField('ViewsNote', '<p>The viewed by list may not be ' . 'accurate, as many email clients block images used for ' . 'tracking by default.</p>'), $viewers));
 }
Ejemplo n.º 3
0
 /**
  * Transform the named field into a readonly feld.
  * 
  * @param string|FormField
  */
 function makeFieldReadonly($field)
 {
     $fieldName = $field instanceof FormField ? $field->Name() : $field;
     // Iterate on items, looking for the applicable field
     foreach ($this->children as $i => $item) {
         if ($item->isComposite()) {
             $item->makeFieldReadonly($fieldName);
         } else {
             // Once it's found, use FormField::transform to turn the field into a readonly version of itself.
             if ($item->Name() == $fieldName) {
                 $this->children->replaceField($fieldName, $item->transform(new ReadonlyTransformation()));
                 // Clear an internal cache
                 $this->sequentialSet = null;
                 // A true results indicates that the field was foudn
                 return true;
             }
         }
     }
     return false;
 }
 /**
  * Test replacing a field with another one.
  */
 function testReplaceField()
 {
     $fields = new FieldSet();
     $tab = new Tab('Root');
     $fields->push($tab);
     /* A field gets added to the set */
     $fields->addFieldToTab('Root', new TextField('Country'));
     /* We have the same object as the one we pushed */
     $this->assertSame($fields->dataFieldByName('Country'), $tab->fieldByName('Country'));
     /* The field called Country is replaced by the field called Email */
     $fields->replaceField('Country', new EmailField('Email'));
     /* We have 1 field inside our tab */
     $this->assertEquals(1, $tab->Fields()->Count());
 }
Ejemplo n.º 5
0
 /**
  * Change the member dialog in the CMS
  *
  * This method updates the forms in the cms to allow the translations for 
  * the defined translatable fields.
  */
 function updateCMSFields(FieldSet &$fields)
 {
     if (!$this->stat('enabled')) {
         return false;
     }
     $creating = false;
     $baseClass = $this->owner->class;
     while (($p = get_parent_class($baseClass)) != "DataObject") {
         $baseClass = $p;
     }
     $allFields = $this->owner->getAllFields();
     if (!self::is_default_lang()) {
         // Get the original version record, to show the original values
         if (!is_numeric($allFields['ID'])) {
             $originalLangID = Session::get($this->owner->ID . '_originalLangID');
             $creating = true;
         } else {
             $originalLangID = $allFields['ID'];
         }
         $originalRecord = self::get_one_by_lang($this->owner->class, self::$default_lang, "`{$baseClass}`.ID = " . $originalLangID);
         $this->original_values = $originalRecord->getAllFields();
         $alltasks = array('dup' => array());
         foreach ($fields as $field) {
             if ($field->isComposite()) {
                 $innertasks = $this->duplicateOrReplaceFields($field->FieldSet());
                 // more efficient and safe than array_merge_recursive
                 $alltasks['dup'] = array_merge($alltasks['dup'], $innertasks['dup']);
             }
         }
         foreach ($alltasks['dup'] as $fieldname => $newfield) {
             // Duplicate the field
             $fields->replaceField($fieldname, $newfield);
         }
     } else {
         $alreadyTranslatedLangs = null;
         if (is_numeric($allFields['ID'])) {
             $alreadyTranslatedLangs = self::get_langs_by_id($baseClass, $allFields['ID']);
         }
         if (!$alreadyTranslatedLangs) {
             $alreadyTranslatedLangs = array();
         }
         foreach ($alreadyTranslatedLangs as $i => $langCode) {
             $alreadyTranslatedLangs[$i] = i18n::get_language_name($langCode);
         }
         $fields->addFieldsToTab('Root', new Tab(_t('Translatable.TRANSLATIONS', 'Translations'), new HeaderField(_t('Translatable.CREATE', 'Create new translation'), 2), $langDropdown = new LanguageDropdownField("NewTransLang", _t('Translatable.NEWLANGUAGE', 'New language'), $alreadyTranslatedLangs), $createButton = new InlineFormAction('createtranslation', _t('Translatable.CREATEBUTTON', 'Create'))));
         if (count($alreadyTranslatedLangs)) {
             $fields->addFieldsToTab('Root.Translations', new FieldSet(new HeaderField(_t('Translatable.EXISTING', 'Existing translations:'), 3), new LiteralField('existingtrans', implode(', ', $alreadyTranslatedLangs))));
         }
         $langDropdown->addExtraClass('languageDropdown');
         $createButton->addExtraClass('createTranslationButton');
         $createButton->includeDefaultJS(false);
     }
 }
 public function updateCMSFields(FieldSet $fields)
 {
     $fields->removeByName('Hash');
     $fields->replaceField('ViewedMembers', $members = new TableListField('ViewedMembers', 'Member', array('Name' => 'Name', 'Email' => 'Email'), '"Newsletter_TrackedLinkID" = ' . $this->owner->ID, null, 'LEFT JOIN "Newsletter_TrackedLink_ViewedMembers" ON "MemberID" = "Member"."ID"'));
     $members->setPermissions(array('show'));
 }
Ejemplo n.º 7
0
 /**
  * If the record is not shown in the default language, this method
  * will try to autoselect a master language which is shown alongside
  * the normal formfields as a readonly representation.
  * This gives translators a powerful tool for their translation workflow
  * without leaving the translated page interface.
  * Translatable also adds a new tab "Translation" which shows existing
  * translations, as well as a formaction to create new translations based
  * on a dropdown with available languages.
  * 
  * @todo This is specific to SiteTree and CMSMain
  * @todo Implement a special "translation mode" which triggers display of the
  * readonly fields, so you can translation INTO the "default language" while
  * seeing readonly fields as well.
  */
 function updateCMSFields(FieldSet &$fields)
 {
     // Don't apply these modifications for normal DataObjects - they rely on CMSMain logic
     if (!$this->owner instanceof SiteTree) {
         return;
     }
     // used in CMSMain->init() to set language state when reading/writing record
     $fields->push(new HiddenField("Locale", "Locale", $this->owner->Locale));
     // Don't allow translation of virtual pages because of data inconsistencies (see #5000)
     $excludedPageTypes = array('VirtualPage');
     foreach ($excludedPageTypes as $excludedPageType) {
         if (is_a($this->owner, $excludedPageType)) {
             return;
         }
     }
     $excludeFields = array('ViewerGroups', 'EditorGroups', 'CanViewType', 'CanEditType');
     // if a language other than default language is used, we're in "translation mode",
     // hence have to modify the original fields
     $creating = false;
     $baseClass = $this->owner->class;
     $allFields = $fields->toArray();
     while (($p = get_parent_class($baseClass)) != "DataObject") {
         $baseClass = $p;
     }
     // try to get the record in "default language"
     $originalRecord = $this->owner->getTranslation(Translatable::default_locale());
     // if no translation in "default language", fall back to first translation
     if (!$originalRecord) {
         $translations = $this->owner->getTranslations();
         $originalRecord = $translations ? $translations->First() : null;
     }
     $isTranslationMode = $this->owner->Locale != Translatable::default_locale();
     // Show a dropdown to create a new translation.
     // This action is possible both when showing the "default language"
     // and a translation. Include the current locale (record might not be saved yet).
     $alreadyTranslatedLocales = $this->getTranslatedLocales();
     $alreadyTranslatedLocales[$this->owner->Locale] = $this->owner->Locale;
     if ($originalRecord && $isTranslationMode) {
         $originalLangID = Session::get($this->owner->ID . '_originalLangID');
         // Remove parent page dropdown
         $fields->removeByName("ParentType");
         $fields->removeByName("ParentID");
         $translatableFieldNames = $this->getTranslatableFields();
         $allDataFields = $fields->dataFields();
         $transformation = new Translatable_Transformation($originalRecord);
         // iterate through sequential list of all datafields in fieldset
         // (fields are object references, so we can replace them with the translatable CompositeField)
         foreach ($allDataFields as $dataField) {
             if ($dataField instanceof HiddenField) {
                 continue;
             }
             if (in_array($dataField->Name(), $excludeFields)) {
                 continue;
             }
             if (in_array($dataField->Name(), $translatableFieldNames)) {
                 // if the field is translatable, perform transformation
                 $fields->replaceField($dataField->Name(), $transformation->transformFormField($dataField));
             } else {
                 // else field shouldn't be editable in translation-mode, make readonly
                 $fields->replaceField($dataField->Name(), $dataField->performReadonlyTransformation());
             }
         }
     } elseif ($this->owner->isNew()) {
         $fields->addFieldsToTab('Root', new Tab(_t('Translatable.TRANSLATIONS', 'Translations'), new LiteralField('SaveBeforeCreatingTranslationNote', sprintf('<p class="message">%s</p>', _t('Translatable.NOTICENEWPAGE', 'Please save this page before creating a translation')))));
     }
     $fields->addFieldsToTab('Root', new Tab('Translations', _t('Translatable.TRANSLATIONS', 'Translations'), new HeaderField('CreateTransHeader', _t('Translatable.CREATE', 'Create new translation'), 2), $langDropdown = new LanguageDropdownField("NewTransLang", _t('Translatable.NEWLANGUAGE', 'New language'), $alreadyTranslatedLocales, 'SiteTree', 'Locale-English', $this->owner), $createButton = new InlineFormAction('createtranslation', _t('Translatable.CREATEBUTTON', 'Create'))));
     $createButton->includeDefaultJS(false);
     if ($alreadyTranslatedLocales) {
         $fields->addFieldToTab('Root.Translations', new HeaderField('ExistingTransHeader', _t('Translatable.EXISTING', 'Existing translations:'), 3));
         $existingTransHTML = '<ul>';
         foreach ($alreadyTranslatedLocales as $i => $langCode) {
             $existingTranslation = $this->owner->getTranslation($langCode);
             if ($existingTranslation) {
                 $existingTransHTML .= sprintf('<li><a href="%s">%s</a></li>', sprintf('admin/show/%d/?locale=%s', $existingTranslation->ID, $langCode), i18n::get_locale_name($langCode));
             }
         }
         $existingTransHTML .= '</ul>';
         $fields->addFieldToTab('Root.Translations', new LiteralField('existingtrans', $existingTransHTML));
     }
     $langDropdown->addExtraClass('languageDropdown');
     $createButton->addExtraClass('createTranslationButton');
 }
Ejemplo n.º 8
0
	function updateCMSFields(FieldSet &$fields) {
		if(!$this->stat('enabled', true)) return false;
		
		// add hidden fields for the used language and original record
		$fields->push(new HiddenField("Lang", "Lang", $this->getLang()) );
		$fields->push(new HiddenField("OriginalID", "OriginalID", $this->owner->OriginalID) );
		
		// if a language other than default language is used, we're in "translation mode",
		// hence have to modify the original fields
		$isTranslationMode = (Translatable::default_lang() != $this->getLang() && $this->getLang());
		if($isTranslationMode) {
			$originalLangID = Session::get($this->owner->ID . '_originalLangID');
			
			$translatableFieldNames = $this->getTranslatableFields();
			$allDataFields = $fields->dataFields();
			$transformation = new Translatable_Transformation(Translatable::get_original($this->owner->class, $this->owner->ID));
			
			// iterate through sequential list of all datafields in fieldset
			// (fields are object references, so we can replace them with the translatable CompositeField)
			foreach($allDataFields as $dataField) {
				
				if(in_array($dataField->Name(), $translatableFieldNames)) {
					//var_dump($dataField->Name());
					// if the field is translatable, perform transformation
					$fields->replaceField($dataField->Name(), $transformation->transformFormField($dataField));
				} else {
					// else field shouldn't be editable in translation-mode, make readonly
					$fields->replaceField($dataField->Name(), $dataField->performReadonlyTransformation());
				}
			}
		} else {
			// if we're not in "translation mode", show a dropdown to create a new translation.
			// this action should just be possible when showing the default language,
			// you can't create new translations from within a "translation mode" form.
			
			$alreadyTranslatedLangs = array();
			foreach ($alreadyTranslatedLangs as $i => $langCode) {
				$alreadyTranslatedLangs[$i] = i18n::get_language_name($langCode);
			}
			$fields->addFieldsToTab(
				'Root',
				new Tab(_t('Translatable.TRANSLATIONS', 'Translations'),
					new HeaderField('CreateTransHeader', _t('Translatable.CREATE', 'Create new translation'), 2),
					$langDropdown = new LanguageDropdownField("NewTransLang", _t('Translatable.NEWLANGUAGE', 'New language'), $alreadyTranslatedLangs),
					$createButton = new InlineFormAction('createtranslation',_t('Translatable.CREATEBUTTON', 'Create'))
				)
			);
			if (count($alreadyTranslatedLangs)) {
				$fields->addFieldsToTab(
					'Root.Translations',
					new FieldSet(
						new HeaderField('ExistingTransHeader', _t('Translatable.EXISTING', 'Existing translations:'), 3),
						new LiteralField('existingtrans',implode(', ',$alreadyTranslatedLangs))
					)
				);
			}
			$langDropdown->addExtraClass('languageDropdown');
			$createButton->addExtraClass('createTranslationButton');
			$createButton->includeDefaultJS(false);
		}
	}
 /**
  * Allows a formatter to change the fields available in the backend for a wiki page. 
  *
  * @param FieldSet $fields 
  */
 public function updateCMSFields($fields)
 {
     // default behaviour is to change to a textarea - the HTML formatter type will
     // just override this behaviour
     $fields->replaceField('Content', new TextareaField('Content', _t('WikiPage.CONTENT', 'Content'), 15));
 }
 /**
  * standard SS method
  * @param FieldSet $fields (passed by reference)
  */
 function updateCMSFields(&$fields)
 {
     $fields->replaceField("OrderID", new ReadonlyField("OrderID", "Order ID"));
     return $fields;
 }