Jump to content

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

Featured Replies

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

Edited by edmsl

  • Replies 80
  • Created
  • Последний ответ
Expand topic overview

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

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

Most Popular Posts

Exception
Exception

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

Exception
Exception

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

AHristich
AHristich

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

Posted Images

Expand topic overview

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

// Метод в модели
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'));}}

 

2 часа назад, Exception сказал:
{{$newsId = \array_key_first($record->customFieldDisplayByKey('game_name','raw'));}}

Вот это мне и нужно было. Спасибо.

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

 

Спасибо @Exceptionза подсказку.

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

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

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

В общем, сделал через foreach, все фильтруется как надо.

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

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

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

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

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

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

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

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

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

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

В 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.

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

Есть ли внутренний метод для получения того же результата?

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

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 );
	}

 

 

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

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/

Хотелось бы поднять снова этот вопрос.

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

А в JS?

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

ips.getSetting('someParam') возвращает undefined.

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

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

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

<li class="ipsHide">
  {$input->html()|raw}
</li>

Нашел еще способ. Можно изменить массив $input->rowClasses. Например, $input->rowClasses[0]='ipsHide'.

Выводим как обычно,

{$input|raw}
В 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('ваша_переменная'));

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.