Neuigkeiten:

Privates MODX und LINUX BLOG, User Registrierung ist deaktiviert! Fragen oder Tipps? Bitte per Matrix: @jolichter:tchncs.de

Hauptmenü

Neueste Beiträge

#91
CMS / MODx Twitter Feed
Letzter Beitrag von Jo - 2013-01-13 | 18:43:20
Hinweis: Twitter hat seine API v1 am 11. Juni 2013 abgeschaltet (LINK) - leider unterstützt die API v1.1 nur noch JSON und kein RSS-Feed :mad:



Hallo hier stelle ich euch mein
Fading Twitter Feed Ticker
für MODx (benötigt jQuery für das Fading) per cURL und SimpleXML vor

Sollte auch mit file_get_contents funktionieren (ungetestet).

Snippet 'TwitterFeed'
<?php
# V 13.02.003
#
# Mit PHP5 direkt Twitter-XML-Dateien (RSS-Feed) verarbeiten
# Benötigt ein aktiviertes allow_url_fopen oder ein installiertes cURL-Modul!
#
# http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=[DeinTwitterAccount]
#
# Beispiel Chunk Aufruf:
# [[!$TwitterFeed? &TWaccount=`twitter` &TWcount=`10` &TWfading=`5000` &TWtpl=`tplTwitterFeed`]]
#
#
# Variablen -Start------------------->
   $intCount $modx->getOption('limit',$scriptProperties,10);
   $strAccount $modx->getOption('account',$scriptProperties,'twitter');
   $strTargetURL='http://api.twitter.com/1/statuses/user_timeline.rss?screen_name='.$strAccount;
           
$tpl $modx->getOption('tpl',$scriptProperties,'tplTwitterFeed');
           
$intFading $modx->getOption('fading',$scriptProperties,5000);
# Variablen -Ende-------------------<
#
#
# Methode zum abholen der Daten wählen -Start------------------->
if (function_exists('curl_version')) {
# mit cURL XML Daten von Twitter holen
$strArray = array('Accept-Language: '.$_SERVER["HTTP_ACCEPT_LANGUAGE"]);
$ch curl_init();
curl_setopt($chCURLOPT_URL$strTargetURL);
curl_setopt($chCURLOPT_HTTPHEADER$strArray);
curl_setopt($chCURLOPT_CONNECTTIMEOUT4);
curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
$feed curl_exec($ch);
$intReturnCode curl_getinfo($chCURLINFO_HTTP_CODE); 
curl_close($ch);
# prüfe ob die Seite erreichbar ist!
if ($intReturnCode != 200 && $intReturnCode != 302 && $intReturnCode != 304) { return 'ERROR RSS-Feed'; };
}
else if (
file_get_contents(__FILE__) && ini_get('allow_url_fopen')) {
# mit file_get_contents XML Daten holen
$feed file_get_contents($strTargetURL);
}
else
{
    return 
'Weder cURL installiert, noch allow_url_fopen aktiviert!';
}
# Methode zum abholen der Daten wählen -Ende-------------------<


# konvertiert in UTF-8
$feed utf8_encode($feed); 

# Feed als neue SimpleXML Element aufsetzen
$xml = new SimpleXmlElement($feed);

# Namensraum deklarieren
$xml->registerXPathNamespace('twitter''http://api.twitter.com/');
#print_r($xml);
#print $xml->asXML();


$title $xml->xpath('//channel/item/title');
$description $xml->xpath('//channel/item/description');
$pubDate $xml->xpath('//channel/item/pubDate');
$guid $xml->xpath('//channel/item/guid');
$link $xml->xpath('//channel/item/link');


# Platzhalter -Start------------------->
$modx->setPlaceholder('TWaccount'$strAccount);
$modx->setPlaceholder('TWtpl'$tpl);
$modx->setPlaceholder('TWfading'$intFading);

        
$intCount $intCount#(limitiert die Ausgabe)

    
for($i=1$i <= $intCount$i++) {

$modx->setPlaceholder('TWcount'$i);
$modx->setPlaceholder('TWtitle'.$itrim($title[$i]));
$modx->setPlaceholder('TWdescription'.$itrim($description[$i]));
$modx->setPlaceholder('TWpubDate'.$itrim($pubDate[$i]));
$modx->setPlaceholder('TWguid'.$itrim($guid[$i]));
$modx->setPlaceholder('TWlink'.$itrim($link[$i]));

        
$output.= $modx->parseChunk($tpl$modx->placeholders'[[+'']]'); 
    }
# Platzhalter -Ende-------------------<

return $output;




Snippet 'twitterFilter' um den Twitter Namen zu entfernen
<?php
// strip the twitter username

$input preg_replace('@(http?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@''$1'$input);
$intLen strlen($modx->getPlaceholder('TWaccount')) + 1;
return 
substr($input,$intLen);




Snippet 'twitterParser' um die URLs zu formatieren
<?php
// properly formatted URLs

$input preg_replace("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t< ]*)#""\\1<a href=\"\\2\" target=\"_blank\">\\2</a>"$input);
$input preg_replace("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r< ]*)#""\\1<a href=\"http://\\2\" target=\"_blank\">\\2</a>"$input);
$input preg_replace("/@(\w+)/""<a href=\"http://twitter.com/\\1\" target=\"_blank\">@\\1</a>"$input);
$input preg_replace("/#(\w+)/""<a href=\"http://search.twitter.com/search?q=\\1\" target=\"_blank\">#\\1</a>"$input);
 
return 
$input;




Chunk 'TwitterFeed' mit Fading (jQuery) und das Snippet getCache zum Cachen (alle 30 Minuten)
<div id="div_twitter">
<h2>Tweets</h2>
<ul id="tweet">
               [[!getCache?
                  &element=`TwitterFeed`
                  &cacheExpires=`1800`
                  &account=`[[+TWaccount]]`
                  &limit=`[[+TWcount]]`
                  &fading=`[[+TWfading]]`
                  &tpl=`[[+TWtpl]]`]]
</ul>
<p style="text-align: center;">
<img style="float:left; margin:2px 2px 10px 20px;" src="assets/templates/tmp_jolichter/images/twitter_32x26.png" alt="@Twitter" width="20" height="16" />
<a title="Folge [[+TWaccount]] auf Twitter" href="http://twitter.com/[[+TWaccount]]" rel="nofollow" target="_blank">Folge auf Twitter</a>
</p>
</div>



<script type="text/javascript">
<!--
$(document).ready(function(){
var tweets = $("#tweet li");
showt(tweets);
})
var n = 0;
function showt(jq){
jq.eq(n).fadeIn(1000).delay([[+TWfading]]).fadeOut(1000, function(){
n++;
if (n == [[+TWcount]]) { n = 0; };
showt(jq);
});
}
//-->
</script>

Danke Joe Molloy für den Tipp!



Chunk 'tplTwitterFeed'
<li><p>
[[+TWtitle[[+TWcount]]:twitterFilter:twitterParser]]
<br /><br />
<span class="smallfont" style="float:right;"><a href="[[+TWlink[[+TWcount]]]]" target="_blank">[[+TWpubDate[[+TWcount]]:ago]]</a></span>
</p></li>




Ein wenig CSS und fertig  :biggrin:
.tweet{word-wrap:break-word;} #tweet{min-height:120px; position:relative;} #tweet li{display:none;}



Aufgerufen wird der Feed dann einfach so:
[[!$TwitterFeed? &TWaccount=`JoLichter` &TWcount=`10` &TWfading=`5000` &TWtpl=`tplTwitterFeed`]]

Parameter (in Klammer die Standardwerte):
TWaccount: Twitter Name (twitter)
TWcount: Anzahl der Tweets (10)
TWfading: Animationszeit in ms (5000)
TWtpl: Chunk Template (tplTwitterFeed)
#92
CMS / MODX Wetter
Letzter Beitrag von Jo - 2012-08-31 | 23:22:14
Google will die Welt verbessern und hat die Wetter-API abgeschaltet  :confused:

Yahoo Wetter-API funktioniert auch nicht mehr per cURL und SimpleXML... egal, wer ist Yahoo?

Daher wurde der alte Beitrag gelöscht.
Vergesst Google und Yahoo, mit dem DWD und opendata funktioniert das ohne Anmeldung: dwdWetter
#93
LINUX / BackInTime Anleitung
Letzter Beitrag von Jo - 2012-06-04 | 23:44:57
Back In Time ist ein geniales Backup Programm für Linux mit grafischer Oberfläche (GUI) und daher einfach zu bedienen.

Unter Linux reicht es vollkommen aus nur sein /home zu sicheren, da sich dort alle eure Dokumente und Einstellungsdateien befinden.

Eine ausführliche Anleitung mit meinen Settings als Beispiel findet ihr hier als PDF Anhang.

Nachtrag:
Zwei Backup Ordner auf externer Festplatte mit jeweiligen User-Rechten erstellen.
Festplatte per Partitionsverwaltung mit ext3/ext4 oder btrfs formatieren, Partitionsname z.B.: USB-BACKUP
Ordner z.B. für Paul und Marianne erstellen, wenn Paul angemeldet ist.

1) Ordner paul und marianne erstellen:
sudo mkdir -p /media/paul/USB-BACKUP/backintime/{paul,marianne}
2) Ordner paul, Eigentümer und Gruppe paul vergeben
sudo chown $USER:$USER /media/paul/USB-BACKUP/backintime/paul/
3) Ordner marianne, Eigentümer und Gruppe marianne vergeben
sudo chown marianne:marianne /media/paul/USB-BACKUP/backintime/marianne/

:-[


Wichtig: Alle Dateien im /home/DeinName/ sollten euch gehören! Mehr Infos siehe KDEtweaks.sh und "Zugriffsrechte/Besitzer aktualisieren".

Prüfen:
find ~ ! -user $USER -ls
alle Dateien im "/home/USER" dem angemeldeten User zuordnen:
sudo chown -R $USER:$USER /home/$USER/

#94
CMS / MODX Accordion
Letzter Beitrag von Jo - 2012-04-30 | 21:12:57
Akkordeon Menü unter MODx Revo mit Wayfinder & jQuery UI
Quelle: jQuery UI Accordion

Link MODx Demo Seite

Wayfinder Aufruf
[[!Wayfinder? &startId=`0`
              &level=`2`
              &outerTpl=`accOuter`
              &parentRowTpl=`accParentRow`
              &activeParentRowTpl=`accActiveParentRow`
              &innerTpl=`accInner`
              &rowTpl=`accRow`
              &innerRowTpl=`accInnerRow`
              &cssTpl=`accCSS`
              &jsTpl=`accJS`
              &hereTpl=`accHere`]]





CHUNKS

accActiveParentRow
<li><a class="menuitem submenuheader" id="active-submenuheader" href="[[+wf.link]]">[[+wf.linktext]]</a>[[+wf.wrapper]]</li>


accHere
<li><a id="active-menu" href="[[+wf.link]]">[[+wf.linktext]]</a></li>

accInner
<ul class="submenu">
[[+wf.wrapper]]
</ul>


accInnerRow
<li><a href="[[+wf.link]]">[[+wf.linktext]]</a></li>

accJS
animated: slide oder bounceslide
event: click oder mouseover
<script type="text/javascript">
    $(function() {
    $( "#accordion" ).accordion({ header: '.submenuheader',
                                  fillSpace: false,
                                  autoHeight: false,
                                  animated: 'slide',
                                  event: 'click',
                                  navigation: true
                                  });
    });
</script>


accOuter
<div class="accordion-menu">
  <ul id="accordion">
   [[+wf.wrapper]]
  </ul>
</div>


accParentRow
<li><a class="menuitem submenuheader" href="[[+wf.link]]">[[+wf.linktext]]</a>[[+wf.wrapper]]</li>

accRow
<li><a class="menuitem" href="[[+wf.link]]">[[+wf.linktext]]</a></li>

accCSS
<style type="text/css">
.accordion-menu {
        margin-left: 0px;
width:200px;
font:11px "Verdana";
}
.accordion-menu a.menuitem{
        background:#330000;
font:bold 11px "Verdana";
color:#fff;
text-decoration:none;
display:block;
width:auto;
padding:3px 0 3px 5px;
border-top:1px solid #fff;
        outline:none;
        border-radius:3px;
}
.accordion-menu li{
list-style-type:none;
}
.accordion-menu a.menuitem:visited, .accordion-menu .menuitem:active{
}
.accordion-menu a.menuitem:hover{
background:#123;
}
.accordion-menu ul.submenu{
width:auto;
list-style-type:none;
}
.accordion-menu ul.submenu li{
text-indent:5px;
background:#d3d3d3;
display:block;
width:auto;
        border-radius:3px;
}
.accordion-menu ul.submenu li a{
text-indent:5px;
background:#d3d3d3;
display:block;
width:auto;
color:#123;
padding:3px 0 3px 5px;
border-top:1px solid #fff;
text-decoration:none;
        border-radius:3px;
}
.accordion-menu ul.submenu li a:hover{
        background:#fff;
}
#active-submenuheader{
background:#123;
color:#fff;
font:bold 11px "Verdana";
display:block;
width:auto;
padding:3px 0 3px 5px;
border-top:1px solid #fff;
}
#active-menu{
background:#fff;
font:bold 11px "Verdana";
}
</style>


:-[
#95
LINUX / Antw:LMDE Update Pack 4
Letzter Beitrag von Wasi - 2012-04-19 | 18:23:40
Beim Backup erstellen per BackInTime ist mir noch ein falscher chmod im Ordner .config/nautilus-actions aufgefallen.

Dort hatte der Eigentümer keine Leserechte!

Also schnell den Ordner auf chmod 0755 geändert und BackInTime erstellt Backups ohne Fehler.

Info zu Nautilus-Actions: Das ist eine Erweiterung für den Nautilus (Dateimanager), der das Ausführen von Aktionen über das Kontextmenü erlaubt (z.B. Senden an...).
#96
LINUX / Antw:ecryptfs - home unter Deb...
Letzter Beitrag von Wasi - 2012-04-15 | 20:29:10
Eine verschlüsselte SWAP die ihr mit dem Befehl "ecryptfs-setup-swap" erstellt habt, kann man wie folgt wieder rückgängig machen.

Angenommen eure SWAP Partition ist sda1:

- sudo swapoff -a
- sudo cryptsetup remove /dev/mapper/cryptswap1
- sudo remove /etc/crypttab
- sudo /sbin/mkswap /dev/sda1
- sudo swapon /dev/sda1
- sudo gkgedit /etc/fstab
   *Ersetzt /dev/mapper/cryptswap1 mit /dev/sda1*
- sudo swapon /dev/sda1

Mit sudo swapon -s kann man den Stand der SWAP Datei überprüfen.
#97
LINUX / LMDE Update Pack 4
Letzter Beitrag von Wasi - 2012-04-11 | 10:05:02
Auf dieses Update mussten LMDE-User lange warten.
*Linux Kernel 3.2 / Gnome2 to Gnome3 - ich favorisiere jedoch Cinnamon*

Grund der Verzögerung: Wenn Debian Gnome 3.2 hat, geht es mit LMDE weiter und bekommt dann Cinnamon (btw: Cinnamon hat das Zeug ein guter Gnome2 Nachfolger zu werden).

Bei mir hatte das Update über 1200 Dateien! Für ein RR (Rolling Release) ist das eigentlich untragbar  :eek:

Ich hatte mich auf ein System gefreut, dass ich nicht mehr neu aufsetzten muß um immer aktuell zu bleiben. Ich hoffe das LMDE nun wieder in die richtige Richtung geht und häufiger Updates bringt.

Wenn ihr euch dieses Wahnsinns-Update (bei mir 5 Stunden) nicht antun wollt, solltet ihr auf die neue Iso-Version warten. Damit LMDE erst live testen und dann sauber neu installieren. Wer sein /home auf einer extra Partition hat, wird damit wohl kaum Probleme haben.




Nachtrag: Fehlermeldung beim Herunterfahren nach dem LMDE Update Pack 4 bekam ich beim Herunterfahren des Systems folgende Fehlermeldung:

Umounting temporary filesystems...umount: /var/run: device is busy

Anscheinend ist die Verlinkung falsch. Der Ordner /run verlinkt auf /var/run und dieser widerum ist auf /run verlinkt. Dabei muss nur /var/run auf /run verlinkt sein.

Deshalb habe ich den Ordner /run per su umbenannt und einen Neuen erstellt.
Nach einem neuen Systemstart wird /run dann wieder korrekt angelegt und die Fehlermeldung beim Herunterfahren ist bei mir weg.

mv /run run--old
mkdir /run


:-[  O0
#98
CMS / EditOwnResources
Letzter Beitrag von Jo - 2012-04-08 | 15:21:54
Plugin: EditOwnResources
(Allow mgr user to only edit own resources)

Ziel: User dürfen nur eigene Ressourcen bearbeiten.

<?php
# hier im Plugin 'System Events'
# OnBeforeDocFormDelete und OnDocFormPrerender aktivieren!
#
# optional: Access Controls (Policy)
# 'Quick Update Resource' (resource_quick_update) deaktivieren
# da sonst ein Bearbeiten per Quick Update möglich ist
#
# $modx->setDebug(E_ALL & ~E_NOTICE);
# $modx->setLogLevel(modX::LOG_LEVEL_DEBUG);

if ($mode == modSystemEvent::MODE_NEW) {
  return;
}

$managerPath $modx->config['site_url'].'manager';
$authorId $resource->get('createdby');

if (isset(
$authorId)) {
     if (
$modx->user->isMember(array('Administrator')) or
        (
$modx->user->get('id') == $authorId))
     {
        
#mache nichts, also Ressorcen Zugriff erlauben
     
} else {
     
$modx->sendRedirect($managerPath);
     }
}
  return;
#99
CMS / User Media Sources
Letzter Beitrag von Jo - 2012-04-08 | 10:10:19
Ziel: Jeder User soll unter MODx Revo 2.2 oder höher sein eigenen Media Sources Ordner bekommen.

Dazu lege ich für jeden User unter "assets/content/user/" einen Ordner mit dessen User ID an, z.B.: "assets/content/user/2/"

Dann noch ein Snippet getUserID
<?php
// return userid
return $modx->user->get('id');

und in der entsprechenden Media Source (z.B. myFolder) als basePath und baseUrl assets/content/user/[[getUserID]]/ eintragen.

Im TAB Access Permissions z.B.
[tt]Administrator - Super User - Media Source Admin
Manager - Editor - Media Source Admin[/tt]
eintragen und Flush Permissions nicht vergessen  :wink:



Wer will kann sich den User-Ordner automatisch anlegen lassen.
Snippet getUserID
<?php
// get userid
// $UserID = $modx->user->get('id');
$UserID $modx->getLoginUserID('mgr');

// check proper path alignment!
$users_folder $modx->getOption('assets_path').'content/user/'.$UserID.'/';
// $modx->log(modX::LOG_LEVEL_ERROR,$users_folder);


// create an user folder
if (!file_exists($users_folder)){
    
mkdir($users_folder,0755);
    }

return 
$UserID;


Unter den Users Settings dann noch per 'default_media_source' eine Media Sources zuordnen, damit der User diese direkt als Auswahl bekommt und fertig.
#100
LINUX / Antw:hplip-Treiber (HP-Drucker...
Letzter Beitrag von Wasi - 2012-03-16 | 11:17:59
Der HP Color LaserJet CP2025dn Drucker rennt auch unter Linux

Getestet mit HPLIP Version (LMDE 3.11.5) 3.12.2 unter Debian 6 testing (sid), Link: CP2025dn

:-[  O0