MediaWiki
REL1_22
|
00001 <?php 00032 class ApiQueryProtectedTitles extends ApiQueryGeneratorBase { 00033 00034 public function __construct( $query, $moduleName ) { 00035 parent::__construct( $query, $moduleName, 'pt' ); 00036 } 00037 00038 public function execute() { 00039 $this->run(); 00040 } 00041 00042 public function executeGenerator( $resultPageSet ) { 00043 $this->run( $resultPageSet ); 00044 } 00045 00050 private function run( $resultPageSet = null ) { 00051 $params = $this->extractRequestParams(); 00052 00053 $this->addTables( 'protected_titles' ); 00054 $this->addFields( array( 'pt_namespace', 'pt_title', 'pt_timestamp' ) ); 00055 00056 $prop = array_flip( $params['prop'] ); 00057 $this->addFieldsIf( 'pt_user', isset( $prop['user'] ) || isset( $prop['userid'] ) ); 00058 $this->addFieldsIf( 'pt_reason', isset( $prop['comment'] ) || isset( $prop['parsedcomment'] ) ); 00059 $this->addFieldsIf( 'pt_expiry', isset( $prop['expiry'] ) ); 00060 $this->addFieldsIf( 'pt_create_perm', isset( $prop['level'] ) ); 00061 00062 $this->addTimestampWhereRange( 'pt_timestamp', $params['dir'], $params['start'], $params['end'] ); 00063 $this->addWhereFld( 'pt_namespace', $params['namespace'] ); 00064 $this->addWhereFld( 'pt_create_perm', $params['level'] ); 00065 00066 if ( isset( $prop['user'] ) ) { 00067 $this->addTables( 'user' ); 00068 $this->addFields( 'user_name' ); 00069 $this->addJoinConds( array( 'user' => array( 'LEFT JOIN', 00070 'user_id=pt_user' 00071 ) ) ); 00072 } 00073 00074 $this->addOption( 'LIMIT', $params['limit'] + 1 ); 00075 $res = $this->select( __METHOD__ ); 00076 00077 $count = 0; 00078 $result = $this->getResult(); 00079 00080 $titles = array(); 00081 00082 foreach ( $res as $row ) { 00083 if ( ++ $count > $params['limit'] ) { 00084 // We've reached the one extra which shows that there are additional pages to be had. Stop here... 00085 $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->pt_timestamp ) ); 00086 break; 00087 } 00088 00089 $title = Title::makeTitle( $row->pt_namespace, $row->pt_title ); 00090 if ( is_null( $resultPageSet ) ) { 00091 $vals = array(); 00092 ApiQueryBase::addTitleInfo( $vals, $title ); 00093 if ( isset( $prop['timestamp'] ) ) { 00094 $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->pt_timestamp ); 00095 } 00096 00097 if ( isset( $prop['user'] ) && !is_null( $row->user_name ) ) { 00098 $vals['user'] = $row->user_name; 00099 } 00100 00101 if ( isset( $prop['userid'] ) || /*B/C*/isset( $prop['user'] ) ) { 00102 $vals['userid'] = $row->pt_user; 00103 } 00104 00105 if ( isset( $prop['comment'] ) ) { 00106 $vals['comment'] = $row->pt_reason; 00107 } 00108 00109 if ( isset( $prop['parsedcomment'] ) ) { 00110 $vals['parsedcomment'] = Linker::formatComment( $row->pt_reason, $title ); 00111 } 00112 00113 if ( isset( $prop['expiry'] ) ) { 00114 global $wgContLang; 00115 $vals['expiry'] = $wgContLang->formatExpiry( $row->pt_expiry, TS_ISO_8601 ); 00116 } 00117 00118 if ( isset( $prop['level'] ) ) { 00119 $vals['level'] = $row->pt_create_perm; 00120 } 00121 00122 $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals ); 00123 if ( !$fit ) { 00124 $this->setContinueEnumParameter( 'start', 00125 wfTimestamp( TS_ISO_8601, $row->pt_timestamp ) ); 00126 break; 00127 } 00128 } else { 00129 $titles[] = $title; 00130 } 00131 } 00132 00133 if ( is_null( $resultPageSet ) ) { 00134 $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), $this->getModulePrefix() ); 00135 } else { 00136 $resultPageSet->populateFromTitles( $titles ); 00137 } 00138 } 00139 00140 public function getCacheMode( $params ) { 00141 if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) { 00142 // formatComment() calls wfMessage() among other things 00143 return 'anon-public-user-private'; 00144 } else { 00145 return 'public'; 00146 } 00147 } 00148 00149 public function getAllowedParams() { 00150 global $wgRestrictionLevels; 00151 return array( 00152 'namespace' => array( 00153 ApiBase::PARAM_ISMULTI => true, 00154 ApiBase::PARAM_TYPE => 'namespace', 00155 ), 00156 'level' => array( 00157 ApiBase::PARAM_ISMULTI => true, 00158 ApiBase::PARAM_TYPE => array_diff( $wgRestrictionLevels, array( '' ) ) 00159 ), 00160 'limit' => array( 00161 ApiBase::PARAM_DFLT => 10, 00162 ApiBase::PARAM_TYPE => 'limit', 00163 ApiBase::PARAM_MIN => 1, 00164 ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1, 00165 ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2 00166 ), 00167 'dir' => array( 00168 ApiBase::PARAM_DFLT => 'older', 00169 ApiBase::PARAM_TYPE => array( 00170 'newer', 00171 'older' 00172 ) 00173 ), 00174 'start' => array( 00175 ApiBase::PARAM_TYPE => 'timestamp' 00176 ), 00177 'end' => array( 00178 ApiBase::PARAM_TYPE => 'timestamp' 00179 ), 00180 'prop' => array( 00181 ApiBase::PARAM_ISMULTI => true, 00182 ApiBase::PARAM_DFLT => 'timestamp|level', 00183 ApiBase::PARAM_TYPE => array( 00184 'timestamp', 00185 'user', 00186 'userid', 00187 'comment', 00188 'parsedcomment', 00189 'expiry', 00190 'level' 00191 ) 00192 ), 00193 ); 00194 } 00195 00196 public function getParamDescription() { 00197 return array( 00198 'namespace' => 'Only list titles in these namespaces', 00199 'start' => 'Start listing at this protection timestamp', 00200 'end' => 'Stop listing at this protection timestamp', 00201 'dir' => $this->getDirectionDescription( $this->getModulePrefix() ), 00202 'limit' => 'How many total pages to return', 00203 'prop' => array( 00204 'Which properties to get', 00205 ' timestamp - Adds the timestamp of when protection was added', 00206 ' user - Adds the user that added the protection', 00207 ' userid - Adds the user id that added the protection', 00208 ' comment - Adds the comment for the protection', 00209 ' parsedcomment - Adds the parsed comment for the protection', 00210 ' expiry - Adds the timestamp of when the protection will be lifted', 00211 ' level - Adds the protection level', 00212 ), 00213 'level' => 'Only list titles with these protection levels', 00214 ); 00215 } 00216 00217 public function getResultProperties() { 00218 global $wgRestrictionLevels; 00219 return array( 00220 '' => array( 00221 'ns' => 'namespace', 00222 'title' => 'string' 00223 ), 00224 'timestamp' => array( 00225 'timestamp' => 'timestamp' 00226 ), 00227 'user' => array( 00228 'user' => array( 00229 ApiBase::PROP_TYPE => 'string', 00230 ApiBase::PROP_NULLABLE => true 00231 ), 00232 'userid' => 'integer' 00233 ), 00234 'userid' => array( 00235 'userid' => 'integer' 00236 ), 00237 'comment' => array( 00238 'comment' => 'string' 00239 ), 00240 'parsedcomment' => array( 00241 'parsedcomment' => 'string' 00242 ), 00243 'expiry' => array( 00244 'expiry' => 'timestamp' 00245 ), 00246 'level' => array( 00247 'level' => array( 00248 ApiBase::PROP_TYPE => array_diff( $wgRestrictionLevels, array( '' ) ) 00249 ) 00250 ) 00251 ); 00252 } 00253 00254 public function getDescription() { 00255 return 'List all titles protected from creation'; 00256 } 00257 00258 public function getExamples() { 00259 return array( 00260 'api.php?action=query&list=protectedtitles', 00261 ); 00262 } 00263 00264 public function getHelpUrls() { 00265 return 'https://www.mediawiki.org/wiki/API:Protectedtitles'; 00266 } 00267 }