HTML Öğeleri
Nette\Utils\Html sınıfı, Siteler Arası Komut Dosyası (XSS) güvenlik açığını önleyen HTML kodu oluşturmaya yönelik bir yardımcıdır.
Nesneleri HTML öğelerini temsil edecek şekilde çalışır, parametrelerini ayarlarız ve render edilmelerine izin veririz:
$el = Html::el('img'); // <img> öğesini oluşturur
$el->src = 'image.jpg'; // src özniteliğini ayarlar
echo $el; // '<img src="image.jpg">' yazdırır
Kurulum:
composer require nette/utils
Tüm örnekler aşağıdaki sınıf takma adının tanımlandığını varsayar:
use Nette\Utils\Html;
HTML Öğesi Oluşturma
Eleman Html::el()
yöntemi kullanılarak oluşturulur:
$el = Html::el('img'); // <img> öğesini oluşturur
Adın yanı sıra, HTML sözdiziminde başka nitelikler de girebilirsiniz:
$el = Html::el('input type=text class="red important"');
Ya da bunları ikinci parametreye ilişkisel bir dizi olarak aktarın:
$el = Html::el('input', [
'type' => 'text',
'class' => 'important',
]);
Bir öğe adını değiştirmek ve döndürmek için:
$el->setName('img');
$el->getName(); // 'img'
$el->isEmpty(); // true, <img> boş bir eleman olduğu için
HTML Nitelikleri
Bireysel HTML niteliklerini üç şekilde ayarlayabilir ve alabilirsiniz, hangisini daha çok seveceğiniz size kalmış. Birincisi özellikler aracılığıyla:
$el->src = 'image.jpg'; // src özniteliğini ayarlar
echo $el->src; // 'image.jpg'
unset($el->src); // özniteliği kaldırır
// veya $el->src = null;
İkinci yol, özellikleri ayarlamanın aksine, birbirlerine zincirleme bağlayabileceğimiz yöntemleri çağırmaktır:
$el = Html::el('img')->src('image.jpg')->alt('photo');
// <img src="image.jpg" alt="photo">
$el->alt(null); // özniteliği kaldırır
Üçüncü yol ise en konuşkan olanıdır:
$el = Html::el('img')
->setAttribute('src', 'image.jpg')
->setAttribute('alt', 'photo');
echo $el->getAttribute('src'); // 'image.jpg'
$el->removeAttribute('alt');
Toplu olarak, öznitelikler addAttributes(array $attrs)
ile ayarlanabilir ve
removeAttributes(array $attrNames)
ile silinebilir.
Bir özniteliğin değeri yalnızca bir dize olmak zorunda değildir, mantıksal öznitelikler için mantıksal değerler de kullanılabilir:
$checkbox = Html::el('input')->type('checkbox');
$checkbox->checked = true; // <input type="checkbox" checked>
$checkbox->checked = false; // <input type="checkbox">
Bir nitelik, örneğin CSS sınıfları için uygun olan, boşluklarla ayrılmış olarak listelenen bir belirteç dizisi de olabilir:
$el = Html::el('input');
$el->class[] = 'active';
$el->class[] = null; // null göz ardı edilir
$el->class[] = 'top';
echo $el; // '<input class="active top">'
Bir alternatif, değerlerin anahtarın listelenip listelenmeyeceğini belirttiği bir ilişkisel dizidir:
$el = Html::el('input');
$el->class['active'] = true;
$el->class['top'] = false;
echo $el; // '<input class="active">'
CSS stilleri ilişkisel diziler şeklinde yazılabilir:
$el = Html::el('input');
$el->style['color'] = 'green';
$el->style['display'] = 'block';
echo $el; // '<input style="color: green; display: block">'
Şimdi özellikleri kullandık, ancak aynı şey yöntemler kullanılarak da yapılabilir:
$el = Html::el('input');
$el->style('color', 'green');
$el->style('display', 'block');
echo $el; // '<input style="color: green; display: block">'
Ya da en konuşkan şekilde bile:
$el = Html::el('input');
$el->appendAttribute('style', 'color', 'green');
$el->appendAttribute('style', 'display', 'block');
echo $el; // '<input style="color: green; display: block">'
Son bir şey: href()
yöntemi, bir URL'de sorgu parametreleri oluşturmayı kolaylaştırabilir:
echo Html::el('a')->href('index.php', [
'id' => 10,
'lang' => 'en',
]);
// '<a href="index.php?id=10&lang=en"></a>'
Veri Öznitelikleri
Veri nitelikleri özel bir desteğe sahiptir. Adları tire içerdiğinden, özellikler ve yöntemler aracılığıyla erişim
çok zarif değildir, bu nedenle data()
yöntemi vardır:
$el = Html::el('input');
$el->{'data-max-size'} = '500x300'; // pek şık değil
$el->data('max-size', '500x300'); // zarif
echo $el; // '<input data-max-size="500x300">'
Veri özniteliğinin değeri bir dizi ise, otomatik olarak JSON'a serileştirilir:
$el = Html::el('input');
$el->data('items', [1,2,3]);
echo $el; // '<input data-items="[1,2,3]">'
Element İçeriği
Öğenin iç içeriği setHtml()
veya setText()
yöntemleri tarafından ayarlanır. İlkini yalnızca
parametreye güvenli bir HTML dizesi aktardığınızı biliyorsanız kullanın.
echo Html::el('span')->setHtml('hello<br>');
// '<span>hello<br></span>'
echo Html::el('span')->setText('10 < 20');
// '<span>10 < 20</span>'
Tersine, iç içerik getHtml()
veya getText()
yöntemleriyle elde edilir. İkincisi, HTML
çıktısından etiketleri kaldırır ve HTML varlıklarını karakterlere dönüştürür.
echo $el->getHtml(); // '10 < 20'
echo $el->getText(); // '10 < 20'
Çocuk Düğümleri
Bir elemanın iç içeriği bir çocuk dizisi de olabilir. Bunların her biri bir dize ya da başka bir Html
öğesi olabilir. Bunlar addHtml()
veya addText()
kullanılarak eklenir:
$el = Html::el('span')
->addHtml('hello<br>')
->addText('10 < 20')
->addHtml( Html::el('br') );
// <span>hello<br>10 < 20<br></span>
Yeni bir Html
düğümü oluşturmanın ve eklemenin başka bir yolu:
$ul = Html::el('ul');
$ul->create('li', ['class' => 'first'])
->setText('hello');
// <ul><li class="first">hello</li></ul>
Düğümlerle dizi öğeleriymiş gibi çalışabilirsiniz. Yani köşeli parantez kullanarak tek tek olanlara erişin,
count()
ile sayın ve üzerlerinde yineleyin:
$el = Html::el('div');
$el[] = '<b>hello</b>';
$el[] = Html::el('span');
echo $el[1]; // '<span></span>'
foreach ($el as $child) { /* ... */ }
echo count($el); // 2
insert(?int $index, $child, bool $replace = false)
kullanılarak belirli bir konuma yeni bir düğüm eklenebilir.
$replace = false
ise, öğeyi $index
konumuna ekler ve diğerlerini taşır. Eğer
$index = null
ise, sonuna bir eleman ekler.
// öğeyi ilk konuma ekler ve diğerlerini ilerletir
$el->insert(0, Html::el('span'));
Tüm düğümler getChildren()
yöntemi ile döndürülür ve removeChildren()
yöntemi ile
kaldırılır.
Belge Parçası Oluşturma
Bir dizi düğümle çalışmak istiyorsanız ve sarmalayan öğeyle ilgilenmiyorsanız, öğe adı yerine null
adresini geçerek document fragment oluşturabilirsiniz:
$el = Html::el(null)
->addHtml('hello<br>')
->addText('10 < 20')
->addHtml( Html::el('br') );
// hello<br>10 < 20<br>
fromHtml()
ve fromText()
yöntemleri bir parça oluşturmak için daha hızlı bir yol sunar:
$el = Html::fromHtml('hello<br>');
echo $el; // 'hello<br>'
$el = Html::fromText('10 < 20');
echo $el; // '10 < 20'
HTML Çıktısı Oluşturma
Bir HTML öğesi oluşturmanın en kolay yolu echo
adresini kullanmak veya bir nesneyi (string)
adresine atamaktır. Ayrıca açılış veya kapanış etiketlerini ve niteliklerini ayrı ayrı yazdırabilirsiniz:
$el = Html::el('div class=header')->setText('hello');
echo $el; // '<div class="header"></div>'
$s = (string) $el; // '<div class="header">hello</div>'
$s = $el->toHtml(); // '<div class="header">hello</div>'
$s = $el->toText(); // 'hello'
echo $el->startTag(); // '<div class="header">'
echo $el->endTag(); // '</div>'
echo $el->attributes(); // 'class="header"'
Önemli bir özellik de Çapraz Site Komut
Dosyalarına (XSS) karşı otomatik korumadır. setText()
veya addText()
kullanılarak eklenen tüm
öznitelik değerleri veya içerik güvenilir bir şekilde önlenir:
echo Html::el('div')
->title('" onmouseover="bad()')
->setText('<script>bad()</script>');
// <div title='" onmouseover="bad()'><script>bad()</script></div>
HTML ↔ Metin Dönüştürme
HTML'yi metne dönüştürmek için htmlToText()
statik yöntemini kullanabilirsiniz:
echo Html::htmlToText('<span>One & Two</span>'); // 'One & Two'
HtmlStringable
Nette\Utils\Html
nesnesi, örneğin Latte veya formların HTML kodu döndüren __toString()
yöntemine sahip nesneleri ayırt etmek için kullandığı Nette\HtmlStringable
arabirimini uygular. Dolayısıyla,
örneğin şablondaki nesneyi {$el}
kullanarak yazdırırsak çift kaçış oluşmaz.