5 июля, 20231 yr Author comment_194478 Полагаю, что самый лучший и правильный вариант - это уйти от использования блока и подгружать записи из БД напрямую на странице конкретной сборки. Но, как уже мне писали, без нужных знаний это сложно. Видимо, это надолго. Edited 5 июля, 20231 yr by edmsl
5 июля, 20231 yr comment_194479 Создайте метод в соответствующей модели, который будет извлекать нужные записи. Например: // Метод в модели 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 В этом случае, вы сможете напрямую подгружать и отображать данные из базы данных на странице конкретной сборки.
5 июля, 20231 yr comment_194480 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
5 июля, 20231 yr comment_194481 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 июля, 20231 yr comment_194482 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'));}}
5 июля, 20231 yr Author comment_194483 2 часа назад, Exception сказал: {{$newsId = \array_key_first($record->customFieldDisplayByKey('game_name','raw'));}} Вот это мне и нужно было. Спасибо.
6 июля, 20231 yr Author comment_194493 Отказался от блока и сделал загрузку записей багов из базы напрямую в шаблоне, как здесь Спасибо @Exceptionза подсказку.
6 июля, 20231 yr Author comment_194495 Exception Я же правильно понимаю, что фильтрацию по итератору сделать нельзя, только перебор циклом и выводить по условию. {{$records=$recordClass::getItemsWithPermission( array(), $database->field_sort . ' ' . $database->field_direction, NULL, 'read' );}} Здесь в $records будет итератор. Мне нужно выводить только те записи багов, у кого совпадают значения из кастомных полей. Я смотрел функцию getItemsWithPermission, там не передается параметр для фильтрации по полям. array_filter не работает. Только foreach и проверять каждую запись перед выводом в шаблоне?
6 июля, 20231 yr comment_194499 58 минут назад, edmsl сказал: там не передается параметр для фильтрации по полям там $where, для поиска нужных записей в бд. При создании поля в бд в кастомной таблице нужной базы данных создается столбец для значений этих полей.
8 июля, 20231 yr Author comment_194514 В 06.07.2023 в 16:46, Exception сказал: там $where, для поиска нужных записей в бд Снова спасибо. Записал так: {{$records=$recordClass::getItemsWithPermission( array(array( 'field_33=?', $gameId )), $database->field_sort . ' ' . $database->field_direction, 5, 'read' );}} Все работает.
9 июля, 20231 yr Author comment_194531 {{foreach $collection as $inputName => $input}} {$input|raw} {{endforeach}} Можно ли как-то инпуту добавить класс в данном случаем? Это блоки кастомных полей из БД. Они все генерируются на основе своего шаблона и как подкинуть для этого свой я не знаю. Сейчас я их скрываю через JS, но это приводит к их миганию, сначала они есть, а потом их нет. Хотелось бы сразу накинуть нужным класс ipsHide.
9 июля, 20231 yr Author comment_194534 В 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.
9 июля, 20231 yr comment_194540 1 час назад, edmsl сказал: Есть ли внутренний метод для получения того же результата? нету, напиши функцию которая вернет нужные данные в формате json
9 июля, 20231 yr Author comment_194542 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 ); }
9 июля, 20231 yr comment_194546 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 ); } да, что-то вроде этого
9 июля, 20231 yr Author comment_194547 2 минуты назад, Exception сказал: да, что-то вроде этого Тогда еще вопрос. Куда писать свои функции на php? С шаблонами, css и js понятно, а с php не доводилось. Не в шаблоне же всю эту портянку расписывать. Edited 9 июля, 20231 yr by edmsl
9 июля, 20231 yr comment_194549 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/
18 июля, 20231 yr Author comment_194837 Как можно получить (а можно ли?) значения настроек в JS? В шаблонах html и css это делается так: {{if settings.someParam}}. А в JS? Да, уточню, что настройки из плагина.
21 июля, 20231 yr Author comment_194907 В 09.07.2023 в 12:08, edmsl сказал: {{foreach $collection as $inputName => $input}} {$input|raw} {{endforeach}} Можно ли как-то инпуту добавить класс в данном случаем? Это блоки кастомных полей из БД. Они все генерируются на основе своего шаблона и как подкинуть для этого свой я не знаю. Сейчас я их скрываю через JS, но это приводит к их миганию, сначала они есть, а потом их нет. Хотелось бы сразу накинуть нужным класс ipsHide. Мне нужно было скрыть поле, чтобы не делать это через JS. Для себя решил задачу так: <li class="ipsHide"> {$input->html()|raw} </li>
21 июля, 20231 yr Author comment_194912 Нашел еще способ. Можно изменить массив $input->rowClasses. Например, $input->rowClasses[0]='ipsHide'. Выводим как обычно, {$input|raw}
23 июля, 20231 yr Author comment_194952 В 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('ваша_переменная'));
23 июля, 20231 yr Author comment_194956 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.