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

Hallo zusammen, aus einem gegeben Anlass wieder ein kleines Tutorial diesmal zum Thema:
IF-Else und Typo3-Session in einer Typoscript verarbeitung.

Wenn man in Typo3 einen bestimmten Content zeigen muss bevor man gewisse AGB’s akzeptiert hat, kann man das am besten über die Session und einem kleinen Formular lösen. Dazu muss man im Folgeschritt etwas am Typoscript arbeiten um dies zu Händeln.

Mein aktuelles Projekt ist sehr alt und daher wird der „Template Auto-parser“ noch verwendet, wodrauf das Beispiel beruht. Ich denke, aber das es auch eben so mit TemplaVoila läuft.

An diesem Beispiel zeige ich, wie man mit ein paar Tricks, eine kleine Content-Weiche
schaltet und dem User dazu bringen muss, etwas zu akzeptieren oder darauf zu verzichten was nach der Weiche steht.

Das Typoscript:

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

# check the session-data
###################################
tmp.check = COA
tmp.check {
  10 = COA
  10 {
       if {
           value.data = TSFE:fe_user|sesData|recs|ts|akz
           equals = Akzeptieren
           negate=1
       }
       10 < lib.agbtext
  }
  20 = COA
  20 {
       if {
           value.data = TSFE:fe_user|sesData|recs|ts|akz
           equals = Akzeptieren
       }
       10 < temp.content
  }
}

# override the template-parsing
###################################
temp.mainTemplate.subparts.content < tmp.check
page.10 < temp.mainTemplate
&#91;/code&#93;
<p>&nbsp;</p>
<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>

 

Erklärung:

Das „lib.agbtext“ speichert 2 Datensätze von der Webseite die in einem nicht sichtbaren Bereich abgelegt werden, am besten so dass die Suchmaschine es auch nicht finden kann (SEO Hintergrund).

Das „tmp.check“ checkt die Session und zeigt je nach Zustand entweder den „lib.agbtext“ oder wenn es erfolgreich / zutreffend ist wird der aktuelle Content dargestellt.

Am Schluss wir durch das Schreiben in den Subpart wie Weiche vervollständigt. „temp.mainTemplate.subparts.content < tmp.check“

 

Viel Spaß damit 🙂
Marc

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

SEO Titel mit tt_news

Hallo zusammen,
für alle die ihren eigenen PageTitle verwenden und das auch mit tt_news machen wollen, hier die Lösung 😉
Viel Spaß damit Red lion design – SEO Cardiff

# **
# * Seitennamen von tt_News Name // Konstanten
# ********************
page_news_detail = xx

# **
# * Seitennamen von tt_News Name // setup
# ********************
[globalVar = TSFE:id = {$page_news_detail}]
config.noPageTitle = 2
temp.headertitle = COA
temp.headertitle {
wrap = |
10=RECORDS
10 {
# id des template-records
# < typo3 4.7 # source = {GPvar:tx_ttnews|tt_news} # > typo3 4.7
source = {GP:tx_ttnews|tt_news}
source.insertData = 1
tables = tt_news
conf.tt_news >
conf.tt_news = TEXT
conf.tt_news.field=title
}
15 = TEXT
15.value =
15.noTrimWrap= || – |
20 = TEXT
20.field = subtitle
20.if.isTrue.field = subtitle
20.noTrimWrap= || – |
30 = TEXT
# read pagetitle from template
30.data = TSFE : tmpl | setup | sitetitle
30.ifEmpty = FIRMENNAME
stdWrap.noTrimWrap = | |||
}
[end]
page.headerData.10 < temp.headertitle [/code]

Meta tags, extended (metatags) probleme, Seite bleibt weiß!

Wer mit dem Update auf Typo3 4.7.x eine weiße Seite durch mit folgenden Fehler bekommt:

<?php
 Fatal error: Call to undefined method tslib_content_PhpScript::stdWrap() in /html/typo3/typo3conf/ext/metatags/meta.php on line 45
?>

Muss sich nur kurz Zeit nehmen und nicht direkt in Panik geraten 😉

Download

Lösung:

<?php
 // function: $this->stdWrap();
 // replace with new function since 4.7: $this->cObj->stdWrap();

// Line: 45 & 46
// directory: /typo3conf/ext/metatags/meta.php 
// Old:
$localDescription = trim($this->stdWrap($local['description'],$local['description.']));
$localKeywords = trim($this->stdWrap($local['keywords'],$local['keywords.']));

// New:
$localDescription = trim($this->cObj->stdWrap($local['description'],$local['description.']));
$localKeywords = trim($this->cObj->stdWrap($local['keywords'],$local['keywords.']));
?>

Viel Spaß 😉

TwitterAPI mit PHP abrufen

Hallo zusammen,
wer braucht es nicht… ein Tweet auf seiner eigen Seite oder etwas individueller… aber ohne ein Plugin aus WordPress sondern auf seinem eigenen System.
Mit diesem kleinen Beispiel kann man sich schnell und einfach die Tweets auf seine Webseite holen. Das einzige was gebraucht wird, ist PHP 😉 Ach so noch ein kleiner Hinweis… der Cache wurde eingebaut, weil Twitter bei 1000 aufrufen an die API zu einer TwitterPerson dicht macht und man dann ein Tag keine weiteren Daten bekommen kann. Mit der Datei wird es aktuell nur 1x Stunde angefragt 😉

<?php
/**
 * Created by JetBrains PhpStorm.
 * User: marcfinnern
 * Date: 24.08.12
 * Time: 10:47
 */
class twitter {

    function twitter_api($screenname, $maxItems="3", $cacheTime="60"){
        $url = "https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=$screenname&count=$maxItems";

        // Caching
        $cachedatei = "cache/twitter_".$screenname.".txt";
        $cacheTime = time()-($cacheTime*60);

        if (file_exists($cachedatei)){
            if (filemtime($cachedatei)<$cacheTime){
                $daten = file_get_contents($url);
                file_put_contents($cachedatei, $daten);
            }
            else {
                $daten = file_get_contents($cachedatei);
            }
        }
        else {
            $daten = file_get_contents($url);
            file_put_contents($cachedatei, $daten);
        }
        // Caching - End


        $result = json_decode($daten);
        $count = 0;
        echo '<ul id="twitter_api">'."\n";
        foreach($result as $tweet) {
            if($count < $maxItems){

                if($count == 0){
                    $class = "first";
                } else if ($count == ($maxItems-1)) {
                    $class = "last";
                } else {
                    $class = "middle";
                }

                $date = date("d M",strtotime($tweet->created_at));
                $search = array(
                    $tweet->entities->urls[0]->url,
                    "@".$tweet->entities->user_mentions[0]->screen_name,
                    "#".$tweet->entities->hashtags[0]->text

                );
                $replace = array(
                    '<a href="'.$tweet->entities->urls[0]->url.'" target="_blank">'.$tweet->entities->urls[0]->expanded_url.'</a>',
                    '<a href="https://twitter.com/'.$tweet->entities->user_mentions[0]->screen_name.'" target="_blank">@'.$tweet->entities->user_mentions[0]->screen_name.'</a>',
                    '<a href="https://twitter.com/search/'.$tweet->entities->hashtags[0]->text.'" target="_blank">#'.$tweet->entities->hashtags[0]->text.'</a>'
                );


                echo '  <li class="'.$class.'">'."\n";
                echo '      <span class="title"><strong>'.$date." | ".$tweet->user->name.'</strong> <a href="https://twitter.com/'.$tweet->user->screen_name.'" target="_blank">@'.$tweet->user->screen_name.'</a></span>'."\n";
                echo '      <span class="desc">'.str_replace($search,$replace,$tweet->text).'</span>'."\n";
                echo '  </li>'."\n";
            }
            $count++;
        }
        echo "</ul>"."\n";
    }
}

Im weiteren sind dann die Sachen für den Quellcode so zu schreiben.
Hinweiß: Man muss dem Cache-Ordner die Rechte 777 oder 0777 geben, damit die Daten abgelegt werden können.

<?php
/*
* Einladen der Twitter-Class
* Und verfügbar machen in einer Variable
* Defaults: $screenname, $maxItems="3", $cacheTime="60"
*/

require("class/twitter.php");
$tw = new twitter();

# Wiedergabe des tweets (3x + 1 Stunde Cachezeit):
$tw->twitter_api("klickfabrik");

# Wiedergabe von 10 Tweets, 30 Minuten Cachezeit
$tw->twitter_api("klickfabrik","10","30");
?>

Wenn man das ganze auch in WordPress nutzen will, muss man zusätzlich noch folgendes machen, damit es auch in einem z.B. PHP-Widget verfügbar ist:

<?php
/*
* Daten werden unter der function.php im WordPresstheme abgelegt und wie folgt aktiviert
*/
#Zeile 11-70 einfügen (also nur die function)
function twitter_api($screenname, $maxItems="3", $cacheTime="60"){
..
.
}

#diese Zeile unter der function anhängen, damit WordPress damit arbeiten kann.
add_action('twitter_api', 'twitter_api');


/* 
* Caching anpassung für WordPress
* Wird dann im Theme-Ordner abgelegt und gespeichert
* Bitte das alte Caching ersetzen 😉
*/
$wordpressDir = explode("/themes/",get_bloginfo('template_url'));
$wordpressDir = "wp-content/themes/".$wordpressDir&#91;1&#93;."/";
$cachedatei = $wordpressDir."cache/twitter_".$screenname.".txt";
?>

Viel Spaß damit,
euer Marc

SocialMediaBar mit TypoScript

Wer wollte nicht schon immer mal für seine eigene Seite eine SocialMediaBar haben und auf jeder Seite Like’n / Google’n oder Twittern können…
hier mit dem kleinen TypoScript kann man das locker umsetzen.

Konstanten:
baseURL = http://www.domain.ltd/

Setup:
# **
# * socialmediabox
# ********************
lib.field_smb = COA
lib.field_smb {
  10 = TEXT
  10 {
    typolink.parameter.data = getIndpEnv:REQUEST_URI
    typolink.returnLast = url
    wrap (
    <li class="google">
    <div class="g-plusone" data-size="medium" data-href="{$baseURL}|"></div>
    <script type="text/javascript">
      (function() {
        var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
        po.src = 'https://apis.google.com/js/plusone.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
      })();
    </script>
    </li>
    )
  }
  20 = TEXT
  20 {
    typolink.parameter.data = getIndpEnv:REQUEST_URI
    typolink.returnLast = url
    wrap (
    <li class="twitter"><a href="https://twitter.com/share" class="twitter-share-button" data-url="{$baseURL}|" data-size="medium">Tweet</a>
    <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
    </li>
  )
  }
  30 = TEXT
  30 {
    typolink.parameter.data = getIndpEnv:REQUEST_URI
    typolink.returnLast = url
    wrap (
    <li class="facebook"><div class="fb-like" data-href="{$baseURL}|" data-send="false" data-layout="button_count" data-width="450" data-show-faces="false"></div>
    <div id="fb-root"></div>
    <script>(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/all.js#xfbml=1&appId=459667507386498";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));</script>
    </li>
    )
  }
 wrap = <ul class="smb">|</ul> 
}

Viel Spaß damit 😉

A-Z Navigation für die Posts

Hallo liebe Freunde,
so es gibt mal wieder was aus dem Bereich WordPress dating site von mir zu berichten 😉
Wer wollte nicht schon immer mal seine Posts mit einer Filterung von a-z haben…hier die Lösung dafür!
Gefiltert wird in diesem Fall der Titel des Post’s.

Erklärung:

  1. Titel wird eingelesen
  2. Titel wird auf ein Zeichen gekürzt
  3. Buchstabe wird klein geschrieben und mit dem Array-Buchstaben verglichen
  4. Wenn der Buchstabe vorhanden ist und noch nicht verwendet wurde, wird das echo ausgeführt

Das geht solange bis alle Titel abgearbeitet werden 😉
 
 
A-Z-Browser

<div class="aznavi">
    <?php
    $args = array (
        'posts_per_page' => $posts_per_page,
        'post_type' => 'post',
        'orderby' => 'title',
        'cat' => '4',
        'showposts' => $limit,
        'order' => 'ASC',
        'paged' => $paged
    );
    query_posts($args);
    $azarray = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
    echo "<ul>";
    if ( have_posts() ) :
        while ( have_posts() ) : the_post();
            $checkTitle = substr(get_the_title(),0,1);
            foreach ( $azarray as $value) {
                if(strtolower($checkTitle) == $value && $oldTitle != $checkTitle) {
                    echo '<li><a href="?letter='.$value.'" title="Zeige alles mit dem Buchstaben ('.$value.')">'.strtoupper($value).'</a></li>';
                    $oldTitle = $checkTitle;
                }
            }
        endwhile;
    endif;
    echo '<li><a href="?letter=all" title="Zeige alles">Alle Titel</a></li>';
    echo "</ul>";
    ?>
</div>

 
 
Und hier kommt dann alles was man in seinem Post machen will.
 
Schleife für den Post

     <?php
    // category 4 => Discography
    $limit = get_option('posts_per_page');
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $catId = "4";

    $args1 = array (
        'posts_per_page' => $posts_per_page,
        'post_type' => 'post',
        'cat' => $catId,
        'showposts' => $limit,
        'paged' => $paged,
        'orderby' => 'date',
        'order' => 'DESC'
    );
    query_posts($args1);
    $wp_query->is_archive = true; $wp_query->is_home = false;
    // Start Loop
    if ( have_posts() ) :
        while ( have_posts() ) :
            the_post();


            $checkTitle = substr(get_the_title(),0,1);
            if(strtolower($checkTitle) == $_GET['letter'] || $_GET['letter'] == "all" || $_GET['letter'] == "") :
                ?>
                <div class="post">
                    <p>
                        Hier stehen deine Posts
                    </p>
                </div>
                <?php
            endif;
            // end of check
        endwhile;
    else:
        ?>
        <div class="post">
            <p>
                <?php _e('Sorry, no posts matched your criteria.', 'dzonia'); ?>
            </p>
        </div>
        <?php endif;
    // end loop
    ?>

 
So sieht es dann aus, muss natürlich noch gestylt werden 😉