# SMS Şablonu Yazma

https://dev.wisecp.com/tr/sms-sablonu-yazma

Bir olayın kısa mesaj gövdesi, çevresinde hiçbir kabuk olmayan tek bir düz dosyadır. Bu onu yazılacak en kısa şablon, aynı zamanda kazara işaretlemeyle doldurulması en kolay şablon yapar.

## Genel Bakış

Her olay e-posta gövdesinin yanında bir `.txt` taşır ve o dosya mesajın tamamıdır: başına da sonuna da bir şey eklenmez. Dosya neyi üretiyorsa telefona ulaşan odur.

Motor aynı, değişkenler aynı, olay aynıdır. Farkların hepsi kanaldan gelir: bağlamı devralacak bir çerçeve, yaslanılacak bir işaretleme ve hesabında cep numarası olmayan bir alıcı yoktur.

## Ön Koşullar

- **halihazırda var olan bir olay**: Kısa mesaj gövdesi bir olayın üçte biridir, kendi başına bir olay değildir. Yapılandırma kaydı, çözümleyici kaydı ve panel etiketi e-posta ile paylaşılır; önce onları bağlayın.
- **açılmış kısa mesaj kanalı**: Dosya yalnızca olayın yapılandırma kaydında `user-sms` ya da `admin-sms` set edildiğinde okunur. İkisi de 0 iken dosya ne içerirse içersin ölüdür.
- **hesapta bir cep numarası**: Alıcının numarası ve ülke kodu hesap profilinden gelir.
- **kum havuzu kısa mesaj modülü**: Bir sürücü, ağ geçidini aramak yerine her mesajı diske yazar. Teslim edilen karakterleri, tarayıcının gizleyeceklerini de dahil olmak üzere birebir okumanızı sağlar.

## Yapı

### Kabuk Yok, İşaretleme Yok

E-posta yolu, önce bir header, bir gövde yuvası ve bir footer birleştirir. Kısa mesaj yolu bunu tümüyle atlar, yani dosya tek başına durur.

```smarty
Your service has been activated.

Service Information
------------------------------------
{$service_name} - {$service_amount}

Service Details
------------------------------------
{$service_detail_link}
```

- **kim olduğunuzu söyleyin**: Tek marka işareti, ağ geçidinin gösterdiği gönderici adı ve metnin kendi söyledikleridir. "Hizmetiniz" diye başlayıp siteyi hiç adlandırmayan bir mesaj yabancı bir mesaj gibi okunur.
- **düz metin ve hiçbir şey kaçmaz**: Motor ne kaçış uygular ne de temizler. Zengin metin taşıyan bir değişken, etiketlerini onları gösterme imkanı olmayan bir mesajın içine harfi harfine yazar.
- **bağlantılar uzundur**: Detay ve ödeme bağlantıları mutlaktır ve token taşır, yani biri mesajın çoğu olabilir. Onu en sona, kendi satırına koyun ve telefonun adrese yutabileceği noktalama işaretlerine sarmayın.

### Kanal Hangi Dosyayı Okur

| Kanal | Gövde dosyası | Kabuk | Konu |
| --- | --- | --- | --- |
| e-posta | `{name}.html` | header, gövde yuvası, footer | `.json` içindeki `subject`, değişkenleri doldurulmuş |
| kısa mesaj | `{name}.txt` | yok | yok: bu kanalda `.json` okunmaz |

Motor, `.json` içindeki bir `title` anahtarını anlar ve kısa mesaj kanalı için döner; ama dağıtıcı onu daha ileri taşımaz ve gelen şablonların hiçbiri böyle bir anahtar bildirmez.

## Adım Adım

### 1. Gövdeyi Yazın

1. Olayın `.txt` dosyasını kurulu her dil dizininde açın. Üçlüyle birlikte oluşturulmuştu; yoksa kısa mesaj kanalının okuyacak bir şeyi yok demektir.
2. Mesajı bir müşterinin almak isteyeceği gibi yazın: ne oldu, hangi hizmette ve nereye bakılacak. Bir iki kısa satır ve bir bağlantı.
3. E-posta gövdesiyle aynı yer tutucu söz dizimini kullanın: motor aynı olduğu için söz dizimi hatası da aynı şekilde, dosyanın tamamını işlenmeden bırakarak başarısız olur.
4. Kısa değişkenleri tercih edin. Bir açıklama alanı ya da bir talep mesajı, sığsa bile bu kanal için ölçülmemiştir.

### 2. Kanalı Açın

1. Hesap sahibine mesaj için olayın yapılandırma kaydında `user-sms` değerini 1 yapın, personele kopya için `admin-sms`.
2. Personel numaraları olayın departmanlarından ve kaydın kendi telefon listesinden çözülür; anahtar açıkken başka bir şey çözülmezse kök yöneticiye düşer.
3. Kısa mesaj sürümü bir ücrete değmeyen her olayda ikisini de 0'da bırakın. Olayların çoğu bilerek öyle gelir.

### 3. Düz Tutun

1. İşaretleme taşıyabilecek her şeyi kaynağa güvenmek yerine basıldığı noktada temizleyin: talep yanıtı, açıklama, operatörün yazdığı not.
2. Alfabeye dikkat edin: temel kümenin dışındaki tek bir karakter, mesajın tamamının nasıl sayıldığını değiştirir.
3. Sözcükleri e-postadan bağımsız tutun. Kısa mesaj sürümü, o e-postayı hiç açmayacak bir okur için yazılmış mesajdır.

### 4. Gönderimi Doğrulayın

1. Gerçekten cep numarası olan bir hesapla gerçek akışı tetikleyin ve dönen durumu okuyun. E-posta normal ulaşırken gelen bir `no_recipients` yanıtı, eksik olanın numara olduğunu söyler.
2. Teslim edilen dosyayı kum havuzu modülünün çıktı dizininden okuyun: gönderici adını, hedefi ve gövdenin birebir halini kaydeder, sondaki boşluk ve kaçak etiketler böylece görünür.
3. Diğer dilde tekrarlayın. Kısa mesaj gövdesi, eksik bir çevirinin gözden kaçmasına yetecek kadar küçüktür ve hata yerine sessizlik üretir.

## Referans

### Uzunluk ve Kodlama

Bildirim yolu kısa mesaj gövdesini ölçmez, bölmez ve kırpmaz. Dosyayı okur ve dizeyi modüle teslim eder. Her sınır ağ geçidinindir ve her maliyet mesaj parçası başınadır.

O aritmetik platformda, bildirim şablonlarında değil kredi ile çalışan uluslararası mesajlaşma panelinde vardır; yine de bir şablonu ona göre boyutlandırmak doğru modeldir.

| Kodlama | Ne zaman geçerli | Tek mesaj | Bölündükten sonra parça başına |
| --- | --- | --- | --- |
| temel alfabe | her karakter standart mesajlaşma alfabesinde | 160 | 153 |
| geniş | mesajın herhangi bir yerinde bunun dışında tek bir karakter | 70 | 67 |

- **Sms::analyze_message()**: Kodlamayı, sayılan uzunluğu, parça sayısını ve kesilmesi gerekip gerekmediğini döner. Panelin fiyatlandırma yolundan çağrılır, bir bildirimden asla; yani burada hiçbir şey sizin için şablonu kırpmaz.
- **bazı karakterler iki sayılır**: Temel alfabede bir avuç sembol iki birim olarak iletilir, geniş kodlamada ise bir emoji iki sayılır. Gözle boyutlandırılan bir gövde düzenli olarak bir birim taşar.
- **parça tavanı yapılandırılabilir**: Panel yapılandırılmış parça sayısının ötesine geçmeyi reddeder, varsayılanı altıdır, ve ağ geçidinin atmasına izin vermek yerine metni keser. Bir bildirimde böyle bir koruma yoktur.

### Modüle Ne Ulaşır

Bir kısa mesaj modülüne bir gövde, bir hedef ve bir ülke kodu verilir ve göndermesi istenir. Bildirim yolu, modülün arayüzünün yalnız bu kadarını kullanır.

```php
$sms = new $smsModule();

// Zaten render edilmiş gövde. Buraya bunun yerine bir şablon adı geçmek modülün
// kendi kısayoludur ve düşük seviyeli göndericinin kullandığı yoldur; dispatch asla.
$sms->body($item['body']);

// Tek alıcı ya da liste. Ülke kodu ayrı bir argümandır, çünkü hesap onu numaradan
// ayrı saklar.
$sms->addNumber($item['recipient'], $item['recipient_cc']);

$sent = $sms->submit();
if (!$sent) $error = $sms->getError();
```

- **gönderici adı modülündür**: Modül kurulurken kendi yapılandırmasından set edilir ve teslim yolu onu hiç ezmez. Bir şablon mesajın kimden geliyor göründüğünü değiştiremez.
- **ülke kodu ayrı gider**: Numara ve kod hesapta iki alan, burada iki argümandır. Onları kendisi birleştiren bir modül kendi biçimine karar verir; bir ağ geçidinde çalışan numaranın diğerinde başarısız olmasının sebebi budur.
- **başarılı gönderim gövdesiyle loglanır**: Mesaj logu gönderici adını, metni ve hedefleri saklar. Destek için faydalıdır ve kısa mesaj gövdesine gizli bir şey basmamak için bir sebeptir.

## Örnek

Bir olayın kısa mesaj yarısı, geri kalan her şeyi paylaştığı e-posta yarısının yanında.

```smarty
{$company_name}: {$service_name} kotasının %{$quota_percent} kadarını kullandı.

{* Koşulun çıktıda maliyeti yoktur, yani mesaj yalnız gerekince bir satır uzar.
   Bunun gibi yorumlar tamamen silinir. *}
{if $quota_percent >= 100}Kota yükseltilene kadar yeni yüklemeler reddedilecek.
{/if}
{$service_detail_link}
```

```smarty
{* {$admin_reply} yanıtın saklandığı halidir: satır sonları yeni satıra çevrildi,
   ama düzenleyicinin ürettiği diğer her etiket hala içinde. *}
{$ticket_num} numaralı talep yanıtlandı.

{$admin_reply|strip_tags|truncate:120}

{$ticket_link}
```

```php
// Tek çağrı. Hangi dosyaların okunacağı alıcının kanalına bağlıdır ve aynı kişi için
// aynı dispatch içinde iki kanal birden üretilebilir.
$result = \Notification::dispatch('service', 'acme-quota-reached', [
    'entity'  => $service,
    'percent' => 100,
]);

// Her alıcı kaydı hangi kanal için yazıldığını söyler, yani eksik bir kısa mesaj
// yalnız ağ geçidinin raporunda değil burada da görünür.
foreach ($result['items'] ?? [] as $item)
    if (($item['channel'] ?? '') === 'sms')
        Logger::getInstance()->info('kota bildirimi kisa mesaj olarak kuyruga alindi', [
            'recipient' => $item['recipient'] ?? '',
            'queue_id'  => $item['queue_id'] ?? 0,
        ]);
```

```php
// Dört kanal anahtarını yalnız bu çağrı için ezer ve personel kopyasını düşürür.
// Alıcının kategori tercihini de atlar, o yüzden bunu yalnız hesabın açıkça istediği
// bir mesaja saklayın; doğrulama kodu gibi.
$result = \Notification::dispatch('user', 'gsm-activation', [
    'entity'          => $userId,
    'code'            => $code,
    '_force_channels' => ['sms'],
    '_sync'           => true,   // yerinde teslim: müşteri bunu bekliyor
]);
```

## Tuzaklar

> **Zengin metin kısa mesaj kanalına olduğu gibi ulaşır**
> 
> Talep mesajları düzenleyicinin ürettiği halde saklanır; çıkışta yalnız satır sonları normalize edilir. Birini kısa mesaj gövdesine basmak etiketleri de gönderir ve alıcı o karakterlerin parasını öder. Değişkene güvenmek yerine basıldığı noktada temizleyin.

> **Numara yok, alıcı yok, hata da yok**
> 
> Cep numarası olmayan bir hesap alıcı listesine hiç girmez. E-posta yine gider, dispatch yine başarı bildirir ve hiç gönderilmemiş kısa mesaj arkasında iz bırakmaz. Kısa mesaj yarısı eksik göründüğünde şablondan önce hesaba bakın.

> **Tek bir aksanlı harf alanın yarısından fazlasını götürür**
> 
> Tek bir karakter temel alfabenin dışına düştüğü anda sayım geniş kodlamaya geçer ve sınır yüz altmıştan yetmişe iner. İngilizce aslıyla aynı uzunlukta okunan bir çeviri düzenli olarak iki katı parçaya mal olur.

> **Boş gövde bir karardır, öyle olduğundan emin olun**
> 
> Hiçbir şey üretmeyen bir dosya sessizce atlanır. Olayın kısa mesaj sürümü yokken bu tam olarak doğrudur, varken ise bir hatadan ayırt edilemez. Bir olay kısa mesaj göndermemeli ise, boş bir dosyanın bunu anlatmasını beklemek yerine yapılandırma kaydında kanalı kapatın.

## İlgili Makaleler

- [Bildirim Şablonları Nasıl Çalışır](https://dev.wisecp.com/tr/bildirim-sablonlari-nasil-calisir)
- [E-posta Şablonu Yazma](https://dev.wisecp.com/tr/e-posta-sablonu-yazma)
- [Bildirim Şablonu Değişkenleri](https://dev.wisecp.com/tr/bildirim-sablonu-degiskenleri)
- [SMS Modülü Yazma](https://dev.wisecp.com/tr/sms-modulu-yazma)
