Newsletter zapisujący do bazy

Newsletter zapisujący do bazy
K8
  • Rejestracja:około 11 lat
  • Ostatnio:około 7 lat
  • Postów:16
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:

Kopiuj
<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

KA
  • Rejestracja:prawie 21 lat
  • Ostatnio:22 dni
  • Postów:700
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:

Kopiuj
<?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' => 'john@doe.tld',
    '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;
}

Kto nigdy nie zrobił var dupa niech pierwszy rzuci kamień.
edytowany 5x, ostatnio: karpov
K8
  • Rejestracja:około 11 lat
  • Ostatnio:około 7 lat
  • Postów:16
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 >

Kopiuj
<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 >

Kopiuj
<?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 >

Kopiuj
<?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 >

Kopiuj
<?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:

edytowany 1x, ostatnio: kammic8
KA
  • Rejestracja:prawie 21 lat
  • Ostatnio:22 dni
  • Postów:700
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:

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

i potem:

Kopiuj

$('#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:

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

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


Kto nigdy nie zrobił var dupa niech pierwszy rzuci kamień.
edytowany 4x, ostatnio: karpov
K8
  • Rejestracja:około 11 lat
  • Ostatnio:około 7 lat
  • Postów:16
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]:

Kopiuj
	<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?

edytowany 1x, ostatnio: kammic8
KA
  • Rejestracja:prawie 21 lat
  • Ostatnio:22 dni
  • Postów:700
0

A jak zrobisz tak to co sie wyswietli?

Kopiuj

   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);
        });


Kto nigdy nie zrobił var dupa niech pierwszy rzuci kamień.
K8
  • Rejestracja:około 11 lat
  • Ostatnio:około 7 lat
  • Postów:16
0
karpov napisał(a):

A jak zrobisz tak to co sie wyswietli?

Kopiuj

   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".

edytowany 1x, ostatnio: kammic8
KA
  • Rejestracja:prawie 21 lat
  • Ostatnio:22 dni
  • Postów:700
0

A sprobuj:

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

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:)


Kto nigdy nie zrobił var dupa niech pierwszy rzuci kamień.
edytowany 8x, ostatnio: karpov
K8
  • Rejestracja:około 11 lat
  • Ostatnio:około 7 lat
  • Postów:16
0
karpov napisał(a):

A sprobuj:

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

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

Kopiuj
<!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>
KA
  • Rejestracja:prawie 21 lat
  • Ostatnio:22 dni
  • Postów:700
0

Tutaj masz:

Kopiuj
var dataString='email'+mail;

a powinny byc:

Kopiuj
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 ;)


Kto nigdy nie zrobił var dupa niech pierwszy rzuci kamień.
edytowany 1x, ostatnio: karpov
K8
  • Rejestracja:około 11 lat
  • Ostatnio:około 7 lat
  • Postów:16
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. : /

Kopiuj
		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); 
	}
});
}
KA
  • Rejestracja:prawie 21 lat
  • Ostatnio:22 dni
  • Postów:700
0

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


Kto nigdy nie zrobił var dupa niech pierwszy rzuci kamień.
K8
  • Rejestracja:około 11 lat
  • Ostatnio:około 7 lat
  • Postów:16
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 :/

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)