Documentation/ru_RU/book/1.0/07-Inside-the-View-Layer (diff)

You must first sign up to be able to contribute.

Changes between Version 11 and Version 12 of Documentation/ru_RU/book/1.0/07-Inside-the-View-Layer

NaTTs (IP:
02/11/08 21:12:47 (10 years ago)



  • Documentation/ru_RU/book/1.0/07-Inside-the-View-Layer

    v11 v12  
    932932### Escaping Strategy 
    934 The `escaping_strategy` setting determines the way variables are output by default. The following are the possible values: 
    936   * `bc` (backward compatible mode): Variables are not escaped, but an escaped version of each variable is available through the `$sf_data` container. So the data is raw by default, unless you choose to use the escaped value via the `$sf_data` object. This is the default value, and you should be aware that with this strategy, your application is subject to XSS attack risks. 
    937   * `both`: All variables are escaped by default. Values are also made available in the `$sf_data` container. This is the recommended strategy, since you will be at risk only if you voluntarily output raw data. In some cases, you will have to use unescaped data--for instance, if you output a variable that contains HTML with the intention that this HTML be rendered as such in the browser. So be aware that if you switch to this strategy with a partially developed application, some features may break. The best choice is to use this setting right from the beginning. 
    938   * `on`: Values are available only in the `$sf_data` container. This is the most secure and fastest way to deal with escaping, because each time you output a variable, you must choose if you want to use the escaped version with `get()` or the raw version with `getRaw()`. So you are always aware of the possibility that data may be corrupted. 
    939   * `off`: Turns off output escaping. The `$sf_data` container is not available in templates. You can choose to use this strategy rather than `bc` to speed up your application if you are sure that you will never need to access escaped data. 
    941 ### Escaping Helpers 
    943 Escaping helpers are functions returning an escaped version of their input. They can be provided as a default `escaping_method` in the `settings.yml` file or to specify an escaping method for a specific value in the view. The following escaping helpers are available: 
    945   * `ESC_RAW`: Doesn't escape the value. 
    946   * `ESC_ENTITIES`: Applies the PHP function `htmlentities()` to the input with `ENT_QUOTES` as the quote style. 
    947   * `ESC_JS`: Escapes a value to be put into a JavaScript string that is going to be used as HTML. This is useful for escaping things where HTML is going to be dynamically changed using JavaScript. 
    948   * `ESC_JS_NO_ENTITIES`: Escapes a value to be put into a JavaScript string but does not add entities. This is useful if the value is going to be displayed using a dialog box (for example, for a `myString` variable used in `javascript:alert(myString);`). 
    951 ### Escaping Arrays and Objects 
    953 Output escaping not only works for strings, but also for arrays and objects. Any values that are objects or arrays will pass on their escaped state to their children. Assuming your strategy is set to `both`, Listing 7-45 demonstrates the escaping cascade. 
    956 Listing 7-45 - Escaping Also Works for Arrays and Objects 
     934Настройка `escaping_strategy` определяет, как именно переменные обрабатываются. Вот возможные значения: 
     936  * `bc`: Переменные не обрабатываются. Точнее, по умолчанию будет использоваться RAW версия данных, а преобразованная версия будет доступна через объект $sf_data. Этот подход применяется по умолчанию. Остерегайтесь этого подхода, при нем ваше приложение может стать легкой добычей XSS атак. 
     937  * `both`: Все переменные обрабатываются. Значения доступны через объект $sf_data. Это как раз рекоменжлваный подход, так как могут возникнуть случаи, в которых вам необходимо использовать непреобразованные данные. Однако, если вы перейдете на эту опцию  на среднем этапе разработки вашего приложения, некоторые функции, использовавшие непреобразованные данные по умолчанию могут перестать работать. Лучший вариант - использовать эту опцию с самого начала.  
     938  * `on`: При таком подходе все переменные доступны ТОЛЬКО через объект $sf_data. Это обеспечивает явный выбор между методом get() и getRaw() (обработанные и необработанные данные соответственно), что обеспечивает лучшую безопастность и надежность.  
     939  * `off`: При этой опции контейнер $sf_data не будет доступен в шаблонах. Применяйте эту опцию, если вы уверены, что точно не будете работать с преобразованием. Это даст вам определенный выйгрыш в производительности. 
     941### Преобразовывающие методы-помощники. 
     943Преобразовывающие методы-помощники - это функции, которые возвращают преобразованную версию входных данных. За выбор функции-преобразователя отвечает настройка escaping_method в settings.yml. Вот ее доступные значения: 
     945  * `ESC_RAW`: Не преобразовывает данные. 
     946  * `ESC_ENTITIES`: Выполняет для входных данных htmlentities() с `ENT_QUOTES` в качестве стиля кавычек. 
     947  * `ESC_JS`: Преобразовывает html в JS строку, которая будет выведена как html. Это полезно, когда вы работаете с динамическим html контентом, который изменяется посредствам JS. 
     948  * `ESC_JS_NO_ENTITIES`: Преобразовывает данные в JS строчку, но не включает в нее html сущностей. Это полезно, когда данные должны быть выведены в диалоговом окне. 
     950### Преобразование массивов и объектов. 
     952Преобразование вывода работает не только для строк, но и для массивов и объектов. Все значения, являющиеся объектами или массивами, так же будут преобраованы вместе со всеми их членами. Листинг 7-45 демонстрируед каскадное преобразование, с учетом параметра strategy установленного в "both": 
     954Listing 7-45 - Преобразование массивов и объектов 
    958956    [php] 
    981979     => <&> 
    983 As a matter of fact, the variables in the template are not of the type you might expect. The output escaping system "decorates" them and transforms them into special objects: 
     981На самом деле перменные, которые вы использутее в шаблоне, уже не относятся к классу массивов или вашему классу объекта. Преобразователь приводит их к внутреннему типу преобразователя для наведения "декораций". 
    985983    [php] 
    989987     => sfOutputEscaperObjectDecorator 
    991 This explains why some usual PHP functions (like `array_shift()`, `print_r()`, and so on) don't work on escaped arrays anymore. But they can be still be accessed using `[]`, be traversed using foreach, and they give back the right result with `count()` (`count()` works only with PHP 5.2 or later). And in templates, the data should be read-only anyway, so most access will be through the methods that do work. 
    993 You still have a way to retrieve the raw data through the `$sf_data` object. In addition, methods of escaped objects are altered to accept an additional parameter: an escaping method. So you can choose an alternative escaping method each time you display a variable in a template, or opt for the `ESC_RAW` helper to deactivate escaping. See Listing 7-46 for an example
    995 Listing 7-46 - Methods of Escaped Objects Accept an Additional Parameter 
     989Это объявняет тот факт, что некоторые php функции (array_shift(), print_r()) не будут работать с преобразованными массивами. Но доступ к их элементам посредствам "[]" по-прежнему работает. Функция count() возвращает корректное число элементов в массиве (начиная с версии php 5.2). В шаблонах данные предоставляются в режиме read-only, так что, большинство методов не будут работать.  
     991У вас попрежнему есть возможность использовать непреобразовенный объект через $sf_data. В качестве дополнения, методы объекта изменяются таким образом, что принимают один лишний параметр, описывающий метод преобразования. Иначе говоря, вы можете выбрать метод преобразования при каждом вызове функции у преобразуемого объекта. Указав ESC_RAW преобразование в контексте этого вызова будет отключено
     993Listing 7-46 - Методы преобразования в дополнительном параметре. 
    997995    [php] 
    10041002     => <&> 
    1006 If you deal with objects in your templates, you will use the additional parameter trick a lot, since it is the fastest way to get raw data on a method call
     1004Если вы работаете с объектами в ваших шаблонах, вы будете использовать дополнительный параметр достаточно часто, так как это самый  быстрый и простой способ получить непреобразованные данные при вызове метода
    1009 >The usual symfony variables are also escaped when you turn on output escaping. So be aware that `$sf_user`, `$sf_request`, `$sf_param`, and `$sf_context` still work, but their methods return escaped data, unless you add `ESC_RAW` as a final argument to their method calls. 
    1011 Summary 
    1012 ------- 
    1014 All kinds of tools are available to manipulate the presentation layer. The templates are built in seconds, thanks to helpers. The layouts, partials, components, and component slots bring both modularity and reusability. The view configuration takes advantage of the speed of YAML to handle (mostly) page headers. The configuration cascade exempts you from defining every setting for each view. For every modification of the presentation that depends on dynamic data, the action has access to the `sfResponse` object. And the view is secure from XSS attacks, thanks to the output escaping system. 
     1007> Все стандартные внутренние переменные symfony тоже будут преобразованы, если вы используете преобразование. Будьте аккуратны используя $sf_user, $sf_request, $sf_param.. Сами объекты будут работать, но их методы будут возвращать преобразованные данные, если вы не укажете последним параметром ESC_RAW. 
     1012Доступно множество разных инструментов для управления слоем представления. Разработка шаблонов занимает считанные секундны, благодаря методам-помощникам. Обрамления, части шаблонов, компоненты, комонентные слоты - все эти средства приносят в разработку модульность и возможность использовать один и тот же код в нескольких местах, DRY ;).Конфигурация вида позволяет настроить хидеры страниц используя все преимущества YAML. Каскадные конфиграции позволяют настраивать вид глобально, не повтотряя настроек для каждого модуля отдельно. Для всех изменений вида, зависящих от динамических данных используйте объект sfResponse. Данные вида защищены от XSS атак благодаря системе постпреобразования.