2016-04-08 17 views
0

Sitemdeki kullanıcıların düz metin yorumları göndermelerine izin vermek istiyorum. Bu yorumları sitemde sunduğumda, bunların HTML olarak gösterilmesini isterim (örneğin: <p> etiketinde ve <br> olarak yeni satırlarda).Silverstripe 3.3 - HTML formatlı metni nasıl önyüz formundan veritabanına kaydedebilirim?

Düz metni Silverstripe 3.3'te HTML olarak nasıl tanıtabilirim? Şu anda bir düz metin olarak metin kaydeder

public function MyForm() { 
     $myForm = Form::create(
      $this, 
      __FUNCTION__, 
      FieldList::create(
       HtmlEditorField::create('MyText') 
     ), 
      FieldList::create(
       FormAction::create('submit','Submit') 
     ) 
    ); 
     return $myForm; 
} 

benim işlevi bu

public function submit($data, $form) { 
     $myDataobject = new MyDataobject(); 
     $form->saveInto($myDataobject); 
     $myDataobject->write(); 

     $form->sessionMessage('Message saved.','good'); 
     return $this->redirectBack(); 
} 

gibidir gönderin:

Ben

private static $db = array (
     'MyText' => 'HTMLText', 
); 

ve bir form, bir DataObject var HTML olmadan dize.

+0

Bu konuda yanlış bir şey göremiyorum. "Basit dize" ile ne demek istiyorsun? Ekleme hangi HTML'yi ekliyorsunuz? –

+0

Demek istediğim, bir kullanıcı textarea alanında bir metin yazdığında ve istediğim metinde bazı kopukluklar/paragraflar varsa, veritabanımdaki html etiketleri ile metni şu şekilde kaydedin: "

Merhaba,
Bir sorum var. .. (...)

" – iraira

+0

Ah, bir textarrafield, örnek kodunuzda gösterildiği gibi bir HtmlEditorField'dan oldukça farklıdır. –

cevap

1

Tamam - Yorumunuzdan örnek kodunuz aslında yaptığınız gibi değil ve HTMLEditorField yerine TextareaField kullanıyorsunuz. { $ myDataobject

kamu fonksiyonu göndermek ($ veri $, formu):

  1. form gönderimini yazmadan önce HTML ekle: birkaç seçenek var bu yüzden

    Bu, gayet = yeni MyDataobject(); $ form-> saveInto ($ myDataobject); $ myDataobject-> MyText = sprintf ('

    % s

    ', nl2br (Dönüştürme :: raw2xml ($ data ['MyText']))); $ myDataobject-> write();

    $form->sessionMessage('Message saved.','good'); 
        return $this->redirectBack(); 
    

    }

Convert::raw2html kullanımını unutmayın - bu olmadan, büyük olasılıkla bir HTML enjeksiyon saldırısı gerçekleştirmek için HTML gönderen bir zararlı kullanıcıya savunmasız olacak.

  1. Modeli üzerinde bir ayarlayıcı ekleyin:

    sınıf MyDataobject DataObject genişletir {

    ...

    public function setMyText($value) { 
        return $this->setField('MyText', sprintf('<p>%s</p>', nl2br(Convert::raw2xml($value))); 
    } 
    

    }

Bu yaklaşım, valu her zaman olduğu gibi oldukça kırılgan olacaktır. e ayarlanır, HTML'yi kasıtlı olarak belirlediğinizde kodlanmış olabilir.

Önerilen çözüm: # 1

+0

Çok teşekkür ederim. Çözümünüz # 1 çalışır, ancak raw2html yerine raw2html kullanmam gerektiğinden, raw3html SS 3.3'te bulunmaz. Ve: Ben bir TextareaField kullanmıyorum, bir HTMLEditorField kullanıyorum, ancak bir frontend formda kullanarak bana tinymce = "true" özniteliği ile basit bir textarea alanı gösterir. Her neyse, metni ara vermeden kurtardı. Çözümünüz şimdi çalışıyor. – iraira

+0

Ah, üzgünüm - 'Dönüştürme :: raw2xml' –

İlgili konular