MediaWiki  master
TextConflictHelper.php
Go to the documentation of this file.
1 <?php
25 namespace MediaWiki\EditPage;
26 
27 use Content;
28 use ContentHandler;
29 use Html;
31 use OutputPage;
32 use Title;
33 
41 
45  protected $title;
46 
50  public $contentModel = null;
51 
55  public $contentFormat = null;
56 
60  protected $out;
61 
65  protected $stats;
66 
70  protected $submitLabel;
71 
75  protected $yourtext = '';
76 
80  protected $storedversion = '';
81 
90  ) {
91  $this->title = $title;
92  $this->out = $out;
93  $this->stats = $stats;
94  $this->submitLabel = $submitLabel;
95  $this->contentModel = $title->getContentModel();
96  $this->contentFormat = ContentHandler::getForModelID( $this->contentModel )->getDefaultFormat();
97  }
98 
103  public function setTextboxes( $yourtext, $storedversion ) {
104  $this->yourtext = $yourtext;
105  $this->storedversion = $storedversion;
106  }
107 
111  public function setContentModel( $contentModel ) {
112  $this->contentModel = $contentModel;
113  }
114 
118  public function setContentFormat( $contentFormat ) {
119  $this->contentFormat = $contentFormat;
120  }
121 
125  public function incrementConflictStats() {
126  $this->stats->increment( 'edit.failures.conflict' );
127  // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
128  if (
129  $this->title->getNamespace() >= NS_MAIN &&
130  $this->title->getNamespace() <= NS_CATEGORY_TALK
131  ) {
132  $this->stats->increment(
133  'edit.failures.conflict.byNamespaceId.' . $this->title->getNamespace()
134  );
135  }
136  }
137 
141  public function incrementResolvedStats() {
142  $this->stats->increment( 'edit.failures.conflict.resolved' );
143  // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
144  if (
145  $this->title->getNamespace() >= NS_MAIN &&
146  $this->title->getNamespace() <= NS_CATEGORY_TALK
147  ) {
148  $this->stats->increment(
149  'edit.failures.conflict.resolved.byNamespaceId.' . $this->title->getNamespace()
150  );
151  }
152  }
153 
157  public function getExplainHeader() {
158  return Html::rawElement(
159  'div',
160  [ 'class' => 'mw-explainconflict' ],
161  $this->out->msg( 'explainconflict', $this->out->msg( $this->submitLabel )->text() )->parse()
162  );
163  }
164 
170  public function getEditConflictMainTextBox( array $customAttribs = [] ) {
171  $builder = new TextboxBuilder();
172  $classes = $builder->getTextboxProtectionCSSClasses( $this->title );
173 
174  $attribs = [ 'tabindex' => 1 ];
175  $attribs += $customAttribs;
176 
177  $attribs = $builder->mergeClassesIntoAttributes( $classes, $attribs );
178 
179  $attribs = $builder->buildTextboxAttribs(
180  'wpTextbox1',
181  $attribs,
182  $this->out->getUser(),
184  );
185 
186  $this->out->addHTML(
187  Html::textarea( 'wpTextbox1', $builder->addNewLineAtEnd( $this->storedversion ), $attribs )
188  );
189  }
190 
197  public function getEditFormHtmlBeforeContent() {
198  return '';
199  }
200 
207  public function getEditFormHtmlAfterContent() {
208  return '';
209  }
210 
215  public function showEditFormTextAfterFooters() {
216  $this->out->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
217 
218  $yourContent = $this->toEditContent( $this->yourtext );
219  $storedContent = $this->toEditContent( $this->storedversion );
220  $handler = ContentHandler::getForModelID( $this->contentModel );
221  $diffEngine = $handler->createDifferenceEngine( $this->out );
222 
223  $diffEngine->setContent( $yourContent, $storedContent );
224  $diffEngine->showDiff(
225  $this->out->msg( 'yourtext' )->parse(),
226  $this->out->msg( 'storedversion' )->text()
227  );
228 
229  $this->out->wrapWikiMsg( '<h2>$1</h2>', "yourtext" );
230 
231  $builder = new TextboxBuilder();
232  $attribs = $builder->buildTextboxAttribs(
233  'wpTextbox2',
234  [ 'tabindex' => 6, 'readonly' ],
235  $this->out->getUser(),
237  );
238 
239  $this->out->addHTML(
240  Html::textarea( 'wpTextbox2', $builder->addNewLineAtEnd( $this->yourtext ), $attribs )
241  );
242  }
243 
248  private function toEditContent( $text ) {
250  $text,
251  $this->title,
252  $this->contentModel,
253  $this->contentFormat
254  );
255  }
256 }
Helps EditPage build textboxes.
const NS_MAIN
Definition: Defines.php:60
static rawElement( $element, $attribs=[], $contents='')
Returns an HTML element in a string.
Definition: Html.php:209
Helper for displaying edit conflicts in text content models to users.
getEditConflictMainTextBox(array $customAttribs=[])
HTML to build the textbox1 on edit conflicts.
incrementConflictStats()
Record a user encountering an edit conflict.
static textarea( $name, $value='', array $attribs=[])
Convenience function to produce a <textarea> element.
Definition: Html.php:818
getEditFormHtmlBeforeContent()
Content to go in the edit form before textbox1.
string $submitLabel
Message key for submit button&#39;s label.
IBufferingStatsdDataFactory $stats
__construct(Title $title, OutputPage $out, IBufferingStatsdDataFactory $stats, $submitLabel)
static getForModelID( $modelId)
Returns the ContentHandler singleton for the given model ID.
incrementResolvedStats()
Record when a user has resolved an edit conflict.
getEditFormHtmlAfterContent()
Content to go in the edit form after textbox1.
const NS_CATEGORY_TALK
Definition: Defines.php:75
getContentModel( $flags=0)
Get the page&#39;s content model id, see the CONTENT_MODEL_XXX constants.
Definition: Title.php:1052
static makeContent( $text, Title $title=null, $modelId=null, $format=null)
Convenience function for creating a Content object from a given textual representation.
showEditFormTextAfterFooters()
Content to go in the edit form after the footers (templates on this page, hidden categories, limit report)
setTextboxes( $yourtext, $storedversion)