Skip to content

Commit

Permalink
Added universal inheritance for label and child record callbacks (#87)
Browse files Browse the repository at this point in the history
  • Loading branch information
aschempp committed Nov 23, 2016
1 parent f8cec36 commit 9cd34d5
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 60 deletions.
Expand Up @@ -3,15 +3,14 @@
namespace Terminal42\ChangeLanguage\EventListener\DataContainer;

use Contao\ArticleModel;
use Contao\Backend;
use Contao\CalendarEventsModel;
use Contao\CalendarModel;
use Contao\FaqCategoryModel;
use Contao\FaqModel;
use Contao\NewsArchiveModel;
use Contao\NewsModel;
use Contao\PageModel;
use Contao\System;
use Terminal42\ChangeLanguage\Helper\LabelCallback;

class MissingLanguageIconListener
{
Expand All @@ -23,11 +22,6 @@ class MissingLanguageIconListener
'tl_faq' => 'onFaqChildRecords',
];

/**
* @var array|callable
*/
private $originalLabelCallback;

/**
* Override core labels to show missing language information.
*
Expand All @@ -36,51 +30,29 @@ class MissingLanguageIconListener
public function register($table)
{
if (array_key_exists($table, self::$callbacks)) {
$callback = function () use ($table) {
return call_user_func_array(
[$this, self::$callbacks[$table]],
func_get_args()
);
};

if (4 === $GLOBALS['TL_DCA'][$table]['list']['sorting']['mode']) {
$GLOBALS['TL_DCA'][$table]['list']['sorting']['child_record_callback'] = $callback;
} else {
$this->originalLabelCallback = $GLOBALS['TL_DCA'][$table]['list']['label']['label_callback'];
$GLOBALS['TL_DCA'][$table]['list']['label']['label_callback'] = $callback;
}
LabelCallback::createAndRegister(
$table,
function (array $args, $previousResult) use ($table) {
return $this->{self::$callbacks[$table]}($args, $previousResult);
}
);
}
}

/**
* Adds missing translation warning to page tree.
*
* @param array $row
* @param string $label
* @param \DataContainer|null $dc
* @param string $imageAttribute
* @param bool $blnReturnImage
* @param bool $blnProtected
* @param array $args
* @param mixed $previousResult
*
* @return string
*/
public function onPageLabel(
array $row,
$label,
$dc = null,
$imageAttribute = '',
$blnReturnImage = false,
$blnProtected = false
) {
if (is_array($this->originalLabelCallback)) {
$label = call_user_func_array(
[System::importStatic($this->originalLabelCallback[0]), $this->originalLabelCallback[1]],
func_get_args()
);
} elseif (is_callable($this->originalLabelCallback)) {
$label = call_user_func_array($this->originalLabelCallback, func_get_args());
} else {
$label = Backend::addPageIcon($row, $label, $dc, $imageAttribute, $blnReturnImage, $blnProtected);
public function onPageLabel(array $args, $previousResult = null)
{
list($row, $label) = $args;

if ($previousResult) {
$label = $previousResult;
}

if ('root' === $row['type'] || 'folder' === $row['type'] || 'page' !== \Input::get('do')) {
Expand All @@ -102,15 +74,18 @@ public function onPageLabel(
/**
* Adds missing translation warning to article tree.
*
* @param array $row
* @param string $label
* @param array $args
* @param mixed $previousResult
*
* @return string
*/
public function onArticleLabel(array $row, $label)
public function onArticleLabel(array $args, $previousResult = null)
{
$tl_article = new \tl_article();
$label = $tl_article->addIcon($row, $label);
list($row, $label) = $args;

if ($previousResult) {
$label = $previousResult;
}

$page = PageModel::findWithDetails($row['pid']);
$root = PageModel::findByPk($page->rootId);
Expand All @@ -128,14 +103,15 @@ public function onArticleLabel(array $row, $label)
/**
* Generate missing translation warning for news child records.
*
* @param array $row
* @param array $args
* @param mixed $previousResult
*
* @return string
*/
public function onNewsChildRecords(array $row)
public function onNewsChildRecords(array $args, $previousResult = null)
{
$tl_news = new \tl_news();
$label = $tl_news->listNewsArticles($row);
$row = $args[0];
$label = (string) $previousResult;

$archive = NewsArchiveModel::findByPk($row['pid']);

Expand All @@ -151,14 +127,15 @@ public function onNewsChildRecords(array $row)
/**
* Generate missing translation warning for calendar events child records.
*
* @param array $row
* @param array $args
* @param mixed $previousResult
*
* @return string
*/
public function onCalendarEventChildRecords(array $row)
public function onCalendarEventChildRecords(array $args, $previousResult = null)
{
$tl_calendar_events = new \tl_calendar_events();
$label = $tl_calendar_events->listEvents($row);
$row = $args[0];
$label = (string) $previousResult;

$calendar = CalendarModel::findByPk($row['pid']);

Expand All @@ -174,14 +151,15 @@ public function onCalendarEventChildRecords(array $row)
/**
* Generate missing translation warning for faq child records.
*
* @param array $row
* @param array $args
* @param mixed $previousResult
*
* @return string
*/
public function onFaqChildRecords(array $row)
public function onFaqChildRecords(array $args, $previousResult = null)
{
$tl_faq = new \tl_faq();
$label = $tl_faq->listQuestions($row);
$row = $args[0];
$label = (string) $previousResult;

$category = FaqCategoryModel::findByPk($row['pid']);

Expand Down
79 changes: 79 additions & 0 deletions library/Terminal42/ChangeLanguage/Helper/LabelCallback.php
@@ -0,0 +1,79 @@
<?php

namespace Terminal42\ChangeLanguage\Helper;

use Contao\Controller;
use Contao\System;

class LabelCallback
{
/**
* @var callable
*/
private $previous;

/**
* Registers callback for given table.
*
* @param string $table
* @param callable $callback
*/
public function register($table, callable $callback)
{
Controller::loadDataContainer($table);

$chain = function () use ($callback) {
$args = func_get_args();
$result = null;

if (is_callable($this->previous)) {
$result = $this->executeCallback($this->previous, $args);
}

return $this->executeCallback($callback, [$args, $result]);
};

if (4 === $GLOBALS['TL_DCA'][$table]['list']['sorting']['mode']) {
$this->previous = $GLOBALS['TL_DCA'][$table]['list']['sorting']['child_record_callback'];
$GLOBALS['TL_DCA'][$table]['list']['sorting']['child_record_callback'] = $chain;
} else {
$this->previous = $GLOBALS['TL_DCA'][$table]['list']['label']['label_callback'];
$GLOBALS['TL_DCA'][$table]['list']['label']['label_callback'] = $chain;
}
}

/**
* @param \Closure|array $callback
* @param array $args
*
* @return mixed
*/
private function executeCallback($callback, array $args)
{
// Support Contao's getInstance() method when callback is an array
if (is_array($callback)) {
return call_user_func_array(
[System::importStatic($callback[0]), $callback[1]],
$args
);
}

return call_user_func_array($callback, $args);
}

/**
* Creates and registers new LabelCallback.
*
* @param string $table
* @param callable $callback
*
* @return static
*/
public static function createAndRegister($table, callable $callback)
{
$instance = new static();
$instance->register($table, $callback);

return $instance;
}
}

1 comment on commit 9cd34d5

@Aybee
Copy link

@Aybee Aybee commented on 9cd34d5 Nov 24, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you. I will try that at next opportunity.

Please sign in to comment.