Files
wyczarujprezent.pl/modules/jxblogcomment/jxblogcomment.php
2024-10-28 22:14:22 +01:00

626 lines
24 KiB
PHP

<?php
/**
* 2017 Zemez
*
* JX Blog Comment
*
* NOTICE OF LICENSE
*
* This source file is subject to the General Public License (GPL 2.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/GPL-2.0
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade the module to newer
* versions in the future.
*
* @author Zemez (Alexander Grosul)
* @copyright 2017 Zemez
* @license http://opensource.org/licenses/GPL-2.0 General Public License (GPL 2.0)
*/
if (!defined('_PS_VERSION_')) {
exit;
}
include_once(_PS_MODULE_DIR_.'jxblogcomment/src/JXBlogCommentRepository.php');
include_once(_PS_MODULE_DIR_.'jxblogcomment/classes/JXBlogComments.php');
use PrestaShop\PrestaShop\Core\Addon\Module\ModuleManagerBuilder;
class Jxblogcomment extends Module
{
protected $config_form = false;
public $repository;
public $mainTab = array();
public $tabs = array();
public $languages;
public $tabRepository;
public $authors = array();
public $attachmentsPath;
public $attachmentsLink;
public function __construct()
{
$this->name = 'jxblogcomment';
$this->tab = 'content_management';
$this->version = '0.1.3';
$this->author = 'Zemez';
$this->need_instance = 1;
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('JX Blog Comment');
$this->description = $this->l('The module to improve Jx Blog with powerful comments system.');
$this->confirmUninstall = $this->l(
'Are you sure that you want to delete the module? All related data will be deleted forever!'
);
$this->ps_versions_compliancy = array('min' => '1.7', 'max' => _PS_VERSION_);
$this->languages = Language::getLanguages(true);
$this->defaultLanguage = new Language(Configuration::get('PS_LANG_DEFAULT'));
$this->repository = new JXBlogCommentRepository(
Db::getInstance(),
$this->context->shop
);
$this->attachmentsPath = $this->local_path.'attachments/';
$this->attachmentsLink = $this->_path.'attachments/';
$this->mainTab = array(
'class_name' => 'AdminJXBlog',
'module' => $this->name,
'name' => 'JX Blog'
);
$this->tabs = array(
array(
'class_name' => 'AdminJXBlogComments',
'module' => $this->name,
'name' => 'Comments'
)
);
$this->settingsTab = array(
'class_name' => 'AdminJXBlogSettings',
'module' => $this->name,
'name' => 'Settings'
);
$this->settingsSubTabs = array(
array(
'class_name' => 'AdminJXBlogCommentsSettings',
'module' => $this->name,
'name' => 'Comments settings'
)
);
}
public function install()
{
$moduleManagerBuilder = ModuleManagerBuilder::getInstance();
$moduleManager = $moduleManagerBuilder->build();
if (!$moduleManager->isInstalled('jxblog') || !$moduleManager->isEnabled('jxblog')) {
/*TODO# add an error if JX Blog does'nt installed*/
return false;
}
return parent::install() &&
$this->registerHook('registerGDPRConsent') &&
$this->registerHook('actionDeleteGDPRCustomer') &&
$this->registerHook('actionExportGDPRData') &&
$this->registerHook('actionObjectShopAddAfter') &&
$this->registerHook('displayJxblogImageManagerExtra') &&
$this->registerHook('actionJxblogPostAfterDelete') &&
$this->registerHook('actionUpdateJxblogImages') &&
$this->registerHook('header') &&
$this->registerHook('displayJXBlogPostFooter') &&
$this->repository->createTables() &&
$this->setSettings() &&
$this->addTabs();
}
/**
* Set default module settings after installation or adding new store
*
* @return bool
*/
public function setSettings()
{
Configuration::updateValue('JXBLOGCOMMENT_READ_PERMISSION', 1);
Configuration::updateValue('JXBLOGCOMMENT_WRITE_PERMISSION', 2);
Configuration::updateValue('JXBLOGCOMMENT_MODERATION', 1);
Configuration::updateValue('JXBLOGCOMMENT_REPLYING', 2);
Configuration::updateValue('JXBLOGCOMMENT_UPVOTING', 2);
Configuration::updateValue('JXBLOGCOMMENT_EDITING', 2);
Configuration::updateValue('JXBLOGCOMMENT_EDITING_CONFIRMATION', 1);
Configuration::updateValue('JXBLOGCOMMENT_DELETING', 2);
Configuration::updateValue('JXBLOGCOMMENT_DELETING_REPLIED', 0);
Configuration::updateValue('JXBLOGCOMMENT_ATTACHMENTS', 2);
Configuration::updateValue('JXBLOGCOMMENT_HASHTAGS', 2);
Configuration::updateValue('JXBLOGCOMMENT_PINGING', 2);
Configuration::updateValue('JXBLOGCOMMENT_NAVIGATION', 1);
Configuration::updateValue('JXBLOGCOMMENT_ON_ENTER', 0);
return true;
}
/**
* Set default settings after new store creation
*
* @param $params
*/
public function hookActionObjectShopAddAfter($params)
{
$this->setSettings();
}
public function uninstall()
{
return $this->repository->dropTables() &&
$this->removeTabs() &&
$this->removeSettings() &&
$this->removeAttachments() &&
parent::uninstall();
}
/**
* Remove all module settings after module deletion
*
* @return bool
*/
public function removeSettings()
{
Configuration::deleteByName('JXBLOGCOMMENT_READ_PERMISSION');
Configuration::deleteByName('JXBLOGCOMMENT_WRITE_PERMISSION');
Configuration::deleteByName('JXBLOGCOMMENT_MODERATION');
Configuration::deleteByName('JXBLOGCOMMENT_REPLYING');
Configuration::deleteByName('JXBLOGCOMMENT_UPVOTING');
Configuration::deleteByName('JXBLOGCOMMENT_EDITING');
Configuration::deleteByName('JXBLOGCOMMENT_EDITING_CONFIRMATION');
Configuration::deleteByName('JXBLOGCOMMENT_DELETING');
Configuration::deleteByName('JXBLOGCOMMENT_DELETING_REPLIED');
Configuration::deleteByName('JXBLOGCOMMENT_ATTACHMENTS');
Configuration::deleteByName('JXBLOGCOMMENT_HASHTAGS');
Configuration::deleteByName('JXBLOGCOMMENT_PINGING');
Configuration::deleteByName('JXBLOGCOMMENT_NAVIGATION');
Configuration::deleteByName('JXBLOGCOMMENT_ON_ENTERs');
return true;
}
/**
* Clear attachments folder before module uninstalling
*
* @return bool
*/
public function removeAttachments()
{
$attachments = array_merge(
Tools::scandir($this->attachmentsPath, 'jpg'),
Tools::scandir($this->attachmentsPath, 'jpeg'),
Tools::scandir($this->attachmentsPath, 'gif'),
Tools::scandir($this->attachmentsPath, 'png')
);
if (count($attachments)) {
foreach ($attachments as $attachment) {
unlink($this->attachmentsPath.$attachment);
}
}
return true;
}
/**
* Add related to module tabs to the main navigation menu
*
* @return bool
*/
protected function addTabs()
{
$tabId = TabCore::getIdFromClassName($this->mainTab['class_name']);
foreach ($this->tabs as $item) {
$this->addTab($item, $tabId);
}
$idSettingsTab = TabCore::getIdFromClassName($this->settingsTab['class_name']);
if (!$idSettingsTab) {
$idSettingsTab = $this->addTab($this->settingsTab, $tabId);
}
foreach ($this->settingsSubTabs as $newSubTab) {
$this->addTab($newSubTab, $idSettingsTab);
}
return true;
}
public function addTab($tab, $parent)
{
$t = new Tab();
$t->class_name = $tab['class_name'];
$t->id_parent = $parent;
$t->module = $tab['module'];
foreach ($this->languages as $lang) {
$t->name[$lang['id_lang']] = $this->l($tab['name']);
}
if (!$t->save()) {
return false;
}
return $t->id;
}
/**
* Add related to module tabs to the main navigation menu
*
* @return bool
*/
protected function removeTabs()
{
foreach (array_merge($this->tabs, $this->settingsSubTabs) as $t) {
if ($t) {
$t = new Tab(TabCore::getIdFromClassName($t['class_name']));
if (!$t->delete()) {
return false;
}
}
}
return true;
}
/**
* Return message if attempt to menage in multi-store mode
*
* @return bool|string
*/
public function getWarningMultishop()
{
if (Shop::getContext() == Shop::CONTEXT_GROUP || Shop::getContext() == Shop::CONTEXT_ALL) {
return $this->displayError(
$this->l('You cannot manage it from "All Shops" or "Group Shop" context, select the store you want to edit')
);
} else {
return false;
}
}
/**
* Adapt comments array for comments plugin
*
* @param $rawArray
*
* @return array
*/
public function prepareCommentsArray($rawArray)
{
$result = array();
if (!$rawArray) {
return array();
}
// an array of disabled items and all their children
$disabledArray = array();
foreach ($rawArray as $key => $comment) {
// add item to disabled if it isn't active
if (!$comment['active']) {
array_push($disabledArray, $comment['id_jxblog_comment']);
continue;
}
// check if the item's parent is not in the disabled array.
//If so, add this item to array as well because all its children also must be disabled
if (in_array($comment['id_parent'], $disabledArray)) {
array_push($disabledArray, $comment['id_jxblog_comment']);
continue;
}
$result[$key]['id'] = $comment['id_jxblog_comment'];
$result[$key]['parent'] = isset($comment['id_parent']) && $comment['id_parent'] ? $comment['id_parent'] : null;
$result[$key]['created'] = $comment['date_add'];
$result[$key]['upvote_count'] = $comment['upvote_count'];
$result[$key]['profile_picture_url'] = $this->getUserIcon(false);
// check if a comment has being updated
if ($comment['date_update'] && $comment['date_update'] != '0000-00-00 00:00:00') {
$result[$key]['modified'] = $comment['date_update'];
}
$result[$key]['content'] = $comment['content'];
if ($comment['image_name'] && $comment['image_type']) {
$result[$key]['file_url'] = $this->attachmentsLink.$comment['image_name'];
$result[$key]['file_mime_type'] = $comment['image_type'];
}
$result[$key]['created_by_current_user'] = false;
if ($comment['id_customer']) {
$result[$key]['creator'] = $comment['id_customer'];
$customer = new Customer($comment['id_customer']);
if (!Validate::isLoadedObject($customer)) {
$result[$key]['fullname'] = $this->l('Inactive customer');
} else {
$result[$key]['fullname'] = $customer->firstname.' '.$customer->lastname;
// get this author to the authors list
$this->addAuthorToList($customer->id, $result[$key]['fullname'], $customer->email, $this->getUserIcon(false, $customer->id));
if ($customer->id == $this->context->customer->id) {
$result[$key]['created_by_current_user'] = true;
}
$result[$key]['profile_picture_url'] = $this->getUserIcon(false, $customer->id);
}
} else if ($comment['id_guest']) {
$result[$key]['creator'] = (100*100)+$comment['id_guest'];
if ($this->context->customer->id_guest == $comment['id_guest']) {
$result[$key]['fullname'] = $this->l('You');
$result[$key]['created_by_current_user'] = true;
} else {
$result[$key]['fullname'] = $this->l('Guest ('.$comment['id_guest'].')');
$this->addAuthorToList($result[$key]['creator'], $result[$key]['fullname'], '', $this->getUserIcon(false));
}
} else if ($comment['id_admin']) {
$result[$key]['creator'] = (200*200)+$comment['id_admin'];
$result[$key]['fullname'] = $this->l('Administrator');
$this->addAuthorToList($result[$key]['creator'], $result[$key]['fullname'], '', $this->getUserIcon(true));
$result[$key]['profile_picture_url'] = $this->getUserIcon(true);
}
$result[$key]['is_new'] = (bool)$comment['is_new'];
if ($comment['pings']) {
$result[$key]['pings'] = explode(',', $comment['pings']);
}
}
return $result;
}
public function addAuthorToList($id_author, $fullName, $email, $avatar = '')
{
if (!$email) {
$email = '';
}
$this->authors[] = array(
'id' => $id_author,
'fullname' => $fullName,
'email' => $email,
'profile_picture_url' => $avatar
);
}
public function hookActionExportGDPRData($customer)
{
if (!Tools::isEmpty($customer['email']) && Validate::isEmail($customer['email'])) {
$user = Customer::getCustomersByEmail($customer['email']);
if ($customerComments = JXBlogComments::getAllUserComments($user[0]['id_customer'], $this->context->language->id)) {
if ($customerComments) {
return json_encode($customerComments);
}
}
return json_encode($this->displayName.$this->l(' module doesn\'t contain any information about you or it is unable to export it using email.'));
}
}
public function hookActionDeleteGDPRCustomer($customer)
{
if (!empty($customer['email']) && Validate::isEmail($customer['email'])) {
if ($user = Customer::getCustomersByEmail($customer['email'])) {
return json_encode(JXBlogComments::removeEntriesByCustomerId($user[0]['id_customer']));
}
return json_encode($this->displayName.$this->l(' module! An error occurred during customer data removing'));
}
}
public function hookHeader()
{
if (isset($this->context->controller->pagename) && $this->context->controller->pagename == 'jxblogpost') {
Media::addJsDef(
array(
'jxCurrentUserIcon' => $this->getUserIcon(false),
'jxTextareaPlaceholderText' => $this->l('Add a comment'),
'jxNewestText' => $this->l('New'),
'jxOldestText' => $this->l('Old'),
'jxPopularText' => $this->l('Popular'),
'jxAttachmentsText' => $this->l('Attachments'),
'jxSendText' => $this->l('Send'),
'jxReplyText' => $this->l('Reply'),
'jxEditText' => $this->l('Edit'),
'jxEditedText' => $this->l('edited'),
'jxYouText' => $this->l('You'),
'jxSaveText' => $this->l('Save'),
'jxDeleteText' => $this->l('Delete'),
'jxViewAllRepliesText' => $this->l('Show all replies (__replyCount__)'),
'jxHideRepliesText' => $this->l('Hide'),
'jxNoCommentsText' => $this->l('No comments'),
'jxNoAttachmentsText' => $this->l('No attachments'),
'jxAttachmentDropText' => $this->l('Drop here'),
'jxReadOnly' => $this->checkPermission('JXBLOGCOMMENT_WRITE_PERMISSION'),
'jxModeration' => $this->checkAccess('JXBLOGCOMMENT_MODERATION'),
'jxReplying' => $this->checkAccess('JXBLOGCOMMENT_REPLYING'),
'jxVoting' => $this->checkAccess('JXBLOGCOMMENT_UPVOTING'),
'jxEditing' => $this->checkAccess('JXBLOGCOMMENT_EDITING'),
'jxEditingConfirmation' => $this->checkAccess('JXBLOGCOMMENT_EDITING_CONFIRMATION'),
'jxDeleting' => $this->checkAccess('JXBLOGCOMMENT_DELETING'),
'jxDeletingReplied' => $this->checkAccess('JXBLOGCOMMENT_DELETING_REPLIED'),
'jxAttachments' => $this->checkAccess('JXBLOGCOMMENT_ATTACHMENTS'),
'jxHashtags' => $this->checkAccess('JXBLOGCOMMENT_HASHTAGS'),
'jxPinging' => $this->checkAccess('JXBLOGCOMMENT_PINGING'),
'jxNavigation' => $this->checkAccess('JXBLOGCOMMENT_NAVIGATION'),
'jxPostOnEnter' => (bool)Configuration::get('JXBLOGCOMMENT_ON_ENTER'),
'ajaxPath' => $this->context->link->getModuleLink('jxblogcomment', 'ajax', array(), true),
'commentsArray' => $this->prepareCommentsArray(JXBlogComments::getAllComments(Tools::getValue('id_jxblog_post'))),
'usersArray' => $this->authors
)
);
$this->context->controller->addJS($this->_path.'/views/js/jquery.textcomplete.min.js');
$this->context->controller->addJS($this->_path.'/views/js/jquery-comments-modified.js');
$this->context->controller->addJS($this->_path.'/views/js/jxblogcomment.js');
$this->context->controller->addCss($this->_path.'/views/css/jquery-comments.css');
$this->context->controller->addCSS($this->_path.'/views/css/jxblogcomment.css');
}
}
public function checkPermission($param)
{
$user = $this->context->customer->isLogged();
$readPermission = (int)Configuration::get($param);
if ($readPermission === 0) {
return true;
}
if ($readPermission === 1) {
return false;
}
if ($user && $readPermission === 2) {
return false;
}
return true;
}
public function checkAccess($param)
{
$user = $this->context->customer->isLogged();
$varPermission = (int)Configuration::get($param);
if ($varPermission == 0) {
return false;
}
if ($varPermission == 1) {
return true;
}
if ($varPermission == 2 && $user) {
return true;
}
return false;
}
public function getUserIcon($is_admin, $id_user = false)
{
if ($is_admin) {
return $this->_path.'images/admin-icon.jpg';
}
$logged = $this->context->customer->isLogged();
if (!$id_user && !$logged) {
return $this->_path.'images/guest-icon.jpg';
}
return $this->_path.'images/user-icon.jpg';
}
/**
* Upload user ions(used by the main module)
* @param $name name of new file
* @param $file file data
*
* @return bool|mixed|string
*/
public function uploadIcon($name, $file)
{
if (isset($file['name']) && isset($file['tmp_name']) && !Tools::isEmpty($file['tmp_name'])) {
if ($error = ImageManager::validateUpload($file, Tools::getMaxUploadSize())) {
return $error;
} else {
$path = $this->local_path.'images/';
if (!($tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS')) || !move_uploaded_file($file['tmp_name'], $tmp_name)) {
return Context::getContext()->getTranslator()->l('Error while uploading image.', array($file['error']), 'Modules.Jxblogcomment.Admin');
}
if (!ImageManager::resize($tmp_name, $path.'/'.$name.'.jpg', 100, 100, 'png')) {
return Context::getContext()->getTranslator()->l('Cannot resize an image.', array($file['error']), 'Modules.Jxblogcomment.Admin');
}
unlink($tmp_name);
}
}
return false;
}
/**
* Display icon fields in the Image Manager Page
* The fields will complement the main images' form so they must be in format such as below
*
* @return array
*/
public function hookDisplayJxblogImageManagerExtra()
{
$fields = array();
$imageAdminIcon = '';
$imageUserIcon = '';
$imageGuestIcon = '';
if (file_exists(str_replace('/modules/jxblog/', '/modules/jxblogcomment/', $this->local_path).'images/admin-icon.jpg')) {
$imageAdminIcon = '<img src="'.str_replace('/modules/jxblog/', '/modules/jxblogcomment/', $this->_path).'images/admin-icon.jpg'.'" alt="" />';
}
if (file_exists(str_replace('/modules/jxblog/', '/modules/jxblogcomment/', $this->local_path).'images/user-icon.jpg')) {
$imageUserIcon = '<img src="'.str_replace('/modules/jxblog/', '/modules/jxblogcomment/', $this->_path).'images/user-icon.jpg'.'" alt="" />';
}
if (file_exists(str_replace('/modules/jxblog/', '/modules/jxblogcomment/', $this->local_path).'images/guest-icon.jpg')) {
$imageGuestIcon = '<img src="'.str_replace('/modules/jxblog/', '/modules/jxblogcomment/', $this->_path).'images/guest-icon.jpg'.'" alt="" />';
}
$fields[] = array(
'label' => $this->l('Administrator icon'),
'desc' => $this->l('The icon which will be displayed in the comments'),
'type' => 'file',
'name' => 'admin_icon',
'image' => $imageAdminIcon
);
$fields[] = array(
'label' => $this->l('Registered users icon'),
'desc' => $this->l('The icon which will be displayed in the comments'),
'type' => 'file',
'name' => 'user_icon',
'image' => $imageUserIcon
);
$fields[] = array(
'label' => $this->l('Unregistered users icon'),
'desc' => $this->l('The icon which will be displayed in the comments'),
'type' => 'file',
'name' => 'guest_icon',
'image' => $imageGuestIcon
);
return $fields;
}
/**
* Upload user icons
* @param $params
*/
public function hookActionUpdateJxblogImages($params)
{
$errors = array();
if ($userIcon = $params['values']['admin_icon']) {
if ($error = $this->uploadIcon('admin-icon', $_FILES['admin_icon'])) {
$errors[] = $error;
}
}
if ($userIcon = $params['values']['user_icon']) {
if ($error = $this->uploadIcon('user-icon', $_FILES['user_icon'])) {
$errors[] = $error;
}
}
if ($guestIcon = $params['values']['guest_icon']) {
if ($error = $this->uploadIcon('guest-icon', $_FILES['guest_icon'])) {
$errors[] = $error;
}
}
}
public function hookActionJxblogPostAfterDelete($params)
{
$comment = new JXBlogComments();
$comments = $comment->getAllPostCommentsByID($params['id_jxblog_post']);
if ($comments) {
foreach ($comments as $item) {
$commentToDelete = new JXBlogComments($item['id_jxblog_comment']);
$commentToDelete->delete();
}
}
}
public function hookDisplayJXBlogPostFooter()
{
$this->context->smarty->assign('id_module', $this->id);
$this->context->smarty->assign('isLogged', $this->context->customer->isLogged());
$this->context->smarty->assign('readingDisabled', $this->checkPermission('JXBLOGCOMMENT_READ_PERMISSION'));
$this->context->smarty->assign('commentingDisabled', $this->checkPermission('JXBLOGCOMMENT_WRITE_PERMISSION'));
return $this->display($this->local_path, 'views/templates/hook/comments-loop.tpl');
}
}