Существует ли реализация DOM на PHP?

Духовность™

Продвинутый новичок
Собственно, что есть у меня:

PHP:
        <td>
        <?
        $select = $this->getHelper('Helper_Form')->inputSelect('advert[active]', $this->advert->getActive());
        $select->addOption( $this->getHelper('Helper_Form')->inputOption(1, $this->lang->yes) );
        $select->addOption( $this->getHelper('Helper_Form')->inputOption(0, $this->lang->no) );
        echo $select->getHtml();
        ?>
        </td>
Это нарисует select с именем "advert[active]" и двумя options со значениями "Да" и "Нет". Соответственно, этот код сделает checked для option-a со значением равным $this->advert->getActive()


Такая практика шаблонов оказалась очень удобной. Она минимизирует ошибки, не отвлекает от верстки, дает сконцентрироваться лишь на структуре.

Меня интересует, есть ли подобные вещи в PHP? И не планируется ли создать расширение для PHP под работу с DOM HTML?
 

tz-lom

Продвинутый новичок
Моя библиотека и использует DOM. Но мне нужно не просто DOM, а интерфейс для HTML!
тебе селекторы что ли нужны? есть phpQuery, или тебе что то другое?
DOM и есть интерфейс к HTML/XML, развёрнуто напиши что именно тебе нужно
 

MiksIr

miksir@home:~$
А чо не
PHP:
<?
$table = $this->getHelper("Helper_Table")->startTable()->addRow()->addColumn($select);
$table->getHtml()
?>
 
  • Like
Реакции: AmdY

AmdY

Пью пиво
Команда форума
Духовность™
эм, я так понимаю это была ирония. идея абсурдна, так как шаг влево-вправо и количество кода и его путанность. и вообще формирование элементов не должно делаться во вьюхе, идеально формировать в модели, похуже в контролере, но во вьхе - смысла нет
 

Духовность™

Продвинутый новичок
AmdY
Модель ничего не должна знать о HTML

MiksIr
Вот что я имел в виду. У меня ест класс Html_ElementInput соответствующий тегу input. Вод как выглядит его код:

PHP:
<?php
class Krugozor_Html_ElementInput extends Krugozor_Html_Element
{
    /**
     * Сравниваемое значение для radio и checkbox-ов.
     *
     * @access protected
     * @var string
     */
    private $checked_value;

    public function __construct($type=null)
    {
        parent::__construct();

        $this->attrs = array
        (
            // Устанавливает фильтр на типы файлов, которые вы можете отправить через поле загрузки файлов.
            'accept' => 'ContentTypes',
            // Альтернативный текст для кнопки с изображением.
            'alt' => 'Text',
            // Включает или отключает автозаполнение. HTML5
            'autocomplete' => array('on', 'off'),
            // Переход к элементу с помощью комбинации клавиш.
            'accesskey' => 'Character',
            // Указывает, должен ли входной элемент получить фокус при загрузке страницы
            'autofocus' => array('autofocus'),
            // Предварительно активированный переключатель или флажок.
            'checked' => array('checked'),
            // Блокирует доступ и изменение элемента.
            'disabled' => array('disabled'),
            // Связывает поле с формой по её идентификатору.
            'form' => 'ID',
            // Определяет адрес обработчика формы.
            'formaction' => 'URI',
            // Устанавливает способ кодирования данных формы при их отправке на сервер.
            'formenctype' => array('application/x-www-form-urlencoded', '"multipart/form-data', 'text/plain'),
            // Сообщает браузеру каким методом следует передавать данные формы на сервер.
            'formmethod' => array('get', 'post'),
            // Отменяет встроенную проверку данных на корректность.
            'formnovalidate' => array('formnovalidate'),
            // Определяет окно или фрейм в которое будет загружаться результат, возвращаемый обработчиком формы.
            // @todo: добавить по спецификации возможность указывать имя окна
            'formtarget' => array('_blank', '_self', '_parent', '_top'),
            // Указывает на список вариантов, которые можно выбирать при вводе текста.
            'list' => 'ID',
            // Устанавливает верхнее значение для ввода числа или даты в поле формы.
            // @todo: добавить по спецификации возможность указывать дату
            'max' => 'Number',
            // Максимальное количество символов разрешенных в тексте.
            'maxlength' => 'Number',
            // Нижнее значение для ввода числа или даты.
            'min' => 'Number',
            // Позволяет загрузить несколько файлов одновременно.
            'multiple' => array('multiple'),
            // Имя поля, предназначено для того, чтобы обработчик формы мог его идентифицировать.
            'name' => 'CDATA',
            // Устанавливает шаблон ввода.
            'pattern' => 'CDATA',
            // Выводит подсказывающий текст.
            'placeholder' => 'CDATA',
            // Устанавливает, что поле не может изменяться пользователем.
            'readonly' => array('readonly'),
            // Обязательное для заполнения поле.
            'required' => array('required'),
            // Ширина текстового поля.
            'size' => 'Number',
            // Адрес графического файла для поля с изображением.
            'src' => 'URI',
            // Шаг приращения для числовых полей.
            'step' => 'Number',
            // Определяет порядок перехода между элементами с помощью клавиши Tab.
            'tabindex' => 'Number',
            // Сообщает браузеру, к какому типу относится элемент формы.
            'type' => array('text', 'password', 'checkbox', 'radio', 'submit', 'reset', 'file', 'hidden', 'image', 'button'),
            // Значение элемента.
            'value' => 'CDATA',

            // todo
            'usemap' => 'URI',
            'onfocus' => 'Script',
            'onblur' => 'Script',
            'onselect' => 'Script',
            'onchange' => 'Script',
        );

        $this->all_attrs = array_merge($this->attrs, $this->coreattrs, $this->i18n, $this->events);

        $this->type = $type !== null ? $type : $this->attrs['type'][0];
    }

    /**
     * Устанавливает значение для checkbox и radio типов,
     * которое будет сравниваться с имеющимся значением $this->value
     * и в случае, если значения равны, к элементу будет
     * добавляться аттрибут checked.
     *
     * @access public
     * @param string|int $value
     * @return void
     */
    public function setCheckedValue($value)
    {
        $this->checked_value = $value;

        return $this;
    }

    protected function createDocObject()
    {
        $class = __CLASS__;

        if (is_object($this->doc) && $this->doc instanceof $class) return;

        $this->doc = new DOMDocument('1.0', 'windows-1251');
    	$input = $this->doc->createElement('input');

        if ($this->checked_value !== null &&
            $this->checked_value == $this->value AND
            $this->type == 'checkbox' || $this->type == 'radio')
        {
            $this->checked = 'checked';
        }

        foreach ($this->data as $key => $value)
        {
            $input->setAttribute($key, $value);
        }

        $this->doc->appendChild($input);
    }
}
т.е. основная проблема (у меня сейчас) перейти с HTML4 на HTML5 на базе их нового синтаксиса: http://www.w3.org/TR/html5/common-microsyntaxes.html#common-microsyntaxes
После описать все возможные атрибуты тега и браться за другой. Так можно создать хотя бы формы.
 

MiksIr

miksir@home:~$
Единственное, ради чего можно что-то такое использовать - это красота записи. Часто, всякие формочки обрастают таким количеством ифов внутри тегов, что получается жуткая каша. Но, в общем, для этого и нужны шаблонизаторы. А создавать такого монстра для перехода из html4 в html5, и при этом оставляя часть через генератор, часть текстом - это утопия и потеря времени.
 

AmdY

Пью пиво
Команда форума
Духовность™
то, что у тебя html, это уже вторая твоя проблема, в каком-то топике fixxxer тебе уже показывал эту идею.
PHP:
<?
        $select = $this->getHelper('Helper_Form')->input('advert[active]', $this->advert->getActive());
        $select->addOption( 1, $this->lang->yes )->addOption(0, $this->lang->no);
// во вью только эта сторочка
        echo $select->getAsSelect();
// или эта
        echo $select->getAsRadio();
        ?>
блин, научи меня как писать столько кода, а то я даже треть своих идей на могу закодить, лень писать много кода.
 
  • Like
Реакции: NeD

fixxxer

К.О.
Партнер клуба
Вроде примерно такое где-то прогонял, ага.
Но мне еще совершенно не нравится вообще какое-либо наличие HTML в php-коде (я тут не имею в виду pure php шаблоны), а именно хелперы вида echo '<select>'.
Я тут вижу два подхода
1. как я щас делаю - передавать в шаблон абстрагированные от представления данные, и юзать макросы вида {{ form.select() }} - но местами получается говно в контроллере для всяких дополнительных опций
2. активные шаблоны.
Как то так, навсидку:

Контроллер (в случае get запроса) - в идеале ничего не делает, кроме загрузки моделей и создания связки
PHP:
$this->View->bind('Advert', $this->Advert);
Шаблон (допустим pure-php, это неважно на самом деле, как он устроен)
PHP:
<?php print $this->getHelper('Form')->input('advert_name', $this->Advert->name)->render('helpers/form.tpl.php') ?>
Хелпер по сути рендерит подшаблон 'helpers/form.tpl.php' в итоге.

В случае хитрых форм разумно делать хелперы для конкретных случаев (типа SettingsFormHelper).

Переносить весь ваще хтмл в хелперы я не вижу никакого смысла - верстальщик от такого просто охренеет. Единственный случай - админки, которые верстает программист, но тут отдельный случай.
 

fixxxer

К.О.
Партнер клуба
Касаемо собственно форм у меня есть такой способ проверять на говенность архитектуры.
Если верстальщик без помощи программиста не может сделать вывод ошибок валидации формы
1) сверху списком
2) рядом с полями, подсвеченными допустим фоном
и произвольно переделывать с (1) на (2) и обратно, то что-то у нас не то.
 

atv

Новичок
Народ жаждет возможностей XSLT, но упорно его игнорирует :D ...
 

fixxxer

К.О.
Партнер клуба
Не, писать xslt на постоянной основе это бред собачий. Я его вполне нормально знаю, кстати, использую для задач, где он действительно хорошо подходит (например, сгенерировать пачку всякой документации по формальным xml-описаниям). Но писать в таком виде шаблоны сайта это п-ц. Это трудоемко и непродуктивно.

Не говоря уж о том, что это тормоз.

Ну и если уж о верстальщиках. Учить человека, который из программирования умеет только основы JS, писать xslt? Удачи
 

atv

Новичок
Но писать в таком виде шаблоны сайта это п-ц. Это трудоемко и непродуктивно.
Ага, именно поэтому в смарти 3 добавили блоки и сделали возможность их наследования :) Все шаблонизаторы, так или иначе, стремятся к возможностям XSLT :) Кстати, смарти 3 выглядит теперь как хорошая альтернатива XSLT.
 

fixxxer

К.О.
Партнер клуба
Блоки с наследованием не имеют никакого отношения к xslt, это клонирование django templates. xsl:apply-templates - это несколько другое и более общее.
 

atv

Новичок
Блоки с наследованием не имеют никакого отношения к xslt
Ну драсьте. xsl:template, это и есть блок, а <xsl:template name="foo">, это именованный блок который можно переопределить и даже вызвать в дочернем блоке через xsl:apply-imports. А xsl:apply-templates, это да, несколько другое, но тоже очень удобное :)
 

Духовность™

Продвинутый новичок
Ладно, умники, вот что я имел в виду. У нас есть спецификация, определяющая интерфейс DOM HTML5. Вот на примере input-a - http://www.w3.org/TR/html5/the-input-element.html#the-input-element

Что я хочу: сделать реализацию этого DOM-a на PHP. Фактически идет речь о создании классов-потомков для многих классов расширения DOM PHP.
 

tz-lom

Продвинутый новичок
Делай, кто мешает?
Если ты думаешь что существуют реализации спорной фичи по Work in progress draft то спешу тебя обрадовать - ты будешь первый и все лавры достанутся тебе :)
 
Сверху