ФорумПрограммированиеPHP для идиотов → Где вызывать декорировани, короче не знаю даже как тему назвать...

Где вызывать декорировани, короче не знаю даже как тему назвать...

  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 26 июня 2010 г. 17:28

    Хочу побеседовать о таком…
    Допустим есть объект
    class Object {

    protected $_data;

    public function __construct()
    {
    $this->_data = array();
    }

    public fucntion __get($name)
    {
    return (isset($this->_data[$name]) ? $this->_data[$name] : null);
    }

    public function _set($name, $value)
    {
    $this->_data[$name] = $value;
    }
    }

    тобишь типа ArrayObject. Когда мы показываем пользователю данные в формате html мы обезопасеваем их с помощью htmlspecialchars. Но нам может также понадобиться оперировать чистыми данными, допустим сделать копию их или еще кудато записать или отправить, ну вообщем надо и с чистыми работать.
    Так вот, например, мы передаём данные объекта в представление. В этом топике я рассматриваю памятиэкономный способ, так скажем. Тобишь в представление мы передаём ссылку на объект
    $object->login = $login;
    $view->user = $object;

    Потом при выводе представления происходит что то типа такого:
    echo $this->user->login

    или
    echo $this->escape($this->user->login)

    Это нормально как бы, ведь представление определяет формат вывода, в данном случае декорируя в escape данные с помощью htmlspecialchars.
    Также есть много разных вариантов реализации способов и мест вызова декорирования данных, типа:
    $view->assignHtml('login', $user->login)

    $view->user = $user->asHtml();

    echo $this->user->login_html


    //или внутри шаблона
    view::__get($name)
    {
    return $this->_data[$name]->asHtml();
    }

    Короче где правильнее делать преобразование, так скажем "формата данных", где переключать объекты на отдачу данных в определённом формате или преобразовывать данные объекта в этот формат, или просить у объекта данные в определённом формате???? Ведь допустим вызыв
    echo json_encode($object) 

    пойдёт с чистыми данными, значит надо, допустим переключить объект на отдачу его данных в другом форамте, типа
    echo json_encode($object->asHtml())

    Вообщем что скажите спецы?

    зы: хуёвый __get() в пыхе, надо бы еще параметров ;)
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 26 июня 2010 г. 17:36, спустя 8 минут 38 секунд

    Короче где правильнее делать преобразование, так скажем "формата данных", где переключать объекты на отдачу данных в определённом формате или преобразовывать данные объекта в этот формат, или просить у объекта данные в определённом формате????

    разные преобразования надо делать в разных местах.
    что касается хтмлескейпа, то вариант
    $this->escape($this->user->login)

    нормальный, только обзови метод понормальному, ты ескейпаешь, а вот что именно ескейпаешь не указываешь.
    напиши типа escapeHtml()

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

    ну и т.д.
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 26 июня 2010 г. 17:44, спустя 7 минут 24 секунды

    напиши типа escapeHtml()

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

    а вот тут самый важный момент, где и что должно быть. Елси я отдаю результаты экшена как ответ пользователю то в шаблоне хтмл у меня будет всё ок, ибо $this->escapeHtml($this->user->login) походит на ура, а вот если я отдаю результаты экшена аджакс ответом, разве я не должен заэскейпить данные? - Должен. Но где мне это сделать? - Перед тем как передать в шаблон, скорее всего или представить, что шаблон это какой то кусок кода, метод там какой-то в котором есть помимо всего прочего json_encode. Вот тут то я и теряюсь где и чего границы?
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 26 июня 2010 г. 17:48, спустя 4 минуты 22 секунды

    если аякс, то ответ аяксом должен прийти такой, который не надо нихуя проверять.
    т.е. тот скрипт на который ты ломишся аяксом уже должен отдавать тебе данные которые прошли через некий prepare().
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 26 июня 2010 г. 17:58, спустя 9 минут 36 секунд

    NRG, так нафиг тогда 2 экшена на одни запрос делать, почему нельзя подменить представление, которое как бы отработает одинаково, но внутри по разному…
    Так, не надо увиливать, а ну признавайся давай как лучше для моего случая?
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 26 июня 2010 г. 18:09, спустя 11 минут 11 секунд

    Почти, но хотя не особо то же самое. Вот мы получили из базы данных дату 2010-08-08 15:25. Где её надо преобразовать, что бы вывести "08 августа" и еще где то вывести в виде "08 08 2010" в логике представления? А аджаксом если возвращать?
    А вот если у меня объект с тремя свойствами и при передаче данных представлению json мне надо одно свойство преобразовать колбеком, второе оставить чистым, а третье заэскейпить, это прямо при передаче делать?
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 26 июня 2010 г. 21:35, спустя 3 часа 26 минут 4 секунды

    kostyl, весь косяк в том, что ты эскейпишь строку в шаблоне. эскейпить строку надо в контроллере. в шаблон надо передавать просто хэш-массив, в котором строки уже подготовлены
    почему так? потому что некоторые строки, которые ты будешь получать из базы, уже заэскейпены, и их эскейпить не надо.
    Спустя 96 сек.
    Где её надо преобразовать, что бы вывести "08 августа" и еще где то вывести в виде "08 08 2010" в логике представления?

    ващет без разницы, но в контроллере будет проще потом сменить одно на другое
    не всё полезно, что в swap полезло
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 26 июня 2010 г. 22:14, спустя 39 минут 14 секунд

    master, ты неправ. данные должны приходить в исходном виде, а представление (назови его "шаблон") заботится об оформлении под конкретного "потребителя".

    kostyl, может быть в этом случае скрипты клиентской стороны считать представлением? отдаешь им дату только в исходном виде, а дальше их работа.
    ιιlllιlllι унц-унц
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 26 июня 2010 г. 22:57, спустя 42 минуты 29 секунд

    artoodetoo, вот пример. есть табличка


    Имя: Иван
    День рождения: 12/01/1901
    Рост: 1м 70см
    Вес: 70,5 кг
    Время пребывания на форуме: 2 ч 52 мин
    Подпись: я Иван c планеты альдебаран
    Пожертвовал на строительство телеграфа: 500 руб 3 коп
    Аватарка: [тут выводится картинка размером икс на игрек с некими урл, алт и тайтл]

    подпись содержит html-текст

    какие данные должны быть переданы в шаблон? имею ввиду их исходный вид.
    не всё полезно, что в swap полезло
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 26 июня 2010 г. 23:05, спустя 8 минут 9 секунд

    Данные должны быть переданы в шаблон в исходном виде, грубо говоря как их fetch вернул — в виде ассоциативного массива.
    Шаблон описывает какие данные эскейпить, какие обрезать по длине, какие отформатировать по заданному правилу. No problem.
    ιιlllιlllι унц-унц
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 26 июня 2010 г. 23:08, спустя 3 минуты

    то есть теперь fetch безликий всеми правит? вообще здорово.
    а если данные не хранятся в одной таблице, т.е. массив нужно собирать?
    а если фетча в контроллере вообще нет?
    Спустя 80 сек.
    Всё-таки давай более конкретно. Вот в том примеру что я привёл какие должны быть исходные данные, те что передаются в шаблон?
    не всё полезно, что в swap полезло
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 26 июня 2010 г. 23:09, спустя 1 минуту 2 секунды

    Шаблон на псевдоязые. Думаю, всё очевидно:

    <li>Имя: {$name|esc}</li>
    <li>Рост: {$growth|format_length}</li>
    <li>Подпись: {$sign}</li>

    ιιlllιlllι унц-унц
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 26 июня 2010 г. 23:14, спустя 4 минуты 57 секунд

    зачем format_length выносить в шаблон?
    не всё полезно, что в swap полезло
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 26 июня 2010 г. 23:28, спустя 14 минут 35 секунд

    Зачем контроллер должен что-то знать о форматировании длины?
    Спустя 90 сек.
    Ты намеренно не используешь слово "представление". Форматирование данных — задача представления.
    ιιlllιlllι унц-унц
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 26 июня 2010 г. 23:34, спустя 5 минут 58 секунд

    ну так он же главный. шаблон мы можем сменить, а контроллер нет.

    Я веду к упрощению задачи шаблонизатора/шаблона. Шаблонизатор должен делать только одно - вставлять данные в шаблон. Это кстати снижает нагрузку на верстальщика. И если что-то надо изменить - точно знаем куда лезть.

    в общем тут такая картина
    controller -> data_transformer -> template
    в промежуточном звене можно придать данным любую форму, но поступать в шаблон они должны уже в готовом виде. так гораздо гибче и отлаживать проще.
    не всё полезно, что в swap полезло

Пожалуйста, авторизуйтесь, чтобы написать комментарий!