Construct html in php

Создание страниц PHP – печатаем сайт налету!

От автора: вы когда-нибудь наблюдали за работой талантливых писателей? У меня есть один знакомый из «таких». Свои произведения он печатает на машинке: считает, что компьютер не способен принять всю «полноту его мыслей». А я ему в ответ говорю, что он так же, как и любая программа, всего лишь умело манипулирует строковыми значениями переменных. В общем, каждый остался при своем мнении. Сегодня мы рассмотрим создание страниц PHP, чтобы доказать, что этот язык программирования обладает огромным талантом.

Динамический талант

На проявление таланта любого автора (знаю по себе) могут влиять множество «сопутствующих» факторов: собственное настроение, погода и другие «ненастья». Но PHP «наплевать» на погоду за окном или ворчание жены за поломанный кран :). Он выполняет заложенный в него код. Причем делает это не просто так, а динамично: формируя (собирая) страницы налету.
Сегодня я постараюсь на несложны примерах продемонстрировать часто применяемые методы реализации динамичности на основе PHP:

Использование одного шаблона для создания нескольких веб-страниц.

Интеграция кода PHP в HTML.

Онлайн курс «PHP-разработчик»

Изучите курс и создайте полноценный проект — облачное хранилище файлов

С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.

Начнем рассмотрение динамического создания страниц на PHP c последнего пункта. Поскольку для изучения первых двух требуется знание третьего. Стартуем!

Разметка основного примера

Сейчас за пару минут «набросаю» разметку самой простой страницы на HTML без особых «изысков».

Читайте также:  Python pandas dataframe loc

Источник

Генерация html на PHP

Предлагаю вашему вниманию свое решение по генерации html на PHP. Задача вроде бы тривиальная, но хотелось бы, чтобы это было расширяемо, кратко, но в тоже время с хорошим функционалом. Получилось вроде не плохо.

Сразу скажу( как многие считают в комментариях), что задача ставилось не написать шаблонизатор (которых и так много) и не заменить шаблонизатор JavaScript. Я прекрасно знаю, что true way это разделять html и данные. Но мне понадобилось писать html в классах, для создания компонентов фреймворка, на подобие CGridView в yii, стоит ли в таких местах выносить html в отдельные файлы решать вам.

Основная цель, избавится от html в классах и функциях.

Простой пример, обычная кнопка:

CHtml::create() ->p() ->a(array('href' => 'http://habrahabr.ru', 'class' => 'btn')) ->text('Перейти') ->render(); 

Ничего хитрого, можно было бы этим и ограничется, но захотелось циклы:

 $arr = array('1' => 'Первый', '2' => 'Второй'); CHtml::create() ->select($options) ->each(CHtml::plainArray($arr, 'value', 'text')) ->option('array("value" => $data->value)') ->text('$data->text') ->end() ->endEach() 
$arr = array( array('value' => '1', 'text' =>'Первый'), array('value' => '2', 'text' => 'Второй') ); 

Теги внутри цикла могут содержать функции или строки с eval выражениями, вложенность любая, пример с таблицей:

$columns = array( array('id' => 'NAME', 'label' => 'Имя'), array('id' => 'AGE', 'label' => 'Возраст') ); $data = array( array('NAME' => 'Петр', 'AGE' => 29), array('NAME' => 'Василий', 'AGE' => 32) ); CHtml::create() ->table() ->thead() ->tr() ->each($columns) ->th() ->text(function($column)< return $column['label']; >) ->end() ->endEach() ->end() ->end() ->tbody() ->each($data) ->tr() ->each($columns) ->td() ->text(function($row, $column) < return $row[$column['id']]; >) ->end() ->endEach() ->end() ->endEach() ->render(); 

Незакрытые теги закрываются автоматически.

Класс можно расширить, вплоть до использования в формах. Расширить можно за счет наследования или внедрения зависимости, за то, как будет выводится каждый тег и его атрибуты используется одна функция, поэтому можно легко переопределить это поведение.

 class CMyHtml extends CHtml < public function a($options = array()) < $default = array( 'href' =>'javascript:void(0)' ); return parent::a(array_replace($default, $options)); > > 
class CForm < private $_lastLabel = ''; public function __construct(CModel $model, CHtml $html = null) < $this->_model = $model; $this->_html = $html ?: CHtml::create(); > public function __call($method, $ps) < $options = $ps ? $ps[0]: array(); if ($method === 'label') < $this->_lastLabel = isset($options['for']) ? $this->_model->getLabel($options['for']) : ''; > if ($method === 'text' && $this->_lastLabel) < $options = $options ?: $this->_lastLabel; $this->_lastLabel = ''; > $this->_html->$method($options); return $this; > > 

Само решение можно посмотреть и попробовать на github.

Читайте также:  Piratku bez litsenzii html

Источник

Create HTML Elements Using PHP: html_element Class

I love creating HTML elements using the MooTools JavaScript library. It’s easy, fast, and the JavaScript code to create the element is beautiful. That got me thinking — why don’t I do this using PHP? When you build as many dynamic CMS-like websites as me, you end up having to manipulate single HTML element attributes with a bunch of if/else logic and the code can start looking ugly.

I took about a half hour to throw together the following PHP class. It’s small, easy to use, and produces beautiful code—just like Moo!

The PHP

/* creates an html element, like in js */ class html_element < /* vars */ var $type; var $attributes; var $self_closers; /* constructor */ function html_element($type,$self_closers = array('input','img','hr','br','meta','link')) < $this->type = strtolower($type); $this->self_closers = $self_closers; > /* get */ function get($attribute) < return $this->attributes[$attribute]; > /* set -- array or key,value */ function set($attribute,$value = '') < if(!is_array($attribute)) < $this->attributes[$attribute] = $value; > else < $this->attributes = array_merge($this->attributes,$attribute); > > /* remove an attribute */ function remove($att) < if(isset($this->attributes[$att])) < unset($this->attributes[$att]); > > /* clear */ function clear() < $this->attributes = array(); > /* inject */ function inject($object) < if(@get_class($object) == __class__) < $this->attributes['text'].= $object->build(); > > /* build */ function build() < //start $build = 'type; //add attributes if(count($this->attributes)) < foreach($this->attributes as $key=>$value) < if($key != 'text') < $build.= ' '.$key.'="'.$value.'"'; >> > //closing if(!in_array($this->type,$this->self_closers)) < $build.= '>'.$this->attributes['text'].'type.'>'; > else < $build.= ' />'; > //return it return $build; > /* spit it out */ function output() < echo $this->build(); > >

The class is pretty simple. When you instantiate the class, you feed it the element type. Once the element is created, you use get() to retrieve values and set() (key and value OR array key=>value) to set values. You can get rid of a specified attribute using remove() or all attribute key=>values using clear() . You can inject html_elements into other html_elements by using inject() . You can get the raw HTML of the element using build() or you can use the output() function to echo out the HTML. Important: use the «text» attribute to add text/HTML inside an element.

Читайте также:  Java http rest request

Example Uses

/* test case - simple link */ $my_anchor = new html_element('a'); $my_anchor->set('href','https://davidwalsh.name'); $my_anchor->set('title','David Walsh Blog'); $my_anchor->set('text','Click here!'); $my_anchor->output(); //Click here! /* test case - br tag */ echo '
'; $my_anchor = new html_element('br'); $my_anchor->output(); // 
/* test case - sending an array to set */ echo '
'; $my_anchor = new html_element('a'); $my_anchor->set('href','https://davidwalsh.name'); $my_anchor->set(array('href'=>'http://cnn.com','text'=>'CNN')); $my_anchor->output(); //CNN /* test case - injecting another element */ echo '
'; $my_image = new html_element('img'); $my_image->set('src','cnn-logo.jpg'); $my_image->set('border','0'); $my_anchor = new html_element('a'); $my_anchor->set(array('href'=>'http://cnn.com','title'=>'CNN')); $my_anchor->inject($my_image); $my_anchor->output(); //  

Have any ideas for this class? Share them!

Источник

Оцените статью