* @ingroup SpecialPage
*/
class SpecialBookSources extends SpecialPage {
- /**
- * ISBN passed to the page, if any
- */
- protected $isbn = '';
-
public function __construct() {
parent::__construct( 'Booksources' );
}
$this->setHeaders();
$this->outputHeader();
- $this->isbn = self::cleanIsbn( $isbn ?: $this->getRequest()->getText( 'isbn' ) );
+ // User provided ISBN
+ $isbn = $isbn ?: $this->getRequest()->getText( 'isbn' );
+ $isbn = trim( $isbn );
- $this->buildForm();
+ $this->buildForm( $isbn );
- if ( $this->isbn !== '' ) {
- if ( !self::isValidISBN( $this->isbn ) ) {
+ if ( $isbn !== '' ) {
+ if ( !self::isValidISBN( $isbn ) ) {
$out->wrapWikiMsg(
"<div class=\"error\">\n$1\n</div>",
'booksources-invalid-isbn'
);
}
- $this->showList();
+ $this->showList( $isbn );
}
}
/**
* Generate a form to allow users to enter an ISBN
+ *
+ * @param string $isbn
*/
- private function buildForm() {
+ private function buildForm( $isbn ) {
$formDescriptor = [
'isbn' => [
'type' => 'text',
'name' => 'isbn',
'label-message' => 'booksources-isbn',
- 'default' => $this->isbn,
+ 'default' => $isbn,
'autofocus' => true,
'required' => true,
],
];
- $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
+ HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
->setWrapperLegendMsg( 'booksources-search-legend' )
->setSubmitTextMsg( 'booksources-search' )
->setMethod( 'get' )
* Determine where to get the list of book sources from,
* format and output them
*
+ * @param string $isbn
* @throws MWException
* @return bool
*/
- private function showList() {
+ private function showList( $isbn ) {
$out = $this->getOutput();
global $wgContLang;
+ $isbn = self::cleanIsbn( $isbn );
# Hook to allow extensions to insert additional HTML,
# e.g. for API-interacting plugins and so on
- Hooks::run( 'BookInformation', [ $this->isbn, $out ] );
+ Hooks::run( 'BookInformation', [ $isbn, $out ] );
# Check for a local page such as Project:Book_sources and use that if available
$page = $this->msg( 'booksources' )->inContentLanguage()->text();
// XXX: in the future, this could be stored as structured data, defining a list of book sources
$text = $content->getNativeData();
- $out->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) );
+ $out->addWikiText( str_replace( 'MAGICNUMBER', $isbn, $text ) );
return true;
} else {
$out->addHTML( '<ul>' );
$items = $wgContLang->getBookstoreList();
foreach ( $items as $label => $url ) {
- $out->addHTML( $this->makeListItem( $label, $url ) );
+ $out->addHTML( $this->makeListItem( $isbn, $label, $url ) );
}
$out->addHTML( '</ul>' );
/**
* Format a book source list item
*
+ * @param string $isbn
* @param string $label Book source label
* @param string $url Book source URL
* @return string
*/
- private function makeListItem( $label, $url ) {
- $url = str_replace( '$1', $this->isbn, $url );
+ private function makeListItem( $isbn, $label, $url ) {
+ $url = str_replace( '$1', $isbn, $url );
return Html::rawElement( 'li', [],
Html::element( 'a', [ 'href' => $url, 'class' => 'external' ], $label )
<?php
-class SpecialBooksourcesTest extends MediaWikiTestCase {
+class SpecialBooksourcesTest extends SpecialPageTestBase {
public static function provideISBNs() {
return [
[ '978-0-300-14424-6', true ],
public function testIsValidISBN( $isbn, $isValid ) {
$this->assertSame( $isValid, SpecialBookSources::isValidISBN( $isbn ) );
}
+
+ protected function newSpecialPage() {
+ return new SpecialBookSources();
+ }
+
+ /**
+ * @covers SpecialBookSources::execute
+ */
+ public function testExecute() {
+ list( $html, ) = $this->executeSpecialPage( 'Invalid', null, 'qqx' );
+ $this->assertContains( '(booksources-invalid-isbn)', $html );
+ list( $html, ) = $this->executeSpecialPage( '0-7475-3269-9', null, 'qqx' );
+ $this->assertNotContains( '(booksources-invalid-isbn)', $html );
+ $this->assertContains( '(booksources-text)', $html );
+ }
}