15.06.2011  TYPO3

Schwarzes Brett für FE-User

Aufgabenstellung

Frontend-User sollen die Möglichkeit bekommen, kurze Nachrichten auf einer Website zu veröffentlichen. Überschrift, Text, Links und der Upload von bis zu drei Dateien sollen möglich sein und der User soll bestimmen können, ob die News für alle oder nur für eingeloggte User sichtbar sein soll. Ausserdem sollen die Beiträge von einem Admin vorab kontrolliert und dann freigeschaltet werden.

Für die Umsetzung verwende ich tt_news und den formhandler.

Nachdem formhandler und tt_news installiert sind, erstelle ich zuerst zwei News-Kategorien: "alle Besucher" und "nur eingeloggte". Danach erstelle ich folgendes Formulartemplate für die Eingabe der News im Frontend:

<div class="newsform">
  <form method="post" action="###REL_URL###" enctype="multipart/form-data">
    <fieldset>
      <input type="hidden" name="formhandler[submitted]" value="1" />
      <dl>
        <dt>
          <label for="category">Category</label>
        </dt>
        <dd>
          <select name="formhandler[category]">
            <option value="1" ###selected_category_2### >All visitors</option>
            <option value="2" ###selected_category_1### >Only members</option>
          </select>
          <p>You can select if the notice is only be visible FE members or to everyone visiting this site.</p>
        </dd>
        <dt>###error_title###
          <label for="title">Title</label>
        </dt>
        <dd>
          <input type="text" name="formhandler[title]" id="title" value="###value_title###"/>
        </dd>
        <dt>###error_bodytext###
          <label for="bodytext">Text</label>
        </dt>
        <dd>
          <textarea name="formhandler[bodytext]" id="bodytext" rows="30">###value_bodytext###</textarea>
          <p>Max. 1000 characters</p>
        </dd>
        <dt>###error_links###
          <label for="links">Related Links</label>
        </dt>
        <dd>
          <textarea name="formhandler[links]" id="bodytext">###value_links###</textarea>
          <p>Related links (optional). Only one link per line. Start each line with http://</p>
        </dd>
        <dt>
			###error_picture###
			<label for="picture">Attach a document (optional)</label>
        </dt>
		<dd>
        	<input type="file" name="formhandler[picture]" id="picture" value="###value_picture###"/>
			<br />
			<input type="submit" value="Upload file now" ###submit_reload### /><br />
			<p>Maximum size: ###picture_maxSize###<br />
			Allowed types: ###picture_allowedTypes###<br />
            ###picture_fileCount###/###picture_maxCount###<br />
			###picture_remainingCount### files left to upload<br />
			File: ###picture_uploadedFiles###</p>
		</dd>
        <dt>&nbsp;</dt>
        <dd>
          <input type="submit" value="Send" ###submit_nextStep###/>
        </dd>
      </dl>
    </fieldset>
  </form>
</div>

Dieses Formular packe ich nun auf die Website und stelle den Zugriff der Seite oder des Inhaltselements auf "Anzeigen, wenn angemeldet". Das Typoscript für die Seite sieht dann wie folgt aus:

plugin.Tx_Formhandler.settings.predef.singlestep_example {

  # Common configuration
  name = Example SingleStep
  debug = 0
  addErrorAnchors = 1
  formValuesPrefix = formhandler

  # HTML wrapping by validation error
  errorListTemplate {
    totalWrap = <ul>|</ul>
    singleWrap = <li class="error">|</li>
  }
  singleErrorTemplate {
    singleWrap = <span class="error">|</span><br />
  }

  files {
    clearTempFilesOlderThanHours = 24
    uploadFolder = uploads/media/
    enableAjaxFileRemoval = 1
  }
  
  # Validators configuration
  validators {
    1 {
      class = Tx_Formhandler_Validator_Default
      config {
        fieldConf {
          title {
            errorCheck.1 = required
            errorCheck.2 = maxLength
            errorCheck.2.value = 150
          }
          bodytext {
            errorCheck.1 = required
            errorCheck.2 = maxLength
            errorCheck.2.value = 1000
          }
          picture {
            errorCheck.1 = fileAllowedTypes
            errorCheck.1.allowedTypes = doc,pdf
            errorCheck.2 = fileMinSize
            errorCheck.2.minSize = 10000
            errorCheck.3 = fileMaxSize
            errorCheck.3.maxSize= 5120000
            errorCheck.4 = fileMaxCount
            errorCheck.4.maxCount = 3
          }
        }
      }
    }
  }

  # Interceptors configuration
  initInterceptors {
    1 {
      class = Tx_Formhandler_Interceptor_Filtreatment
    }
  }

  # Finishers configuration
  finishers {
     1 {
      class = Tx_Formhandler_Finisher_DB
      config {
        table = tt_news
        key = uid
        fields {
          title {
            mapping = title
            if_is_empty = None given
          }
          bodytext {
            mapping = bodytext
          }
          links {
            mapping = links
          }
          news_files {
           mapping = picture
          }
          author {
            mapping = TEXT
            mapping {
              data = TSFE:fe_user|user|name
            }
          }
          author_email {
            mapping = TEXT
            mapping {
              data = TSFE:fe_user|user|email
            }
          }
          hidden = 1
          pid = 76
          category = 1
          datetime.special = sub_tstamp
          crdate.special = sub_tstamp
          tstamp.special = sub_tstamp
        }
      }
    }
    2.class = Tx_Formhandler_Finisher_DB
    2.config {
         table = tt_news_cat_mm
         fields {
           uid_local.special = inserted_uid
           uid_local.special.table = tt_news
           uid_foreign.mapping = category
         }
       }
    3.class = Tx_Formhandler_Finisher_Mail
    3.config {
      limitMailsToUser = 5
      admin {
        to_email = beispiel@beispiel.org
        to_name = Mein Name
        subject = Mein Subject
        sender_email = TSFE:fe_user|user|email
        sender_name = TSFE:fe_user|user|name
        replyto_email = TSFE:fe_user|user|email
        replyto_name = TSFE:fe_user|user|name
      }
    }
    4.class = Tx_Formhandler_Finisher_Redirect
    4.config {
      redirectPage = 78
    }
  }
}

Wichtig ist die Zeile 20, hier kommt der Wert "upload/media" hinein, der Ordner, in dem auch tt_news die angehängten Dateien ablegt. Dann braucht es noch ein paar Validatoren und drei Finisher. Der erste speichert die Formularwerte Titel, Bodytext, Links und Dateien, die Werte des eingeloggten Users username und -mail sowie die statischen Werte pid, hidden und datetime in die Tabelle "tt_news". Der zweite speichert die ausgewählte Kategorie in die Tabelle "tt_news_cat_mm". Die dritte versendet eine Nachricht an den Admin. Das formhandler-Mailtemplate schaut wie folgt aus:

<!-- ###TEMPLATE_EMAIL_ADMIN_HTML### begin --> 
Hello Admin,<br /><br />

a user has just filled out the form for the Notice-Board. 
<br />
Title: ###value_title###<br />
Text: ###value_bodytext###<br />
Links: ###value_links###

<!-- ###TEMPLATE_EMAIL_ADMIN_HTML### end --> 

Der Admin kann daraufhin ins BE gehen, sich den Beitrag noch einmal ansehen und dann sichtbar schalten.

Auf der Site kann man nun überall tt_news einbinden und die Beiträge anzeigen lassen. Wobei man immer jede Ansicht zweimal anlegen muss, einmal mit der Zugriffseinstellung "Anzeigen, wenn angemeldet" und beiden Kategorien und einmal mit der Zugriffseinstellung "Nach Anmeldung verbergen" und nur der Kategorie "Alle Besucher".

Versionen: TYPO3 4.5.3, tt_news 3.0.1, formhandler 0.9.14

  •  
  • 0 Kommentar(e)
  •  

Mein Kommentar

Ich möchte über jeden weiteren Kommentar in diesem Post benachrichtigt werden.

Zurück