За последние 24 часа нас посетили 18129 программистов и 1677 роботов. Сейчас ищут 1111 программистов ...

Готовое решение: PHPC — PHP Compiler CMF

Тема в разделе "Решения, алгоритмы", создана пользователем Dagdamor, 2 мар 2007.

  1. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    tenshi
    Просто вы явно не понимаете, что в моем движке можно, а что нельзя. Значениями параметров могут быть любые строки, хоть бинарные. Правила экранирования - как у double-quoted строк в PHP. И это делает их крайне мощными: хотите - передавайте теги (param="<Читай>"), хотите - передавайте HTML-сущности (param="&lt;Читай&gt;"), хотите - передавайте и то, и другое. У шаблона есть две стратегии работы с переданными параметрами:

    - экранировать их перед выводом (стратегия по умолчанию, уже экранированные символы повторно не трогаются);
    - тупо выводить все как есть (нужно вместо <var:param> писать в шаблоне <var:param nofilter>).

    То есть в PHPC для любого параметра существует выбор между безопасной стратегией (экранирование) и более опасной (что передали, то и имеем). В XSLT же выбора нет - там только "опасная" стратегия. Если я напишу в XML опасный тег (<script>...</script>), он и вывалится тупо на экран - привет, XSS! Чтобы обезопасить данные, мне нужно самому вручную экранировать их в XML - геморрой. В то же время из-за ограниченного синтаксиса XML нет возможности передать "опасные" данные и возложить их экранирование на движок - ваш XML просто вывалится с ошибкой на фрагменте "<Читай>", приняв его за "невалидный тег". А ведь кому-то может быть удобно использовать такие символы в заголовках.

    Вывод: это XSLT заставляет вас ковыряться в "экранированном хмл-е", а не PHPC. Да, это сомнительное удовольствие, согласен.

    Я эту обработку давно написал, а у вас пока одни пустые слова.

    Не спорю. Я это приводил к тому, что слова про "сложность (шаблонов) растёт экспоненциально" - глупость, если конечно не валить все в одну кашу, а структурировать. В PHPC все возможности для структурирования есть.

    Не только. Не забудьте потом, изменив логику (например, чуть изменив вложенность тегов), потом внести соответствующие изменения и в шаблонах. Ибо они у вас этими DOM-путями насмерть завязаны друг на друга, никакой абстракции.

    Ога. Правда, момент с перестановкой двух полей местами мы с вами уже рассматривали в соседней теме ;)

    Да как же нет? Все там есть, именно такие дикие пути там и есть. У вас все правила морфирования начинаются с одного и того же
    Код (Text):
    1. <t:template match=" /o:data/o:track-list/o:track/o:descr ">
    , где между кавычками прописывается этот кошмарный путь. И у каждого правила он другой, и редко когда эти правила меньше тройной вложенности. Это типа нормально для XSLT?

    Здрасте, я ваша тетя! С plain-text письмами все ясно (я о них и не упоминал), а вот в XML все прекрасно поддерживается и работает.
    Простой пример, учим матчасть. Специалисты по XML епт :)

    И не надо. Я свой движок писал не для того, чтобы его "правили под себя", а чтобы им пользовались.

    Во-первых, работа с УРЛами у меня автоматизирована, все запросы обслуживает один "реврайт", а вовсе не туча. Во-вторых, никакой "привязки к иерархии" у меня по умолчанию нет: хотите - привязывайтесь в своем проекте, хотите - используйте самые короткие УРЛы. В-третьих, вы явно не понимаете разницу между понятиями URL и ID. Первое имеет осмысленную для человека форму и потому может измениться (например, исправлена опечатка, которых у вас в базе хватает, или статья была дополнена и ей нужно более общее название), как следствие - эту строку нельзя использовать для связей между таблицами, она не неизменна. Второе - это значение, которое не имеет осмысленного вида и никогда и ни при каких обстоятельствах не изменяется, как следствие - это значение можно использовать для внутренних связей. Что немаловажно, выборка, в т.ч. индексированная, по числовым ключам гораздо быстрее выборки по строке.

    Статью я читал, сама статья неплохая, но однобокая. Автор забыл про один важный аспект ЧПУ: они должны легко набираться с клавиатуры по памяти, а иначе какой смысл делать адрес простым и коротким? У вас все УРЛы имеют вид типа "?article:uuu.hell", то есть, кроме букв, используется как минимум три разных знака препинания, что делает такие адреса совершенно бесполезными для запоминания. Все равно потом правильно не наберешь. Такие адреса годятся только для кликов по ним мышкой, то есть смысл ЧПУ как таковой теряется.
     
  2. tenshi

    tenshi Активный пользователь

    С нами с:
    1 июн 2010
    Сообщения:
    191
    Симпатии:
    0
    то есть если я напишу "&amp;" то "amp;" таинственным образом исчезнет?

    речь шла об этом коде: <insert:htmlMenuItem link="/" title="Читай"/> тут в тайтле нельзя использовать тэги, а если и можно, то заэкранированные.

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

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

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

    что в этом пути кошмарного? смотрим в хмл и уже знаем где искать шаблон для каждого тэга. смотрим на шаблон и знаем что подключится он к чётко определённому хмл.

    http://en.wikipedia.org/wiki/List_of_XM ... references

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

    не говори глупостей. всё замечательно запоминается. главным образом по тому, что по всему сайту используются единые правила формирования урлов.
     
  3. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    tenshi
    Уже экранированные символы не трогаются. "&amp;" останется "&amp;", и на экране это будет выглядеть, как просто "&".

    Да сколько ж раз повторять-то? Можно! Можно использовать теги. Например:
    HTML:
    1. <insert:htmlMenuItem link="/" title="<b>Читай</b>"/>
    Да никакой не сложный. Все расширяется элементарно, ведь шаблоны в PHPC - это очень мощная вещь, в них можно проверять произвольные условия, можно вставлять другие шаблоны, можно наследовать их друг от друга, можно использовать PHP-вставки и так далее. А вот как расширять шаблоны в XSLT? Можно конечно сделать кучу проверок, привязавшись к DOM пути, и для каждого случая наделать обработчиков - для верхнего уровня один, для вложенного другой, но если потом понадобится чуть изменить структуру данных (например, меню перенести из верхнего уровня в какую-нибудь боковую панельку), у вас же все придется переписывать под корень.

    По-моему, это жутко неудобно. Смотрим в XML - и одновременно на бумажке записываем путь (начиная с текущего элемента, то есть с конца, и постепенно поднимаясь до корневого элемента), а потом в текстовом редакторе делаем Ctrl+F и вводим этот путь, чтобы найти в файле искомый шаблон-мутатор...

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

    Ссылка на вики - не совсем то. Это именованные сущности... их вроде как тоже можно использовать в XML, если совсем приспичит, но надо как-то предварительно "объявлять". Числовые сущности работают везде и всегда.

    Мне было лень :)

    Текст, может быть, и запоминается, а вот с символами беда. Я сейчас, не перечитывая свою мессагу, уже не скажу по памяти, где там что было - где было двоеточие, а где запятая (или точка?). Имхо, в URL есть только один символ, который знают и помнят все - это слеш (/). Все остальное от лукавого и никому не надо.

    А то, что на всем сайте единые правила - ну еще бы они в пределах сайта различались ;) Да только на одном сайте одни правила, на другом другие... люди не обязаны запоминать все эти тонкости.
     
  4. tenshi

    tenshi Активный пользователь

    С нами с:
    1 июн 2010
    Сообщения:
    191
    Симпатии:
    0
    ну то есть amp; просто исчезнет. вот юзеры будут счастливы экранировать амперсанды. но если тэги не дупустимы, то экранирование пользователем нафиг не нужно. а если допустимы, то автоэкранирование идёт лесом.

    Код (Text):
    1. <insert:htmlMenuItem link="/" title="<b>Читай</b>"/>
    Код (Text):
    1. <insert:htmlMenuItem link="/" title="Читай "так" и 'эдак'"/>
     
  5. tenshi

    tenshi Активный пользователь

    С нами с:
    1 июн 2010
    Сообщения:
    191
    Симпатии:
    0
    шаблоны замещают друг друга. писать подряд несколько шаблонов со всё большей специфичностью - нормальная практика. у вас это вырождается в лесенку из ифов.
     
  6. tenshi

    tenshi Активный пользователь

    С нами с:
    1 июн 2010
    Сообщения:
    191
    Симпатии:
    0
    нет никаких числовых сущностей. все сущности именованные. а числами записываются ссылки на символы. ничего общего кроме похожего синтаксиса между ними нет.
     
  7. tenshi

    tenshi Активный пользователь

    С нами с:
    1 июн 2010
    Сообщения:
    191
    Симпатии:
    0
    возможность ручного ввода урла - для постоянный пользователей. непостоянный просто не знает что вводить. и знаки препинания никакой роли тут не играют.
     
  8. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    tenshi
    С-ответом-тормозящий, словонеохотливый мультипостер :D

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

    Зато у меня по крайней мере все, что отвечает за один шаблон - рядом, а не разбросано по десяти местам (хорошо, если не по десяти файлам). Кроме того, напоминаю про механизм наследования шаблонов в PHPC - специально для тех, кому не нравятся проверки условий.

    Вы помните, с чего вообще начался этот наш разговор про HTML-сущности? Напоминаю:
    ВЫ: Если у тебя win1251, как же ты хранишь иероглифы? HTML-сущностями?
    Я: Да, и ничего плохого в этом не вижу.
    Не знаю, что в тот момент под "HTML-сущностями" подразумевали вы, но я имел в виду и именованные сущности, и числовые (по-вашему - "ссылки на символы", хотя в оригинале это называется Numeric Character Reference). Для того злосчастного иероглифа именованной сущности, насколько я понимаю, не существует вовсе. Так что выбора нет - только число. Которое, еще раз повторяю, работает везде и всегда. И ради сомнительного удовольствия записать эту зигогулину не шестью байтами, а тремя (экономия аж 3 байта!!!) переводить ВСЮ базу в более расходную и медленную, а главное - нестабильную, многобайтовую кодировку, лично я смысла не вижу никакого.

    Если речь не о ручном наборе УРЛа, то статья теряет всякую ценность. Ибо без ручного набора на внешний вид ссылок всем глубоко плевать. Постоянные посетители - тоже, кстати, немаленькая ценность. Я бы даже сказал, большая. Ради них можно и продумать архитектуру сайта немножко.
     
  9. tenshi

    tenshi Активный пользователь

    С нами с:
    1 июн 2010
    Сообщения:
    191
    Симпатии:
    0
    пользователь вводит "&amp;" а получает просто "&". поэтому ему приходится дополнительно экранировать амперсанд. спрашивается, зачем его напрягать?

    а у меня всё, что относится к одной сущности.

    оно позволяет полностью перегрузить шаблон?

    ладно, с иероглифами я погорячился. классические "кавычки-ёлочки" - хороший пример.

    что в ней нестабильного?

    вот именно для них и придуманы простые и лаконичные правила.
     
  10. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    tenshi
    Это у вас пользователь вводит "&amp;" а получает просто "&". ;)
    У меня пользователь вводит "&", и получает на экране "&".

    Да, позволяет.

    Да, хороший, ибо в 1251 эти символы есть. :)

    Строка в однобайтовой кодировке всегда корректна, ибо допускаются все 256 вариантов для каждого символа.
    А строку в UTF8 можно запросто запороть. Один substr вместо mb_substr, и все. Порченая строка может быть легко передана и снаружи. Вы хоть в одном своем проекте на UTF8 выполняете строковую валидацию входящих данных? Я говорю не об обычной валидации, типа "не более 100 символов" или "только буквы и цифры", а именно о валидации внутренней структуры самой строки. А нормализацию, чтобы минимизировать неоднозначности? Если нет - поздравляю, ваши проекты дырявы. Например, MySQL не принимает порченые UTF8-строки в запросах, в лучшем случае выдавая ошибку всего запроса. А до недавней версии так и вовсе намертво зависал на них.

    ...с тремя разными знаками препинания в них. ;) Имхо, все, что кроме слеша - уже не к месту. Даже всяких тире и подчеркиваний нужно стараться по возможности избегать.
     
  11. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
  12. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
  13. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    iliavlad
    tommyangelo
    www.phpc.ru/manual - вот тру человекопонятный УРЛ. ;)
     
  14. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    да как-то человекопонятность сильно... выворачивается что ли. вот если делать понятность, то тогда уж http://domotekhnika.ru/ERT647.htm
    Dagdamor
    у тебя хорошие чпу (http://www.phpc.ru/manual/samples/expandmenu), но только для говорящих по-нерусски. а вот когда такие чпу начинают на русский переводить и получается vozduhoochistiteli-ionizatory, которые по-моему ни фига не чпу.
     
  15. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    ННУ