[], ]; $options += $defaults; $this->originalBlocks = $options[ 'originalBlocks' ]; $this->setHideName( $this->propHasValue( 'mHideName', true ) ); $this->isSitewide( $this->propHasValue( 'isSitewide', true ) ); $this->isEmailBlocked( $this->propHasValue( 'mBlockEmail', true ) ); $this->isCreateAccountBlocked( $this->propHasValue( 'blockCreateAccount', true ) ); $this->isUsertalkEditAllowed( !$this->propHasValue( 'allowUsertalk', false ) ); } /** * Determine whether any original blocks have a particular property set to a * particular value. * * @param string $prop * @param mixed $value * @return bool At least one block has the property set to the value */ private function propHasValue( $prop, $value ) { foreach ( $this->originalBlocks as $block ) { if ( $block->$prop == $value ) { return true; } } return false; } /** * Determine whether any original blocks have a particular method returning a * particular value. * * @param string $method * @param mixed $value * @param mixed ...$params * @return bool At least one block has the method returning the value */ private function methodReturnsValue( $method, $value, ...$params ) { foreach ( $this->originalBlocks as $block ) { if ( $block->$method( ...$params ) == $value ) { return true; } } return false; } /** * Get the original blocks from which this block is composed * * @since 1.34 * @return AbstractBlock[] */ public function getOriginalBlocks() { return $this->originalBlocks; } /** * @inheritDoc */ public function getExpiry() { $maxExpiry = null; foreach ( $this->originalBlocks as $block ) { $expiry = $block->getExpiry(); if ( $maxExpiry === null || $expiry === '' || $expiry > $maxExpiry ) { $maxExpiry = $expiry; } } return $maxExpiry; } /** * Get the IDs for the original blocks, ignoring any that are null * * @return int[] */ protected function getIds() { $ids = []; foreach ( $this->originalBlocks as $block ) { $id = $block->getId(); if ( $id !== null ) { $ids[] = $id; } } return $ids; } /** * @inheritDoc */ public function getPermissionsError( IContextSource $context ) { $params = $this->getBlockErrorParams( $context ); $ids = implode( ', ', array_map( function ( $id ) { return '#' . $id; }, $this->getIds() ) ); if ( $ids === '' ) { $idsMsg = $context->msg( 'blockedtext-composite-no-ids' )->plain(); } else { $idsMsg = $context->msg( 'blockedtext-composite-ids', [ $ids ] )->plain(); } // TODO: Clean up error messages params so we don't have to do this (T227174) $params[ 4 ] = $idsMsg; $msg = 'blockedtext-composite'; array_unshift( $params, $msg ); return $params; } /** * @inheritDoc */ public function appliesToRight( $right ) { return $this->methodReturnsValue( __FUNCTION__, true, $right ); } /** * @inheritDoc */ public function appliesToUsertalk( Title $usertalk = null ) { return $this->methodReturnsValue( __FUNCTION__, true, $usertalk ); } /** * @inheritDoc */ public function appliesToTitle( Title $title ) { return $this->methodReturnsValue( __FUNCTION__, true, $title ); } /** * @inheritDoc */ public function appliesToNamespace( $ns ) { return $this->methodReturnsValue( __FUNCTION__, true, $ns ); } /** * @inheritDoc */ public function appliesToPage( $pageId ) { return $this->methodReturnsValue( __FUNCTION__, true, $pageId ); } /** * @inheritDoc */ public function appliesToPasswordReset() { return $this->methodReturnsValue( __FUNCTION__, true ); } }