Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/view/src/StatementGroupListView.php
<?php

namespace Wikibase\View;

use Wikibase\DataModel\Services\EntityId\EntityIdFormatter;
use Wikibase\DataModel\Statement\Statement;
use Wikibase\View\Template\TemplateFactory;

/**
 * Generates HTML to display statements.
 *
 * @since 0.5
 *
 * @license GPL-2.0+
 * @author Bene* < benestar.wikimedia@gmail.com >
 * @author Daniel Kinzler
 */
class StatementGroupListView {

	/**
	 * @var TemplateFactory
	 */
	private $templateFactory;

	/**
	 * @var EntityIdFormatter
	 */
	private $propertyIdFormatter;

	/**
	 * @var EditSectionGenerator
	 */
	private $editSectionGenerator;

	/**
	 * @var ClaimHtmlGenerator
	 */
	private $claimHtmlGenerator;

	/**
	 * @param TemplateFactory $templateFactory
	 * @param EntityIdFormatter $propertyIdFormatter
	 * @param EditSectionGenerator $sectionEditLinkGenerator
	 * @param ClaimHtmlGenerator $claimHtmlGenerator
	 */
	public function __construct(
		TemplateFactory $templateFactory,
		EntityIdFormatter $propertyIdFormatter,
		EditSectionGenerator $sectionEditLinkGenerator,
		ClaimHtmlGenerator $claimHtmlGenerator
	) {
		$this->propertyIdFormatter = $propertyIdFormatter;
		$this->editSectionGenerator = $sectionEditLinkGenerator;
		$this->claimHtmlGenerator = $claimHtmlGenerator;
		$this->templateFactory = $templateFactory;
	}

	/**
	 * Builds and returns the HTML representing a WikibaseEntity's statements.
	 *
	 * @since 0.5
	 *
	 * @param Statement[] $statements
	 * @return string HTML
	 */
	public function getHtml( array $statements ) {
		$statementsByProperty = $this->groupStatementsByProperties( $statements );

		$statementsHtml = '';
		foreach ( $statementsByProperty as $statements ) {
			$statementsHtml .= $this->getHtmlForStatementGroupView( $statements );
		}

		return $this->templateFactory->render(
			'wikibase-statementgrouplistview',
			$this->templateFactory->render( 'wikibase-listview', $statementsHtml )
		);
	}

	/**
	 * @param Statement[] $statements
	 *
	 * @return array[]
	 */
	private function groupStatementsByProperties( array $statements ) {
		$byProperty = array();

		foreach ( $statements as $statement ) {
			$propertyId = $statement->getMainSnak()->getPropertyId();
			$byProperty[$propertyId->getSerialization()][] = $statement;
		}

		return $byProperty;
	}

	/**
	 * @param Statement[] $statements
	 *
	 * @return string HTML
	 */
	private function getHtmlForStatementGroupView( array $statements ) {
		$propertyId = $statements[0]->getMainSnak()->getPropertyId();
		$addStatementHtml = $this->editSectionGenerator->getAddStatementToGroupSection( $propertyId );

		return $this->templateFactory->render(
			'wikibase-statementgroupview',
			$this->propertyIdFormatter->formatEntityId( $propertyId ),
			$this->getHtmlForStatementListView( $statements, $addStatementHtml ),
			$propertyId->getSerialization()
		);
	}

	/**
	 * @param Statement[] $statements
	 * @param string $addStatementHtml
	 *
	 * @return string HTML
	 */
	private function getHtmlForStatementListView( array $statements, $addStatementHtml ) {
		$statementViewsHtml = '';

		foreach ( $statements as $statement ) {
			$statementViewsHtml .= $this->claimHtmlGenerator->getHtmlForClaim(
				$statement,
				$this->editSectionGenerator->getStatementEditSection( $statement )
			);
		}

		return $this->templateFactory->render( 'wikibase-statementlistview',
			$statementViewsHtml,
			$addStatementHtml
		);
	}

}