edmsl Опубликовано 5 июля, 2023 Автор Поделиться Опубликовано 5 июля, 2023 (изменено) Полагаю, что самый лучший и правильный вариант - это уйти от использования блока и подгружать записи из БД напрямую на странице конкретной сборки. Но, как уже мне писали, без нужных знаний это сложно. Видимо, это надолго. Изменено 5 июля, 2023 пользователем edmsl Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
001 Опубликовано 5 июля, 2023 Поделиться Опубликовано 5 июля, 2023 Создайте метод в соответствующей модели, который будет извлекать нужные записи. Например: // Метод в модели 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 В этом случае, вы сможете напрямую подгружать и отображать данные из базы данных на странице конкретной сборки. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Exception Опубликовано 5 июля, 2023 Поделиться Опубликовано 5 июля, 2023 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 Respected 1 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
001 Опубликовано 5 июля, 2023 Поделиться Опубликовано 5 июля, 2023 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} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Exception Опубликовано 5 июля, 2023 Поделиться Опубликовано 5 июля, 2023 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'));}} edmsl 1 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 5 июля, 2023 Автор Поделиться Опубликовано 5 июля, 2023 2 часа назад, Exception сказал: {{$newsId = \array_key_first($record->customFieldDisplayByKey('game_name','raw'));}} Вот это мне и нужно было. Спасибо. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 6 июля, 2023 Автор Поделиться Опубликовано 6 июля, 2023 Отказался от блока и сделал загрузку записей багов из базы напрямую в шаблоне, как здесь Спасибо @Exceptionза подсказку. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 6 июля, 2023 Автор Поделиться Опубликовано 6 июля, 2023 Exception Я же правильно понимаю, что фильтрацию по итератору сделать нельзя, только перебор циклом и выводить по условию. {{$records=$recordClass::getItemsWithPermission( array(), $database->field_sort . ' ' . $database->field_direction, NULL, 'read' );}} Здесь в $records будет итератор. Мне нужно выводить только те записи багов, у кого совпадают значения из кастомных полей. Я смотрел функцию getItemsWithPermission, там не передается параметр для фильтрации по полям. array_filter не работает. Только foreach и проверять каждую запись перед выводом в шаблоне? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 6 июля, 2023 Автор Поделиться Опубликовано 6 июля, 2023 В общем, сделал через foreach, все фильтруется как надо. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Exception Опубликовано 6 июля, 2023 Поделиться Опубликовано 6 июля, 2023 58 минут назад, edmsl сказал: там не передается параметр для фильтрации по полям там $where, для поиска нужных записей в бд. При создании поля в бд в кастомной таблице нужной базы данных создается столбец для значений этих полей. edmsl 1 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 8 июля, 2023 Автор Поделиться Опубликовано 8 июля, 2023 В 06.07.2023 в 16:46, Exception сказал: там $where, для поиска нужных записей в бд Снова спасибо. Записал так: {{$records=$recordClass::getItemsWithPermission( array(array( 'field_33=?', $gameId )), $database->field_sort . ' ' . $database->field_direction, 5, 'read' );}} Все работает. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 9 июля, 2023 Автор Поделиться Опубликовано 9 июля, 2023 {{foreach $collection as $inputName => $input}} {$input|raw} {{endforeach}} Можно ли как-то инпуту добавить класс в данном случаем? Это блоки кастомных полей из БД. Они все генерируются на основе своего шаблона и как подкинуть для этого свой я не знаю. Сейчас я их скрываю через JS, но это приводит к их миганию, сначала они есть, а потом их нет. Хотелось бы сразу накинуть нужным класс ipsHide. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 9 июля, 2023 Автор Поделиться Опубликовано 9 июля, 2023 В 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. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Exception Опубликовано 9 июля, 2023 Поделиться Опубликовано 9 июля, 2023 1 час назад, edmsl сказал: Есть ли внутренний метод для получения того же результата? нету, напиши функцию которая вернет нужные данные в формате json Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 9 июля, 2023 Автор Поделиться Опубликовано 9 июля, 2023 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 ); } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Exception Опубликовано 9 июля, 2023 Поделиться Опубликовано 9 июля, 2023 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 ); } да, что-то вроде этого Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 9 июля, 2023 Автор Поделиться Опубликовано 9 июля, 2023 (изменено) 2 минуты назад, Exception сказал: да, что-то вроде этого Тогда еще вопрос. Куда писать свои функции на php? С шаблонами, css и js понятно, а с php не доводилось. Не в шаблоне же всю эту портянку расписывать. Изменено 9 июля, 2023 пользователем edmsl Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Exception Опубликовано 9 июля, 2023 Поделиться Опубликовано 9 июля, 2023 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/ edmsl 1 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 11 июля, 2023 Автор Поделиться Опубликовано 11 июля, 2023 Хотелось бы поднять снова этот вопрос. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 18 июля, 2023 Автор Поделиться Опубликовано 18 июля, 2023 Как можно получить (а можно ли?) значения настроек в JS? В шаблонах html и css это делается так: {{if settings.someParam}}. А в JS? Да, уточню, что настройки из плагина. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 18 июля, 2023 Автор Поделиться Опубликовано 18 июля, 2023 ips.getSetting('someParam') возвращает undefined. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 21 июля, 2023 Автор Поделиться Опубликовано 21 июля, 2023 В 09.07.2023 в 12:08, edmsl сказал: {{foreach $collection as $inputName => $input}} {$input|raw} {{endforeach}} Можно ли как-то инпуту добавить класс в данном случаем? Это блоки кастомных полей из БД. Они все генерируются на основе своего шаблона и как подкинуть для этого свой я не знаю. Сейчас я их скрываю через JS, но это приводит к их миганию, сначала они есть, а потом их нет. Хотелось бы сразу накинуть нужным класс ipsHide. Мне нужно было скрыть поле, чтобы не делать это через JS. Для себя решил задачу так: <li class="ipsHide"> {$input->html()|raw} </li> Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 21 июля, 2023 Автор Поделиться Опубликовано 21 июля, 2023 Нашел еще способ. Можно изменить массив $input->rowClasses. Например, $input->rowClasses[0]='ipsHide'. Выводим как обычно, {$input|raw} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 23 июля, 2023 Автор Поделиться Опубликовано 23 июля, 2023 В 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('ваша_переменная')); ryancoolround 1 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
edmsl Опубликовано 23 июля, 2023 Автор Поделиться Опубликовано 23 июля, 2023 Exception По поводу Сделал я такой хук: Спойлер Как мне его вызвать теперь в JS коде? Вот так, например: ips.getAjax()( ips.getSetting('baseURL') + 'index.php?app=cms&module=database&controller=ajax&do=makeFurl', { type: 'get', } ) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.