WooCommerce & Fastbill API

Für alle die FastBill und WooCommerce mit WordPress nutzen wollen, hier ein Plugin welchen den Export nach FastBill übernimmt (auch mit einem Cronjob möglich).

Viel Spaß mit dem Plugin und ich freue mich auf eure Kommentare!

Download:

“WooCommerce & Fastbill API” weiterlesen

Facebook “Add Page Tag Dialog ” Workaround

Hallo zusammen,
für alle die aktuell den Bug haben: FB-Bug “Add Page Tag Dialog “
Hier mein kleiner Workaround um die App auf die Seite zu bringen.

Voraussetzung:
+ Rechte auf der Seite
+ App-Admin
+ Facebook-SDK (Javascript) geladen

Hello everybody,
at the moment i can’t add an app to a page with the “add page tag dialog” on facebook. FB-Bug “Add Page Tag Dialog “.
This is my workaround:

Prerequisite:
+ Right on the site
+ App Admin
+ Loading Facebook SDK (Javascript)

    function addAppToPage(name,appID){
        FB.login(function(response){
                FB.api('/me/accounts', function(response){
                    if (response && !response.error) {
                        $.each(response.data,function(k,v){
                            if(name.toLowerCase() == v.name.toLowerCase()){
                                FB.api(
                                    "/"+v.id+"/tabs",
                                    "POST",
                                    {
                                        "app_id": appID,
                                        "access_token": v.access_token
                                    },
                                    function (response) {
                                        if (response && !response.error) {
                                            console.log(response);
                                        }
                                    }
                                );
                            }
                        })
                    }
                })
            }
            ,{scope:"manage_pages"});
    }

    // Load the SDK asynchronously
    (function(d, s, id){
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/de_DE/sdk.js";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));

    // Die Funktion startet nach 2000ms
    setTimeout(function(){
        addAppToPage("YOURPAGE","APPID")
    },2000);

RealURL valueDefault language

Hallo zusammen,
damit in TYPO3 kein doppelter Content entsteht, sollte man die default-Language in der URL direkt mit darstellen, ansonsten wird domain.ltd/home und domain.ltd/de/home als doppelter Content gezählt. Um das zu vermeiden, kann man ein wenig an der Config von RealURL arbeiten.

RealURL-Teil-Auszug — NICHT komplette Konfiguration!

<?php
$GLOBALS&#91;'TYPO3_CONF_VARS'&#93;&#91;'EXTCONF'&#93;&#91;'realurl'&#93; = array (
    '_DEFAULT' => array (
        'preVars' => array (
            '0' => array (
                'GETvar' => 'no_cache',
                'valueMap' => array (
                    'nc' => '1',
                ),
                'noMatch' => 'bypass'
            ),
            '1' => array (
                'GETvar' => 'L',
                'valueMap' => array (
                    'de' => '0',
                    'en' => '1',
                    'fr' => '2',
                ),
                'valueDefault' => 'de', // default language 
                //'noMatch' => 'bypass',
            ),
            '2' => array (
                'GETvar' => 'lang',
                'valueMap' => array (
                    'de' => 'de',
                    'en' => 'en',
                    'fr' => 'fr',
                ),
                'noMatch' => 'bypass',
            ),
        ),
    ),
);
?>

Dann würde ich noch auf dem Root-Pfad im Seitenbaum ein Shortcut auf eine Unterseite machen. Somit entsteht direkt eine URL mit Sprach-Segemet (http://domain.ltd/de/SEITENNAME). Und alle anderen Semantischen-Links haben das Sprachsegment mit im Pfad.

Viel Spaß damit

wt_directory für TYPO3 6.2.x

Update: 2016/01/01

Hallo zusammen,
hier noch ein kleines Updat ezu dem Thema. Es wurde weiter entwickelt…
Git:

Alte Version:

Hallo in die Runde,
im Zuge eines Update bei einem Kunden, habe ich das sehr alte Plugin von wt_directory und wt_doormann auf die neue TYPO3 6.2.x Version angepasst. Ich garantiere nichts aber bei mir läuft es nun wieder und man kann auch wie in den alten Versionen alle Punkte hädnisch anpassen im Backend.

Gestet: TYPO3 6.2.9 – 11.01.2015

Bugfix#1: Danke Frank für die Anpassungen für die Kategorie-Auswahl.
Bugfix#1 – Info:
Habe noch was zum “Mehr-Link” herausgefunden, mit dem man von der Listenansicht auf die Detailansicht eines Adresseintrags wechselt:
Hierbei wird derzeit dieser Fehler ausgegeben “#1401732564: Invalid file identifier given. It must be of type string and not empty. “NULL” given.” Ein Bug im Source von TYPO3 6.2.x, an dem anscheinend aktuell gearbeitet wird (siehe https://forge.typo3.org/issues/62184).
Beim wt_directory ist davon die Funktion zum Einbinden von Bildern betroffen (imageLinkWrap), welche man durch folgenden Eintrag im TS-Setup deaktivieren kann (getestet mit TYPO3 6.2.9):
plugin.tx_wtdirectory_pi1.detail.field.image.split.1.10.imageLinkWrap.enable = 0

Viel Spaß,
Marc

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>