PHP rocks! wünscht allen Mitgliedern einen guten Rutsch ins neue Jahr 2017 !!!
Hinweis: Das Forum zieht um! Um keine Datenverluste zu haben, schalten wir zwecks Übernahme der Daten das Forum am Sonntag, den 24.04.2016 um ca. 21:00 Uhr offline und passen anschliessend die DNS-Einträge an.
www.php-rocks.de wird euch dann nach den Aktualisierungen der DNS-Server wieder wie gewohnt uneingeschränkt zur Verfügung stehen.
Danke für euer Verständnis!

Hallo, Gast
Du musst dich registrieren bevor du auf unserer Seite Beiträge schreiben kannst.

Benutzername/E-Mail:
  

Passwort
  





Durchsuche Foren

(Erweiterte Suche)

Foren-Statistiken
» Mitglieder: 303
» Neuestes Mitglied: Gebby
» Foren-Themen: 376
» Foren-Beiträge: 1.101

Komplettstatistiken

Aktive Themen
PHPMailer Pfad wird nicht...
Forum: Webserver
Letzter Beitrag: Gebby
Vor 7 Stunden
» Antworten: 0
» Ansichten: 3
KAUFEN SIE EINEN FÜHRERSC...
Forum: NoSQL Datenbanken
Letzter Beitrag: joness
15.07.2022, 02:23
» Antworten: 0
» Ansichten: 81
KAUFEN SIE EINEN FÜHRERSC...
Forum: Andere SQL Datenbanken
Letzter Beitrag: joness
15.07.2022, 02:22
» Antworten: 0
» Ansichten: 202
FÜHRERSCHEIN KAUFEN https...
Forum: PostgreSQL
Letzter Beitrag: joness
15.07.2022, 02:20
» Antworten: 0
» Ansichten: 104
FÜHRERSCHEIN KAUFEN https...
Forum: MySQL
Letzter Beitrag: joness
15.07.2022, 02:19
» Antworten: 0
» Ansichten: 109
FÜHRERSCHEIN KAUFEN https...
Forum: PHP Template Engines
Letzter Beitrag: joness
15.07.2022, 02:15
» Antworten: 0
» Ansichten: 113
FÜHRERSCHEIN KAUFEN https...
Forum: PHP Frameworks
Letzter Beitrag: joness
15.07.2022, 02:12
» Antworten: 0
» Ansichten: 109
FÜHRERSCHEIN KAUFEN https...
Forum: PHP Professional
Letzter Beitrag: joness
15.07.2022, 02:09
» Antworten: 0
» Ansichten: 124
FÜHRERSCHEIN KAUFEN https...
Forum: PHP Basics
Letzter Beitrag: joness
15.07.2022, 02:06
» Antworten: 0
» Ansichten: 122
CNC Precision Machining
Forum: PHP Basics
Letzter Beitrag: fewfg668
14.07.2022, 05:32
» Antworten: 0
» Ansichten: 94

 
  ui.router und jQuery mobile
Geschrieben von: Till - 18.05.2016, 12:46 - Forum: JavaScript / JavaScript Frameworks / Ajax - Antworten (6)

Hallo,
so, mit dem ui.router (siehe anderer Thread) bin ich nun weiter und hab es begriffen.

Jetzt habe ich ein Problem mit ui.router in Verwendung mit jQuery mobile:

Code:
     if(false===navigator.isDesktop){
    $locationProvider.html5Mode({
           enabled: false,
          requireBase: false
        });
        $locationProvider.hashPrefix('#');
 }else{
  $locationProvider.html5Mode(false);
 }
funktioniert nicht insofern er wenn jqm initialisiert wurde IMMER den htm5 mode verwendet.

Zur Info:
Im html5 Modus wird der "pushState flow" verwendet, die URL wird also als "echte" URL aufgerufen
und nicht als #hash anker.

Auf der Testseite kann man sehen was ich meine, wenn man sie jeweils mit einem
Desktop device oder einem mobile device aufruft:
http://test.freizeittreffen.de/pmx/
(Bei Verwendung von device emulator ist ein cache refresh erforderlich!)

Um den jqm push state modus zu vermeiden (für solche Fälle nutze ich meine eigene direktive http://www.jsclasses.org/blog/package/445/post/1-Fast-Migration-of-Regular-Sites-to-Mobile-using-Flow-Library.html ) hänge das rel="external" attribut an ausgehende links.
Dies funktioniert auch ganz gut, solange ich nicht den angular ui.router verwende.
Also:
- jqm geht
- ui.router geht
- beides zusammen -> conflict


Meine jqm initialisierung sieht so aus (wird aufgerufen wenn KEIN desktop device):
Code:
    var initialPageWrap = frdl.$q('body *[data-role="page"]');
  if(0 === initialPageWrap.length){
$('body' ).wrapInner( '<div data-dom-cache="false" data-role="page" data-frdl-mod="nodesktop" id="nodesktop-'+ str_replace('.', '-', new frdl.Url().getHost()) + '-' + Sha1.hash(new frdl.Url().urlMakeNew()) + '-' + Sha1.hash(document.title) +'" style="top:0px;left:0px;right:0px;bottom:0px;height:auto;width:auto;"></div>' );
  }    
  try{
 
         
    frdl.watchFor('a[href*=":\/\/"]:not([data-flow-prepared="true"]):not([frdl-ajax-link-boddystripped])').every(function(el){
        $(el).attr('data-flow-prepared', 'true')
             .attr('rel', 'external');
     });
     
     
       $('*[data-role="page"]').page({
                        create: function( event, ui ) {
                              $.mobile.pushStateEnabled = false;
                              $.mobile.initializePage();      
                          $.mobile.loading( 'hide' );
                        }
          });  
                   
               
                   
                       
           $('*[data-role="page"]').trigger('create');
           $.mobile.pushStateEnabled = false;
         
                             
}catch(err){
console.error(err);
}

In Internetforen habe ich gelesen man solle
Code:
<script> $.mobile.pushStateEnabled = false;</script>
bereits im HEADER der Seite deklarieren.
Das $.mobile wird allerdings bei mir asynchron geladen per $.lazy http://unwrongest.com/projects/lazy/ geladen
und jqm wird (wenn erforderlich) erst initialisiert wenn DOMContentLoaded.
Eine Verwendung von $.mobile im Header würde jqm zu früh und ungewollt laden!

Ich habe versucht das "normale Verhalten zu emulieren" indem ich das ui.router url prefix lösche und
$locationProvider.hashPrefix('#'); als hash prefix setzte.
Dies funktioniert zum einen nicht und ist zum anderen auch keine saubere Lösung.


Zusammenfassung:
Wie kann ich  $.mobile.pushStateEnabled = false; erzwingen?

Drucke diesen Beitrag

  [Entwicklung] Die UTF8-Verschw�rung
Geschrieben von: Arne Drews - 15.04.2016, 16:04 - Forum: Tutorials - Keine Antworten

Die UTF8-Verschw�rung
Man mag es kaum glauben, aber auch in der heutigen Zeit werden Projekte online gestellt, die ein Problem mit Sonderzeichen haben. In diesem kleinen Tutorial möchte ich euch das Ganze etwas näher bringen, in der Hoffnung, dass die Mystik dessen etwas verschwindet.


Was bedeutet "Sonderzeichen"?
Um den Begriff Sonderzeichen im Zusammenhang mit diesem Tutorial zu definieren, sollte man wissen, dass wir von sogenannten Zeichenkodierungen und Kodierungstabellen sprechen. Alle Zeichen, die wir auf dem Bildschirm darstellen können, entstammen aus einer Zeichenkodierungen-Tabelle. Wenn wir nun versuchen ein Zeichen auszugeben, das sich in der verwendeten Tabelle nicht befindet, kommt es zu unerwünschten Ausgaben, die wir sicher alle schon mal gesehen haben.

Als Beispiel soll dieses kleine HTML mal herhalten:

Code:
<html>
<head>
<title></title>
</head>

<body>

<p>Hier steht ein ganz gewöhnlicher Satz mit lauter bekannten Zeichen</p>

</body>
</html>
Soweit ja nichts besonderes und relativ unspektakulär... Aber Moment... Im Browser sieht das auf einmal eher komisch aus:
Ausgabe:
Hier steht ein ganz gew�hnlicher Satz mit lauter bekannten Zeichen
Hier haben wir ein Problem mit der Zeichenkodierung. Die von uns verwendete scheint das ö nicht zu kennen und macht daraus eine sonderbare Konstellation.


Wo liegt mein Fehler?
Hier liegt ein Problem mit der Zeichenkodierung vor. Zugegeben, hier wäre es mit ein wenig Erfahrung leicht, die Kodierung an der richtigen Stelle zu setzen, um alles korrekt anzeigen zu lassen. Aber wir wollen heute mal alles richtig machen und schauen uns dazu mal kurz im Überblick an, an welchen Stellen wir auf eine korrekte Kodierung achten und diese konsequent auch einsetzen sollten:
  • Speicherung von Dateien
  • HTTP Header
  • Im HTML als <meta>-Tag
  • Datenbankverbindungen
  • Datenbank-, Tabellen- und Spaltenkollation
Ui... Für einige vielleicht schon zu viele unbekannte Begriffe?
Keine Angst, was das im einzelnen bedeutet, gehen wir jetzt mal Schritt für Schritt durch...


Speicherung von Dateien
Eure Dateien sollten immer als UTF-8 ohne BOM gespeichert werden. Viele gute Editoren oder IDE's bieten die Möglichkeit, die Kodierung beim Speichern einer Dateien einzustellen.
Beispielhaft wäre das im SublimeText 3 über den Menüpunkt File -> Save with Encoding -> UTF-8 erledigt oder ihr geht auf File -> Reopen with Encoding -> UTF-8 und speichert die Datei dann wieder.
Aber auch andere Editoren, wie bspw. Notepad++ haben diese Möglichkeiten.
Hinweis
Das BOM ( ByteOrderMark ) ist eine Kennung für die Unicode-Kodierung, die den Datenstrom einleitet und im Falle von UTF8 aus der Bytesequenz EF BB BF besteht.
Das wird in Browsern häufig als  interpretiert und ausgegeben ( im Quelltext des Browsers erkennbar ).
Das führt häufig zu bekannten Fehlern, wie Cannot add header information. Daher sollte man immer darauf achten, dass Dateien immer ohne BOM gespeichert werden!
Das gilt übrigens für alle Dateien ( .html, .php, .css, .js, usw. )!


HTTP Header
Im HTTP-Header werden Informationen über das Dokument, sowie HTTP-Cookies und Kennungen für den HTTP-Server, User-Agent und MIME-Typ übertragen.
Hier muß für unseren Zweck die entsprechende Kodierung bestimmt werden. Das geht bspw. über folgende PHP-Anweisung:
PHP-Code:
header 'Content-Type: text/html; Charset=utf-8' ); 
Hinweis
Bei der Verwendung der header()-Anweisung ist darauf zu achten, dass diese am Anfang des Root-Scriptes vor sämtlichen Ausgaben erfolgt, da ihr sonst schnell wieder den bereits erwähnten Fehler Cannot add header information bekommt.


<meta>-Tag
Um auch dem Browser mitzuteilen, welche Codierung wir in dem Dokument verwenden, müssen wir dies per <meta>-Tag entsprechend dem verwendeten <!DOCTYPE mitteilen:

Für Dokumente mit HTML4.x-Doctype:
Code:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
Für Dokumente mit HTML5-Doctype:
Code:
<meta charset="utf-8">
Der <meta>-Tag wird im <head> des Dokuments, am besten direkt nach dem <title>-Tag angegeben.
Tipp
Solltet ihr Formulare verwenden, setzt am besten auch darin gleich die korrekte Kodierung für die Datenübertragung:
Code:
<form name="form" method="post" accept-charset="utf-8">


Datenbankverbindung
Verwendet ihr in eurem Projekt eine Datenbank, ist natürlich auch darauf zu achten, dass die Daten über eine einheitliche Kodierung ausgetauscht werden.
Für die Verbindung mit der Datenbank ( hier beispielhaft MySQL ) können wir dies wie folgt angeben:

PDO:
PHP-Code:
$oDB = new PDO'mysql:host=localhost;dbname=exampledb;charset=utf8'$username$password ); 
MySQLi:
PHP-Code:
$oDB = new MySQLi 'localhost'$username$password'exampledb' );
$oDB->set_charset'utf8' ); 
Hinweis
In Bezug auf PDO sei erwähnt, dass der Parameter charset im DSN ( Data Source Name ) in PHP-Versionen vor 5.3.6 ignoriert wurde. Solltet ihr tatsächlich noch eine dieser Versionen haben, müsst ihr die Kodierung ähnlich folgender Weise setzen:
PHP-Code:
$options = array( MYSQL_ATTR_INI_COMMAND => 'set names utf8' );
$oDB = new PDO'mysql:host=localhost;dbname=exampledb'$username$password$options ); 
Noch besser wäre es natürlich, wenn ihr in dem Falle eher die PHP-Version updated!


Kollation der Tabellen, Spalten und der Datenbank selbst
Wenn wir dafür sorgen, dass die Verbindung zur Datenbank sauber über UTF-8 abgewickelt wird, müssen wir natürlich auch die Datenhaltung sinnvoller Weise darauf auslegen.
Hierzu gibt es in Administrations-Tools, wie etwa phpMyAdmin ( MySQL ), pgAdmin ( pgSQL ), u.w. eine Einstellung, die sich Kollation ( Collation ) nennt. Hier kann sowohl auf Datenbank-, Tabellen- und Spalten-Ebene festgelegt werden, mit welcher Kodierung gearbeitet werden soll.

Die gängigsten Kollationen in dem Bereich Unicode sind utf8_unicode_ci und utf8_general_ci. Nennenswerter Unterschied ist die genauere Sortierung bei utf8_unicode_ci, während utf8_general_ci etwas mehr Performance nachgesagt wird. Weitere nennenswerte Unterschiede sind mir von den verschiedenen utf8_-Kodierungen nicht bekannt. Ein Spezialfall bildet allerdings utf8_bin, das die Vergleiche im Binär-Format durchführt.

Hinweis
Sollte euer verwendetes DBMS utf8mb4 unterstützen, wäre das die noch die bessere Wahl. Damit stehen euch bis zu 4 Bytes pro Character zur Verfügung, womit ein zusätzlicher Umfang an Character dargestellt werden kann. MySQL unterstützt utf8mb4 ab Version 5.3.3

Danke an @mermshaus für die Info: http://www.php-rocks.de/thema/143;777-re-utf-8-verschwoerung-ergaenzung.html#pid777



Sonderfälle
Aus diesem Tutorial solltet ihr mitnehmen, dass ihr immer mit der richtigen Kodierung arbeitet und zwar an jeder Stelle, an der ihr Einfluss darauf habt!
Es gibt allerdings Situationen, in denen man vielleicht keinen Einfluss auf die Daten-Kollation hat. Bspw. bei einer Datenbank-Migration aus einer alten Datenbank in eine neue. Die alte Datenbank hält die Daten nicht in UTF-8 vor und ihr müsst diese zu UTF-8 in die neue übertragen. Hier wäre bspw. die PHP-Funktion utf8_encode() oder mb_convert_encoding() zu verwenden.

Hinweis
Vielleicht ist dem einen oder anderen bereits aufgefallen, dass auf Datenbank- und Datenbankverbindungs-Ebene grundsätzlich utf8 und in allen anderen Kontexten utf-8 verwendet wird. Wer sich daran hält, spart sich manche Fehlersuche...

Drucke diesen Beitrag

  C# - Outlook Plugin: Ribbon nicht sichtbar und Zugriff auf selektierte Mails?
Geschrieben von: Arne Drews - 24.03.2016, 20:47 - Forum: Off Topic - Keine Antworten

Hallo,

Hinweis
Ich habe das Thema bereits in einem anderen Forum laufen ( http://entwickler-forum.de/showthread.php/75109-Outlook-Plugin-Ribbon-nicht-sichtbar-und-Zugriff-auf-selektierte-Mails ), denke aber leider nicht, dass dort trotz guter Hilfe eine Lösung gefunden wird. Daher erstelle ich den Beitrag hier noch einmal und gebe das auch in dem anderen Forum bekannt, damit ich niemanden wegen CrossPost zu nahe trete. Sollte es extern eine Lösung geben, werde ich diese hier ebenfalls posten, wie auch umgekehrt.

Zum Thema:
Ich wollte gerne ein kleines Outlook-Plugin schreiben, mit dem ich per Button-Klick aus einem Ribbon-Menü über eine Liste markierter E-Mails iteriere und dessen Informationen verarbeite.

Das erste Problem habe ich bereits bei der Erstellung des Ribbon.
Ich habe mich dazu an diese Anleitung gehalten: https://youtu.be/3ucCxRrcgWA
Ist zwar am Beispiel von Word, aber ich denke, dass sollte adaptierbar sein.

Jedenfalls wird mir das Ribbon gar nicht angezeigt.

Kurze Erklärung zur Vorgehensweise:
Ich habe mit Visual Studio 2010 ein neues C#-Projekt ( Office -> 2010 -> Outlook 2010-AddIn ) angelegt.
Darin über Rechtsklick -> Hinzufügen -> Neues Element -> Office -> Menüband ( Visueller Designer ) hinzugefügt.
Den Scope des Ribbon, Tabs und des Button habe ich als public definiert ( als Versuch, weil beim Standard "Integrated" auch nichts zu sehen war ).

Das Ribbon wird aber wie gesagt nicht angezeigt?
Über Optionen -> AddIns in Outlook finde ich mein AddIn angehakt in den COM-Elementen. "Laden beim Starten" ist auch gesetzt.

Wenn ich Outlook starte bekomme ich diese Systemmeldung:
Ausgabe:
System.ArgumentException: Der Wert liegt außerhalb des erwarteten Bereichs.
  at
Microsoft.VisualStudio.Tools.Applications.Deployment.ClickOnceAddInDeploymentManager.GetManifests(TimeSpan timeout)
  at
Microsoft.VisualStudio.Tools.Applications.Deployment.ClickOnceAddInDeploymentManager.InstallAddIn()

ClickOnce benötige ich für das Projekt nicht, ist aber automatisch mit eingebunden. Ich habe keine Ahnung, wie ich das aus dem Projekt entferne oder den Fehler sonst beheben kann.
Im Netz finde ich zu dem Fehler so gut wie nur, dass man den Anwendungscache löschen/entfernen soll. Das habe ich gemacht, aber ohne Erfolg.
Der Fehler bleibt.

Ich habe inzwischen verschiedene Versionen des VS verwendet, um zu sehen, ob es daran lag, aber ganz egal mit welcher Kombination, ich bekomme immer obigen Fehler beim Starten von Outlook.


Ich freue mich über Hilfe und Ratschläge!
Danke

Drucke diesen Beitrag

  Android Tablet Probleme
Geschrieben von: Till - 23.03.2016, 16:05 - Forum: JavaScript / JavaScript Frameworks / Ajax - Antworten (5)

Hallo,
ich habe hier ein Android Tablet bei welchem im mitgelieferten Browser (wird wohl Chrome sein?) die Seite nicht wie gewünscht rendert.
Einige javascripte, insbesondere jQuery Mobile,werden hier nicht oder nicht richtig ausgeführt.
Im Firefox auf dem gleichen System gibt es keinerlei Probleme.
Auch wenn ich die Seite auf meinem Desktop PC im Emulator (Opera + Chrome) debugge werden keinerlei Fehler angezeigt.

Ich habe noch nicht herausbekommen wie ich auf diesem Tablet-Browser eine Fehlerkonsole anzeigen kann!?!

Testseite: shell.frdl.de

Drucke diesen Beitrag

  SQL Server Agent: Typenkonflikt
Geschrieben von: Arne Drews - 03.03.2016, 04:33 - Forum: Andere SQL Datenbanken - Antworten (1)

Hallo,

Ich habe auf einem MSSQL-Server 2012 einen Job laufen, der die Daten einer Sicht in eine CSV spielt.
Die Sicht habe ich heute in einer anderen Datenbank ( gleicher SQL-Server! ) neu aufgebaut und bekomme nun ein Typkonflikt für die Replace-Funktion ( VBScript ):

Code:
If dboColumn.Name = "Description" Then
   Set oRegExp = new RegExp
   With oRegExp
           .IgnoreCase = True
           .Global = True
           .MultiLine = True
           .Pattern = "<.*?>"
    sHtmlStripped = .Replace( dboColumn.Value, "" )
   End With
   Set oRegExp = Nothing
End If
Die Spalte Description ist sowohl in der alten Sicht, wie auch in der neuen vom Datentyp text.
Das Script ist an der Stelle absolut identisch, daher kann ich mir den Typkonflikt nicht erklären.

Vielleicht hat ja jemand eine Ahnung, woran das liegen könnte?

Das Protokoll sagt das:
Code:
Fehlerquelle= Laufzeitfehler in Microsoft VBScript  Fehlerbeschreibung: Typenkonflikt: 'Replace'    Fehler in Zeile 76.
Zeile 76 ist das Replace oben.

Danke und Gruß
Arne

Drucke diesen Beitrag

  ui.router - Fragen über Fragen...
Geschrieben von: Till - 25.02.2016, 14:22 - Forum: JavaScript / JavaScript Frameworks / Ajax - Antworten (4)

Auch auf die Gefahr hin das ich es selber werd lösen können schmeiß ich mal als Neuling folgende Fragen in den Raum:

Frage 1)
Ich habe ein Template projects.html

Code:
<div ng-controller="projectsCtrl as projectsCtrlInstance">

<h4>Projects</h4>

<ul>
    <li ng-repeat="p in projects">
     <!-- {{$index + 1}}. -->
     <p><strong ng-bind="p.title"></strong></p>  
     <p><span ng-bind="p.dir"></span></p>
    </li>

</ul>


</div>

Und einen stateProvider:
Code:
...
        
    .state( {
      name : 'projects',    
      url: "/projects/:parentProjectID",
      views: {
        "viewA": { templateUrl:  AppData.__DIR__+'templates/projects.html',
                   controller:'projectsCtrl'  },
        "viewB": { templateUrl:  AppData.__DIR__+'templates/project.html' }/**/
       }
     })    
...

Wie man sehen kann ist der Controller projectsCtrl im Template und im stateProvider definiert und wird demzufolge bei mir auch zweimal ausgeführt!
Wo ist der richtige Platz?
Im template kann ich mehrere Controller verwenden und diese auch außerhalb des views, so wie ich es verstehe ist dann der controller im stateProvider ein optionaler state-bezogener zusätzlicher Controller...?

...und damit zu Frage zwei...2)
Im Template main.html habe ich einen Link um die oben unter 1 genannte Geschichte aufzurufen:
Code:
<a ui-sref="projects({projectID:'0', reload:true})"><span>Projects</span></a>
Mein Problem hier ist, daß ich den Link ZWEIMAL klicken muß bis der Scope gerendert wird, also die gewünschten Projekte angezeigt werden.
Laut console werden die Daten jedoch eigentlich schon beim ersten klick in den scope geladen.
Code:
.controller('projectsCtrl', [ '$scope', '$element', '$compile', '$http', '$location', 'API_CLIENT_URL', '$stateParams',
                       function($scope,   $element,   $compile,   $http,   $location,   API_CLIENT_URL, $stateParams) {
            /* todo promise4 */               
       var cb = '__JSONPCALLBACK_projects_'+mt_rand(1000,9999);                    
       frdl.cbs[cb] = function(result){
            console.log('Fetching project');
       /*     frdlBounce(result);
             alert(JSON.stringify(result)); */
         $scope.projects = result.projects;    
/* hilft auch nicht: frdl.UI.Compile(1); */
        $compile($element.contents())(angular.element($element).scope());  
    
          frdl.cbs[cb]=undefined;
      } ;    
      if('undefined'===typeof $stateParams.parentProjectID)$stateParams.parentProjectID=0;
       var cmd = 'frdl project childs --project='+$stateParams.parentProjectID+' -bd --callback=frdl.cbs.'+cb+' --expect=jsonp';
      /* alert(JSON.stringify($stateParams)); */
      
        
        $.cliExec(cmd);      
  }])


Ich glaube hier noch irgendein Verständnisproblem zu haben?
Ich fasse nochmal zusammen:
Ich muß zweimal klicken damit der View upgedated wird.

Drucke diesen Beitrag

  $.ajax - JSONP vs. JSON - parse error
Geschrieben von: Till - 23.02.2016, 17:04 - Forum: JavaScript / JavaScript Frameworks / Ajax - Antworten (3)

Ich habe einen Ajax Request (API, bisher ohne diese Probleme im Einsatz) welcher eigentlich problemlos funktioniert.
Wenn ich allerdings bei einer bestimmten Funktion JSONP benutze wirft der jQuery Error Handler einen "parsererror", also bei

Code:
dataType: 'jsonp'
Das eigentliche Script funktioniert allerdings! D.h. die Daten werden korrekt der callback Funktion übergeben und die Funktionalität ist eigentlich gegeben bis auf diese unschöne Fehlermeldung.

Wenn ich einen "normalen" ajax request verwende, also
Code:
dataType: 'json'
erscheint auch die Fehlermeldung nicht, es wird allerdings natürlich auch das callback nicht ausgeführt und das script nicht injeziert.

Ist das ein jQuery Problem oder mache ich da irgendwas falsch?
Und ist es nicht so, daß bei einem jsonp request jQuery das result eigentlich gar NICHT parsen muß, dies sollte doch eigentlich alles von der callback Funktion gehandelt werden?
Es solllte hier doch eigentlich gar kein ajax request stattfinden sondern eine script injektion?
Oder macht jQuery das nicht automatisch, sollte ich überhaupt $.ajax für jsonp requests verwenden oder einen anderen/eigenen wrapper, vielleicht ist es eigentlich nicht dafür angedacht?

Drucke diesen Beitrag

  HTML E-Mails versenden mit dem SwiftMailer
Geschrieben von: Arne Drews - 21.02.2016, 23:00 - Forum: Tutorials - Keine Antworten

Hinweis
Die aktuelle Version des SwiftMailer ist im Standard nur noch als Installation über composer gedacht. Einige kennen meine Ansicht über den Zwang dieses Tool benutzen zu müssen. Das Tool ist gut für seinen Zweck, aber es ist eine Schande, dass Einsteiger/Anfänger gezwungen werden, sich diesem anzunehmen. Ein Produkt/PlugIn sollte aus meiner Sicht für jeden Anwender mit einfacher Anleitung installierbar sein ohne weitere Tools dafür einsetzen zu müssen!

Wer keinen Composer installieren möchte oder kann, hat die Möglichkeit auf PHProcks! ein PreComposed Package herunterzuladen. Dieses Package ist mit Composer erstellt worden und kann direkt verwendet werden. Es ist kein Composer zur Nutzung notwendig.

Den Download findet ihr hier: SwiftMailer | PreComposed Package
Die Nutzung ist dann wieder wie unten unter Das Transport-Objekt beschrieben.

HTML E-Mail versenden mit dem SwiftMailer
Dieses Tutorial soll den SwiftMailer als Alternative zum PHPMailer kurz vorstellen. Eine Ausführung, warum man generell eine Mailer-Klasse verwenden sollte, findet ihr in diesem Tutorial, so dass wir an dieser Stelle nicht weiter darauf eingehen wollen.

Wie implementiere ich den SwiftMailer?
Um den SwiftMailer in euer Projekt einzubinden, müsst ihr die aktuelle Version notwendigen Pakete herunterladen und auf eurem Webspace hinterlegen. Wir gehen mal davon aus, dass ihr den Inhalt des Downloads in das Verzeichnis swiftmailer/ abgelegt habt.

Wie fange ich an?
Der SwiftMailer bietet uns verschiedene Klassen, die wir nicht immer auch alle benötigen. Daher ist es wichtig, daß wir den Autoloader vom SwiftMailer in unser Projekt einbinden:
PHP-Code:
include_once __DIR__ '/swiftmailer/swift_required.php'
Damit haben wir den Grundstein gelegt, SwiftMailer in unserem Projekt nutzen zu können.

Grundsätzlich benötigen wir beim SwiftMailer drei Objekt-Instanzen:
  • Swift_MailTransport
    Swift_SendmailTransport
    Swift_SmtpTransport
  • Swift_Message
  • Swift_Mailer

Das Transport-Objekt
Mit dieser Objekt-Instanz definieren wir die Methode, wie wir die Mail versenden wollen. Wir können dies über die gewöhnliche mail()-Funktion von PHP machen, den MailerDeamon sendmail nutzen oder die Mail direkt über SMTP versenden. Für dieses Tutorial entscheiden wir uns grundsätzlich mal für die SMTP-Variante, damit wir auch ein wenig konform zu dem PHPMailer-Tutorial bleiben.

Wir instanziieren also ein Objekt der Klasse Swift_SmtpTransport und setzen die erforderlichen Auth-Parameter:
PHP-Code:
$oTransport Swift_SmtpTransport::newInstance'mail.example.com'587 );
$oTransport->setUsername'auth@example.com' );
$oTransport->setPassword'yourpassword' ); 
Damit wäre das auch schon erledigt. Für die korrekten Angaben des Mail-Servers müsst ihr euch bei eurem Provider informieren.
Hinweis
Solltet ihr die Daten nicht wissen, nutzt am besten die Swift_MailTransport-Klasse:
PHP-Code:
$oTransport Swift_MailTransport::newInstance(); 
Die Verwendung der Swift_SendmailTransport-Klasse erfordert die Angabe des sendmail-Pfades, sofern dieser vom Standard /usr/sbin/sendmail abweicht.

Das Message-Objekt
Als nächstes wollen wir uns ein Message-Objekt erstellen:
PHP-Code:
$oMessage Swift_Message::newInstance(); 
Diesem Objekt teilen wir nun die Einzelheiten unseres Mail-Headers, sowie des Mail-Contents mit. Für den Mail-Header wollen wir uns auf die notwendigsten festlegen:
PHP-Code:
$oMessage->setFrom'phprocks@example.com' );
$oMessage->setTo'max.mustermann@example.com''Max Mustermann' );
$oMessage->setCc'maria.mustermann@example.com''Maria Mustermann' );
$oMessage->setSubject'PHProcks! Tutorials - less time to learn more' ); 
Wir haben jetzt den Absender, den Empfänger, einen Empfänger in Kopie und den Betreff an das Message-Objekt gebunden.
Als nächstes wollen wir den Content, also den Mail Inhalt an das Objekt übergeben:
PHP-Code:
$oMessage->setBody'<h1>PHProcks!</h1><h2>Tutorial: HTML E-Mail senden mit SwiftMailer</h2>''text/html' );
$oMessage->addPartstrip_tags($oMessage->getBody()), 'text/plain' ); 
Wie man erkennen kann, können wir dem Message-Objekt über den zweiten Parameter direkt mitteilen, um was für einen Content-Type es sich handelt.
Hinweis
Die Methode addPart() bietet uns auf einfache Weise die Möglichkeit, alternativen Content in die Mail zu setzen. Dies kann nützlich sein, wenn bspw. unsere Mail hauptsächlich per HTML angezeigt werden soll, aber der Empfänger die HTML-Ansicht deaktiviert hat. In diesem Fall würde der Teil, den wir mit addPart( [content], 'text/plain' ) an die Mail gehängt haben greifen. Der alternative PlainText-Part sollte im Idealfall eigenen Content besitzen. Die Funktion strip_tags() wurde für dieses Tutorial nur der Einfachheit genutzt.

Nu' aber: Versenden der Mail über das Mail-Objekt
Wir haben nun alle Vorbereitungen soweit abgeschlossen. Wir haben festgelegt, wie unsere Mail versendet werden soll und was unsere Mail eigentlich an Inhalt hat. Jetzt muss diese nur noch versendet werden.

Wir instanziieren ein Mail-Objekt und übergeben diesem direkt unser Transport-Objekt:
PHP-Code:
$oMailer Swift_Mailer::newInstance$oTransport ); 
Das Senden der Mail erfolgt über die send()-Methode:
PHP-Code:
if ( !$oMailer->send($oMessage) ) {

 
   echo 'Something\'s went wrong!';
 
   exit;

}

echo 
'Yes! First Mail with SwiftMailer sent successfully!'

Das komplette Script zur Übersicht
Um einmal im Ganzen zu schauen, was wir gemacht haben, poste ich hier nochmal das gesamte Script aus diesem Tutorial:
PHP-Code:
// SwiftMailer Autoloader einbinden
include_once __DIR__ '/swiftmailer/swift_required.php';

// Das Transport-Objekt
$oTransport Swift_SmtpTransport::newInstance'mail.example.com'587 );
$oTransport->setUsername'auth@example.com' );
$oTransport->setPassword'yourpassword' );

// Das Message-Objekt
$oMessage Swift_Message::newInstance();
$oMessage->setFrom'phprocks@example.com' );
$oMessage->setTo'max.mustermann@example.com''Max Mustermann' );
$oMessage->setCc'maria.mustermann@example.com''Maria Mustermann' );
$oMessage->setSubject'PHProcks! Tutorials - less time to learn more' );
$oMessage->setBody'<h1>PHProcks!</h1><h2>Tutorial: HTML E-Mail senden mit SwiftMailer</h2>''text/html' );
$oMessage->addPartstrip_tags($oMessage->getBody()), 'text/plain' );

// Das Mailer-Objekt
$oMailer Swift_Mailer::newInstance$oTransport );

// Versenden der Mail und prüfen, auf Versendet
if ( !$oMailer->send($oMessage) ) {

 
   echo 'Something\'s went wrong!';
 
   exit;

}


echo 
'Yes! First Mail with SwiftMailer sent successfully!'
Hinweis
Die Möglichkeiten des SwiftMailer sind natürlich noch sehr viel größer, als hier dargestellt. Da es sich hierbei aber um ein Einsteiger-Tutorial handeln soll, werde ich darauf nicht weiter eingehen.

Drucke diesen Beitrag

  Eval is a nicve feature - Eine Provokation
Geschrieben von: Till - 16.02.2016, 18:18 - Forum: Off Topic - Antworten (8)

Kann mir jemand erklären warum eval grundsätzlich böse sein soll?

Eine mögliche Gefahr sei, es könnten Benutzereingaben injeziert werden, aber liegt das an eval ansich?
Ist es nicht eher ein Fehler des Programmierers, als das es ein Fehler der Funktion selbst ist?

Wir haben folgenden konkreten Anwendungsfall 1):
http://www.php-rocks.de/thema/64-welchen-sinn-hat-eval-im-templating-.html
Hier macht es für mich keinen Sinn eval zu benutzen, ein z.B. include wäre vl. naheliegender!?!
Eval=evil=einverstanden!

Wir haben folgenden konkreten Anwendungsfall 2):
http://www.phpclasses.org/package/9071-PHP-Autoload-classes-with-PSR-0-PSR-4-mapping-etc-.html#view_files/files/60161

PHP-Code:
if(eval('$data = '.$source.';')===false
Dies ist der einzige Fall in welchem ich jemals "produktiv" eval einsetze, eingesetzt habe(!). Es wird remote Code geladen, geprüft und dann  ausgeführt.

- Würde ein abspeichern als datei und ein include den code sicherer machen? (Ich denke nicht!?!)
- Gibt es in meinem Anwendungsfall eine (sichere) Alternative zu eval?

These 1: eval ist entsprechend sicher oder unsicher, als wie es vom Programmierer verwendet wird.

------------------------------------------

These 2/Idee: Wann wird eval evaluiert, beim parsen oder zur Laufzeit, kann man "lazy loading" damit realisieren?


------------------------------------------

These 3: Eval is a nicve feature.


------------------------------------------

So, nun bitte ich die Experten um eine Erklärung (damit auch ich es verstehe)...

Drucke diesen Beitrag

  Best Practice für Response-Objekte
Geschrieben von: Scarabaeus - 09.02.2016, 17:46 - Forum: PHP Professional - Antworten (8)

Moin Moin

normalerweise setze ich meine Projekte mit Laravel um, aber jetzt steht bei mir auf Arbeit ein Projekt an, für welches Laravel schlicht zu groß / zu umfangreich ist. Für solche Fälle habe ich schon vor geraumer Zeit angefangen mir quasi eine Mikro-Version von Laravel zu basteln (jaja - ich hätte auch gleich ein existierendes Micro-Framework oder Lumen nutzen können Big Grin). Gleichzeitig will ich - so zumindest mein Plan - mittels dieses Mikro-Laravels meine Kollegen, die sich beharrlich weigern für Großprojekte ein anständiges PHP-Framework zu nutzen, gewissermaßen auf die sanfte Tour an Laravel ranführen.

Die ganze Geschichte die ich mir zurecht geschrieben habe funktioniert auch wunderbar, nur bräuchte ich an einer Stelle mal andere Meinungen als meine eigene. Konkret geht's um mein Response-Objekt, welches ich mir ab Framework-Start erzeuge. Meine Controller können, je nachdem was in den Methoden steht, entweder ein View-Objekt, ein Response-Objekt, ein Redirect-Objekt oder im ganz simpelstem Fall einen String zurückgeben. Sieht ganz ähnlich wie in Laravel aus:

PHP-Code:
// Controller gibt ein View-Objekt zurück
return view('test')->with([
 
   'foo' => 'bar'
]);

// Controller gibt ein Response-Objekt zurück
return response()->json([
 
   'foo' => 'bar'
]);

// Controller gibt ein Redirect-Objekt zurück
return redirect('foo')->with([
 
   'bar' => 'barfoo'
]);

// Controller gibt einen String zurück
return 'FooBar'


Diese Rückgabewerte wandern dann in die am Framework-Start erstellte Response-Instanz, die letztlich entscheidet was dem Client zurückgegeben wird und genau zu diesem Schnipsel hätte ich gerne ein paar Meinungen, denn so ganz zufrieden bin ich damit nicht. Nebenbei bemerkt: Es funktioniert alles so wie angedacht. Von daher besteht in der Hinsicht momentan kein Handlungsbedarf. Mir geht's in dem Punkt um die - wie im Titel schon erwähnten - Best Practices in dem Fall.

PHP-Code:
public function __destruct() {

 
   // Wenn Controller ein View-Objekt zurückgegeben hat
 
   if($this->response instanceof View) {
        $this->responseContent $this->response->render();
        echo $this->responseContent;
        session()->forget('_flashed');
    }

 
   // Wenn Controller ein Redirect-Objekt zurückgegeben hat
    if($this->response instanceof Redirect) {
        header('Location: ' config('app.url') . '/' $this->response->getTo());
    }

 
   // Wenn Controller ein Response-Objekt zurückgegeben hat
    if($this->response instanceof Response) {
        header(sprintf('HTTP/%s %s %s''1.1'$this->httpStatusCode''), true$this->httpStatusCode);

        foreach($this->headers as $flag => $value) {
            header($flag.':'.$valuetrue$this->httpStatusCode);
        }

        echo $this->responseContent;
        session()->forget('_flashed');
    }

 
   // Wenn Controller kein Objekt (zb. einen String) zurückgegeben hat
    if(!is_object($this->response)) {
        echo $this->response;
        session()->forget('_flashed');
    }


Grüße

Drucke diesen Beitrag