Jump to content
  1. Обзор помощников формы

    Назначение Помощника форм
    Большая часть пользовательского интерфейса в Invision Community содержит формы, будь то многочисленные страницы настроек в админцентре, публикация контента в фронтэнде, настройка профиля и многое другое.
    Invision Community имеет мощный класс Помощника формы, который упрощает внедрение форм в ваших приложениях и плагинах. Он предоставляет такие функции, как автоматическая проверка и встроенная безопасность, заботится о создании пользовательского интерфейса (в случае более сложных типов полей, таких как матрицы и селектор нод/деревьев) и динамического поведения для вас. Формы, созданные с помощью Помощника формы, поддерживают широкий диапазон типов полей, имеют встроенную поддержку вкладок, используют возможности HTML5, где это применимо, и многое другое.
    Если вам нужен ввод какой-либо информации от пользователей в вашем приложении или плагине, вы всегда должны использовать Помощник форм; никогда не реализуйте такую функциональность вручную и не обходите фреймворк.
    Основной фрагмент, показывающий, как в конечном итоге будет выглядеть код вашей формы:
    // Создать экземпляр формы $form = new \IPS\Helpers\Form; // Добавить поля формы $form->add( ... ); $form->add( ... ); if ( $values = $form->values() ) { // Форма отправлена; обрабатывайте значения формы здесь } // Отправить форму для вывода \IPS\Output::i()->output = $form; Создание формы
    Чтобы создать форму, вы просто создаете экземпляр из Помощника формы. К возвращенному объекту вы можете добавлять поля, вкладки и т.д. (описано в следующих разделах).
    // Создание формы с использованием значений по умолчанию $form = new \IPS\Helpers\Form; Никакие параметры не требуются, но есть несколько необязательных параметров, которые вы можете передать:
    \IPS\Helpers\Form( [ string $formID='form' [, string $submitLang='save' [, \IPS\Http\Url $actionURL=NULL [, array $attributes=array() ]]]] );
    $formID (строка, необязательный) - Идентификатор для использования в HTML атрибуте id для этой формы. $submitLang (строка, необязательный) - Языковой ключ строки для использования в названии кнопки 'отправить'. $actionURL (\IPS\Http\Url, необязательный) - Объект URL-адреса, по которому должна быть отправлена форма (по умолчанию, формы отправляются на ту же страницу, которая их отображает). $attributes (массив, необязательный) - Массив ключ/значение других HTML атрибутов, которые вы хотели бы включить в тег <form>, например для функции javascript. Добавление элементов формы
    Добавление элемента формы выполняется методом $form->add(). Вы передаете ему объект элемента, который вы хотите - например, чтобы добавить текстовый ввод в свою форму, вы можете сделать следующее:
    $form->add( new \IPS\Helpers\Form\Text('name') ); Вы можете использовать широкий диапазон встроенных типов полей форм. Некоторые из доступных классов:
    \IPS\Helpers\Form\Text для обычного ввода текста. \IPS\Helpers\Form\Editor для ввода текста WYSIWYG. \IPS\Helpers\Form\Upload для загрузки файлов. \IPS\Helpers\Form\Date для дат. \IPS\Helpers\Form\Select для окна выбора. \IPS\Helpers\Form\YesNo для переключателей да/нет. Классы всех полей форм имеют похожий набор параметров. Каждый из них настраивается с помощью значений, которые вы передаете. Вот параметры, которые вы можете передать в классы полей форм:
    $name (строка, обязательный) - имя поля (используется в атрибуте имени в HTML). $defaultValue (mixed, необязательный) - стандартное значение поля, независимо от типа поля. $required (boolean, необязательный) - будет ли поле обязательным. Обратите внимание: передача true устанавливает HTML5 атрибут required, то есть форма не может быть отправлена, если она не заполнена. Передав NULL, вы отключите атрибут required, позволяя вместо этого проверять поле вручную на бэкэнд. $options (массив, необязательный) - Массив параметров. Допустимые значения зависят от типа поля; посмотрите документы по отдельным классам для получения дополнительной информации. $customValidationCode (функция, необязательный) - функция проверки значения поля. $prefix (строка, необязательный) - HTML строка для отображения перед полем HTML. $suffix (строка, необязательный) - HTML строка для отображения после поля HTML. $id (строка, необязательный) - Идентификатор, который будет использован в HTML атрибуте id. Для всех доступных классов, просмотрите файлы в директории system/Helpers/Form/. Значения, приемлемые для $options описаны в исходном коде каждого класса в директории. Имейте в виду, что некоторые классы расширяют другие (например, CheckboxSet расширяет Select и имеет те же $options).
    Например, чтобы создать окно с множественным выбором, вы должны сделать что-то вроде этого:
    $form->add( new \IPS\Helpers\Form\Select( 'my_select_box', NULL, TRUE, array( 'options' => array( 0 => 'Foo', 1 => 'Bar', 2=> 'Baz' ), 'multiple' => TRUE ) ) ); Метки и описания
    Свойство $name, в дополнение к имени, используемом для HTML поля, также используется для отображения метки (label). Помощник формы автоматически найдёт языковую строку с таким ключом, чтобы использовать её в качестве метки.
    Он также будет искать языковую строку с _desc для описания.Например, если $name для вашего поля - my_field, в качестве описания будет использоваться языковая строка my_field_desc. Если языковая строка с этим ключом не существует, описание не будет использоваться.
    Система также будет искать языковую строку с _warning для блока предупреждения (опять же, если строки не существует, не будет отображено). Обычно это всегда используется с переключателями (см. ниже), например, для отображения предупреждения, когда пользователь выбирает нежелательный вариант.
    В дополнение к меткам и описаниям с автоматическим использованием языковой строки, также можно переопределить это поведение и установить свои собственные значения в контроллере. Например:
    $input = new \IPS\Helpers\Form\Text( 'my_select_box', NULL, TRUE ); $input->description = "My Description"; $input->label = "My Label"; Важно отметить, что при установке описаний как данном случае, они будут добавлены точно такими же, как указаны, без дополнительной разметки. Если необходима разметка, вы должны установить свойство с помощью шаблона.  
    Проверка
    Большинство классов будут автоматически проверять введённые данные, а параметр $options предоставляет способы настройки. Например, если вы создаёте элемент \IPS\Helpers\Form\Number, он будет автоматически проверен - является ли значение числом, и вы можете использовать $options для управления максимумом и минимумом вводимого числа вместе с количеством разрешенных десятичных знаков после точки. Система автоматически снова отобразит форму со встроенной ошибкой, если любой из элементов не пройдёт проверку, без необходимости предоставления дополнительного кода с вашей стороны. Однако, если вы хотите включить собственную проверку, вы можете сделать это с помощью свойства $customValidationCode - вы просто предоставляете метод обратного вызова, который генерирует исключение DomainException, если возникла ошибка. Например, если вы хотите сделать числовое поле, где число 7 не было разрешено, вы можете сделать это следующим образом:
    $form->add( new \IPS\Helpers\Form\Number( 'my_field', NULL, TRUE, array(), function( $val ) { if ( $val == 7 ) { throw new \DomainException('form_bad_value'); } } ) ); Обработка данных
    Когда ваша форма будет отправлена, $form->values() вернет массив со значениями каждого элемента (если форма не была отправлена или проверка не пройдена, она возвращает FALSE). Имейте в виду, что защита CSRF обрабатывается автоматически при использовании централизованного класса \IPS\Helpers\Form и будет показано сообщение об ошибке, если ключ CSRF не будет соответствовать ожидаемому значению.
    Значение, возвращаемое для каждого элемента, зависит от типа, а иногда и от параметров. Например, элемент \IPS\Helpers\Form\Text всегда возвращает строку в качестве значения. Однако \IPS\Helpers\Form\Number может вернуть целое число (int) или число с плавающей точкой (float). С другой стороны \IPS\Helpers\Form\Upload возвращает объект класса \IPS\File (или даже массив объектов, если это поле для загрузки нескольких файлов).
    Если вы предпочитаете получать только строковые значения (например, вы хотите сохранить значения как объект JSON), вы можете передать TRUE в метод $form->values().
    Рекомендации
    Формы составляют большую часть пользовательского интерфейса в сообществе Invision Community. Важно представлять UI интерфейс как общую среду, согласующуюся с другими областями сайта. В связи с этим некоторые наши рекомендации:
    Всегда создавайте описание настроек положительно. Например, пишите "Включить функцию?" вместо "Отключить функцию?". Значение "Да" всегда должно означать, что и "Включить". Делайте метки короткими и понятными и используйте описания, если только оно необходимо. Например, для поля "Включить функцию?" не требуется добавлять описание в стиле "Установите значение в Да, чтобы включить функцию", т.к. это очевидно. Используйте префиксы и суффиксы, а не добавляйте информацию на ярлык или описание, где это возможно. Например, не используйте метку "Количество дней пред удалением" - сделайте метку более лаконичной - "Удалить после" и суффикс, который появится после поля - "дней". Никогда не обращайтесь в настройка в метках или описаниях. Например, не делайте такого описания "Применяется только, если настройка выше включена". Используйте переключатели для обозначения этого. Никогда не делайте указание определённого значения для какого-либо действия. Например, не делайте описание подобного этому "Оставьте поле пустым для неограниченного - используйте чекбокс "Неограниченно" или отдельную настройку, которая переключает другие настройки.
  2. Отображение формы

    Приведение объекта $form в строку возвращает HTML код для отображения формы. Обычно вам не нужно приводить форму явно, просто добавьте её в буфер отображения, например \IPS\Output::i()->output.
    \IPS\Output::i()->output .= $form; Добавление собственного CSS в форму
    По умолчанию форма горизонтальная. Чтобы сделать её вертикальной, или применить какой-либо класс, вы должны сделать следующее:
    $form->class = 'ipsForm_vertical'; Свойство class представляет собой простую строку (не массив), поэтому просто используйте список имен классов CSS, разделенных пробелами. Если вы используете свои собственные стили CSS, а не встроенные классы, не забудьте также добавить свой CSS файл!
    Использование шаблонов пользовательских форм
    По умолчанию для отображения формы используются стандартные встроенные шаблоны форм. Однако для дальнейшей настройки вы можете вызвать $form->customTemplate() передавая обратный вызов с шаблоном для использования. Это позволяет полностью настроить внешний вид формы.
    Это необходимо для использования шаблона, который выглядит лучше в модальном окне:
    \IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) ); Создаваемый шаблон должен содержать следующий заголовок шаблона, включая следующие параметры:
    <ips:template parameters="$id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar, $form=NULL" /> Передача пользовательских параметров
    Если вам нужно передать дополнительные настраиваемые параметры в шаблон формы, вы можете сделать это во втором параметре метода customTemplate, например:
    $templateToUse = array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ); $form->customTemplate( $templateToUse, $myCustomParameter, $anotherParameter ); Ваши параметры добавляются в начало списка параметров шаблона, то есть в этом случае заголовок вашего шаблона будет выглядеть следующим образом:
    <ips:template parameters="$myCustomParameter, $anotherParameter, $id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar, $form=NULL" />  
  3. Вкладки, заголовки и боковые блоки форм

    Для более сложных форм помощник \IPS\Helpers\Form предоставляет несколько методов, чтобы помочь вам организовать и сгруппировать ваши поля формы:
    Вкладки (включая определение того, на какой вкладке находится поле с ошибкой). Заголовки (для группировки связанных полей под одним заголовком). Боковые блоки (чтобы добавить контекстный контент в форму). Разделители (разбить форму на логические части). Использование их простое:
    $form->addTab('Tab1'); $form->addHeader('Header'); $form->add( new \IPS\Helpers\Form\YesNo( 'yes_no_field' ) ); $form->add( new \IPS\Helpers\Form\Text( 'text_field' ) ); $form->addHeader('Header'); $form->add( new \IPS\Helpers\Form\Text( 'another_text_field' ) ); $form->addTab('Tab2'); $form->add( new \IPS\Helpers\Form\Text( 'another_text_field' ) ); Форма строится последовательно, поэтому вы должны вызывать addTab, addHeader и т.д., на которых расположены поля, которые должны появляться на этой вкладке или под этим заголовком, перед добавлением другой вкладки и т.д.
    Вкладки
    $form->addTab( string $lang [, string $icon=NULL [, string $blurbLang=NULL [, string $css=NULL ] ] ] )
    $lang (строка, обязательный) - Ключ языковой строки для использования на этой вкладке. $icon (строка, необязательный) - Если указано, на вкладке будет отображена иконка. Должна быть именем класса FontAwesome без префикса fa-. Например, cloud-download или envelope-o. $blurbLang (строка, необязательный) - Если указано, добавит описание сверху под вкладкой над полями. Должен быть ключ языковой строки. $css (строка, необязательный) - Строка названий CSS классов, разделённых пробелами, для добавления к обложке контента вкладки (но не к самой вкладке).  Заголовки
    $form->addHeader( string $lang )
    $lang (строка, обязательный) - Ключ языковой строки для использования в качестве заголовка. Боковой блок
    На каждой вкладке может быть свой отдельный боковой блок (конечно же на одну вкладку только один боковой блок).
    $form->addSidebar( string $html )
    $html (строка, обязательный) - HTML для отображения в качестве боковой панели. Обычно здесь вызывается шаблон: $form->addSidebar( \IPS\Theme::i()->getTemplate( 'group', 'app', 'location' )->myTemplate() );  
  4. Переключатели

    Часто в дизайне формы вы хотите отображать или скрывать группы полей в зависимости от значений других полей. Например, предположим, что у вас есть поле Да/Нет, которое активирует некоторый функционал, и некоторые другие поля, которые управляют работой этой функции. Когда пользователь выбирает 'Нет' для отключения функции, вы можете скрыть другие поля с помощью переключателей (и показывать их автоматически, если настройка включена). Делая это, вы упрощаете дизайн своей формы и облегчаете пользователям понимание каждого поля, которое они видят.
    Invision Community имеет встроенную поддержку такого поведения в формах с использованием функций переключения. Это автоматический процесс - вы просто указываете соответствующие идентификаторы элементов при создании своей формы.
    Использование переключателей формы
    Доступные опции зависят от типа поля. Например, тип ДаНет имеет два параметра: togglesOn (который определяет, какие элементы будут отображаться, когда для параметра установлено значение "Да") и togglesOff (который определяет, какие элементы будут отображаться, когда для параметра установлено значение "Нет"). Select имеет один параметр переключения, который принимает массив, указывающий какие элементы должны отображаться для каждого из доступных значений. Тип Number имеет параметр unlimitedToggles, отвечающий за то, какие элементы отображаются, когда установлен флажок "Без ограничений", а параметр unlimitedToggleOn отменяет это поведение, когда флажок снят. Для получения дополнительной информации смотрите исходный код для каждого типа элемента в директории system/Helpers/Form.
    Все опции переключения принимают массив идентификаторов HTML-элементов, которые следует переключать. Например, чтобы переключить элемент с ID "myElement" из поля YesNo, вы должны:
    $form->add( new \IPS\Helpers\Form\YesNo( 'yes_no_field', NULL, TRUE, array( 'togglesOn' => array( 'myElement' ) ) ) ); Обратите внимание: если вы планируете переключать другие элементы формы, вам нужно будет вручную указать ID элемента (последний параметр конструктора поля). Например, чтобы поле YesNo переключило текстовое поле, мы также должны указать идентификатор у данного текстового поля:
    $form->add( new \IPS\Helpers\Form\YesNo( 'yes_no_field', NULL, TRUE, array( 'togglesOn' => array( 'text_field_container' ) ) ) ); $form->add( new \IPS\Helpers\Form\Text( 'text_field', NULL, TRUE, array(), NULL, NULL, NULL, 'text_field_container' ) );  
  5. Загрузка файлов

    Чтобы разрешить загрузку файлов в вашем коде, вы должны использовать класс \IPS\Helpers\Form\Upload внутри Помощника формы.
    Администратор имеет возможность контролировать как хранить различные типы файлов - из-за этого использование поля Upload немного сложнее, чем большинство других типов форм.
    Расширение FileStorage
    Вы должны создать расширение FileStorage в своем приложении, которое в основном используется для предоставления обратных вызовов для поиска файлов, загружаемых вашим полем.
    Для начала создайте файл расширения FileStorage с помощью Центра разработчика для вашего приложения. Файл скелета будет создан в директории applications/app/extensions/core/FileStorage с кодом примером. Вам нужно будет предоставить код для всех методов.
    Например, если вы сохраняете каждый файл в строке в таблице базы данных, код может выглядеть примерно так:
    <?php namespace IPS\forums\extensions\core\FileStorage; class _Key { /** * Count stored files * * @return int */ public function count() { return \IPS\Settings::i()->setting_key ? 1 : 0; } /** * Move stored files * * @param int $offset This will be sent starting with 0, increasing to get all files stored by this extension * @param int $storageConfiguration New storage configuration ID * @param int|NULL $oldConfiguration Old storage configuration ID * @throws \Underflowexception When file record doesn't exist. Indicating there are no more files to move * @return void */ public function move( $offset, $storageConfiguration, $oldConfiguration=NULL ) { $thing = \IPS\Db::i()->select( '*', 'my_table', 'image IS NOT NULL', 'id', array( $offset, 1 ) )->first(); \IPS\Db::i()->update( 'my_table', array( 'image' => (string) \IPS\File::get( $oldConfiguration ?: 'app_Key', $thing['image'] )->move( $storageConfiguration ) ), array( 'id=?', $thing['id'] ) ); } /** * Check if a file is valid * * @param \IPS\Http\Url $file The file to check * @return bool */ public function isValidFile( $file ) { try { \IPS\Db::i()->select( 'id', 'my_table', array( 'image=?', $file ) )->first(); return TRUE; } catch ( \UnderflowException $e ) { return FALSE; } } /** * Delete all stored files * * @return void */ public function delete() { foreach( \IPS\Db::i()->select( '*', 'my_table', "image IS NOT NULL" ) as $forum ) { try { \IPS\File::get( 'app_Key', $forum['image'] )->delete(); } catch( \Exception $e ){} } } } Однако, соответствующий код для использования будет зависеть от природы того, как хранятся файлы, созданные вашим контентом.
    Создание элемента формы
    При создании элемента вы должны указать параметр $options, указав только что созданное расширение. Например, код для создания вашего элемента будет похож на этот:
    $form->add( new \IPS\Helpers\Form\Upload( 'my_upload_field', NULL, TRUE, array( 'storageExtension' => 'app_Key' ) ) ); Доступны дополнительные опции, позволяющие загружать несколько файлов, ограничивать разрешенные расширения, максимальный размер файла и многое другое. Смотрите исходный код класса для всех доступных опций.
    Обработка данных
    Возвращаемое значение будет объектом класса \IPS\File (или массив объектов \IPS\File, если поле допускает загрузку нескольких файлов). Вам не нужно ничего делать с самим файлом, поскольку он уже был сохранен в соответствии с предпочтениями администратора. Тем не менее, вам нужно сохранить URL-адрес (который вы можете получить путём преобразования объекта \IPS\File в строку), поскольку это то, что вам понадобится получить и манипулировать файлом позже, и использовать внутри созданного вами расширения ранее. Например, ваш код может выглядеть так:
    $form = new \IPS\Helpers\Form; $form->add( new \IPS\Helpers\Form\Upload( 'my_upload_field', NULL, TRUE, array( 'storageExtension' => 'app_Key' ) ) ); if ( $values = $form->values() ) { \IPS\Db::i()->insert( 'my_table', array( 'image' => (string) $values['my_upload_field'] ) ); } Манипулирование файлом позже
    Чтобы вернуть объект \IPS\File позже, вы должны вызвать:
    $file = \IPS\File::get( 'app_Key', $url ); Первый параметр является вашим расширением, а второй - URL-адресом, который вы получили при сохранении формы. Затем вы можете использовать этот объект, чтобы получить содержимое файла, удалить его и т.д. Смотрите PhpDocs в \IPS\File для получения дополнительной информации о том, что вы можете делать с файлами.
    Если это файл изображения, вы также можете создать объект \IPS\Image для изменения размера, добавления водяного знака и т.д. Для этого вы должны вызывать:
    $image = \IPS\Image::create( $file->contents() ); Смотрите PhpDocs в \IPS\Image для получения дополнительной информации о том, что вы можете делать с изображениями.
  6. Редактор WYSIWYG

    Чтобы использовать WYSIWG редактор в своём коде, вы должны использовать класс \IPS\Helpers\Form\Editor Помощника форм. Редакторы автоматически имеют возможность поддерживать вложения, и администратор может настроить редактор так, чтобы некоторые функции были доступны в одних некоторых областях, а в других недоступны. Из-за этого использование редактора немного сложнее, чем большинство других типов форм.
    Создание расширения EditorLocations
    Вы должны создать расширение EditorLocations в своем приложении, которое в основном используется для предоставления обратных вызовов для поиска вложений, загруженных в этот редактор.
    Для начала, создайте расширение EditorLocations в Центре разработчика для вашего приложения. Файл скелет будет создан в директории applications/app/extensions/core/EditorLocations с примером кода. Вы должны предоставить код для методов attachmentPermissionCheck() и attachmentLookup().
    Например, если вы используете этот редактор для настройки в админцентре, значение которй будет отображаться на определенной странице, которая будет видна всем пользователям, имеющим доступ к приложению, код может выглядеть примерно так:
    <?php namespace IPS\app\extensions\core\EditorLocations; class _Key { /** * Permission check for attachments * * @param \IPS\Member $member The member * @param int|null $id1 Primary ID * @param int|null $id2 Secondary ID * @param string|null $id3 Arbitrary data * @return bool */ public function attachmentPermissionCheck( $member, $id1, $id2, $id3 ) { return $member->canAccessModule( \IPS\Application\Module::get( 'app', 'module' ) ); } /** * Attachment lookup * * @param int|null $id1 Primary ID * @param int|null $id2 Secondary ID * @param string|null $id3 Arbitrary data * @return \IPS\Http\Url|\IPS\Content|\IPS\Node\Model * @throws \LogicException */ public function attachmentLookup( $id1, $id2, $id3 ) { return \IPS\Http\Url::internal( 'app=app&module=module&controller=controller', 'front' ); } } Или, если вы используете этот редактор для описания Элементов контента, которые создают пользователи, код может выглядеть следующим образом:
    <?php namespace IPS\app\extensions\core\EditorLocations; class _Key { /** * Permission check for attachments * * @param \IPS\Member $member The member * @param int|null $id1 Primary ID * @param int|null $id2 Secondary ID * @param string|null $id3 Arbitrary data * @return bool */ public function attachmentPermissionCheck( $member, $id1, $id2, $id3 ) { try { return \IPS\app\Thing::load( $id1 )->canView( $member ); } catch ( \OutOfRangeException $e ) { return FALSE; } } /** * Attachment lookup * * @param int|null $id1 Primary ID * @param int|null $id2 Secondary ID * @param string|null $id3 Arbitrary data * @return \IPS\Http\Url|\IPS\Content|\IPS\Node\Model * @throws \LogicException */ public function attachmentLookup( $id1, $id2, $id3 ) { return \IPS\app\Thing::load( $id1 )->url(); } } Однако соответствующий код для использования будет зависеть от того, как будет использоваться контент, созданный вашим редактором.
    Обратите внимание, что вам не нужно создавать отдельное расширение для каждого отдельного редактора.Например, можно использовать одно расширение для каждого поля настройки в приложении. Параметры $id позволяют вам знать на какую часть контента ссылаются, как описано ниже.
    Вы также должны создать строку языка, которая идентифицирует ваш редактор с ключом editor__<app>_<Key>. Это используется для отображения администратору, когда он настраивает, какие кнопки отображаются в каких областях. Например, в приложении Core, ключ editor__core_Contact определяется как "Contact Form".
    Создание элемента формы
    При создании элемента вы должны указать параметр $options, указывающий только что созданное расширение, а также некоторую дополнительную информацию:
    autoSaveKey - строка, которая идентифицирует цель этого редактора. Например, если редактор предназначен для ответа в тему с ID 5, вы должны указать "topic-reply-5". Убедитесь, что вы передаете один и тот же ключ каждый раз, но другой ключ для разных редакторов. attachIds обсуждение ниже. Может содержать до 3 элементов, и первые 2 должны быть числовыми, но последним может быть строка. Например, код для создания элемента будет выглядеть примерно так:
    $form->add( new \IPS\Helpers\Form\Editor( 'my_editor', NULL, TRUE, array( 'app' => 'app', 'key' => 'Key', 'autoSaveKey' => 'my-editor-field', 'attachIds' => array( ... ) ) ); Вообще говоря, существуют два типа контента: значения, которые всегда существуют (например, настройки) и контент, который создаётся и удаляется. Вложения обрабатываются по-разному для каждого из них:
    Значения, которые всегда существуют
    Передайте идентификатор в параметр attachIds. Например, вы можете:
    'attachIds' => array( 1 ) А затем в своем расширении вы увидите $id 1 и будете знать, что 1 для этого экземпляра редактора. Затем вы будете использовать разные числа для других редакторов, используя одно и то же расширение. Даже если для этого расширения используется только один редактор, вы должны указать значение для attachIds. 
    Контент, который создается и удаляется
    При отображении редактора на странице 'создать', вы передадите NULL для параметра attachIds (потому что, конечно, в этот момент вы не знаете, какой идентификатор вы сохраните). Затем в коде для вашей формы, который обрабатывает создание контента, после того, как вы создали контент и, следовательно, имеете идентификатор для него, вы вызываете этот код:
    \IPS\File::claimAttachments( $autoSaveKey, $id1, $id2, $id3 ); $autoSaveKey это то же значение, которое вы использовали для параметра autoSaveKey при создании редактора. Каждое из полей $id является необязательным, но вы должны указать хотя бы одно. Это то, что будет передано методу в вашем расширении.
    При отображении редактора на странице 'изменить', вы передаете значения ID в attachIds и не вызываете claimAttachments.
    Пример:
    $editing = NULL; if ( \IPS\Request::i()->id ) { try { $editing = \IPS\app\Thing::load( \IPS\Request::i()->id ); } catch ( \OutOfRangeException $e ) { \IPS\Output::i()->error( ... ); } } $form = new \IPS\Helpers\Form; $form->add( new \IPS\Helpers\Form\Editor( 'my_editor', NULL, TRUE, array( 'app' => 'app', 'key' => 'Key', 'autoSaveKey' => $editing ? 'creating-thing' : "editing-thing-{$editing->id}", 'attachIds' => $editing ? array( $editing->id ) : NULL ) ) ); if ( $values = $form->values() ) { if ( !$editing ) { $item = new \IPS\app\Thing; $item->content = $values['my_editor']; $item->save(); \IPS\File::claimAttachments( 'creating-thing', $item->id ); } else { $editing->content = $values['my_editor']; $editing->save(); } } Отображение контента поля Editor
    Значение автоматически анализируется, включая замену ненормативной лексики и других настроек, сконфигурированных администратором, и очищается от любых потенциальных проблем безопасности.
    Если вы просто выведете значение редактора в свой шаблон, вы заметите, что объекты имеют двойное экранирование. Это связано с тем, что по умолчанию система шаблонов Invision Community экранирует все выходные данные для предотвращения уязвимостей XSS. Однако в случае контента редактора вы можете безопасно использовать неэкранированную версию контента, потому что помощник формы уже позаботились об очистке для вас. Поэтому, чтобы использовать содержимое редактора в шаблоне, вы должны использовать это:
    {$val|raw} Модификатор | raw отключает автоматическое экранирование для этой переменной системой шаблонов.
  7. Переводимые текстовые поля

    Переводимые текстовые поля могут использоваться, чтобы позволить пользователю предоставлять другое значение для других языков, установленных в своем сообществе. Если установлен только один язык, будет отображаться только одно текстовое поле.
    Переводимые текстовые поля предназначены для использования только в админцентре. Они не предназначены для использования пользователями во фронтэнде.
    Класс Translatable работает с тремя типами текстовых полей, доступных для форм в Invision Community: ввод текста (text input), текстовые области (textareas) и редакторы WYSIWYG. Класс заботится о создании базовых текстовых полей для вас. Значения сохраняются в языковой системе и извлекаются позже для их использования.
    Чтобы использовать переводимые поля в вашем коде, вы должны использовать класс \IPS\Helpers\Form\Translatable в рамках Помощника форм.
    Создание элемента
    При создании элемента параметр $options требует как минимум два значения:
    app  - Ключ приложения, которому принадлежит языковая строка. key - Уникальный ключ для этой языковой строки (как со стандартными языковыми строками, только буквенно-цифровые значения). Если вы отображаете форму "Создать" для чего-то ещё не созданного, вы можете передать NULL в качестве ключа. В отличие от других полей, $defaultValue должен быть NULL. Класс автоматически заполнит текущее значение для ключа, извлекая его из языковой системы.
     
    Например, код для создания элемента будет выглядеть примерно так:
    $form->add( new \IPS\Helpers\Form\Translatable( 'my_translatable_field', NULL, TRUE, array( 'app' => 'app', 'key' => 'my_language_string' ) ) ); Этот код добавит стандартное однострочное текстовое поле формы. Для создания же текстового поля, добавьте ключ textArea в ваш массив $options, установив в значение TRUE.
    Для создания поля редактора WYSIWYG, добавьте ключ редактора в ваш массив $options. Значение редактора должно быть массивом, который содержит параметры, принимаемые классом \IPS\Helpers\Form\Editor.
    Обработка материалов
    При обработке формы, содержащей переводимые текстовые поля, вы должны вручную сохранить возвращённые значения в языковую систему, например так:
    if ( $values = $form->values() ) { \IPS\Lang::saveCustom( 'app', 'my_language_string', $values['my_translatable_field'] ); // Other field processing... }  

Messenger

    ×
    ×
    • Create New...

    Important Information

    By using our site you agree to our Privacy Policy