WordPress Content / Image Manipulation

Aller Anfang ist nicht einfach und vor allem wen man mit WordPress ein wenig ausfallende Sachen möchte. Wie zum Beispiel ein oder mehrere Bilder in einem Beitrag mit einem extra DIV wrappen und dazu noch eine MetaInformation (get_post_meta) dazu zuschreiben.

Da mich diese Aufgabe ein paar Stunden gekostet hat, hier die Lösung für alle die so was suchen.

Aufgabenbeschreibung:

  1. Wrappe ein Bild mit einem extra DIV / SPAN
  2. Packe zu dem Bild ein eigenes Copyright Meta-Tag vom “Credit-Tracker-Plugin
  3. ohne das Template zu bearbeiten

“WordPress Content / Image Manipulation” weiterlesen

Metatags mit Typo3 ohne Plugin

Hallo zusammen und ein frohes neues Jahr 2014 🙂
Ich melde mich wieder aus einem aktuellen Projekt wo ich etwas mehr mit SEO einstellen musste. Da ich früher immer ein Plugin verwendet habe für alles, habe ich mich nun entschlossen es mit TypoScript zu machen. Und hier das Ergebnis, eine kleine Erklärung gibts natürlich auch!

In den Kostanten werden ein paar Grundbausteine festgelegt, die dann für alle gelten. Diese werden im SETUP-Skrip wieder ausgelesen und verwendet. Dann müsst ihr nicht mehr den Source-Code sondern nur noch die Infos bearbeiten für die neuen Projekte 🙂

#Konstanten

temp.metatags {
  robots        = index,follow
  copyright     = www.klickfabrik.de | Marc Finnern
  language      = de
  distribution  =
  rating        =
  revisit       = 7 days
  
  keywords      = Typo3, Facebook, WordPress, Apps, Klickfabrik, Marc Finnern
  description   = Das ist ein tolles Beispiel von Marc Finnern
}

[globalVar = TSFE:page|no_search = 1]
temp.metatags.robots = noindex,follow
[global]

#Setup

# **
# * Metatags Eintrag
# ********************
page.meta {
  description {
    data = page:description
    ifEmpty.data = levelfield :-1, description, slide
    ifEmpty.data = {$temp.metatags.description}
  }
  keywords {
    data = page:keywords
    ifEmpty.data = levelfield :-1, keywords, slide
    ifEmpty.data = {$temp.metatags.keywords}
  }
  title {
    data = page:subtitle // page:nav_title // page:title
  }
  author {
    data = page:author
    ifEmpty.data = levelfield :-1, author, slide
  }
  date {
    data = page:SYS_LASTCHANGED // page:crdate
    date = Y-m-d
  }
  robots = {$temp.metatags.robots}
  copyright = {$temp.metatags.copyright}
  distribution = {$temp.metatags.distribution}
  rating = {$temp.metatags.rating}
  revisit-after = {$temp.metatags.revisit}
  
  # Für den IE und sein Verhalten, SEHR WICHTIG!
  X-UA-Compatible = IE=edge,chrome=1
  X-UA-Compatible.httpEquivalent = 1
}

Viel Spaß damit und liebe Grüße
Marc

Typoscript languageMenu alternative zu sr_language_menu

Hallo zusammen,
ich muss mich mal wieder nach etwas langer Zeit zu Wort melden.
Bis vor kurzen habe ich immer alles mit der guten EXT:sr_language_menu das Sprachmenü umgesetzt. Leider hat der Entwickler eine Kleinigkeit (in meinen Augen) vergessen …
Was ist, wenn man mal eine Sprache nicht sehen will … und dann diese verstecken muss …???
Da ich keine Lösung dazu gefunden habe, hier ein Typoscript für ein Language-Menü womit im System selber bestimmen kann wie das ausgesteuert wird.
Auch hier gibt es die normalen NO, ACT / CUR oder INACT Variationen, nur richtig als Hard Drive Data Doctor Typo-Menü.

Das Tyopscript steuert das Menü

# Sprachmenü (konstanten)
defaultLanguageID            = 7
defaultLanguageIDs           = 7,1
defaultLanguageNames         = HE,EN

Das Typoscript generiert das UL-LI Menü mit der Weiche der Sprache.
Falls keine Übersetzung vorhanden ist, habe ich ein “javascript:void(0)” eingesetzt, damit man nicht wechseln kann 🙂

# Sprachmenü (setup)
lib.menu.language = COA
lib.menu.language {
  # load language menu data
  1 = LOAD_REGISTER
  1 {
    queryParams = &{getIndpEnv : QUERY_STRING}
    queryParams {
      if.isTrue.data = getIndpEnv : QUERY_STRING
      insertData = 1
    }
  }
  # Navigation Sprachwahl
  10 = HMENU
  10 {
    wrap = <ul id="languageNavigation" class="languageMenu">|</ul>
 
    special = language
    special.value = {$defaultLanguageIDs}
    special.normalWhenNoLanguage = 0
 
    1 = TMENU
    1 {
      noBlur = 1
 
      NO = 1
      NO {
        wrapItemAndSub = <li class="first">|</li><li class="spacer">&#124;</li> |*| <li>|</li><li class="spacer">&#124;</li> |*| <li class="last">|</li>
        doNotLinkIt = 1
        doNotShowLink = 1
        stdWrap2 {
          cObject = COA
          cObject {
 
            1 = LOAD_REGISTER
            1 {
              lParam.cObject = TEXT
              lParam.cObject {
                value = {$defaultLanguageIDs}
                listNum {
                  stdWrap.data = register:count_HMENU_MENUOBJ
                  stdWrap.wrap = |-1
                  splitChar = ,
                }
              }
              lLabel.cObject = TEXT
              lLabel.cObject {
                value = {$defaultLanguageNames}
                listNum {
                  stdWrap.data = register:count_HMENU_MENUOBJ
                  stdWrap.wrap = |-1
                  splitChar = ,
                }
              }
            }
 
            10 = TEXT
            10 {
              typolink {
                useCacheHash = 1
                parameter.data = TSFE:id
                additionalParams.dataWrap = {register:queryParams}&L={register:lParam}
 
                title {
                  current = 1
                  setCurrent = {register:lLabel}
                  setCurrent.insertData = 1
                }
 
                ATagParams = class="lang{register:lParam}"
                ATagParams.insertData = 1
              }
              current = 1
              setCurrent = {register:lLabel}
              setCurrent.insertData = 1
            }
 
            99 = RESTORE_REGISTER
          }
        }
      }
 
      # Aktive gewählte Sprache
      ACT < .NO
      ACT = 1
      ACT.wrapItemAndSub = <li class="first cur">|</li><li class="spacer">&#124;</li> |*| <li class="cur">|</li><li class="spacer">&#124;</li> |*| <li class="last cur">|</li>
 
      # Keine Übersetzung vorhanden
      USERDEF1 < .NO
      USERDEF1 = 1
      USERDEF1 {
        wrapItemAndSub = <li class="first na">|</li><li class="spacer">&#124;</li> |*| <li class="na">|</li><li class="spacer">&#124;</li> |*| <li class="last na">|</li>
        stdWrap2 {
          cObject {
            10 >
 
            10 = TEXT
            10 {
              typolink {
                parameter = javascript:void(0)
                extTarget = 0
                #{$defaultLanguageID}
                additionalParams.dataWrap = &L={register:lParam}
                title {
                  current = 1
                  setCurrent = {register:lLabel}
                  setCurrent.insertData = 1
                }
                ATagParams = class="lang{register:lParam}"
                ATagParams.insertData = 1
              }
              current = 1
              setCurrent = {register:lLabel}
              setCurrent.insertData = 1
            }
            99 = RESTORE_REGISTER
          }
        }
      }
    }
  }
  4 = RESTORE_REGISTER
}

Der einfache CSS-Style

#languageNavigation {list-style:none;margin:0;padding:0;}
#languageNavigation li {display:block;float:left;margin-right:5px;}
#languageNavigation li a {text-decoration:none}
#languageNavigation li.spacer {font-weight:700}
#languageNavigation li.cur a {color:#fff;}
#languageNavigation li.na a {color:#999}

Viel Spaß damit 🙂

Form-Session-Data per Typoscript überprüfen mit If-Else mit TemplaVoila

Hallo zusammen,
hier der passende Artikel zu dem Vorreiter mit dem Template-Autoparser.

In TemplaVoila

<TypoScript>
<!&#91;CDATA&#91;
# default TS
#10= RECORDS
#10.source.current=1
#10.tables = tt_content
#10.wrap = <!--TYPO3SEARCH_begin--> | <!--TYPO3SEARCH_end-->

# New TS
10 < lib.tv_content
&#93;&#93;></TypoScript>

Das Haupt-Setup

# Display a tt_content record templavoila
###################################
lib.tv_content = COA
lib.tv_content {
    10 = RECORDS
    10 {
        source.current = 1
        tables = tt_content
        wrap = <!--TYPO3SEARCH_begin--> | <!--TYPO3SEARCH_end-->
    }
}

Auf der Seite (mit oder ohne Unterseiten)

# Display the current Record in templavoila
###################################
lib.myContent = COA
lib.myContent {
    10 = RECORDS
    10 {
        source.current = 1
        tables = tt_content
        wrap = <!--TYPO3SEARCH_begin--> | <!--TYPO3SEARCH_end-->
    }
}


# Display a tt_content record
###################################
lib.agbtext = RECORDS
lib.agbtext {
      tables = tt_content
      source = 138,157
      dontCheckPid = 1
}


# Check form-data
###################################
lib.mySessionData = COA_INT
lib.mySessionData.10 = TEXT
lib.mySessionData.10.data = TSFE:fe_user|sesData|recs|ts|akz


lib.check = COA
lib.check {
  10 < lib.mySessionData
  10 {
       if {
           value.data = TSFE:fe_user|sesData|recs|ts|akz
           equals = Akzeptieren
           negate=1
       }
       # Zeige Default Content
       10 < lib.agbtext
  }
  20 < lib.mySessionData
  20 {
       if {
           value.data = TSFE:fe_user|sesData|recs|ts|akz
           equals = Akzeptieren
       }
       # Zeige Content wenn es richtig war
       10 < lib.myContent
  }
}


# Display the Content
###################################
lib.tv_content < lib.check
&#91;/code&#93;
<p><strong>Das Formular:</strong></p>

<div class="absatzDisclaimer">
  <form method="post">
    <table cellspacing="0" cellpadding="0" border="0"><tbody>
      <tr>
        <td style="width: 150px;">
        <input type="submit" name="recs&#91;ts&#93;&#91;akz&#93;" value="Nicht akzeptieren"></td>
        <td style="width: 150px;">
        <input type="submit" name="recs&#91;ts&#93;&#91;akz&#93;" value="Akzeptieren"></td>
      </tr></tbody>
    </table>
  </form>
</div>

Session / $_SESSION empty in Internet Explorer (IE)

Hallo zusammen,
wieder einmal eine kleine Sache, die ich gerne mit euch teilen will.
Aktuell bin ich stark auf Facebook unterwegs und programmiere dort kleine App/Gewinnspiel etc… Jeder Browser ist mein Freund, außer der IE, der speichert nämlich im iFrame nichts dauerhaft in die $_SESSION. Somit sind die einfachsten Sachen, die man aus der $_SESSION braucht, nicht zu erreichen.

Warum ist da so?
Aus Sicherheitsgründen, die natürlich nur Microsoft weiß, wird pro Aufruf in einem iFrame die $_SESSION komplett neu geschrieben / erstellt. Somit sind alle Daten verloren, die vorher in der $_SESSION gespeichert wurden.

ABER es gibt eine Lösung dazu:

<?php 
  // session fix for IE
  header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

  // default session start
  session_start();
?>

Mit diesem Header-Wunder werden auf einmal alle Sachen in die $_SESSION gespeichert und bleiben auch da 🙂

Viel Spaß
Marc

Image aus Templavoila mit Fallback-Bild (ifEmpty, isFalse)

Hallo Freunde,
ich hatte das Problem, wenn ich ein Bild in TemplaVoila als “Image-Field” setze, wird mir nie ein Fallback Bild angezeigt. Nach langem Suchen, Testen & Probieren habe ich folgende Lösung entwickelt.

Wie wo was warum:
Was: field_backimg wird als Image-Field festgelegt.
Wo: In den Seiten-Eigenschaften.
Was: Man kann pro Seite ein Bild auswählen und definiert somit das Hintergrundbild.
Warum: Der Kunde soll ein Hintergrundbild selber bestimmen können, aber auch ein Fallback-Bild bekommen, wenn er keins wählt.

Das Problem:
Im normalem Fall wird durch TemplaVoila Folgendes geschrieben:

10 = IMAGE
10.file.import = uploads/tx_templavoila/
10.file.import.current = 1
10.file.import.listNum = 0
10.file.maxW = 200

Damit kann man aber dann kein Default-Fallback-Bild definieren, da das “current = 1” alles überschreibt. Auch die ifTrue, ifFalse & ifEmpty fassen hier bei nicht.

Die Lösung:
Man bindet das Bild nicht mit “current = 1” ein, sondern holt sich die Daten über “import.data” aus dem Feld. Somit macht man das gleiche wie “current = 1” nur das man dann ein Fallback-Bild setzen kann.

10 = IMAGE
10 {
	file = fileadmin/user_upload/backgrounds/default.jpg
	file {
		import = uploads/tx_templavoila/
		import.data = field:field_backimg
		import.listNum = 0
	}
	# optional Pagetitle als alt/titletag
	altText.data= levelfield :-1, title, slide
	#titleText.data= levelfield :-1, title, slide
}

Viel Spaß damit,
Marc