Invision Power Services, Inc. * @copyright (c) Invision Power Services, Inc. * @license https://www.invisioncommunity.com/legal/standards/ * @package Invision Community * @since 05 Feb 2024 */ namespace IPS\core\modules\admin\developer; use IPS\Developer\Controller; use IPS\Helpers\Form; use IPS\Helpers\Form\Select; use IPS\Helpers\Form\Text; use IPS\Helpers\Table\Custom; use IPS\Http\Url; use IPS\Member; use IPS\Output; use IPS\Request; use function defined; use const IPS\ROOT_PATH; /* To prevent PHP errors (extending class does not exist) revealing path */ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) ) { header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' ); exit; } /** * acpsearch */ class acpsearch extends Controller { /** * @var bool */ public static bool $csrfProtected = true; /** * ... * * @return void */ protected function manage() : void { $json = $this->_getJson( ROOT_PATH . "/applications/{$this->application->directory}/data/acpsearch.json" ); $data = array(); foreach( $json as $k => $v ) { $data[ $k ] = array( 'controller' => $k, 'lang' => $v['lang_key'], 'keywords' => implode( ", ", $v['keywords'] ), 'restriction' => $v['restriction'] ); } $table = new Custom( $data, $this->url ); $table->quickSearch = 'keywords'; $table->include = [ 'controller', 'keywords' ]; $table->langPrefix = 'dev_acpsearch_'; $table->parsers = [ 'controller' => function( $val, $row ) { parse_str( $row['controller'], $params ); if( ( isset( $params['app'] ) and isset( $params['module'] ) ) and ( !isset( $row['restriction'] ) or Member::loggedIn()->hasAcpRestriction( $params['app'], $params['module'], $row['restriction'] ) ) ) { $title = "" . Member::loggedIn()->language()->addToStack( $row['lang'] ) . ""; } $title = Member::loggedIn()->language()->addToStack( $row['lang'] ); return $title . "
{$row['controller']}
"; } ]; $table->rootButtons = array( 'add' => array( 'icon' => 'plus', 'title' => 'add', 'link' => $this->url->setQueryString( 'do', 'form' ), 'data' => array( 'ipsDialog' => '', 'ipsDialog-title' => Member::loggedIn()->language()->addToStack('add') ) ) ); $url = $this->url; $table->rowButtons = function( $row ) use ( $url ) { return array( 'view' => array( 'icon' => 'search', 'title' => 'view', 'link' => Url::internal( $row['controller'] ), 'target' => '_blank' ), 'edit' => array( 'icon' => 'pencil', 'title' => 'edit', 'link' => $url->setQueryString( array( 'do' => 'form', 'key' => urlencode( $row['controller'] ) ) ), 'data' => array( 'ipsDialog' => '', 'ipsDialog-title' => Member::loggedIn()->language()->addToStack('edit') ) ), 'delete' => array( 'icon' => 'times-circle', 'title' => 'delete', 'link' => $url->setQueryString( array( 'do' => 'delete', 'key' => urlencode( $row['controller'] ) ) )->csrf(), 'data' => array( 'confirm' => '' ) ) ); }; Output::i()->output = (string) $table; } /** * @return void */ protected function form() : void { $jsonFile = ROOT_PATH . "/applications/{$this->application->directory}/data/acpsearch.json"; $json = $this->_getJson( $jsonFile ); $controller = isset( Request::i()->key ) ? urldecode( Request::i()->key ) : null; $row = ( $controller !== null and isset( $json[ $controller ] ) ) ? $json[ $controller ] : array(); $restrictions = array( '' => 'no_restriction' ); foreach( $this->application->modules( 'admin' ) as $module ) { $moduleKey = 'menu__' . $this->application->directory . '_' . $module->key; $moduleRestrictions = array(); foreach( $this->_getRestrictions( $module ) as $group => $r ) { foreach( $r as $k => $v ) { $moduleRestrictions[ $k ] = $v; } } if( count( $moduleRestrictions ) ) { $restrictions[ $moduleKey ] = $moduleRestrictions; } } $form = new Form; $form->add( new Text( 'dev_acpsearch_controller', $controller, true ) ); $form->add( new Text( 'dev_acpsearch_lang', $row['lang_key'] ?? null, true ) ); $form->add( new Select( 'dev_acpsearch_restriction', $row['restriction'] ?? null, false, array( 'options' => $restrictions ) ) ); $form->add( new Form\Stack( 'dev_acpsearch_keywords', $row['keywords'] ?? null, true ) ); if( $values = $form->values() ) { $keywordData = [ 'lang_key' => $values['dev_acpsearch_lang'], 'restriction' => $values['dev_acpsearch_restriction'] ?? null, 'keywords' => $values['dev_acpsearch_keywords'] ]; if( $controller == $values['dev_acpsearch_controller'] ) { $json[ $controller ] = $keywordData; } else { $json[ $values['dev_acpsearch_controller'] ] = $keywordData; if( isset( $json[ $controller ] ) ) { unset( $json[ $controller ] ); } } $this->_writeJson( $jsonFile, $json ); Output::i()->redirect( $this->url ); } Output::i()->output = (string) $form; } /** * @return void */ protected function delete() : void { Request::i()->confirmedDelete(); $jsonFile = ROOT_PATH . "/applications/{$this->application->directory}/data/acpsearch.json"; $json = $this->_getJson( $jsonFile ); $controller = isset( Request::i()->key ) ? urldecode( Request::i()->key ) : null; if( isset( $json[ $controller ] ) ) { unset( $json[ $controller ] ); } $this->_writeJson( $jsonFile, $json ); Output::i()->redirect( $this->url ); } }