Jump to content

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

Featured Replies

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

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

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

 

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

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

  • Replies 80
  • Просмотров 8,9k
  • 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
comment_194328

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

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

Edited by edmsl

  • Author
comment_194329

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

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

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

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

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

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

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

  • Author
comment_194410

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.

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

comment_194414
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
comment_194446

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

Есть код:

{{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
comment_194461

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

{{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
comment_194465

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

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

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

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

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

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

 

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

 

  • Author
comment_194470

 

Спойлер

1.png.94d9186ff223ac2cb8c752dc20938e1c.p

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

001 

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

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

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

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

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

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

  • Author
comment_194476

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

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

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

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

comment_194477

К сожалению, в 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.