DEPRECATION WARNING

This documentation is not using the current rendering mechanism and will be deleted by December 31st, 2020. The extension maintainer should switch to the new system. Details on how to use the rendering mechanism can be found here.

Add new Field Properties

Introduction

You can extend powermail fields with new properties to insert (e.g.) a checkbox for readonly or disabled or something else.

Following example shows two new fields in a new tab “Powermailextended”. The first is a textarea. If there is text stored, this should be outputted before the Input field is rendered. The second is a checkbox. If this checkbox was checked from an editor, the input field should use the html-attribute readonly=”readonly”.

developer_new_fieldproperties1

developer_new_fieldproperties2

Extend powermail with an own extension

You have to add one or more fields into tx_powermail_domain_model_field, describe it with additional TCA, add new Models and change the HTML-Template as you want. You can add a new extension with an example key powermailextended.

EXT:powermailextended/ext_tables.sql:

#
# Table structure for table 'tx_powermail_domain_model_field'
#
CREATE TABLE tx_powermail_domain_model_field (
  tx_powermailextended_powermail_text varchar(255) DEFAULT '' NOT NULL,
  tx_powermailextended_powermail_readonly tinyint(4) unsigned DEFAULT '0' NOT NULL
);

EXT:powermailextended/ext_tables.php:

<?php
/**
 * Include Static TypoScript
 */
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile(
     $_EXTKEY,
     'Configuration/TypoScript',
     'Powermail Addition (after Powermail Template)'
);

/**
 * extend powermail fields tx_powermail_domain_model_field
 */
$tempColumns = array (
     'tx_powermailextended_powermail_text' => array(
             'exclude' => 1,
             'label' => 'Text before field',
             'config' => array (
                     'type' => 'text',
                     'cols' => '32',
                     'rows' => '2'
             )
     ),
     'tx_powermailextended_powermail_readonly' => array(
             'exclude' => 1,
             'label' => 'Readonly',
             'config' => array (
                     'type' => 'check'
             )
     ),
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns(
     'tx_powermail_domain_model_field',
     $tempColumns
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
     'tx_powermail_domain_model_field',
     '--div--;Powermailextended, tx_powermailextended_powermail_text, tx_powermailextended_powermail_readonly',
     '',
     'after:own_marker_select'
);

EXT:powermailextended/Configuration/TypoScript/setup.txt:

# Add own Partials
plugin.tx_powermail.view {
        partialRootPaths {
                1 = EXT:powermailextended/Resources/Private/Partials/
        }
}
# Add new Field Properties
config.tx_extbase{
        persistence{
                classes{
                        In2code\Powermail\Domain\Model\Form {
                                subclasses {
                                        0 = In2code\Powermailextended\Domain\Model\Form
                                }
                        }
                        In2code\Powermail\Domain\Model\Page {
                                subclasses {
                                        0 = In2code\Powermailextended\Domain\Model\Page
                                }
                        }
                        In2code\Powermail\Domain\Model\Field {
                                subclasses {
                                        0 = In2code\Powermailextended\Domain\Model\Field
                                }
                        }
                        In2code\Powermailextended\Domain\Model\Form {
                                mapping {
                                        tableName = tx_powermail_domain_model_form
                                }
                        }
                        In2code\Powermailextended\Domain\Model\Page {
                                mapping {
                                        tableName = tx_powermail_domain_model_page
                                }
                        }
                        In2code\Powermailextended\Domain\Model\Field {
                                mapping {
                                        tableName = tx_powermail_domain_model_field
                                }
                        }
                }
        }
        objects {
                In2code\Powermail\Domain\Repository\FormRepository.className = In2code\Powermailextended\Domain\Repository\FormRepository
        }
}

EXT:powermailextended/Resources/Private/Partials/Form/Field/Input.html:

{namespace vh=In2code\Powermail\ViewHelpers}

<div id="powermail_fieldwrap_{field.uid}" class="powermail_fieldwrap powermail_fieldwrap_input powermail_fieldwrap_{field.uid} {field.css}">
      <h2>
              {field.txPowermailextendedPowermailText}
      </h2>
      <label for="powermail_field_{field.marker}" class="powermail_label" title="{field.description}">
              <vh:string.escapeLabels>{field.title}</vh:string.escapeLabels><f:if condition="{field.mandatory}"><span class="mandatory">*</span></f:if>
      </label>
      <f:if condition="{field.txPowermailextendedPowermailReadonly}">
              <f:then>
                      <f:form.textfield
                                      type="{vh:Validation.FieldTypeFromValidation(field:field)}"
                                      property="{field.marker}"
                                      placeholder="{field.placeholder}"
                                      readonly="readonly"
                                      value="{vh:Misc.PrefillField(field:field, mail:mail)}"
                                      class="powermail_field powermail_input {vh:Validation.ErrorClass(field:field, class:'powermail_field_error')}"
                                      additionalAttributes="{vh:Validation.ValidationDataAttribute(field:field)}"
                                      id="powermail_field_{field.marker}" />
              </f:then>
              <f:else>
                      <f:form.textfield
                                      type="{vh:Validation.FieldTypeFromValidation(field:field)}"
                                      property="{field.marker}"
                                      placeholder="{field.placeholder}"
                                      value="{vh:Misc.PrefillField(field:field, mail:mail)}"
                                      class="powermail_field powermail_input {vh:Validation.ErrorClass(field:field, class:'powermail_field_error')}"
                                      additionalAttributes="{vh:Validation.ValidationDataAttribute(field:field)}"
                                      id="powermail_field_{field.marker}" />
              </f:else>
      </f:if>

</div>

EXT:powermailextended/Classes/Domain/Model/Field.php:

<?php
namespace In2code\Powermailextended\Domain\Model;

/**
* Class Field
* @package In2code\Powermailextended\Domain\Model
*/
class Field extends \In2code\Powermail\Domain\Model\Field
{

        /**
         * New property text
         *
         * @var string $txPowermailextendedPowermailText
         */
        protected $txPowermailextendedPowermailText;

        /**
         * New property readonly
         *
         * @var string $txPowermailextendedPowermailReadonly
         */
        protected $txPowermailextendedPowermailReadonly;

        /**
         * @param string $txPowermailextendedPowermailReadonly
         * @return void
         */
        public function setTxPowermailextendedPowermailReadonly($txPowermailextendedPowermailReadonly)
        {
                $this->txPowermailextendedPowermailReadonly = $txPowermailextendedPowermailReadonly;
        }

        /**
         * @return string
         */
        public function getTxPowermailextendedPowermailReadonly()
        {
                return $this->txPowermailextendedPowermailReadonly;
        }

        /**
         * @param string $txPowermailextendedPowermailText
         * @return void
         */
        public function setTxPowermailextendedPowermailText($txPowermailextendedPowermailText)
        {
                $this->txPowermailextendedPowermailText = $txPowermailextendedPowermailText;
        }

        /**
         * @return string
         */
        public function getTxPowermailextendedPowermailText()
        {
                return $this->txPowermailextendedPowermailText;
        }
}

EXT:powermailextended/Classes/Domain/Model/Page.php:

<?php
namespace In2code\Powermailextended\Domain\Model;

/**
* Class Page
* @package In2code\Powermailextended\Domain\Model
*/
class Page extends \In2code\Powermail\Domain\Model\Page
{

        /**
         * Powermail Fields
         *
         * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\In2code\Powermailextended\Domain\Model\Field>
         */
        protected $fields = NULL;

        /**
         * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $fields
         * @return void
         */
        public function setFields($fields)
        {
                $this->fields = $fields;
        }

        /**
         * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage
         */
        public function getFields()
        {
                return $this->fields;
        }
}

EXT:powermailextended/Classes/Domain/Model/Form.php:

<?php
namespace In2code\Powermailextended\Domain\Model;

/**
* Class Form
* @package In2code\Powermailextended\Domain\Model
*/
class Form extends \In2code\Powermail\Domain\Model\Form
{

        /**
         * pages
         *
         * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\In2code\Powermailextended\Domain\Model\Page>
         */
        protected $pages;

        /**
         * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $pages
         * @return void
         */
        public function setPages($pages)
        {
                $this->pages = $pages;
        }

        /**
         * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage
         */
        public function getPages()
        {
                return $this->pages;
        }
}

EXT:powermailextended/Classes/Domain/Repository/FormRepository.php:

<?php
namespace In2code\Powermailextended\Domain\Repository;

/**
 * Class FormRepository
 * @package In2code\Powermailextended\Domain\Repository
 */
class FormRepository extends \In2code\Powermail\Domain\Repository\FormRepository
{
}

Last but not least don’t forget to add your static TypoScript template to your powermail page, otherwise the partials will not be used.

Example Code

Look at https://github.com/einpraegsam/powermailextended for an example extension. This extension allows you to:

  • Extend powermail with a complete new field type (Just a small “Show Text” example)
  • Extend powermail with an own Php and JavaScript validator (ZIP validator - number has to start with 8)
  • Extend powermail with new field properties (readonly and prepend text from Textarea)
  • Extend powermail with an example SignalSlot (see ext_localconf.php and EXT:powermailextended/Classes/Controller/FormController.php)