Jump to content
View in the app

A better way to browse. Learn more.

IPBMafia.ru - поддержка Invision Community, релизы, темы, плагины и приложения

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Реализация кода блока ленты базы данных

Featured Replies

6 часов назад, edmsl сказал:

Возможно ли как-то в шаблоне получить информацию о конкретном файле в Downloads?

Нужно сделать селектор выбора версии файла при размещении бага. Для этого версии надо брать из файла.

 

$file = \IPS\downloads\File::load( FILE_ID );

при указании несуществующего FILE_ID будет выбрасываться исключение OutOfRangeException

  • Replies 80
  • Просмотров 10,5k
  • Created
  • Последний ответ

Лучшие авторы в теме

Most Popular Posts

  • можешь изучить классы IPS\Helpers\Table\Content ( или \IPS\Helpers\Table\Db ) \IPS\Content\Item и функцию getItemsWithPermission() вывести например через функцию getItemsWithPermission {{d

  • В файлах движка конкретной версии ips и php (так как с разными версиями функции модифицируются) IPS\Helpers\Table\Content ( или \IPS\Helpers\Table\Db ) -> корень/system/Helpers/Table Content.p

  • ну я так понимаю что какой-то баг принадлежит какой-то сборке и при создании новой записи с новым багом вы (согласно полю связать с БД)  размещаете запись с этим багом привязав его к какой-то сборке.

Posted Images

  • Author

Для создания новой записи бага я сделал отдельный шаблон формы и привязал его к БД с багами. В этот шаблон я добавил JS код, который мне нужен. Просто в конце добавил тег <script>. Но это не правильно, что js код в середине страницы. Так вот, как мне сделать так, чтобы этот код отрабатывал только на странице с формой создания записи в БД?

Если добавить этот код в шаблон includeJS, он будет отрабатывать везде, что не нужно. Читал, что можно сделать некие контроллеры и добавлять их через атрибут, например, data-controller="core.front.mycontroller". Так вот как создать такой контроллер и привязать его к нужной странице? Или может есть еще способы?

Edited by edmsl

  • Author

Разобрался. Создал новый шаблон JS и привязал к странице с БД багов.

Но это для страницы из Pages. А можно ли что-то подобное для стандартных страниц например для страницы с загрузками или форумов?

  • Author
23 часа назад, Exception сказал:
$file = \IPS\downloads\File::load( FILE_ID );

Увы, но в объекте нет информации о версиях. Есть все другое, но версии даже в шаблон передаются отдельной переменной.

2 часа назад, edmsl сказал:

Увы, но в объекте нет информации о версиях. Есть все другое, но версии даже в шаблон передаются отдельной переменной.

В приложении downloads в файле контроллера view.php найди как добавляются данные в $versionData и $previousVersions

  • Author

Exception Взял кусок кода из метода и вроде как даже работает:

$versionWhere = array( array( "b_fileid=?", \IPS\Request::i()->gamefile ) );
$previousVersions = iterator_to_array( \IPS\Db::i()->select( '*', 'downloads_filebackup', $versionWhere, 'b_backup DESC' )->setKeyField( 'b_id' ) );

Текущая версия: $file->version.

Правда не понятно, почему нельзя все это сразу в объекте файла хранить, чтобы не лепить такие вот конструкции.

8 часов назад, edmsl сказал:

Правда не понятно, почему нельзя все это сразу в объекте файла хранить, чтобы не лепить такие вот конструкции.

Это как минимум не эффективно

9 часов назад, edmsl сказал:
$versionWhere = array( array( "b_fileid=?", \IPS\Request::i()->gamefile ) );

Немного не безопасно добавлять в where необработанные данные из request
И если тебе нужны только версии, можно сделать более простой вариант:

$versions = array_merge( array( $file->version ), iterator_to_array( \IPS\Db::i()->select( 'b_version', 'downloads_filebackup', array( 'b_fileid=?', (int) \IPS\Request::i()->gamefile ), 'b_version DESC' ) ) );

 

  • Author

Все бьюсь с кастомными полями.

Есть код:

{{foreach $record->customFieldsForDisplay('listing') as $key => $field}}
	<p>1.{$key}</p>
	<p>2.{$field->label}</p>
	<p>3.{$field->value}</p>
{{endforeach}}

Можно ли как-то получить здесь label, formValue и value полей, как это делается при собственном форматировании поля? Или там уже только отформатированный html код и ничего более?

Edited by edmsl

  • Author

Путем проб и ошибок установил, что для того, чтобы получить значение кастомного поля  у записи из БД с типом Связь с БД, нужно написать так:

{{foreach $records as $record}}
	{{foreach $record->customFieldDisplayByKey('game_name','raw') as $key=> $field}}
		<p>{$key}</p>
	{{endforeach}}
{{endforeach}}

где game_name - Ключ шаблона кастомного поля. А в $key и будет искомое значение. В моем случае это id сборки из БД сборок, для которой нужно получить баги из БД багов.

Получается, что тип поля Связь с БД - это массив с одним единственным ключем. Если попытаться вывести $field:

<p>{$field}</p>, то будет ошибка шаблона.

Но почему тогда не удается получить значение так:

{$record->customFieldDisplayByKey('game_name','raw')[0]}

 

  • Author

Zero108 Это простой шаблон базы с несколькими полями, которые ни с чем не связаны. Все надо вписывать вручную.

Увы, для моих целей там нет ничего интересного.

В 22.06.2023 в 12:14, edmsl сказал:

Для каждой сборки на ее странице нужно отображать свои баги.

Не совсем понятно, что такое "страница сборки". Какое приложение используется для распространения (раздачи) "сборки"? Это приложение Downloads или что-то другое? Может быть можно воспользоваться обычными комментариями для каждого файла в приложении Downloads для того, чтобы пользователи просто сообщали, что что-то не работает, как задумывалось (баг)?

{$record->customFieldDisplayByKey('sub_title', 'display')|raw}

 

Этот код извлекает значение пользовательского поля "sub_title" с использованием указанного формата отображения и затем применяет фильтр |raw, чтобы предотвратить экранирование HTML.

Убедись, что ключ шаблона ('sub_title') соответствует фактическому ключу твоего пользовательского поля, а формат отображения ('display') является выбранным для этого поля.

Использование |raw позволяет рендерить HTML, созданный выбранным форматом отображения, без его экранирования. Однако, будь осторожн при использовании |raw с контентом, созданным пользователями или ненадежными источниками, чтобы предотвратить возможные уязвимости безопасности, такие как межсайтовый скриптинг (XSS).

 

  • Author
1 минуту назад, Zero108 сказал:

Не совсем понятно, что такое "страница сборки"

Страница сборки это страница файла в Downloads.

2 минуты назад, Zero108 сказал:

Может быть можно воспользоваться обычными комментариями

Сейчас для багов используется отдельная тема на форуме для каждой сборки. Что, по сути, то же самое. Проблема в том, что написал один, начали обсуждать. В процессе обсуждения кто-то запостил еще один баг, потом еще и так далее. В итоге потом нужно сидеть и выискивать все записи с багами, что к чему относится и т.д. Это неудобно. Можно сделать так, чтобы на каждый баг создавалась отдельная тема. Это уже ближе и удобнее, но нет той гибкости, что дают БД, в первую очередь фильтры. Да и чисто из спортивного интереса уже хочется доделать начатое.

001 мне не нужно выводить HTML из этого поля. Тип у поля "Связь с базой данных". Там, по сути, хранится id записи, которая была выбрана при заполнении поля при создании новой записи. Если для него выбрать собственно оформление, то нам доступны три переменные: {$label}: {$value}: {$formValue}. Так вот в $formValue находится нужное мне значение.

{$record->customFieldDisplayByKey('my_key', 'display').formValue}

добавь .formValue для получения значения.

Если нужно использовать другие переменные, такие как $label или $value, ты можешь добавить их в код:

{$record->customFieldDisplayByKey('my_key', 'display').label}
{$record->customFieldDisplayByKey('my_key', 'display').value}

 

  • Author

 

Спойлер

1.png.94d9186ff223ac2cb8c752dc20938e1c.p

На скрине справа есть блок с фильтрами. Как их вывести так же? Для поля в базе я включил по нему фильтрацию, но ничего не появилось.

001 

{{foreach $records as $record}}
	<p>{$record->customFieldDisplayByKey('game_name', 'display').formValue}</p>
{{endforeach}}

Получаю ошибку шаблона

{{foreach $records as $record}}
	<p>{$record->customFieldDisplayByKey('game_name', 'display')['formValue']}</p>
{{endforeach}}

Используй квадратные скобки [ ] для доступа к значению $formValue. Это позволит получить значение $formValue из массива, возвращаемого методом customFieldDisplayByKey('game_name', 'display').

{foreach $records as $record}
	<p>{$record->customFieldDisplayByKey('game_name', 'display')->formValue}</p>
{/foreach}

я сейчас не могу проверить у себя. Может так.

  • Author

Вся эта морока была бы сведена к минимуму, если бы в блок можно было передать параметры, как в шаблон. что-то вроде:

{block="my_block" params="param1, param2"}

но это не работает.

001 тоже нет, ошибка шаблона.

К сожалению, в IPS нет встроенной поддержки передачи параметров в блоки (blocks) напрямую.

 

Можно попробовать достичь желаемого результата, используя следующий подход:

1. Создайте пользовательскую переменную (user variable) перед блоком, в которой определите значения параметров:

{php}
    $param1 = 'значение1';
    $param2 = 'значение2';
{/php}

2. Используйте блок (block) с обычным синтаксисом без параметров и обращайтесь к значениям параметров через созданные переменные:

{block="my_block"}
    <p>{$param1}</p>
    <p>{$param2}</p>
{/block}

3. В вашем пользовательском блоке (my_block) вы можете использовать переданные значения из пользовательских переменных:

{block="my_block"}
    <p>Параметр 1: {$param1}</p>
    <p>Параметр 2: {$param2}</p>
{/block}

Второй вариант

 

1. Использование глобальных переменных:

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

   Пример:

   // В контроллере или классе
   \IPS\Registry::set('param1', 'значение1');
   \IPS\Registry::set('param2', 'значение2');

 

   {block="my_block"}
      <p>{\IPS\Registry::get('param1')}</p>
      <p>{\IPS\Registry::get('param2')}</p>
   {/block}

2. Использование пользовательской функции:

  • Создайте пользовательскую функцию (custom function), которая принимает параметры и возвращает результат.
  • Внутри функции вы можете определить логику, основанную на переданных параметрах.
  • В блоке вызовите созданную пользовательскую функцию и передайте параметры.

   Пример:

 // В файле вашего приложения или плагина
   function myCustomFunction($param1, $param2) {
      // Логика, основанная на переданных параметрах
      $output = "<p>{$param1}</p>";
      $output .= "<p>{$param2}</p>";
      return $output;
   }

 

   {block="my_block"}
      {myCustomFunction("значение1", "значение2")}
   {/block}

Оба эти варианта позволяют передавать параметры в блоки в IPS, но требуют некоторых дополнительных действий и кода.

 

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Ответить в этой теме...

Последние посетители 0

  • No registered users viewing this page.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.