Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public function display($cachable = false, $urlparams = false)
*/
public function displayString($parent_id, $parent_type, $parent_entity,
$title=null, $show_file_links=true, $allow_edit=true,
$echo=true, $from=null)
$echo=true, $from=null, $attachmentid=null)
{
$app = $this->app;
$document = $app->getDocument();
Expand All @@ -102,7 +102,7 @@ public function displayString($parent_id, $parent_type, $parent_entity,
$model->setSortOrder($sort_order);

// If none of the attachments should be visible, exit now
if ( ! $model->someVisible() ) {
if ( ! $model->someVisible($attachmentid) ) {
return false;
}

Expand Down
10 changes: 6 additions & 4 deletions attachments_component/site/src/Model/AttachmentsModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ public function setSortOrder($new_sort_order)
*
* @return the list of attachments for this parent
*/
public function &getAttachmentsList()
public function &getAttachmentsList($attachmentid=null)
{
// Just return it if it has already been created
if ( $this->_list != null ) {
Expand Down Expand Up @@ -387,7 +387,9 @@ public function &getAttachmentsList()
$query = $db->getQuery(true);
$query->select('a.*, u.name as creator_name')->from('#__attachments AS a');
$query->leftJoin('#__users AS u ON u.id = a.created_by');

if ($attachmentid && join(',', $attachmentid)) {
$query->where('a.id in (' . join(',', $attachmentid) . ')' );
}
if ( $parent_id == 0 ) {
// If the parent ID is zero, the parent is being created so we have
// do the query differently
Expand Down Expand Up @@ -497,7 +499,7 @@ public function numAttachments()
*
* @return true if there are attachments and some should be visible
*/
public function someVisible()
public function someVisible($attachmentid=null)
{
// See if the attachments list has been loaded
if ( $this->_list == null ) {
Expand All @@ -508,7 +510,7 @@ public function someVisible()
}

// Since the attachments have not been loaded, load them now
$this->getAttachmentsList();
$this->getAttachmentsList($attachmentid);
}

return $this->_some_visible;
Expand Down
146 changes: 85 additions & 61 deletions attachments_plugin_framework/src/PlgAttachmentsFramework.php
Original file line number Diff line number Diff line change
Expand Up @@ -911,25 +911,31 @@ public function insertAttachmentsList(&$content, $parent_id, $parent_entity)
}

// Get the attachments tag, if present
$attachments_tag = '';
$attachments_tag = [];
$attachments_tag_args = '';
$match = false;
if (StringHelper::strpos($content->$text_field_name, '{attachments'))
$attachment_id = null;
$offset = -1;
while (false != ($offset = StringHelper::strpos($content->$text_field_name, '{attachments', $offset + 1)))
{
if (preg_match('@(<span class="hide_attachments_token">)?{attachments([ ]*:*[^}]+)?}(</span>)?@', $content->$text_field_name, $match))
if (preg_match('@(?<opening_tag><span class="hide_attachments_token">)?{attachments(?<arguments>[ ]*:*[^}]+)?}(?<closing_tag></span>)?@', substr($content->$text_field_name, $offset), $match))
{
$attachments_tag = true;
$attachments_tag[] = $match[0];
}

if (isset($match[1]) && $match[1])
var_dump($match);
if (($attachments_placement === "custom") && isset($match["arguments"]) && $match["arguments"])
{
$attachments_tag_args_raw = $match[1];
$attachments_tag_args_raw = $match["arguments"];
$attachments_tag_args = ltrim($attachments_tag_args_raw, ' :');
}

if ($attachments_tag)
{
$attachments_tag = $match[0];
preg_match('/id=([\d,]+)/', $attachments_tag_args, $match_id);
var_dump($match_id);
if ($match_id) {
$attachment_id[] = explode(",", $match_id[1]);
}
} else {
$attachment_id[] = null;
}
}

Expand All @@ -942,58 +948,66 @@ public function insertAttachmentsList(&$content, $parent_id, $parent_entity)
AttachmentsHelper::setup_upload_directory($attach_dir, $secure);
}

// Construct the attachment list (if appropriate)
$html = '';
$attachments_list = false;
$add_attachment_btn = false;

// Get the html for the attachments list
/** @var \Joomla\CMS\MVC\Factory\MVCFactory $mvc */
$mvc = Factory::getApplication()
->bootComponent("com_attachments")
->getMVCFactory();
/** @var \JMCameron\Component\Attachments\Site\Controller\AttachmentsController $controller */
$controller = $mvc->createController('Attachments', 'Site', [], $this->app, $this->app->getInput());
$attachments_list = $controller->displayString($parent_id, $this->parent_type, $parent_entity, null, true, true, false, $from);

// If the attachments list is empty, insert an empty div for it
if ($attachments_list == '')
{
$class_name = $aparams->get('attachments_table_style', 'attachmentsList');
$div_id = 'attachmentsList' . '_' . $this->parent_type . '_' . $parent_entity . '_' . (string) $parent_id;
$attachments_list = "\n<div class=\"$class_name\" id=\"$div_id\"></div>\n";
}
$i = 0;
$attachments_html = [];
// Run at least once and for every {attachments} tag
while (isset($attachments_tag[$i]) || $i === 0) {

// Construct the attachment list (if appropriate)
$html = '';
$attachments_list = false;
$add_attachment_btn = false;

// Get the html for the attachments list
/** @var \Joomla\CMS\MVC\Factory\MVCFactory $mvc */
$mvc = Factory::getApplication()
->bootComponent("com_attachments")
->getMVCFactory();
/** @var \JMCameron\Component\Attachments\Site\Controller\AttachmentsController $controller */
$controller = $mvc->createController('Attachments', 'Site', [], $this->app, $this->app->getInput());
$attachments_list = $controller->displayString($parent_id, $this->parent_type, $parent_entity, null, true, true, false, $from, $attachment_id[$i]);

// If the attachments list is empty, insert an empty div for it
if ($attachments_list == '')
{
$class_name = $aparams->get('attachments_table_style', 'attachmentsList');
$div_id = 'attachmentsList' . '_' . $this->parent_type . '_' . $parent_entity . '_' . (string) $parent_id;
$attachments_list = "\n<div class=\"$class_name\" id=\"$div_id\"></div>\n";
}

$html .= $attachments_list;
$html .= $attachments_list;

if ($html || $user_can_add)
{
// Add the style sheet
HTMLHelper::stylesheet('media/com_attachments/css/attachments_list.css');
HTMLHelper::stylesheet('media/com_attachments/css/attachments_list_dark.css');
if ($html || $user_can_add)
{
// Add the style sheet
HTMLHelper::stylesheet('media/com_attachments/css/attachments_list.css');
HTMLHelper::stylesheet('media/com_attachments/css/attachments_list_dark.css');

// Handle RTL styling (if necessary)
$lang = $this->app->getLanguage();
if ($lang->isRTL())
// Handle RTL styling (if necessary)
$lang = $this->app->getLanguage();
if ($lang->isRTL())
{
HTMLHelper::stylesheet('media/com_attachments/css/attachments_list_rtl.css');
}
}

// Construct the add-attachments button, if appropriate
$hide_add_attachments_link = $aparams->get('hide_add_attachments_link', 0);
if ($user_can_add && !$hide_add_attachments_link)
{
HTMLHelper::stylesheet('media/com_attachments/css/attachments_list_rtl.css');
$add_attachments_btn = AttachmentsHelper::attachmentButtonsHTML($this->parent_type, $parent_id, $parent_entity, $Itemid, $from);
$html .= $add_attachments_btn;
}
}

// Construct the add-attachments button, if appropriate
$hide_add_attachments_link = $aparams->get('hide_add_attachments_link', 0);
if ($user_can_add && !$hide_add_attachments_link)
{
$add_attachments_btn = AttachmentsHelper::attachmentButtonsHTML($this->parent_type, $parent_id, $parent_entity, $Itemid, $from);
$html .= $add_attachments_btn;
}
// Wrap both list and the Add Attachments button in another div
if ($html)
{
$html = "<div class=\"attachmentsContainer\">\n" . $html . "\n</div>";
}

// Wrap both list and the Add Attachments button in another div
if ($html)
{
$html = "<div class=\"attachmentsContainer\">\n" . $html . "\n</div>";
$attachments_html[] = $html;
$i++;
}

// Finally, add the attachments

// NOTE: Hope str_replace() below is UTF8 safe (since the token being replaced is UTF8)...
Expand All @@ -1006,11 +1020,14 @@ public function insertAttachmentsList(&$content, $parent_id, $parent_entity)
{
if ($attachments_tag)
{
$content->$text_field_name = $html . $content->$text_field_name;
for ($i=0; $i < count($attachments_tag); $i++) {
$content->$text_field_name = str_replace($attachments_tag[$i], '', $content->$text_field_name);
}
$content->$text_field_name = $attachments_html[0] . $content->$text_field_name;
}
else
{
$content->$text_field_name = $html . str_replace($attachments_tag, '', $content->$text_field_name);
$content->$text_field_name = $attachments_html[0] . $content->$text_field_name;
}
}
break;
Expand All @@ -1021,12 +1038,14 @@ public function insertAttachmentsList(&$content, $parent_id, $parent_entity)
{
if ($attachments_tag)
{
$content->$text_field_name = str_replace($attachments_tag, $html, $content->$text_field_name);
for ($i=0; $i < count($attachments_tag); $i++) {
$content->$text_field_name = str_replace($attachments_tag[$i], $attachments_html[$i], $content->$text_field_name);
}
}
else
{
// If there is no tag, insert the attachments at the end
$content->$text_field_name .= $html;
$content->$text_field_name .= $attachments_html[0];
}
}
break;
Expand All @@ -1035,7 +1054,9 @@ public function insertAttachmentsList(&$content, $parent_id, $parent_entity)
// Disable and strip out any attachments tags
if ($attachments_tag)
{
$content->$text_field_name = str_replace($attachments_tag, '', $content->$text_field_name);
for ($i=0; $i < count($attachments_tag); $i++) {
$content->$text_field_name = str_replace($attachments_tag[$i], '', $content->$text_field_name);
}
}
break;

Expand All @@ -1045,11 +1066,14 @@ public function insertAttachmentsList(&$content, $parent_id, $parent_entity)
{
if ($attachments_tag)
{
$content->$text_field_name = str_replace($attachments_tag, '', $content->$text_field_name) . $html;
for ($i=0; $i < count($attachments_tag); $i++) {
$content->$text_field_name = str_replace($attachments_tag[$i], '', $content->$text_field_name);
}
$content->$text_field_name = $content->$text_field_name . $attachments_html[0];
}
else
{
$content->$text_field_name .= $html;
$content->$text_field_name .= $attachments_html[0];
}
}
break;
Expand Down