Jump to content

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

Featured Replies

  • Author

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

Edited by edmsl

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

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

  On 05.07.2023 at 10:31, 001 said:

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

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

 

  On 05.07.2023 at 05:42, edmsl said:

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

{{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 и проверять каждую запись перед выводом в шаблоне?

  On 06.07.2023 at 08:43, edmsl said:

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

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

  • Author
  On 06.07.2023 at 09:46, Exception said:

там $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
  On 09.07.2023 at 13:23, Exception said:

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

На PHP?

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

Показать контент

 

  On 09.07.2023 at 13:39, edmsl said:

На PHP?

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

Показать контент

 

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

  • Author
  On 09.07.2023 at 14:09, Exception said:

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

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

Edited by edmsl

  On 09.07.2023 at 14:12, edmsl said:

Куда писать свои функции на 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
  On 09.07.2023 at 05:08, edmsl said:
{{foreach $collection as $inputName => $input}}
	{$input|raw}
{{endforeach}}

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

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

<li class="ipsHide">
  {$input->html()|raw}
</li>
  • Author
  On 18.07.2023 at 14:42, edmsl said:

Как можно получить (а можно ли?) значения настроек в 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 По поводу

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

Показать контент

Как мне его вызвать теперь в 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.