public function submit($data, $media) { // some beginners' validation, while through validation will happen in the Comment model $validator = new Validator(); $validator->add('thread_num', _i('Thread Number'), [new Assert\NotBlank()])->add('name', _i('Name'), [new Assert\Length(['max' => 64])])->add('email', _i('Email'), [new Assert\Length(['max' => 64])])->add('title', _i('Title'), [new Assert\Length(['max' => 64])])->add('delpass', _i('Deletion pass'), [new Assert\Length(['min' => 3, 'max' => 32])]); // no empty posts without images if ($media === null) { $validator->add('comment', _i('Comment'), [new Assert\NotBlank(), new Assert\Length(['min' => 3])]); } // this is for redirecting, not for the database $limit = false; if (isset($data['last_limit'])) { $limit = intval($data['last_limit']); unset($data['last_limit']); } $validator->validate($data); if (!$validator->getViolations()->count()) { try { $data['poster_ip'] = Inet::ptod($this->getRequest()->getClientIp()); $bulk = new CommentBulk(); $bulk->import($data, $this->radix); $comment = new CommentInsert($this->getContext(), $bulk); $comment->insert($media, $data); } catch (\Foolz\Foolfuuka\Model\CommentSendingRequestCaptchaException $e) { if ($this->getRequest()->isXmlHttpRequest()) { return $this->response->setData(['captcha' => true]); } else { return $this->error(_i('Your message looked like spam. Make sure you have JavaScript enabled to display the reCAPTCHA to submit the comment.')); } } catch (\Foolz\Foolfuuka\Model\CommentSendingException $e) { if ($this->getRequest()->isXmlHttpRequest()) { return $this->response->setData(['error' => $e->getMessage()]); } else { return $this->error($e->getMessage()); } } } else { if ($this->getRequest()->isXmlHttpRequest()) { return $this->response->setData(['error' => $validator->getViolations()->getText()]); } else { return $this->error($validator->getViolations()->getHtml()); } } if ($this->request->isXmlHttpRequest()) { $latest_doc_id = $this->getPost('latest_doc_id'); if ($latest_doc_id && ctype_digit((string) $latest_doc_id)) { try { $board = Board::forge($this->getContext())->getThread($comment->comment->thread_num)->setRadix($this->radix)->setOptions(['type' => 'from_doc_id', 'latest_doc_id' => $latest_doc_id]); $comments = $board->getComments(); } catch (\Foolz\Foolfuuka\Model\BoardThreadNotFoundException $e) { return $this->error(_i('Thread not found.')); } catch (\Foolz\Foolfuuka\Model\BoardException $e) { return $this->error(_i('Unknown error.')); } $comment_obj = new Comment($this->getContext()); $comment_obj->setControllerMethod($limit ? 'last/' . $limit : 'thread'); $media_obj = new Media($this->getContext()); $m = null; foreach ($board->getCommentsUnsorted() as $bulk) { $comment_obj->setBulk($bulk, $this->radix); if ($bulk->media) { $media_obj->setBulk($bulk, $this->radix); $m = $media_obj; } else { $m = null; } if ($this->builder) { $this->param_manager->setParam('controller_method', $limit ? 'last/' . $limit : 'thread'); $partial = $this->builder->createPartial('board_comment', 'board_comment'); $partial->getParamManager()->setParam('p', $comment_obj)->setParam('p_media', $m); $bulk->comment->formatted = $partial->build(); $partial->clearBuilt(); } } $this->response->setData(['success' => _i('Message sent.')] + $comments); } else { if ($this->builder) { $this->param_manager->setParam('controller_method', $limit ? 'last/' . $limit : 'thread'); $partial = $this->builder->createPartial('board_comment', 'board_comment'); $partial->getParamManager()->setParam('p', new Comment($this->getContext(), $comment->bulk))->setParam('p_media', new Media($this->getContext(), $comment->bulk)); $bulk->comment->formatted = $partial->build(); $partial->clearBuilt(); } $this->response->setData(['success' => _i('Message sent.'), 'thread_num' => $comment->comment->thread_num, $comment->comment->thread_num => ['posts' => [$comment->bulk]]]); } } else { $this->builder->createLayout('redirect')->getParamManager()->setParam('url', $this->uri->create([$this->radix->shortname, !$limit ? 'thread' : 'last/' . $limit, $comment->comment->thread_num]) . '#' . $comment->comment->num); $this->builder->getProps()->addTitle(_i('Redirecting')); $this->response->setContent($this->builder->build()); } return $this->response; }
public function apify($bulk, $controller_method = 'thread') { $this->comment_obj->setBulk($bulk); $comment_force = ['getTitleProcessed', 'getNameProcessed', 'getEmailProcessed', 'getTripProcessed', 'getPosterHashProcessed', 'getOriginalTimestamp', 'getFourchanDate', 'getCommentSanitized', 'getCommentProcessed', 'getPosterCountryNameProcessed']; foreach ($comment_force as $value) { $this->comment_obj->{$value}(); } $m = null; if ($bulk->media !== null) { $media_force = ['getMediaFilenameProcessed', 'getMediaLink', 'getThumbLink', 'getRemoteMediaLink', 'getMediaStatus', 'getSafeMediaHash']; $this->media_obj->setBulk($bulk); $m = $this->media_obj; foreach ($media_force as $value) { $this->media_obj->{$value}($this->getRequest()); } } if ($this->builder) { $this->builder->getParamManager()->setParam('controller_method', $controller_method); $partial = $this->builder->createPartial('board_comment', 'board_comment'); $partial->getParamManager()->setParam('p', $this->comment_obj)->setParam('p_media', $m); $bulk->comment->formatted = $partial->build(); $partial->clearBuilt(); } }
public function toString() { $radix = $this->getBuilderParamManager()->getParam('radix'); $board = $this->getParamManager()->getParam('board'); $controller_method = $this->getBuilderParamManager()->getParam('controller_method', 'thread'); $thread_id = $this->getBuilderParamManager()->getParam('thread_id', 0); $form = $this->getForm(); if ($thread_id > 0) { echo $form->open(['enctype' => 'multipart/form-data', 'onsubmit' => 'fuel_set_csrf_token(this);', 'action' => $radix->shortname . '/submit', 'id' => 'postform']); echo $form->hidden('csrf_token', $this->getSecurity()->getCsrfToken()); echo $form->hidden('id', 'postform'); echo isset($backend_vars['last_limit']) ? $form->hidden('reply_last_limit', $backend_vars['last_limit']) : ''; } ?> <div class="content"> <?php foreach ($board as $key => $post) { if (isset($post['op'])) { $op_bulk = $post['op']; $op = new Comment($this->getContext(), $op_bulk); $op->setControllerMethod($controller_method); if ($op_bulk->media !== null) { $op_media = new Media($this->getContext(), $op_bulk); } else { $op_media = null; } ?> <div id="<?php echo $op->num; ?> "> <?php if ($op_media !== null) { ?> <?php if ($op_media->getMediaStatus($this->getRequest()) !== 'banned') { ?> <span><?php echo _i('File:') . ' ' . ByteSize::formatBinary($op_media->media_size, 0) . ', ' . $op_media->media_w . 'x' . $op_media->media_h . ', ' . $op_media->getMediaFilenameProcessed(); ?> <?php echo '<!-- ' . substr($op_media->media_hash, 0, -2) . '-->'; ?> </span> <?php if (!$op->radix->hide_thumbnails || $this->getAuth()->hasAccess('maccess.mod')) { ?> [<a href="<?php echo $this->getUri()->create($op->radix->shortname . '/search/image/' . $op_media->getSafeMediaHash()); ?> "><?php echo _i('View Same'); ?> </a>] [<a href="http://google.com/searchbyimage?image_url=<?php echo $op_media->getThumbLink($this->getRequest()); ?> ">Google</a>] [<a href="http://iqdb.org/?url=<?php echo $op_media->getThumbLink($this->getRequest()); ?> ">iqdb</a>] [<a href="http://saucenao.com/search.php?url=<?php echo $op_media->getThumbLink($this->getRequest()); ?> ">SauceNAO</a>] <?php } ?> <br /> <?php } ?> <?php if ($op_media->getMediaStatus($this->getRequest()) === 'banned') { ?> <img src="<?php echo $this->getAssetManager()->getAssetLink('images/banned-image.png'); ?> " width="150" height="150" class="thumb"/> <?php } elseif ($op_media->getMediaStatus($this->getRequest()) !== 'normal') { ?> <a href="<?php echo $op_media->getMediaLink($this->getRequest()) ? $op_media->getMediaLink($this->getRequest()) : $op_media->getRemoteMediaLink($this->getRequest()); ?> " rel="noreferrer"> <img src="<?php echo $this->getAssetManager()->getAssetLink('images/missing-image.jpg'); ?> " width="150" height="150" class="thumb"/> </a> <?php } else { ?> <a href="<?php echo $op_media->getMediaLink($this->getRequest()) ? $op_media->getMediaLink($this->getRequest()) : $op_media->getRemoteMediaLink($this->getRequest()); ?> " rel="noreferrer"> <?php if (!$this->getAuth()->hasAccess('maccess.mod') && $op_media->spoiler) { ?> <img src="<?php echo $this->getAssetManager()->getAssetLink('images/spoiler.png'); ?> " width="100" height="100" class="thumb" alt="[SPOILER]" /> <?php } else { ?> <img src="<?php echo $op_media->getThumbLink($this->getRequest()); ?> " width="<?php echo $op_media->preview_w; ?> " height="<?php echo $op_media->preview_h; ?> " class="thumb" alt="<?php echo $op->num; ?> " /> <?php } ?> </a> <?php } ?> <?php } ?> <label> <input type="checkbox" name="delete[]" value="<?php echo $op->doc_id; ?> " /> <span class="filetitle"><?php echo $op->getTitleProcessed(); ?> </span> <span class="postername<?php echo $op->capcode == 'M' ? ' mod' : ''; echo $op->capcode == 'A' ? ' admin' : ''; echo $op->capcode == 'D' ? ' developer' : ''; ?> "><?php echo $op->email && $op->email !== 'noko' ? '<a href="mailto:' . rawurlencode($op->email) . '">' . $op->getNameProcessed() . '</a>' : $op->getNameProcessed(); ?> </span> <span class="postertrip<?php echo $op->capcode == 'M' ? ' mod' : ''; echo $op->capcode == 'A' ? ' admin' : ''; echo $op->capcode == 'D' ? ' developer' : ''; ?> "><?php echo $op->getTripProcessed(); ?> </span> <span class="poster_hash"><?php if ($op->getPosterHashProcessed()) { ?> ID:<?php echo $op->getPosterHashProcessed(); } ?> </span> <?php if ($op->capcode == 'M') { ?> <span class="postername mod">## <?php echo _i('Mod'); ?> </span> <?php } ?> <?php if ($op->capcode == 'A') { ?> <span class="postername admin">## <?php echo _i('Admin'); ?> </span> <?php } ?> <?php if ($op->capcode == 'D') { ?> <span class="postername admin">## <?php echo _i('Developer'); ?> </span> <?php } ?> <?php echo gmdate('D d M H:i:s Y', $op->getOriginalTimestamp()); ?> <?php if ($op->poster_country !== null) { ?> <span class="poster_country"><span title="<?php echo e($op->poster_country_name); ?> " class="flag flag-<?php echo strtolower($op->poster_country); ?> "></span></span><?php } ?> </label> <?php if ($thread_id == 0) { ?> <a class="js" href="<?php echo $this->getUri()->create(array($op->radix->shortname, $controller_method, $op->num)) . '#' . $op->num; ?> ">No.<?php echo $op->num; ?> </a> <?php } else { ?> <a class="js" href="<?php echo $this->getUri()->create(array($op->radix->shortname, $controller_method, $op->num)) . '#' . $op->num; ?> ">No.</a><a class="js" href="javascript:replyQuote('>><?php echo $op->num; ?> \n')"><?php echo $op->num; ?> </a> <?php } ?> <?php if (isset($op_media) && $op_media->spoiler == 1) { ?> <img class="inline" src="<?php echo $this->getAssetManager()->getAssetLink('images/icons/spoiler-icon.png'); ?> " alt="[SPOILER]" title="<?php echo _i('The image in this post has been marked spoiler.'); ?> "><?php } ?> <?php if ($op->deleted == 1 && $op->timestamp_expired == 0) { ?> <img class="inline" src="<?php echo $this->getAssetManager()->getAssetLink('images/icons/file-delete-icon.png'); ?> " alt="[DELETED]" title="<?php echo _i('This thread was prematurely deleted.'); ?> "><?php } ?> <?php if ($op->deleted == 1 && $op->timestamp_expired != 0) { ?> <img class="inline" src="<?php echo $this->getAssetManager()->getAssetLink('images/icons/file-delete-icon.png'); ?> " alt="[DELETED]" title="<?php echo _i('This thread was deleted on %s.', gmdate('M d, Y \\a\\t H:i:s e', $op->timestamp_expired)); ?> "><?php } ?> <?php if ($op->sticky == 1) { ?> <img class="inline" src="<?php echo $this->getAssetManager()->getAssetLink('images/icons/sticky-icon.png'); ?> " alt="[STICKY]" title="<?php echo _i('This thread has been stickied.'); ?> "><?php } ?> <?php if ($op->locked == 1) { ?> <img class="inline" src="<?php echo $this->getAssetManager()->getAssetLink('images/icons/locked-icon.png'); ?> " alt="[LOCKED]" title="<?php echo _i('This thread has been locked.'); ?> "><?php } ?> [<a href="<?php echo $this->getUri()->create(array($op->radix->shortname, 'thread', $op->num)); ?> "><?php echo _i('Reply'); ?> </a>] <?php if (isset($post['omitted']) && $post['omitted'] > 50) { ?> [<a href="<?php echo $this->getUri()->create($op->radix->shortname . '/last/50/' . $op->num); ?> "><?php echo _i('Last 50'); ?> </a>]<?php } ?> <?php if ($op->radix->archive) { ?> [<a href="//boards.4chan.org/<?php echo $op->radix->shortname . '/thread/' . $op->num; ?> "><?php echo _i('Original'); ?> </a>]<?php } ?> <div class="quoted-by" style="display: <?php echo $op->getBacklinks() ? 'block' : 'none'; ?> "> <?php echo _i('Quoted By:'); ?> <?php echo $op->getBacklinks() ? implode(' ', $op->getBacklinks()) : ''; ?> </div> <blockquote><p><?php echo $op->getCommentProcessed(); ?> </p></blockquote> <?php if (isset($post['omitted']) && $post['omitted'] > 0) { ?> <span class="omitted"> <?php if (isset($post['images_omitted']) && $post['images_omitted'] > 0) { ?> <?php echo $post['omitted'] + $post['images_omitted'] . ' ' . _n('post', 'posts', $post['omitted'] + $post['images_omitted']); ?> <?php echo ' ' . _n('omitted', 'omitted', $post['omitted'] + $post['images_omitted']); ?> . <?php } else { ?> <?php echo $post['omitted'] . ' ' . _n('post', 'posts', $post['omitted']); ?> <?php echo ' ' . _n('omitted', 'omitted', $post['omitted'] + $post['images_omitted']); ?> . <?php } ?> </span> <?php } ?> </div> <?php } ?> <?php if (isset($post['posts'])) { $post_counter = 0; $image_counter = 0; $board_comment_view = $this->getBuilder()->createPartial('post', 'board_comment'); // reusable Comment object not to create one every loop $comment = new Comment($this->getContext()); $comment->setControllerMethod($controller_method); $media_obj = new Media($this->getContext()); foreach ($post['posts'] as $p) { /** @var CommentBulk $p */ $post_counter++; if ($p->media !== null) { $image_counter++; } $comment->setBulk($p); // set the $media to null and leave the Media object in existence if ($p->media !== null) { $media_obj->setBulk($p); $media = $media_obj; } else { $media = null; } $board_comment_view->getParamManager()->setParams(['p' => $comment, 'p_media' => $media, 'modifiers' => $this->getBuilderParamManager()->getParam('modifiers', false), 'post_counter' => $post_counter, 'image_counter' => $image_counter]); // refreshes the string $board_comment_view->doBuild(); echo $board_comment_view->build(); // remove extra strings from the objects $board_comment_view->clearBuilt(); $p->comment->clean(); if ($p->media !== null) { $p->media->clean(); } } } ?> <?php if ($thread_id > 0) { ?> <?php echo $this->getBuilder()->isPartial('tools_reply_box') ? $this->getBuilder()->getPartial('tools_reply_box')->build() : ''; ?> <?php } ?> <br class="newthr" /> <hr /> <?php } ?> </div> <?php if ($thread_id > 0) { echo $form->close(); } ?> <?php }
public function toString() { $board = $this->getParamManager()->getParam('board'); $controller_method = $this->getBuilderParamManager()->getParam('controller_method', 'thread'); $thread_id = $this->getBuilderParamManager()->getParam('thread_id', 0); foreach ($board as $key => $post) { if (isset($post['op'])) { $op_bulk = $post['op']; $op = new Comment($this->getContext(), $op_bulk); $op->setControllerMethod($controller_method); if ($op_bulk->media !== null) { $op_media = new Media($this->getContext(), $op_bulk); } else { $op_media = null; } $num = $op->num . ($op->subnum ? '_' . $op->subnum : ''); ?> <?php if ($thread_id === 0) { ?> <div class="thread stub stub_doc_id_<?php echo $op->doc_id; ?> "> <button class="btn-toggle-post" data-function="showThread" data-board="<?php echo $op->radix->shortname; ?> " data-doc-id="<?php echo $op->doc_id; ?> " data-thread-num="<?php echo $op->thread_num; ?> "><i class="icon-plus"></i></button> <?php if ($op->email && $op->email !== 'noko') { ?> <a href="mailto:<?php echo rawurlencode($op->email); ?> "><?php } ?> <span class="post_author"><?php echo $op->getNameProcessed(); ?> </span><?php echo $op->getNameProcessed() && $op->getTripProcessed() ? ' ' : ''; ?> <span class="post_tripcode"><?php echo $op->getTripProcessed(); ?> </span><?php if ($op->email && $op->email !== 'noko') { ?> </a><?php } ?> (<?php echo $post['omitted'] + 5 . ' ' . _i('replies'); ?> ) </div> <?php } ?> <article id="<?php echo $num; ?> " class="clearfix thread doc_id_<?php echo $op->doc_id; ?> board_<?php echo $op->radix->shortname; ?> " data-doc-id="<?php echo $op->doc_id; ?> " data-thread-num="<?php echo $op->thread_num; ?> "> <?php if ($thread_id === 0) { ?> <div class="stub pull-left"> <button class="btn-toggle-post" data-function="hideThread" data-board="<?php echo $op->radix->shortname; ?> " data-doc-id="<?php echo $op->doc_id; ?> "><i class="icon-minus"></i></button> </div> <?php } ?> <?php \Foolz\Plugin\Hook::forge('foolfuuka.themes.default_after_op_open')->setObject($this)->setParam('board', $op->radix)->execute(); ?> <?php if ($op_media !== null) { ?> <div class="thread_image_box"> <?php if ($op_media->getMediaStatus($this->getRequest()) === 'banned') { ?> <img src="<?php echo $this->getAssetManager()->getAssetLink('images/banned-image.png'); ?> " width="150" height="150" /> <?php } elseif ($op_media->getMediaStatus($this->getRequest()) !== 'normal') { ?> <a href="<?php echo $op_media->getMediaLink($this->getRequest()) ? $op_media->getMediaLink($this->getRequest()) : $op_media->getRemoteMediaLink($this->getRequest()); ?> " target="_blank" rel="noreferrer" class="thread_image_link"> <img src="<?php echo $this->getAssetManager()->getAssetLink('images/missing-image.jpg'); ?> " width="150" height="150" /> </a> <?php } else { ?> <a href="<?php echo $op_media->getMediaLink($this->getRequest()) ? $op_media->getMediaLink($this->getRequest()) : $op_media->getRemoteMediaLink($this->getRequest()); ?> " target="_blank" rel="noreferrer" class="thread_image_link"> <?php if (!$this->getAuth()->hasAccess('maccess.mod') && !$op->radix->getValue('transparent_spoiler') && $op_media->spoiler) { ?> <div class="spoiler_box"><span class="spoiler_box_text"><?php echo _i('Spoiler'); ?> <span class="spoiler_box_text_help"><?php echo _i('Click to view'); ?> </span></div> <?php } else { ?> <img src="<?php echo $op_media->getThumbLink($this->getRequest()); ?> " width="<?php echo $op_media->preview_w; ?> " height="<?php echo $op_media->preview_h; ?> " class="thread_image<?php echo $op_media->spoiler ? ' is_spoiler_image' : ''; ?> " data-md5="<?php echo $op_media->media_hash; ?> " /> <?php } ?> </a> <?php } ?> <?php if ($op_media->getMediaStatus($this->getRequest()) !== 'banned') { ?> <div class="post_file" style="padding-left: 2px;<?php if ($op_media->preview_w > 149) { echo 'max-width:' . $op_media->preview_w . 'px;'; } ?> "> <?php echo ByteSize::formatBinary($op_media->media_size, 0) . ', ' . $op_media->media_w . 'x' . $op_media->media_h . ', '; ?> <a class="post_file_filename" href="<?php echo $op_media->getMediaLink($this->getRequest()) ? $op_media->getMediaLink($this->getRequest()) : $op_media->getRemoteMediaLink($this->getRequest()); ?> " target="_blank"><?php echo $op_media->getMediaFilenameProcessed(); ?> </a> </div> <?php } ?> <div class="post_file_controls"> <?php if ($op_media->getMediaStatus($this->getRequest()) !== 'banned' || $this->getAuth()->hasAccess('media.see_banned')) { ?> <?php if (!$op->radix->hide_thumbnails || $this->getAuth()->hasAccess('maccess.mod')) { ?> <a href="<?php echo $this->getUri()->create($op->radix->shortname . '/search/image/' . $op_media->getSafeMediaHash()); ?> " class="btnr parent"><?php echo _i('View Same'); ?> </a><a href="http://google.com/searchbyimage?image_url=<?php echo $op_media->getThumbLink($this->getRequest()); ?> " target="_blank" class="btnr parent">Google</a><a href="http://iqdb.org/?url=<?php echo $op_media->getThumbLink($this->getRequest()); ?> " target="_blank" class="btnr parent">iqdb</a><a href="http://saucenao.com/search.php?url=<?php echo $op_media->getThumbLink($this->getRequest()); ?> " target="_blank" class="btnr parent">SauceNAO</a><?php if (!$op->radix->archive || $op->radix->getValue('archive_full_images')) { ?> <a href="<?php echo $op_media->getMediaDownloadLink($this->getRequest()); ?> " download="<?php echo $op_media->getMediaFilenameProcessed(); ?> " class="btnr parent"><i class="icon-download-alt"></i></a><?php } ?> <?php } ?> <?php } ?> </div> </div> <?php } ?> <header> <div class="post_data"> <?php if ($op->getTitleProcessed() !== '') { ?> <h2 class="post_title"><?php echo $op->getTitleProcessed(); ?> </h2><?php } ?> <span class="post_poster_data"> <?php if ($op->email && $op->email !== 'noko') { ?> <a href="mailto:<?php echo rawurlencode($op->email); ?> "><?php } ?> <span class="post_author"><?php echo $op->getNameProcessed(); ?> </span><?php echo $op->getNameProcessed() && $op->getTripProcessed() ? ' ' : ''; ?> <span class="post_tripcode"><?php echo $op->getTripProcessed(); ?> </span><?php if ($op->email && $op->email !== 'noko') { ?> </a><?php } ?> <?php if ($op->getPosterHashProcessed()) { ?> <span class="poster_hash">ID:<?php echo $op->getPosterHashProcessed(); ?> </span><?php } ?> <?php if ($op->capcode !== 'N') { ?> <?php if ($op->capcode === 'M') { ?> <span class="post_level post_level_moderator">## <?php echo _i('Mod'); ?> </span><?php } ?> <?php if ($op->capcode === 'A') { ?> <span class="post_level post_level_administrator">## <?php echo _i('Admin'); ?> </span><?php } ?> <?php if ($op->capcode === 'D') { ?> <span class="post_level post_level_developer">## <?php echo _i('Developer'); ?> </span><?php } ?> <?php } ?> </span> <span class="time_wrap"> <time datetime="<?php echo gmdate(DATE_W3C, $op->timestamp); ?> " class="show_time" <?php if ($op->radix->archive) { ?> title="<?php echo _i('4chan Time') . ': ' . $op->getFourchanDate(); ?> "<?php } ?> ><?php echo gmdate('D d M H:i:s Y', $op->timestamp); ?> </time> </span> <a href="<?php echo $this->getUri()->create(array($op->radix->shortname, $controller_method, $op->thread_num)) . '#' . $num; ?> " data-post="<?php echo $num; ?> " data-function="highlight">No.</a><a href="<?php echo $this->getUri()->create(array($op->radix->shortname, $controller_method, $op->thread_num)) . '#q' . $num; ?> " data-post="<?php echo $num; ?> " data-function="quote"><?php echo $num; ?> </a> <span class="post_type"> <?php if ($op->poster_country !== null) { ?> <span title="<?php echo e($op->poster_country_name); ?> " class="flag flag-<?php echo strtolower($op->poster_country); ?> "></span><?php } ?> <?php if (isset($op_media) && $op_media->spoiler) { ?> <i class="icon-eye-close" title="<?php echo htmlspecialchars(_i('The image in this post has been marked spoiler.')); ?> "></i><?php } ?> <?php if ($op->deleted && !$op->timestamp_expired) { ?> <i class="icon-trash" title="<?php echo htmlspecialchars(_i('This thread was prematurely deleted.')); ?> "></i><?php } ?> <?php if ($op->deleted && $op->timestamp_expired) { ?> <i class="icon-trash" title="<?php echo htmlspecialchars(_i('This thread was deleted on %s.', gmdate('M d, Y \\a\\t H:i:s e', $op->timestamp_expired))); ?> "></i><?php } ?> <?php if ($op->sticky) { ?> <i class="icon-pushpin" title="<?php echo _i('This thread has been stickied.'); ?> "></i><?php } ?> <?php if ($op->locked) { ?> <i class="icon-lock" title="<?php echo _i('This thread has been locked.'); ?> "></i><?php } ?> </span> <span class="post_controls"> <a href="<?php echo $this->getUri()->create(array($op->radix->shortname, 'thread', $num)); ?> " class="btnr parent"><?php echo _i('View'); ?> </a><a href="<?php echo $this->getUri()->create(array($op->radix->shortname, $controller_method, $num)) . '#reply'; ?> " class="btnr parent"><?php echo _i('Reply'); ?> </a><?php echo isset($post['omitted']) && $post['omitted'] > 50 ? '<a href="' . $this->getUri()->create($op->radix->shortname . '/last/50/' . $num) . '" class="btnr parent">' . _i('Last 50') . '</a>' : ''; echo $op->radix->archive ? '<a href="//boards.4chan.org/' . $op->radix->shortname . '/thread/' . $num . '" class="btnr parent">' . _i('Original') . '</a>' : ''; ?> <a href="#" class="btnr parent" data-post="<?php echo $op->doc_id; ?> " data-post-id="<?php echo $num; ?> " data-board="<?php echo htmlspecialchars($op->radix->shortname); ?> " data-controls-modal="post_tools_modal" data-backdrop="true" data-keyboard="true" data-function="report"><?php echo _i('Report'); ?> </a><?php if ($this->getAuth()->hasAccess('maccess.mod') || !$op->radix->archive) { ?> <a href="#" class="btnr parent" data-post="<?php echo $op->doc_id; ?> " data-post-id="<?php echo $num; ?> " data-board="<?php echo htmlspecialchars($op->radix->shortname); ?> " data-controls-modal="post_tools_modal" data-backdrop="true" data-keyboard="true" data-function="delete"><?php echo _i('Delete'); ?> </a><?php } ?> </span> <div class="backlink_list"<?php echo $op->getBacklinks() ? ' style="display:block"' : ''; ?> > <?php echo _i('Quoted By:'); ?> <span class="post_backlink" data-post="<?php echo $num; ?> "><?php echo $op->getBacklinks() ? implode(' ', $op->getBacklinks()) : ''; ?> </span> </div> <?php if ($this->getAuth()->hasAccess('maccess.mod')) { ?> <div class="btn-group" style="clear:both; padding:5px 0 0 0;"> <button class="btn btn-mini" data-function="activateModeration"><?php echo _i('Mod'); if ($op->poster_ip) { echo ' ' . Inet::dtop($op->poster_ip); } ?> </button> </div> <div class="btn-group post_mod_controls" style="clear:both; padding:5px 0 0 0;"> <button class="btn btn-mini" data-function="mod" data-board="<?php echo $op->radix->shortname; ?> " data-id="<?php echo $op->doc_id; ?> " data-action="delete_post"><?php echo _i('Delete Thread'); ?> </button> <?php if (!is_null($op_media)) { ?> <button class="btn btn-mini" data-function="mod" data-board="<?php echo $op->radix->shortname; ?> " data-id="<?php echo $op_media->media_id; ?> " data-doc-id="<?php echo $op->doc_id; ?> " data-action="delete_image"><?php echo _i('Delete Image'); ?> </button> <button class="btn btn-mini" data-function="mod" data-board="<?php echo $op->radix->shortname; ?> " data-id="<?php echo $op_media->media_id; ?> " data-doc-id="<?php echo $op->doc_id; ?> " data-action="ban_image_local"><?php echo _i('Ban Image'); ?> </button> <button class="btn btn-mini" data-function="mod" data-board="<?php echo $op->radix->shortname; ?> " data-id="<?php echo $op_media->media_id; ?> " data-doc-id="<?php echo $op->doc_id; ?> " data-action="ban_image_global"><?php echo _i('Ban Image Globally'); ?> </button> <?php } ?> <?php if ($op->poster_ip) { ?> <button class="btn btn-mini" data-function="ban" data-controls-modal="post_tools_modal" data-backdrop="true" data-keyboard="true" data-board="<?php echo $op->radix->shortname; ?> " data-ip="<?php echo Inet::dtop($op->poster_ip); ?> " data-action="ban_user"><?php echo _i('Ban IP:') . ' ' . Inet::dtop($op->poster_ip); ?> </button> <button class="btn btn-mini" data-function="searchUser" data-board="<?php echo $op->radix->shortname; ?> " data-board-url="<?php echo $this->getUri()->create(array($op->radix->shortname)); ?> " data-id="<?php echo $op->doc_id; ?> " data-poster-ip="<?php echo Inet::dtop($op->poster_ip); ?> "><?php echo _i('Search IP'); ?> </button> <?php if ($this->getPreferences()->get('foolfuuka.sphinx.global')) { ?> <button class="btn btn-mini" data-function="searchUserGlobal" data-board="<?php echo $op->radix->shortname; ?> " data-board-url="<?php echo $this->getUri()->create(array($op->radix->shortname)); ?> " data-id="<?php echo $op->doc_id; ?> " data-poster-ip="<?php echo Inet::dtop($op->poster_ip); ?> "><?php echo _i('Search IP Globally'); ?> </button> <?php } ?> <?php } ?> </div> <?php } ?> </div> </header> <div class="text<?php if (preg_match('/[\\x{4E00}-\\x{9FBF}\\x{3040}-\\x{309F}\\x{30A0}-\\x{30FF}]/u', $op->getCommentProcessed())) { echo ' shift-jis'; } ?> "> <?php echo $op->getCommentProcessed(); ?> </div> <div class="thread_tools_bottom"> <?php if (isset($post['omitted']) && $post['omitted'] > 0) { ?> <span class="omitted"> <a style="display:inline-block" href="<?php echo $this->getUri()->create(array($op->radix->shortname, $controller_method, $op->thread_num)); ?> " data-function="expandThread" data-thread-num="<?php echo $op->thread_num; ?> "><i class="icon icon-resize-full"></i></a> <span class="omitted_text"> <span class="omitted_posts"><?php echo $post['omitted']; ?> </span> <?php echo _n('post', 'posts', $post['omitted']); ?> <?php if (isset($post['images_omitted']) && $post['images_omitted'] > 0) { ?> <?php echo _i('and'); ?> <span class="omitted_images"><?php echo $post['images_omitted']; ?> </span> <?php echo _n('image', 'images', $post['images_omitted']); ?> <?php } ?> <?php echo _n('omitted', 'omitted', $post['omitted'] + $post['images_omitted']); ?> </span> <?php } ?> </div> <?php if ($op->getReports()) { ?> <?php foreach ($op->getReports() as $report) { ?> <div class="report_reason"><?php echo '<strong>' . _i('Reported Reason:') . '</strong> ' . $report->getReasonProcessed(); ?> <br/> <div class="ip_reporter"> <strong><?php echo _i('Info:'); ?> </strong> <?php echo Inet::dtop($report->ip_reporter); ?> , <?php echo _i('Type:'); ?> <?php echo $report->media_id !== null ? _i('media') : _i('post'); ?> , <?php echo _i('Time:'); ?> <?php echo gmdate('D M d H:i:s Y', $report->created); ?> <button class="btn btn-mini" data-function="mod" data-id="<?php echo $report->id; ?> " data-board="<?php echo htmlspecialchars($op->radix->shortname); ?> " data-action="delete_report"><?php echo _i('Delete Report'); ?> </button> </div> </div> <?php } ?> <?php } ?> <?php } elseif (isset($post['posts'])) { ?> <article class="clearfix thread"> <?php \Foolz\Plugin\Hook::forge('foolfuuka.themes.default_after_headless_open')->setObject($this)->setParam('board', array(isset($radix) ? $radix : null))->execute(); ?> <?php } ?> <aside class="posts"> <?php if (isset($post['posts'])) { $post_counter = 0; $image_counter = 0; $board_comment_view = $this->getBuilder()->createPartial('post', 'board_comment'); // reusable Comment object not to create one every loop $comment = new Comment($this->getContext()); $comment->setControllerMethod($controller_method); $media_obj = new Media($this->getContext()); $search = array('/\\>[^\\S ]+/s', '/[^\\S ]+\\</s', '/(\\s)+/s'); $replace = array('>', '<', '\\1'); foreach ($post['posts'] as $p) { /** @var CommentBulk $p */ $post_counter++; if ($p->media !== null) { $image_counter++; } if ($image_counter == 150) { $modifiers['lazyload'] = true; } $comment->setBulk($p); // set the $media to null and leave the Media object in existence if ($p->media !== null) { $media_obj->setBulk($p); $media = $media_obj; } else { $media = null; } $board_comment_view->getParamManager()->setParams(['p' => $comment, 'p_media' => $media, 'modifiers' => $this->getBuilderParamManager()->getParam('modifiers', false), 'post_counter' => $post_counter, 'image_counter' => $image_counter]); // refreshes the string $board_comment_view->doBuild(); echo preg_replace($search, $replace, $board_comment_view->build()); // remove extra strings from the objects $board_comment_view->clearBuilt(); $p->comment->clean(); if ($p->media !== null) { $p->media->clean(); } $this->flush(); } } ?> </aside> <?php if ($thread_id !== 0) { ?> <div class="js_hook_realtimethread"></div> <?php echo $this->getBuilder()->isPartial('tools_reply_box') ? $this->getBuilder()->getPartial('tools_reply_box')->build() : ''; ?> <?php } ?> <?php if (isset($post['op']) || isset($post['posts'])) { ?> </article> <?php } ?> <?php } ?> <article class="clearfix thread backlink_container"> <div id="backlink" style="position: absolute; top: 0; left: 0; z-index: 5;"></div> </article> <?php }