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

  • Author

Полагаю, что самый лучший и правильный вариант - это уйти от использования блока и подгружать записи из БД напрямую на странице конкретной сборки. Но, как уже мне писали, без нужных знаний это сложно. Видимо, это надолго.

Edited by edmsl

  • 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

Создайте метод в соответствующей модели, который будет извлекать нужные записи. Например:

// Метод в модели
public function getGameNames()
{
    // Логика для извлечения записей
    return YourModel::where('your_condition')->get();
}

В контроллере вашей страницы конкретной сборки вызовите созданный метод и передайте результат в шаблон:

public function view()
{
    $model = new YourModel();
    $gameNames = $model->getGameNames();

    $this->view->gameNames = $gameNames;

    // Другая логика контроллера
}

В шаблоне вашей страницы конкретной сборки выведите полученные записи без использования блока:

@foreach ($gameNames as $gameName)
    <p>{{ $gameName->game_name }}</p>
@endforeach

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

21 минуту назад, 001 сказал:

Создайте метод в соответствующей модели, который будет извлекать нужные записи. Например:

// Метод в модели
public function getGameNames()
{
    // Логика для извлечения записей
    return YourModel::where('your_condition')->get();
}

В контроллере вашей страницы конкретной сборки вызовите созданный метод и передайте результат в шаблон:

public function view()
{
    $model = new YourModel();
    $gameNames = $model->getGameNames();

    $this->view->gameNames = $gameNames;

    // Другая логика контроллера
}

В шаблоне вашей страницы конкретной сборки выведите полученные записи без использования блока:

@foreach ($gameNames as $gameName)
    <p>{{ $gameName->game_name }}</p>
@endforeach

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

у нас тут Invision Community

public function view()
{
    // Получение доступа к базе данных
    $db = \IPS\IPS::db();

    // Выполнение запроса к базе данных
    $query = $db->select('*', 'таблица', ['условие']);

    // Получение результата запроса
    $gameNames = $query->fetchAll();

    // Передача данных в шаблон
    $this->template->gameNames = $gameNames;

    // Другая логика контроллера
}

Exception что вроде этого?

{foreach $gameNames as $gameName}
    <p>{$gameName['game_name']}</p>
{/foreach}

 

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

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

{{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]}

 

Какое значение ты хочешь вывести? В значении этого поля хранится ID найденной записи, а при выводе id->объект записи

{{$newsId = \array_key_first($record->customFieldDisplayByKey('game_name','raw'));}}

 

  • Author

Exception Я же правильно понимаю, что фильтрацию по итератору сделать нельзя, только перебор циклом и выводить по условию.

{{$records=$recordClass::getItemsWithPermission( array(), $database->field_sort . ' ' . $database->field_direction, NULL, 'read' );}}

Здесь в $records будет итератор. Мне нужно выводить только те записи багов, у кого совпадают значения из кастомных полей. Я смотрел функцию getItemsWithPermission, там не передается параметр для фильтрации по полям. array_filter не работает. Только foreach и проверять каждую запись перед выводом в шаблоне?

58 минут назад, edmsl сказал:

там не передается параметр для фильтрации по полям

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

  • Author
В 06.07.2023 в 16:46, Exception сказал:

там $where, для поиска нужных записей в бд

Снова спасибо. Записал так:

{{$records=$recordClass::getItemsWithPermission( array(array( 'field_33=?', $gameId )), $database->field_sort . ' ' . $database->field_direction, 5, 'read' );}}

Все работает.

  • Author
{{foreach $collection as $inputName => $input}}
	{$input|raw}
{{endforeach}}

Можно ли как-то инпуту добавить класс в данном случаем? Это блоки кастомных полей из БД. Они все генерируются на основе своего шаблона и как подкинуть для этого свой я не знаю. Сейчас я их скрываю через JS, но это приводит к их миганию, сначала они есть, а потом их нет. Хотелось бы сразу накинуть нужным класс ipsHide.

  • Author

В REST api есть эндпоинты для работы с кастомными базами, типа этого: /cms/databases/{id}. Он вернет информацию имя базы, id, поля и т.д. Есть ли внутренний метод для получения того же результата? Сколько ни рылся по коду, не нашел. Пробовал разные ссылки в ajax запросах, но нужной так и не подобрал.

ips.getAjax()(ips.getSetting('baseURL') + 'index.php?app=cms&module=databases&controller=records&database_id=2', { type: 'get', } )

В идеале бы получать все в json.

  • Author
15 минут назад, Exception сказал:

нету, напиши функцию которая вернет нужные данные в формате json

На PHP?

Что-то вроде этого?

Спойлер
public function findRecord()
	{
		$results  = array();
		$database = \IPS\cms\Databases::load( \IPS\Request::i()->id );
		$input    = mb_strtolower( \IPS\Request::i()->input );
		$field    = "field_" . $database->field_title;
		$class    = '\IPS\cms\Records' . $database->id;
		$category = '';

		$where = array( $field . " LIKE CONCAT('%', ?, '%')" );
		$binds = array( $input );

		foreach ( \IPS\Db::i()->select( '*', 'cms_custom_database_' . $database->id, array_merge( array( implode( ' OR ', $where ) ), $binds ), 'LENGTH(' . $field . ') ASC', array( 0, 20 ) ) as $row )
		{
			$record = $class::constructFromData( $row );
			
			if ( ! $record->canView() )
			{
				continue;
			}
			
			if ( $database->use_categories )
			{
				$category = \IPS\Member::loggedIn()->language()->addToStack( 'cms_autocomplete_category', FALSE, array( 'sprintf' => array( $record->container()->_title ) ) );
			}

			$results[] = array(
				'id'	   => $record->_id,
				'value'    => $record->_title,
				'category' => $category,
				'date'	   => \IPS\DateTime::ts( $record->record_publish_date )->html(),
			);
		}

		\IPS\Output::i()->json( $results );
	}

 

 

30 минут назад, edmsl сказал:

На PHP?

Что-то вроде этого?

  Показать контент
public function findRecord()
	{
		$results  = array();
		$database = \IPS\cms\Databases::load( \IPS\Request::i()->id );
		$input    = mb_strtolower( \IPS\Request::i()->input );
		$field    = "field_" . $database->field_title;
		$class    = '\IPS\cms\Records' . $database->id;
		$category = '';

		$where = array( $field . " LIKE CONCAT('%', ?, '%')" );
		$binds = array( $input );

		foreach ( \IPS\Db::i()->select( '*', 'cms_custom_database_' . $database->id, array_merge( array( implode( ' OR ', $where ) ), $binds ), 'LENGTH(' . $field . ') ASC', array( 0, 20 ) ) as $row )
		{
			$record = $class::constructFromData( $row );
			
			if ( ! $record->canView() )
			{
				continue;
			}
			
			if ( $database->use_categories )
			{
				$category = \IPS\Member::loggedIn()->language()->addToStack( 'cms_autocomplete_category', FALSE, array( 'sprintf' => array( $record->container()->_title ) ) );
			}

			$results[] = array(
				'id'	   => $record->_id,
				'value'    => $record->_title,
				'category' => $category,
				'date'	   => \IPS\DateTime::ts( $record->record_publish_date )->html(),
			);
		}

		\IPS\Output::i()->json( $results );
	}

 

 

да, что-то вроде этого

  • Author
2 минуты назад, Exception сказал:

да, что-то вроде этого

Тогда еще вопрос. Куда писать свои функции на php? С шаблонами, css и js понятно, а с php не доводилось. Не в шаблоне же всю эту портянку расписывать.

Edited by edmsl

6 минут назад, edmsl сказал:

Куда писать свои функции на php?

Самый правильный вариант реализацией плагином\приложением
https://invisioncommunity.com/developers/docs/development/plugins/complete-example-of-a-plugin-in-ips-community-suite-r50/
https://invisioncommunity.com/developers/docs/development/applications/creating-a-simple-hello-world-application-r184/

  • Author

Как можно получить (а можно ли?) значения настроек в JS? В шаблонах html и css это делается так: {{if settings.someParam}}.

А в JS?

Да, уточню, что настройки из плагина.

  • Author
В 09.07.2023 в 12:08, edmsl сказал:
{{foreach $collection as $inputName => $input}}
	{$input|raw}
{{endforeach}}

Можно ли как-то инпуту добавить класс в данном случаем? Это блоки кастомных полей из БД. Они все генерируются на основе своего шаблона и как подкинуть для этого свой я не знаю. Сейчас я их скрываю через JS, но это приводит к их миганию, сначала они есть, а потом их нет. Хотелось бы сразу накинуть нужным класс ipsHide.

Мне нужно было скрыть поле, чтобы не делать это через JS. Для себя решил задачу так:

<li class="ipsHide">
  {$input->html()|raw}
</li>
  • Author
В 18.07.2023 в 21:42, edmsl сказал:

Как можно получить (а можно ли?) значения настроек в JS? В шаблонах html и css это делается так: {{if settings.someParam}}.

А в JS?

Да, уточню, что настройки из плагина.

Чтобы иметь возможность получить доступ к настройкам плагина в JS файлах, нужно в шаблон HTML, который использует контроллер из JS файла, добавить строку:

{{\IPS\Output::i()->jsVars['ваша_переменная'] = \IPS\Settings::i()->ваша_настройка_из_плагина;}}

Тогда в JS файле мы сможем получить значение:

console.log('setting value: ', ips.getSetting('ваша_переменная'));
  • Author

Exception По поводу

Сделал я такой хук:

Спойлер

firefox_2023-07-23_15-40-07.thumb.jpg.31168a7ab69f5e455e462aa55db7b7da.jpg

Как мне его вызвать теперь в JS коде? Вот так, например:

ips.getAjax()( ips.getSetting('baseURL') + 'index.php?app=cms&module=database&controller=ajax&do=makeFurl', { type: 'get', } )

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.