2017-06-08 3 views
0

Ich habe ein Formular erstellt, in dem ich möchte, dass Benutzer unter anderem den gewünschten Raum auswählen. Wenn ich dies als Dropdown oder als Eingabetyp mache, in den sie die Informationen eingeben, wird sie per E-Mail über PHP übermittelt.Versteckter Eingabewert kann nicht von Angular an PHP übergeben werden

Wenn ich jedoch den Eingangstyp auf „versteckt“ zu ändern, ganz der Wert verschwindet und was ich in der Konsole zu sehen, ist dies:

<input _ngcontent-c4 name="room" type="hidden" value class="ng-untouched ng-pristine ng-valid"> 

Dann wird in dem Netzwerk, erscheint nichts als Objekt für "Zimmer". (Hinweis: andere Objekte werden angezeigt.)

Dann, wenn ich einfach den Stil zu "display: none;" und setzen Sie den Wert = "ChosenRoom", nichts wird in der E-Mail gesendet. In der Tat, obwohl es in der Konsole als

<input _ngcontent-c4 name="room" style="display: none;" type="text" value="ChosenRoom" class="ng-untouched ng-pristine ng-valid"> 

deutlich angezeigt wird, wird das Objekt nicht im Netzwerk angezeigt.

Jede Idee, was könnte das Problem sein?

Code:

(Ich habe es in einem rudimentären Plunker geschrieben auch: http://embed.plnkr.co/uUhPrStdw4kDhaus2xfO/)

Dies funktioniert, aber der Benutzer hat in den Raumnamen in Form geben:

HTML (Anmerkung:.. ich verließ die Form den verbleibenden Code aus, unter der Annahme, dass es nicht relevant ist in diesem Fall Wenn Sie das denken würde helfen, ich würde gerne, dass auch posten)

<form (submit)="sendEmail(message)" #f="ngForm"> 
    <input type="text" name="room" [(ngModel)]="message.room" #room="ngModel"> 
    <button type="submit" [disabled]="f.invalid" *ngIf="!f.submitted"> 
</form> 

HTML - Dieser zeigt den Wert in der Konsole nicht an.

HTML - Dieser zeigt den Wert in der Konsole, zeigt aber kein Objekt im Netzwerk an.

<form (submit)="sendEmail(message)" #f="ngForm"> 
    <input type="text" style="display: none;" name="room" [(ngModel)]="message.room" #room="ngModel" value="ThisRoom"> 
    <button type="submit" [disabled]="f.invalid" *ngIf="!f.submitted"> 
</form> 

Typoskript: Contact.Service.TS

import { Injectable } from '@angular/core'; 
import { Http } from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 
import { Resolve } from '@angular/router'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 

export interface IMessage { 
    name?: string, 
    email?: string, 
    room?: string, 
    daterange?: string, 
    message?: string 
} 

@Injectable() 
export class AppService { 
    private emailUrl = '/assets/email.php'; 

    constructor(private http: Http) { 

    } 

    sendEmail(message: IMessage): Observable<IMessage> | any { 
    return this.http.post(this.emailUrl, message) 
     .map(response => { 
     console.log('Sending email was successfull', response); 
     return response; 
     }) 
     .catch(error => { 
     console.log('Sending email got error', error); 
     return Observable.throw(error) 
     }) 
    } 
} 

PHP

<?php 

header('Content-type: application/json'); 

$errors = ''; 

if(empty($errors)) 
{ 

    $postdata = file_get_contents("php://input"); 
    $request = json_decode($postdata); 


    $from_email = '[email protected]'; 
    $message = $request->message; 
    $from_name = $request->name; 

    $to_email = "[email protected]"; 

    $contact = "<p><strong>Name:</strong> $from_name</p> 
       <p><strong>Email:</strong> $request->email</p> 
       <p><strong>Room:</strong> $request->room</p> 
       <p><strong>Dates:</strong> $request->daterange</p>"; 
    $content = "<p><strong>Message:</strong><p>$message</p>"; 




    $website = 'My Currently Not but soon to be Functioning Website'; 
    $email_subject = "$website: Received a message from $from_name"; 

    $email_body = '<html><body>'; 
    $email_body .= "$contact $content"; 
    $email_body .= '</body></html>'; 

    $headers .= "MIME-Version: 1.0\r\n"; 
    $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; 
    $headers .= "From: $from_email\n"; 
    $headers .= "Reply-To: $from_email"; 

    $result = mail($to_email,$email_subject,$email_body,$headers); 

    $response_array['status'] = 'success'; 
    $response_array['from'] = $from_email; 
    $response_array['result'] = $result; 

    echo json_encode($response_array); 

    header($response_array); 
    return $from_email; 
} else { 
    $response_array['status'] = 'error'; 
    echo json_encode($response_array); 
    header('Location: /error.html'); 
} 
?> 

schätze ich Hilfe oder Ideen.

Danke!

Brad

+1

Ist der versteckte Wert in Angular enthalten? Wenn nicht, könnten Sie versuchen, das Problem in einem Plunder zu reproduzieren, da ich das verborgene Feld gut in den Winkelcode einschließen konnte. – Alex

+0

Gute Idee @ AJT_82 Ich habe einen rudimentären Plunker zum Beitrag hinzugefügt. Ich habe eine alternative Lösung gefunden, die das versteckte Feldproblem vermeidet. Also bin ich mir nicht sicher, ob ich tatsächlich ein verstecktes Feld machen kann oder nicht. – AlmostPitt

+0

Das hat nichts damit zu tun, dass es tatsächlich versteckt wird. 'ngModel' überschreibt' value'. Es macht auch keinen Sinn, eine Zwei-Wege-Bindung zu haben, da man das gleiche Objekt aus der Form herausbekommen könnte :) Auch würde ich in diesem Fall vielleicht eine modellgesteuerte Form vorschlagen, die versteckte Eigenschaft wäre leicht zu schaffen mit :) Wenn Sie bei der Vorlage-gesteuerte Formular bleiben möchten, würde ich vorschlagen, dass Sie den Standardwert auf die "Raum" statt. – Alex

Antwort

1

Ich habe eine Lösung für dieses Problem gefunden. Es vermeidet vollständig die versteckten Felder, wobei ich mir immer noch nicht sicher bin, ob sie das Problem waren oder nicht.

Arbeitslösung:

contact.component.html - Hier vermeide ich den versteckten Eingang und den Text neben der Nachricht übergeben.Achten Sie besonders auf "Diese besondere Raum

<form (submit)="sendEmail(message, 'This particular room')" #f="ngForm"> 
... 
</form> 

contact.component.ts - Achten Sie besonders auf message.room = Zimmer;

import { Component, OnInit, HostBinding } from '@angular/core'; 
import { AppService, IMessage } from '../../contact/contact.service'; 

@Component({ 
    selector: 'app-contact', 
    templateUrl: './contact.component.html', 
    styleUrls: ['./contact.component.css'] 
}) 
export class TheensuiteComponent implements OnInit { 
    message: IMessage = {}; 

    constructor(private appService: AppService) { } 

    sendEmail(message: IMessage, room:string) { 
    message.room = room; 
    this.appService.sendEmail(message).subscribe(res => { 
     console.log('ContactComponent Success', res); 
    }, error => { 
     console.log('ContactComponent Error', error); 
    }) 
    } 

    ngOnInit() { 
    }; 
    } 
} 

Alles andere ist gleich links (contact.service.ts und email.php).

Dies ist natürlich ein leichter Hack. Wenn ich mehr Informationen weitergeben wollte, könnte das ziemlich schnell zu einem durcheinandergewürfelten Code führen.

0

Zunächst einmal, dass der Wert nicht hinzugefügt wird, ist, weil ngModelvalue überschreibt und daher nichts mit der Tatsache zu tun hat, die versteckt ist. Zweitens würde ich vorschlagen, dass Sie hier ein modellgesteuertes Formular verwenden möchten. Manchmal ist eine modellgetriebene Form übertrieben, aber in diesem Fall würde ich eine verwenden. Also dachte ich, ich würde diese Option für dich einwerfen, wenn du darüber nachdenken willst.

Sie müssen ReactiveFormsModule importieren und es zu Ihrem imports Array in Ihrem ngModule hinzufügen. Dann importieren Sie die folgenden Ihrer Komponente und injizieren FormBuilder in Ihrem Konstruktor:

import { FormBuilder, FormGroup, Validators } from '@angular/forms'; 

constructor(private fb: FormBuilder) {} 

Dann bauen Sie das Formular mit den Validierer Sie wollen:

this.myForm = this.fb.group({ 
    room: ['theEnsuite'], 
    name: ['', Validators.required], 
    email: ['', [Validators.required, Validators.pattern('[a-z0-9._%+-][email protected][a-z0-9.-]+\.[a-z]{2,3}$']], 
    message: ['', [Validators.required, Validators.minLength(10)]] 
}) 

und dann können Sie die zwei loswerden Wegbindung und ersetze sie stattdessen mit Formkontrolle. Die gute Sache ist, dass Sie die room überhaupt nicht in Ihrer Schablone einschließen müssen. Es ist schön sitzt bereits in der Objektform :) Hier ist eine Probe des name Eingang mit Fehlermeldung:

<input placeholder="Name" formControlName="name"> 
<div *ngIf="!myForm.get('name').valid && myForm.get('name').touched"> 
    <p>Please enter your name.</p> 
</div> 

Wenn Sie das Formular abschicken Sie es tun mit myForm.value als Parameter. Dieses Objekt ist dann identisch mit Ihrem Objekt vom Typ IMessage, mit dem Sie die Postanfrage direkt mit diesem Objekt verwenden können!

Hier ist ein DEMO der oben genannten.

Verwandte Themen