Pull to refresh
Comments 44
Вы мешаете всё в кашу, задумав универсальный инструмент, в то время как 90% «проблем», описываемых вами, и самая главная — разделение кода и представления, решились бы использованием грамотного шаблонизатора.
Я только за написание велосипедов, но в данном случае это избыточно для статьи на хабре, хотя и полезно лично для вас, как учебный проект.

MelonPHP — не шаблонизатор. Он создавался для комфортного написания UI на PHP и вдохновлялся флаттером. Он похож по стилю написания ui на такие фреймворки как: SwiftUI, Jetpack Compose, MAUI. Я не думаю что он является велосипедом, так как на момент его написания я подобных фреймворков на яп пхп не видел.

на момент его написания я подобных фреймворков на яп пхп не видел

Быть может, это потому, что написать UI на серверном языке невозможно? Для UI в вебе, как ни крути, не обойтись без HTML/CSS/Js. А чем вы эту статику будете генерировать — руками в блокноте или в php-коде — ни на что не влияет.
Да, еще можете, к примеру, глянуть Yii — там есть компоненты, отдающие готовый html/js.
Либо, к примеру, InertiaJs — чем не генератор HTML-кода?

Познакомься с функцией sprintf
Генерировать код на стороне сервера… Лет 15 назад норм было.
Даже, если допустить, что такой подход к генерации html и нужен (я не представляю для чего) то никто не будет вот это все использовать. Все эти классы и прочее.

Большое спасибо за sprintf! Я изначально планировал предгенерироать html, но отказался, так как хотел делать rebuild дерева с помощью ajax. Сейчас насколько я вижу модно юзать свои движки для рендеринга (например skia), но у меня бы не хватило на это времени (изначально была цель доделать его до конца семестра, что я и смог сделать). Интересно было узнать что 15 лет назад было модно юзать кодогенерацию html. Так же этот проект скорее — концепт/идея и я не вижу смысла везти его в продакшн.

Даже была одна либа с названием template. Вообще древняя. Разделение кода и html. Ибо в то время js фреймворки только наращивал экспансию. Возьми любую cms и там будет то о чем ты пишешь.
Но проблема этих кодогенераторов ы том, что в результате благие начинания разбиваются о безалаберность писателей. Проще вклинить кусок html в код… Малкнький же кусочек.
Сначала тут, потом там сям… Через год получаем портянку говнокода.
Человеческий фактор.

Я согласен с вами. Я тут ещё подумал. Веб усложняется. Сначала если посмотреть глобально html, потом css, дальше js в вебе. Я думаю что в будущем всеравно появится централизация в вебе, так как чтобы написать простой проект, тебе (нужно быть жонглером?) нужно юзать слишком много не оправданно лишнего.

Я, возможно, что-то просмотрел, но нигде не нашёл HTML-экранирования никакого текста.

Я немного не понял вопроса, но если вы про генерацию чистых html тегов, то этим заниматься класс Tag. Могу скинуть ссылку на него.

Нет, этого нет. Я хотел добавить это когда сделал бы поддержку markdown в тексте.

Обозначенная проблема заменена той же проблемой, только более многословной. Уже 15 лет назад для таких задач активно использовались шаблонизаторы (привет Smarty) и MVC.

Я знал на момент написания фреймворка о шаблонизаторах, но я решил сделать эксперемент. Я хотел попробовать создать что-то наподобие flutter, где в данной ситуации вы могли бы написать сайт/программу используя только один язык — php. Кроме того я пытался сделать это удобным. Кодогенкрация в html /css была выбрана для быстроты написания, чтобы проверить как будет смотреться и писаться код по тем идеям которые я позаимстовал у флаттера и добавил сам. Это скорее концепт написания UI на пхп и я сделал ошибку в статье сосредоточив внимание на кодогенрации.

В том-то все и дело, что, в отличие от Flutter, в вебе есть две части: серверная и клиентская. Вторая, так или иначе, потребует иного, отличного от серверной части языка.

Вместо чистого и лаконичного css / html получилось нагромождение php примерно втрое большего объёма.


Более того, посмотрите на Jade — это псевдо-код, очень удобный для генерации, который собирается в HTML, и посмотрите на LESS — тоже отличная штука для CSS.

Печально что вам не понравилась идея написания UI на php.
В целом по количеству кода тут никак меньше не сделать (если про html генерацию), по крайней мере у меня сейчас идей нет.

Понимаете, программно заменять такую гибкую штуку как HTML/CSS имеет смысл только в двух случаях:


  • когда нужна последовательная генерация в цикле, вроде рядов таблицы
  • когда нужно использование готовых компонентов/виджетов

Вы же пытаетесь сделать какой-то универсальный транслятор, который кроме вас вряд ли кто-то решится использовать — хотя бы потому, что вы смешали дизайн с программированием.


Если на сайте решат сделать кнопки красными, а не синими, или задать не цвет, а смысл (кнопка цвета Submit Secondary), всё это будет жуткой головной болью. Да просто найти по готовому CSS обратно где этот CSS в коде генерится — уже весёлая задачка!


Я уж не говорю про autocomplete и прочие радости нормальной разработки. А вы вообще все свойства собираетесь загнать в константы? А поля 'data-...' будут?


Ну и писать всё это для того, чтобы вывести синюю кнопку с круглыми краями?


Сравните... а если таких кнопок 100?
<button style='width: auto; padding: 4px 10px; color: white; border-radius: 4px;background-color: blue;'>Press</button>

Button::Create()
        ->ThemeParameter(Width, Auto)
        ->ThemeParameter(Padding, [Px(4), Px(10)])
        ->ThemeParameter(BackgroundColor, Blue)
        ->ThemeParameter(Color, White)
        ->ThemeParameter(BorderRadius, Px(4))
        ->Text("Press")

Дело в том, что HTML/CSS уже и есть лучший инструмент для создания такой кнопки. Единственное, чего там не хватает — процедурной генерации и виджетов.

А какой основной (любимый) язык программирования? Чувствуется влияние то ли java, то ли шарпа.

Хороший вопрос. Как вы и написали есть большое влияние шарпов на код, но как такового основного языка у меня нет. Мне нравится шарпы, плюсы, dart, ts, rust, swift.

В PHP немного другая сложившаяся практика структурирования и именования классов/методов/свойств. Почитайте PSR-*.
Помимо этого, скорей всего лучше воспользоваться doc.nette.org/en/3.0/php-generator =)

Проблемы как таковой нет, каждый пишет код как хочет и у каждого решения свои пользователи.
Если бы большинство из сообщества пыха были со вторым стеком java или шарп, вероятно текущие стандарты и подходы были бы ближе к вашему коду.
Я бы с радостью "звезданул" ваше решение, если вдруг вы решите когда-то отрефачить его под PSR и заюзать указанную библиотеку как основу)
А минуса, это фанатики джуниоры ставят)

Да, я отрефакторю. Я доработкой в свободное время занимаюсь. Что касается минусов, то их скорее ставят консерваторы, или люди привыкшие к одному стеку технологий, и не признающие другие стеки.
Что касается минусов, то их скорее ставят консерваторы, или люди привыкшие к одному стеку технологий, и не признающие другие стеки.

Нет, минусы ставят люди, знакомые с давно известным, правильным решением.
habr.com/ru/post/511544/#comment_21861056
habr.com/ru/post/511544/#comment_21862526
habr.com/ru/post/511544/#comment_21863082
habr.com/ru/post/511544/#comment_21867796
А не проще «причесать» первую версию кода?
Было
<?php if ($result->num_rows > 0) {
    echo "<b>Table table</b><br><br>";
    echo "<table border=2>";
    echo "<tr><td> name </td>" . "<td> name </td>" . "<td> name </td></tr>";
    while ($row = $result->fetch_assoc()) {
        echo "<tr><td>" . $row["name"] . "</td><td>" . $row["name"] . "</td><td>" . $row["name"] . "</td></tr>";
    }
    echo "</table>";
} else {
    echo "0 results";
} ?>

Стало
<?php if ($result->num_rows > 0) { ?>
    <b>Table table</b><br><br>
    <table border=2>
        <tr>
            <td> name</td>
            <td> name</td>
            <td> name</td>
        </tr>
        <?php
        while ($row = $result->fetch_assoc()) { ?>
            <tr>
                <td><?php echo $row["name"] ?></td>
                <td><?php echo $row["name"] ?></td>
                <td><?php echo $row["name"] ?></td>
            </tr>
        <?php
        } ?>
    </table>
<?php
} else {
    echo "0 results";
} ?>
Благодарю за дополнение, так действительно удобнее:

<?php if ($result->num_rows > 0) : ?>
    <b>Table table</b><br><br>
    <table border=2>
        <tr>
            <td> name</td>
            <td> name</td>
            <td> name</td>
        </tr>
        <?php while ($row = $result->fetch_assoc()): ?>
            <tr>
                <td><?php echo $row["name"] ?></td>
                <td><?php echo $row["name"] ?></td>
                <td><?php echo $row["name"] ?></td>
            </tr>
        <?php endwhile; ?>
    </table>
<?php else:
    echo "0 results";
endif; ?>

Можно было вместо


<?php echo $row["name"] ?>

Написать


<?= $row["name"] ?>
Начиная с версии PHP 5.4.0 запись <?= стала доступна всегда.
Потому что такое будет работать на любом shared-хостинге.
Стандарты PSR рекомендуют не использовать сокращенную запись.
Сокращенная форма — это <? ?>. Её не рекомендуется юзать чтоб не было потенциальных конфликтов с xml
В шаблонах юзать <?= ?> очень даже ок, тем более, что эта запись доступна даже при выключенном short_open_tag

Я думал об этом, но не стал исправлять. Решил оставить оригинальный код.

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

Автор, похоже, просто не работал с нормальными шаблонизаторами, вроде twig.
Выдумывание своих велосипедов с квадратными колесами это не плохо так то на этапе обучения.
Бэкенд — это бэкенд, а фронтед — ну вы поняли… Я не собираюсь их объединять. Тут нет речи об этом.

«10 уровневые вложения десятков классов». Код удобно разделять на компоненты. А само дерево если грамотно писать (и делить), то вы не столкнетесь с проблемой вложенности.

Проблему связанная ", и попробуй не ошибиться в скобочке…" не является серьезной. В наше время есть IntelliSense и кода форматеры (хз как это пишется правильно).

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

По мне — это довольно свежий взгляд на создание UI со стороны PHP. Мне самому импонирует подход Flutter к созданию интерфейсов в таком стиле, тем более я еще нигде такого не видел.

Автор, пили есчо. Во всяком случае, я бы таким попользовался.
Я буду писать его в свободное время. У меня в планах сделать удобную систему навигации, более удобные темы. Добавить различные оптимизации и реализовать callback api. Пока это всё
Only those users with full accounts are able to leave comments. Log in, please.