Newsletter zapisujący do bazy

0

Mam problem, nie ogarniam na tyle php by to zrobić.

Potrzebuję podpiąć newsletter pod bazę we freshmailu, ogólnie by było spoko bo freshmail udostępnia taki kod do umieszczenia na stronie:

<form method="post" action="https://app.freshmail.com/pl/actions/subscribe/"><br />
<input type="hidden" name="subscribers_list_hash" value="TUTAJ JEST KOD API" /><br />
<label for="freshmail_email">Email</label><br /><br />
<input type="text" id="freshmail_email" name="freshmail_email"/> <br/><br />
<input type="submit" value="Wyślij" /><br />
</form>

Ale ten kod otwiera nową kartę użytkownikowi z podpisem, że wysłano/nie wysłano/już jest się zapisanym/niepoprawny email
Ja chciałbym takie informację wyświetlać pod formularzem bez otwierania nowej karty użytkownikowi. Jak to zrobić?

Mam API z freshmaila i dokumentację API ale nie jestem INTO PHP:
https://freshmail.pl/wp-content/uploads/2016/08/REST_API_v1.0.21.pdf

1

Jezeli masz api to najlepiej samemu napisac calosc po swojej stronie i odczytywac tylko odpowiedzi serwera (czy udalo sie dopisac, czy juz taki kontakt istnieje itp.).

Tu masz gotowe przykłady od FreshMail: https://github.com/FreshMail/REST-API
https://freshmail.pl/developer-api/przyklady/

Formularz musi wskazywac na Twoj plik w php.

Musisz stworzyc 3 dodatkowe pliki:
RestApi.php
RestException.php
config.php

Co w nich jest znajdziesz na githubie. I potem tylko:

<?php
require '../../src/FreshMail/RestApi.php';
require '../../src/FreshMail/RestException.php';
require '../../config.php';
$rest = new \FreshMail\RestApi();
$rest->setApiKey(FM_API_KEY);
$rest->setApiSecret(FM_API_SECRET);
$data = [
    'email' => '[email protected]',
    'list'  => '',
    'custom_fields' => [
        'first_name' => 'John',
        'last_name'  => 'Doe',
    ],
    //'state'   => 2
    //'confirm' => 1
];
try {
    $response = $rest->doRequest('subscriber/add', $data);
    echo 'Subscriber added, received data: ';
    print_r($response);
    echo PHP_EOL;
} catch (Exception $e) {
    echo 'Error message: ' . $e->getMessage() . ', Error code: ' . $e->getCode() . ', HTTP code: ' . $rest->getHttpCode() . PHP_EOL;
}
0

Okay, udało mi się zaimplementować to na testowym serwerze. Zapisuje do bazy newsletterowej, ale nadal przenosi mnie na inna stronę, tym razem stronę z action="zapisz_się.php" z formularza. Chciałbym to zrobić by przeładowywał mi się tylko div pod forumlarzem z zapisem "pomyślnie zapisano się do bazy newsletterowej", bez przeładowywania całej strony.
Tutaj jest kod:
FORMULARZ >

<form method="post" action="zapisz_sie.php"><br />
<label for="email">Email</label><br /><br />
<input type="text" id="email" name="email"/> <br/><br />
<input type="submit" value="Wyślij" /><br />

ZAPISZ_SIE.php >

<?php
require 'RestApi.php';
require 'RestException.php';
require 'config.php';
$rest = new \FreshMail\RestApi();
$rest->setApiKey(FM_API_KEY);
$rest->setApiSecret(FM_API_SECRET);
$data = [
    'email' => $_POST['email'],
    'list'  => 'KOD LISTY FRESHMAILOWEJ',
    //'state'   => 2
    //'confirm' => 1
];
try {
    $response = $rest->doRequest('subscriber/add', $data);
    echo 'Subscriber added, received data: ';
    print_r($response);
    echo PHP_EOL;
} catch (Exception $e) {
    echo 'Error message: ' . $e->getMessage() . ', Error code: ' . $e->getCode() . ', HTTP code: ' . $rest->getHttpCode() . PHP_EOL;
}
?>

RestApi.php >

<?php
namespace FreshMail;
use Exception;
/**
 *  Klasa do uwierzytelniania i wysyłania danych za pomocą REST API FreshMail
 *
 *  @author Tadeusz Kania, Piotr Suszalski, Grzegorz Gorczyca, Piotr Leżoń
 *  @since  2012-06-14
 */
class RestApi
{
    const HOST   = 'https://api.freshmail.com/';
    const PREFIX = 'rest/';
    CONST DEFAULT_FILE_PATH = '/tmp/';
    /**
     * @var string
     */
    private $strApiSecret;
    /**
     * @var string
     */
    private $strApiKey;
    private $response     = null;
    private $rawResponse  = null;
    /**
     * @var int
     */
    private $httpCode;
    /**
     * @var string
     */
    private $contentType = 'application/json';
    /**
     * @var array
     */
    private $errors = array();
    /**
     * Get errors.
     *
     * @return array
     */
    public function getErrors()
    {
        if (isset($this->errors['errors'])) {
            return $this->errors['errors'];
        }
        return null;
    }
     /**
      * Get response.
      *
     * @return array
     */
    public function getResponse()
    {
        return $this->response;
    }
     /**
      * Get raw response.
      *
     * @return array
     */
    public function getRawResponse()
    {
        return $this->rawResponse;
    }
     /**
      * Get HTTP code.
      *
     * @return array
     */
    public function getHttpCode()
    {
        return $this->httpCode;
    }
    /**
     * Set API key.
     *
     * @param string $apiKey
     *
     * @return self
     */
    public function setApiKey($apiKey)
    {
        $this->strApiKey = $apiKey;
        return $this;
    }
    /**
     * Set API secret key.
     *
     * @param string $apiSecret
     *
     * @return self
     */
    public function setApiSecret($apiSecret)
    {
        $this->strApiSecret = $apiSecret;
        return $this;
    }
    /**
     * Set content type.
     *
     * @param string $contentType
     *
     * @return self
     */
    public function setContentType($contentType)
    {
        $this->contentType = $contentType;
        return $this;
    }
    public function doRequest($strUrl, $arrParams = array(), $returnRawResponse = false)
    {
        if (empty($arrParams)) {
            $strPostData = '';
        } elseif ($this->contentType == 'application/json') {
            $strPostData = json_encode($arrParams);
        } elseif (!empty($arrParams)) {
            $strPostData = http_build_query($arrParams);
        }
        $apiSignature = sha1($this->strApiKey . '/' . self::PREFIX . $strUrl . $strPostData . $this->strApiSecret);
        $headers = array();
        $headers[] = 'X-Rest-ApiKey: ' . $this->strApiKey;
        $headers[] = 'X-Rest-ApiSign: ' . $apiSignature;
        if (!empty($this->contentType)) {
            $headers[] = 'Content-Type: ' . $this->contentType;
        }
        $cUrl = curl_init(self::HOST . self::PREFIX . $strUrl);
        curl_setopt($cUrl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($cUrl, CURLOPT_HEADER, true);
        curl_setopt($cUrl, CURLOPT_RETURNTRANSFER, true);
        if ($strPostData) {
            curl_setopt($cUrl, CURLOPT_POST, true);
            curl_setopt($cUrl, CURLOPT_POSTFIELDS, $strPostData);
        }
        $this->rawResponse = curl_exec($cUrl);
        $this->httpCode    = curl_getinfo($cUrl, CURLINFO_HTTP_CODE);
        if ($returnRawResponse) {
            return $this->rawResponse;
        }
        $this->getResponseFromHeaders($cUrl);
        if ($this->httpCode != 200) {
            $this->errors = $this->response['errors'];
            if (is_array($this->errors)) {
                foreach ($this->errors as $error) {
                    throw new RestException($error['message'], $error['code']);
                }
            }
        }
        if (is_array($this->response) == false) {
            throw new Exception('Invalid json response');
        }
        return $this->response;
    }
    private function getResponseFromHeaders($cUrl)
    {
        $headerSize = curl_getinfo($cUrl, CURLINFO_HEADER_SIZE);
        $headers    = substr($this->rawResponse, 0, $headerSize);
        preg_match('/Content-Type:\s*([a-z-Z\/]*)\s/', $headers, $responseType);
        if (isset($responseType[1]) && strtolower($responseType[1]) == 'application/zip') {
            preg_match('/filename\=\"([a-zA-Z0-9\.]+)\"/', $headers, $fileName);
            file_put_contents(self::DEFAULT_FILE_PATH . $fileName[1], substr($this->rawResponse, $headerSize));
            $this->response = array(
                'path' => self::DEFAULT_FILE_PATH . $fileName[1]
            );
        } else {
            $this->response = json_decode(substr($this->rawResponse, $headerSize), true);
        }
    }
    /**
     * Calculate request signature.
     *
     * @param string $apiKey
     * @param string $address
     * @param string $getData
     * @param string $postData
     * @param string $apiSecret
     *
     * @return string
     */
    private function calculateSignature($apiKey, $address, $getData, $postData, $apiSecret)
    {
        return sha1($apiKey . $address . $getData . $postData . $apiSecret);
    }
}
?>

RestException.php >

<?php
namespace FreshMail;
class RestException extends \Exception
{
}
?>

Dodatkowo chciałbym, żeby nie wyświetlało mi się w takiej formie gdy będzie ok i dla błędów:

0

To już raczej nie po stronie php tylko jakieś javascripty i ajax.

Poczytaj tutaj:

https://stackoverflow.com/questions/18169933/submit-form-without-reloading-page
http://www.codexpedia.com/javascript/submitting-html-form-without-reload-the-page/

Znalazlem cos takiego ale nie gwarantuje, ze zadziala ;)

To chyba musisz dodać na górę strony:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

i potem:


$('#submit').click(function() {
    $.ajax({
        url: 'send_email.php', // Twoj plik
        type: 'POST',
        data: {
            email: document.getElementById('email')
        },
        success: function(msg) {
            alert('Tutaj daj wyswietlenie komunikatu w jakims div');
        }               
    });
});

Znalazłem jeszcze trick z iframe:

<iframe name="frame" style="display: none;"></iframe>
<form target="frame">
</form>

Czyli w swoim php wyswietlasz wynik operacji a ta pojawia sie w ramce na stronie bez przeladowania calosci.

0
karpov napisał(a):

To już raczej nie po stronie php tylko jakieś javascripty i ajax.

Poczytaj tutaj:

https://stackoverflow.com/questions/18169933/submit-form-without-reloading-page
http://www.codexpedia.com/javascript/submitting-html-form-without-reload-the-page/

Znalazlem cos takiego ale nie gwarantuje, ze zadziala ;)

Niestety ten skrypt nie działa, a iframe wolałbym użyć w ostateczności. Jeden dobry człowiek napisał mi taki kod[tylko mam problem jeden]:

	<script>
var request;
    $("#formularz").submit(function(event){
 
        // to wyłączy normalne działanie formularza czyli wywołanie akcji
        event.preventDefault();
 
        // czyszczenie requesta
        if (request) {
            request.abort();
        }
        // przypisanie DOM-u formularza do zmiennej
        var $form = $(this);
 
        // pobranie inputów formularza
        var $inputs = $form.find("input, select, button, textarea");
 
        // serializacja
        var serializedData = $form.serialize();
 
        // wyłączenie inputów, mamy je zserializowane
        $inputs.prop("disabled", true);
 
        // odpalenie ajaxa
        request = $.ajax({
            url: "zapisz_sie.php",
            type: "post",
            data: serializedData
        });
		
 
        // obsługa odpowiedzi
        request.done(function (response, textStatus, jqXHR){
            // wyświetlenie odpowiedzi w konsoli (dla chrome F12 żeby to zobaczyć)
            // tutaj możesz sobie to wyświetlić
			$("#response_form").text("Dziękujemy za zapisanie się do newslettera");
        });
 
        // obsługa ewentualnego błedu
        request.fail(function (jqXHR, textStatus, errorThrown){
            // wyświetlenie błędu w konsoli
            console.error(
                "The following error occurred: "+
                textStatus, errorThrown
            );
        });
 
        // przy błędach lub przy poprawnej odpowiedzi
        request.always(function () {
		     
            // odtworzenie inputów
            $inputs.prop("disabled", false);
        });
 
    });
</script>

mianowicie dla prawidłowego zapisania i dla błedu wyświetla mi to samo, że poprawnie zapisano się do bazy.
Chciałbym rozdzielić to na 3 wiadomości - niepoprawny adres email, adres email znajduję się w bazie no i że wszystko jest ok i udalo sie zapisac.
Wiesz jak mi z tym pomóc?

0

A jak zrobisz tak to co sie wyswietli?


   request.done(function (response, textStatus, jqXHR){
            // wyświetlenie odpowiedzi w konsoli (dla chrome F12 żeby to zobaczyć)
            // tutaj możesz sobie to wyświetlić
            $("#response_form").text(textStatus);
        });

0
karpov napisał(a):

A jak zrobisz tak to co sie wyswietli?


   request.done(function (response, textStatus, jqXHR){
            // wyświetlenie odpowiedzi w konsoli (dla chrome F12 żeby to zobaczyć)
            // tutaj możesz sobie to wyświetlić
            $("#response_form").text(textStatus);
        });

Przy błędnym wpisaniu, wyświetla "success", przy prawidłowym wpisaniu też wyświetla "success". Ale do bazy zapisuje tylko przy prawidłowym wpisaniu maila

EDIT:
ale z tego co widzę co bym tam nie dał (nawet jak puste zostawie) to zawsze pokazuje "success".

0

A sprobuj:

<form onsubmit="click();  return false;">

function click()
{
var mail=document.getElementById('email').value;
var dataString='email='+mail;
$.ajax({
type:"post",
url:"zapisz_sie.php",
data:dataString,
cache:false,
success:function(html){
 $("#response_form").html(html); 
}
});

}

</script>

Spawdz, nie jestem specjalista wiec tez czaruje troche ;) Ale pokombinuje jeszcze wieczorem:)

0
karpov napisał(a):

A sprobuj:

<form onsubmit="click();  return false;">

function click()
{
var mail=document.getElementById('email').value;
var dataString='email='+mail;
$.ajax({
type:"post",
url:"zapisz_sie.php",
data:dataString,
cache:false,
success:function(html){
 $("#response_form").html(html); 
}
});

}

</script>

Spawdz, nie jestem specjalista wiec tez czaruje troche ;) Ale pokombinuje jeszcze wieczorem:)

Doceniam to, jako jedyny starasz się mi pomóc. :)

Niestety to też nie działa, ani nie rejestruje do bazy ani nie wyświetla nic. Może ja coś źle zrobiłem z tym nowym kodem :/

Tak wygląda kod

<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
	<form id="formularz" method="post" onsubmit="click();  return false"><br />
		<label for="email">Email</label><br /><br />
		<input type="text" id="email" name="email"/> <br/><br />
		<input type="submit" value="Wyślij" /><br />
	</form>
	<div id="response_form"></div>
	<script>
		function click()
{
var mail=document.getElementById('email').value;
var dataString='email'+mail;
$.ajax({
type:"post",
url:"zapisz_sie.php",
data:dataString,
cache:false,
	success:function(html){
	$("#response_form").html(html); 
	}
});
}
</script>
</body>
</html>
0

Tutaj masz:

var dataString='email'+mail;

a powinny byc:

var dataString='email='+mail;

Jakby rzucil kto na to okiem kto sie zna to pewnie daloby rade rozwiazac problem w 5 minut a tak kombinujemy :P Ale ja tez zawsze tak rozwiazuje swoje problemy wiec wiem jaka to masakra ;)

0

Niestety ten kod też nie działa : / Hmm, jak wyrażasz chęć mogę utworzyć jakąś testową bazę we freshmailu i podać Ci keyApi i secretApi byś mógł sprawdzić u siebie. : /

		function click()
{
var mail=document.getElementById('email').value;
var dataString='email='+mail;
$.ajax({
type:"post",
url:"zapisz_sie.php",
data:dataString,
cache:false,
	success:function(html){
	$("#response_form").html(html); 
	}
});
}
0

Nie trzeba, usiądę nad tym dzisiaj ;) Trzeba to odpowiednio zgooglowac przy braku wiedzy :P

0
karpov napisał(a):

Nie trzeba, usiądę nad tym dzisiaj ;) Trzeba to odpowiednio zgooglowac przy braku wiedzy :P

Jak tam karpov? Udało się? To niestety przerasta moje umiejętności :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1