Перейти к содержанию

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


Рекомендуемые сообщения

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

Изменено пользователем edmsl
Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 80
  • Создана
  • Последний ответ

Топ авторов темы

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

// Метод в модели
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 не доводилось. Не в шаблоне же всю эту портянку расписывать.

Изменено пользователем 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?

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

Ссылка на комментарий
Поделиться на другие сайты

В 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', } )
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...