%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/content/widgets/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/content/widgets/WallEntry.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\content\widgets;
use humhub\modules\content\widgets\stream\StreamEntryWidget;
use humhub\modules\content\widgets\stream\StreamEntryOptions;
use humhub\modules\dashboard\controllers\DashboardController;
use humhub\modules\stream\actions\Stream;
use humhub\modules\ui\menu\DropdownDivider;
use humhub\modules\ui\menu\MenuEntry;
use Yii;
use humhub\modules\user\controllers\ProfileController;
use humhub\components\Widget;
use humhub\modules\space\models\Space;
use humhub\modules\user\models\User;
use humhub\modules\content\components\ContentContainerController;
/**
* WallEntry is responsible to show a content inside a stream/wall.
*
* @see \humhub\modules\content\components\ContentActiveRecord
* @since 0.20
* @author luke
* @deprecated since 1.7 use WallStreamEntryWidget
*/
class WallEntry extends Widget
{
/**
* Edit form is loaded to the wallentry itself.
*/
const EDIT_MODE_INLINE = 'inline';
/**
* Opens the edit page in a new window.
*/
const EDIT_MODE_NEW_WINDOW = 'new_window';
/**
* Edit form is loaded into a modal.
*/
const EDIT_MODE_MODAL = 'modal';
/**
* The content object
*
* @var \humhub\modules\content\components\ContentActiveRecord
*/
public $contentObject;
/**
* Indicates the post was just edited
*
* @var boolean
*/
public $justEdited = false;
/**
* Route to edit the content
*
* @var string
*/
public $editRoute = "";
/**
* Defines the way the edit of this wallentry is displayed.
*
* @var string
*/
public $editMode = self::EDIT_MODE_INLINE;
/**
* The wall entry layout to use
*
* @var string
* @deprecated since 1.4 use [[widgetLayout]] instead
*/
public $wallEntryLayout = "@humhub/modules/content/widgets/views/wallEntry.php";
/**
* @var string Defines the wallEntry Javascript implementation.
*/
public $jsWidget = "stream.StreamEntry";
/**
* Can be used to overwrite default options of WallEntryAddon Widgets as for example ShowFiles etc.
*
* e.g. in order to disable file preview of files:
*
* ```php
* public $addonOptions = [
* ShowFiles::class => [
* 'renderPreview' => false
* ]
*];
* ```
* @var array
*/
public $addonOptions = [];
/**
* Can be used to prevent the rendering of certain WallEntryControl links
*
* e.g. in order to prevent the ArchiveLink to be rendered:
*
* public $controlsOptions = [
* 'prevent' => [
* ArchiveLink::class
* ]
* ];
*
* @var array
*/
public $controlsOptions = [];
/**
* @deprecated since 1.2 use $addonOptions of ShowFiles Widget or disable 'show_in_stream' file flag.
* @var boolean show files widget containing a list of all assigned files
*/
public $showFiles = true;
/**
* @var boolean if set to false, the WallEntryControls won't be rendered
*/
public $renderControls = true;
/**
* @var boolean if set to false, the WallEntryAddons won't be rendered (like/comments/etc)
*/
public $renderAddons = true;
/**
* @inheritdoc
*/
public function init()
{
// Compatibility layer
parent::init();
if (empty($this->widgetLayout)) {
$this->widgetLayout = $this->wallEntryLayout;
}
}
/**
* Returns the edit url to edit the content (if supported)
*
* @return string url
*/
public function getEditUrl()
{
if (empty($this->editRoute) || !$this->contentObject->content || !$this->contentObject->content->container) {
return;
}
// Don't show edit link, when content container is space and archived
if ($this->contentObject->content->container instanceof Space && $this->contentObject->content->container->status == Space::STATUS_ARCHIVED) {
return "";
}
$params = ['id' => $this->contentObject->id];
if (Yii::$app->controller instanceof DashboardController) {
$params['from'] = StreamEntryOptions::VIEW_CONTEXT_DASHBOARD;
}
return $this->contentObject->content->container->createUrl($this->editRoute, $params);
}
/**
* Returns an array of context menu items either in form of a single array:
*
* ['label' => 'mylabel', 'icon' => 'fa-myicon', 'data-action-click' => 'myaction', ...]
*
* or as widget type definition:
*
* [MyWidget::class, [...], [...]]
*
* If an [[editRoute]] is set this function will include an edit button.
* The edit logic can be changed by changing the [[editMode]].
*
* @return array
* @since 1.2
*/
public function getContextMenu()
{
$result = [];
if (!empty($this->getEditUrl())) {
$this->addControl($result, [EditLink::class, ['model' => $this->contentObject, 'mode' => $this->editMode, 'url' => $this->getEditUrl()], ['sortOrder' => 100]]);
}
$this->addControl($result, [PermaLink::class, ['content' => $this->contentObject], ['sortOrder' => 200]]);
$this->addControl($result, [DeleteLink::class, ['content' => $this->contentObject], ['sortOrder' => 300]]);
$this->addControl($result, new DropdownDivider(['sortOrder' => 350]));
$this->addControl($result, [VisibilityLink::class, ['contentRecord' => $this->contentObject], ['sortOrder' => 400]]);
$this->addControl($result, [NotificationSwitchLink::class, ['content' => $this->contentObject], ['sortOrder' => 500]]);
$this->addControl($result, [PinLink::class, ['content' => $this->contentObject], ['sortOrder' => 600]]);
$this->addControl($result, [MoveContentLink::class, ['model' => $this->contentObject], ['sortOrder' => 700]]);
$this->addControl($result, [ArchiveLink::class, ['content' => $this->contentObject], ['sortOrder' => 800]]);
if (isset($this->controlsOptions['add'])) {
foreach ($this->controlsOptions['add'] as $linkOptions) {
$this->addControl($result, $linkOptions);
}
}
return $result;
}
protected function addControl(&$result, $entry)
{
$entryClass = null;
if ($entry instanceof MenuEntry) {
$entryClass = get_class($entry);
} elseif (is_array($entry) && isset($entry[0])) {
$entryClass = $entry[0];
}
if (isset($this->controlsOptions['prevent']) && $entryClass && in_array($entryClass, $this->controlsOptions['prevent'])) {
return;
}
$result[] = $entry;
}
/**
* Renders the wall entry output
*
* Note this function does not call
*
* @return string the output
* @throws \Exception
* @deprecated since 1.4
*/
public function renderWallEntry()
{
ob_start();
ob_implicit_flush(false);
try {
$out = '';
if ($this->beforeRun()) {
$result = $this->render($this->widgetLayout, $this->getLayoutViewParams());
$out = $this->afterRun($result);
}
} catch (\Exception $e) {
ob_end_clean();
throw $e;
}
return ob_get_clean() . $out;
}
/**
* @inheritdoc
*/
public function getLayoutViewParams()
{
return $this->getWallEntryViewParams();
}
/**
* Returns the view paramters for the wall entry layout
*
* @return array the view parameter array
* @deprecated since 1.4 use [[getLayoutViewParams()]] instead
*/
public function getWallEntryViewParams()
{
$showContentContainer = false;
$content = $this->contentObject->content;
$user = $content->createdBy;
$container = $content->container;
// In case of e.g. dashboard, show contentContainer of this content
if (isset($this->controlsOptions['showContentContainer']) && !($container instanceof User && $container->id == $user->id)) {
$showContentContainer = $this->controlsOptions['showContentContainer'];
} elseif (!Yii::$app->controller instanceof ContentContainerController && !($container instanceof User && $container->id == $user->id)) {
$showContentContainer = true;
} elseif (Yii::$app->controller instanceof ProfileController) {
if ($container instanceof User && $container->id == Yii::$app->controller->user->id) {
$showContentContainer = false;
} else {
$showContentContainer = true;
}
}
$createdAt = $content->created_at;
$updatedAt = null;
// Note this won't work if updated_at is of type yii/db/Expression (NOW()) in this case the content has to be refreshed manually.
if ($createdAt !== $content->updated_at && !empty($content->updated_at) && is_string($content->updated_at)) {
$updatedAt = $content->updated_at;
}
$addonOptions = ['object' => $this->contentObject, 'widgetOptions' => $this->addonOptions];
return [
'content' => $this->run(),
'object' => $this->contentObject,
'wallEntryWidget' => $this,
'showContentContainer' => $showContentContainer,
'user' => $user,
'renderControls' => $this->renderControls,
'renderAddons' => $this->renderAddons,
'addonOptions' => $addonOptions,
'container' => $container,
'createdAt' => $createdAt,
'updatedAt' => $updatedAt
];
}
}