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

413 lines
15 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)
*/
class JXBlogCommentAjaxModuleFrontController extends ModuleFrontController
{
public $ssl = true;
/**
* @see FrontController::initContent()
*/
public function initContent()
{
$action = Tools::getValue('action');
$action = str_replace(' ', '', ucwords(str_replace('-', ' ', $action)));
if (!empty($action) && method_exists($this, 'ajax'.$action)) {
$this->{'ajax'.$action}();
} else {
if (isset($_FILES) && $_FILES) {
$this->uploadFile($_FILES['file']);
}
die(json_encode(array('error' => 'method doesn\'t exist')));
}
}
/**
* Upload attachment file
*
* @param $file
*/
private function uploadFile($file)
{
$jxblogcomment = new Jxblogcomment();
if (isset($file['name']) && isset($file['tmp_name']) && !Tools::isEmpty($file['tmp_name'])) {
if ($errors = ImageManager::validateUpload($file, Tools::getMaxUploadSize())) {
die(json_encode(array('status' => false, 'response' => $errors)));
} else {
$fileFormat = explode('.', $file['name']);
$newName = Tools::passwdGen(15).'.'.$fileFormat[1];
if (!move_uploaded_file($file['tmp_name'], $jxblogcomment->attachmentsPath.$newName)) {
die(json_encode(
array(
'status' => false,
'response' => $this->trans(
'Error while uploading image.',
array($file['error']),
'Modules.Jxblogcomment.Admin'
)
)
));
}
die(json_encode(
array(
'status' => true,
'response' => $this->trans(
'The image is uploaded.',
array($file['error']),
'Modules.Jxblogcomment.Admin'
),
'path' => $jxblogcomment->attachmentsLink,
'name' => $newName,
'type' => $file['type']
)
));
}
}
}
/**
* Add comment
*
* @throws PrestaShopException
*/
public function ajaxAddComment()
{
$content = Tools::getValue('content');
$parent = Tools::getValue('parent');
if (Tools::isEmpty($content) || !Validate::isString($content)) {
die(
json_encode(
array(
'status' => false,
'response' => $this->trans(
'The content of the comment is invalid',
array(),
'Modules.Jxblogcomment.Admin'
)
)
)
);
}
$comment = new JXBlogComments();
$comment->id_post = Tools::getValue('id_jxblog_post');
$comment->id_parent = isset($parent) ? (int)$parent : 0;
$comment->id_customer = $this->context->customer->id ? $this->context->customer->id : 0;
$comment->id_guest = !$this->context->customer->id ? $this->context->customer->id_guest : 0;
// check if pings are allowed and decode them if yes
if ($this->module->checkAccess('JXBLOGCOMMENT_PINGING') && $pings = $this->getPings($content)) {
if ($pings['ids']) {
$content = $pings['content'];
$comment->pings = implode(',', $pings['ids']);
}
}
$comment->content = $content;
$comment->upvote_count = 0;
$comment->date_update = date('Y-m-d H:i:s');
$comment->is_new = true;
$comment->active = true;
// if comment require a moderation set a status false
if ($moderation = $this->module->checkPermission('JXBLOGCOMMENT_MODERATION')) {
$comment->active = false;
}
if (!$comment->add()) {
ob_end_clean();
header('Content-Type: application/json');
die(
json_encode(
array(
'status' => false,
'response' => $this->trans(
'An error occurred during the comment saving',
array(),
'Modules.Jxblogcomment.Admin'
)
)
)
);
}
ob_end_clean();
header('Content-Type: application/json');
if ($moderation) {
die(
json_encode(
array(
'status' => true,
'response' => $this->trans('The comment successfully added and will display after moderation', array(), 'Modules.Jxblogcomment.Admin'),
'moderation' => $moderation,
'id_comment' => $comment->id
)
)
);
}
die(
json_encode(
array(
'status' => true,
'response' => $this->trans('The comment successfully added', array(), 'Modules.Jxblogcomment.Admin'),
'moderation' => $moderation,
'id_comment' => $comment->id
)
)
);
}
/**
* Update a comment
*
* @throws PrestaShopException
*/
public function ajaxUpdateComment()
{
$content = Tools::getValue('content');
if (!$id_comment = Tools::getValue('id_comment')) {
ob_end_clean();
header('Content-Type: application/json');
die(
json_encode(
array(
'status' => false,
'response' => $this->trans('Cannot find the comment', array(), 'Modules.Jxblogcomment.Admin')
)
)
);
}
if (Tools::isEmpty($content) || !Validate::isString($content)) {
ob_end_clean();
header('Content-Type: application/json');
die(
json_encode(
array(
'status' => false,
'response' => $this->trans('The content of the comment is invalid', array(), 'Modules.Jxblogcomment.Admin')
)
)
);
}
$comment = new JXBlogComments((int)$id_comment);
$comment->content = $content;
$comment->date_update = date('y-m-d H:i:s');
// check if an edited comment require a moderation if yes set if disabled
if ($moderation = $this->module->checkPermission('JXBLOGCOMMENT_EDITING_CONFIRMATION')) {
$comment->active = false;
}
if (!$comment->update()) {
ob_end_clean();
header('Content-Type: application/json');
die(
json_encode(
array(
'status' => false,
'response' => $this->trans('An error occurred during the comment updating', array(), 'Modules.Jxblogcomment.Admin')
)
)
);
}
ob_end_clean();
header('Content-Type: application/json');
if ($moderation) {
die(
json_encode(
array(
'status' => true,
'response' => $this->trans('The comment successfully updated and will display after moderation', array(), 'Modules.Jxblogcomment.Admin'),
'moderation' => $moderation
)
)
);
}
die(
json_encode(
array(
'status' => true,
'response' => $this->trans('The comment data successfully updated', array(), 'Modules.Jxblogcomment.Admin'),
'moderation' => $moderation
)
)
);
}
/**
* Vote a comment
*/
public function ajaxVoteComment()
{
if (!$id_comment = Tools::getValue('id_comment')) {
ob_end_clean();
header('Content-Type: application/json');
die(
json_encode(
array(
'status' => false,
'response' => $this->trans('Cannot find the comment', array(), 'Modules.Jxblogcomment.Admin')
)
)
);
}
$comment = new JXBlogComments((int)$id_comment);
$guest = $this->context->customer->isLogged();
$id_user = !$guest ? $this->context->customer->id_guest : $this->context->customer->id;
$result = (int)$comment->updateCommentVotes($id_user, !$guest);
if ($result === 0 || $result) {
ob_end_clean();
header('Content-Type: application/json');
die(json_encode(array('status' => true, 'result' => (int)$result)));
}
}
/**
* Delete a comment
*/
public function ajaxDeleteComment()
{
$id_comment = Tools::getValue('id_comment');
if (!$id_comment) {
die(
json_encode(
array(
'status' => false,
'response' => $this->trans('Cannot find the comment', array(), 'Modules.Jxblogcomment.Admin')
)
)
);
}
$jxblogcomment = new Jxblogcomment();
$comment = new JXBlogComments((int)$id_comment);
if ($comment->image_name && file_exists($jxblogcomment->attachmentsPath.$comment->image_name)) {
unlink($jxblogcomment->attachmentsPath.$comment->image_name);
}
if (!$comment->delete()) {
ob_end_clean();
header('Content-Type: application/json');
die(
json_encode(
array(
'status' => false,
'response' => $this->trans('An error occurred during the comment deleting', array(), 'Modules.Jxblogcomment.Admin')
)
)
);
}
ob_end_clean();
header('Content-Type: application/json');
die(
json_encode(
array(
'status' => true,
'response' => $this->trans('The comment data successfully updated', array(), 'Modules.Jxblogcomment.Admin')
)
)
);
}
/**
* Add an information about attached file and form a comment
*
* @throws PrestaShopException
*/
public function ajaxUploadAttachment()
{
$parent = Tools::getValue('parent');
$attachment = new JXBlogComments();
$attachment->id_post = Tools::getValue('id_jxblog_post');
$attachment->id_parent = isset($parent) ? (int)$parent : 0;
$attachment->id_customer = $this->context->customer->id ? $this->context->customer->id : 0;
$attachment->id_guest = !$this->context->customer->id ? $this->context->customer->id_guest : 0;
$attachment->content = '';
$attachment->upvote_count = 0;
$attachment->date_update = date('Y-m-d H:i:s');
$attachment->is_new = true;
$attachment->active = true;
$attachment->image_name = Tools::getValue('name');
$attachment->image_type = Tools::getValue('type');
// check if comment require a moderation
if ($moderation = $this->module->checkPermission('JXBLOGCOMMENT_MODERATION')) {
$attachment->active = false;
}
if (!$attachment->add()) {
ob_end_clean();
header('Content-Type: application/json');
die(
json_encode(
array(
'status' => false,
'response' => $this->trans('An error occurred during the attachment saving', array(), 'Modules.Jxblogcomment.Admin')
)
)
);
}
ob_end_clean();
header('Content-Type: application/json');
if ($moderation) {
die(
json_encode(
array(
'status' => true,
'response' => $this->trans('The attachment successfully added and will display after moderation', array(), 'Modules.Jxblogcomment.Admin'),
'moderation' => $moderation
)
)
);
}
die(
json_encode(
array(
'status' => true,
'response' => $this->trans('The attachment successfully added', array(), 'Modules.Jxblogcomment.Admin'),
'moderation' => $moderation
)
)
);
}
/**
* Parse a comment code to find pings
* @param $content
*
* @return array
*/
private function getPings($content)
{
$result = array();
$ids = array();
$content = explode(' ', $content);
foreach ($content as $entry) {
if (strpos($entry, '@') == 0 && Validate::isInt($id = str_replace('@', '', $entry))) {
if (Validate::isLoadedObject($customer = new Customer($id))) {
array_push($ids, $id);
$result[] = '@'.$customer->firstname.' '.$customer->lastname;
} else if (Validate::isLoadedObject($employee = new Employee(($id - (200*200))))) {
array_push($ids, $id);
$result[] = '@'.$this->trans('Administrator', array(), 'Modules.Jxblogcomment.Admin');
} else {
array_push($ids, $id);
$result[] = '@'.$this->trans('Guest ('.($id - (100*100)).')', array(), 'Modules.Jxblogcomment.Admin');
}
} else {
$result[] = $entry;
}
}
return array('ids' => $ids, 'content' => implode(' ', $result));
}
}