Php 如何在Prestashop中获取所有附件列表

Php 如何在Prestashop中获取所有附件列表,php,prestashop,Php,Prestashop,我正在使用自定义模块,该模块应显示最新(已定义的计数)添加的附件。 我在class/Attachment.php中看到这段代码 public static function getAttachments($id_lang, $id_product, $include = true) { return Db::getInstance()->executeS(' SELECT * FROM '._DB_PREFIX_.'attachment a

我正在使用自定义模块,该模块应显示最新(已定义的计数)添加的附件。 我在class/Attachment.php中看到这段代码

public static function getAttachments($id_lang, $id_product, $include = true)
{
    return Db::getInstance()->executeS('
        SELECT *
        FROM '._DB_PREFIX_.'attachment a
        LEFT JOIN '._DB_PREFIX_.'attachment_lang al
            ON (a.id_attachment = al.id_attachment AND al.id_lang = '.(int)$id_lang.')
        WHERE a.id_attachment '.($include ? 'IN' : 'NOT IN').' (
            SELECT pa.id_attachment
            FROM '._DB_PREFIX_.'product_attachment pa
            WHERE id_product = '.(int)$id_product.'
        )'
    );
}
到目前为止,我知道我不需要这个$include检查,所以我需要定制静态函数,比如getAllattachments或new class?非常感谢您的任何想法

在模块中,我有这个

public function hookLeftColumn($params)
{
    if (!$this->isCached('blockattachment.tpl', $this->getCacheId()))
    {
        $attachments = Attachment::getAttachments();
        foreach ($attachments as &$attachment)
        {
            $attachment['image'] = $this->context->language->iso_code.'-default';
            if (file_exists(_PS_MANU_IMG_DIR_.$attachment['id_manufacturer'].'-'.ImageType::getFormatedName('medium').'.jpg'))
                $attachment['image'] = $attachment['id_manufacturer'];
        }

        $this->smarty->assign(array(
            'attachments' => $attachments,
            'text_list' => Configuration::get('ATTACHMENT_DISPLAY_TEXT'),
            'text_list_nb' => Configuration::get('ATTACHMENT_DISPLAY_TEXT_NB'),
            'form_list' => Configuration::get('ATTACHMENT_DISPLAY_FORM'),
            'display_link_manufacturer' => Configuration::get('PS_DISPLAY_SUPPLIERS'),
        ));
    }
    return $this->display(__FILE__, 'blockattachment.tpl', $this->getCacheId());
}
而在第三方物流这一个

{if $attachments}
        {if $text_list}
            <ul class="bullet">
                {foreach from=$attachments item=attachment name=attachment_list}
                    {if $smarty.foreach.attachment_list.iteration <= $text_list_nb}
                    <li><a href="{$link->getAttachmentLink($attachment.id_attachment, $attachment.link_rewrite)|escape:'html'}" title="{l s='More about %s' sprintf=[$attachment.name] mod='blockattachment'}">{$attachment.name|escape:'html':'UTF-8'}</a></li>
                    {/if}
                {/foreach}
            </ul>
        {/if}
    {else}
        <p>{l s='No new attachments' mod='blockattachment'}</p>
    {/if}
{if$attachments}
{if$text_list}
    {foreach from=$attachments item=附件名称=附件列表}
    {if$smarty.foreach.attachment_list.iteration取决于语言,但请尝试以下操作:

    public static function getLatestAttachments($id_lang, $n = 5)
    {
        return Db::getInstance()->executeS('
            SELECT DISTINCT (a.`id_attachment`), a.`file`,  a.`file_name`, a.`file_size`, al.`name`
            FROM '._DB_PREFIX_.'attachment a
            LEFT JOIN '._DB_PREFIX_.'attachment_lang al
                ON (a.id_attachment = al.id_attachment AND al.id_lang = '.(int)$id_lang.')
            ORDER BY a.`id_attachment` DESC'.
            ($n > 0 ? ' LIMIT '.$n : '')
        );
    }
    
    然后,在您的模块中,您不需要获取所有附件:

    public function hookLeftColumn($params)
    {
        if (!$this->isCached('blockattachment.tpl', $this->getCacheId()))
        {
            $attachments = Attachment::getLatestAttachments($this->context->language->id, Configuration::get('ATTACHMENT_DISPLAY_TEXT_NB'));
            foreach ($attachments as &$attachment)
            {
                $attachment['image'] = $this->context->language->iso_code.'-default';
                if (file_exists(_PS_MANU_IMG_DIR_.$attachment['id_manufacturer'].'-'.ImageType::getFormatedName('medium').'.jpg'))
                    $attachment['image'] = $attachment['id_manufacturer'];
            }
    
            $this->smarty->assign(array(
                'attachments' => $attachments,
                'text_list' => Configuration::get('ATTACHMENT_DISPLAY_TEXT'),
                'form_list' => Configuration::get('ATTACHMENT_DISPLAY_FORM'),
                'display_link_manufacturer' => Configuration::get('PS_DISPLAY_SUPPLIERS'),
            ));
        }
        return $this->display(__FILE__, 'blockattachment.tpl', $this->getCacheId());
    }
    
    您的第三方物流:

    {if $attachments}
            {if $text_list}
                <ul class="bullet">
                    {foreach from=$attachments item=attachment name=attachment_list}
                        <li><a href="{$link->getAttachmentLink($attachment.id_attachment, $attachment.name)|escape:'html'}" title="{l s='More about %s' sprintf=[$attachment.name] mod='blockattachment'}">{$attachment.name|escape:'html':'UTF-8'}</a></li>
                    {/foreach}
                </ul>
            {/if}
        {else}
            <p>{l s='No new attachments' mod='blockattachment'}</p>
        {/if}
    
    {if$attachments}
    {if$text_list}
    
      {foreach from=$attachments item=附件名称=附件列表}
    • {/foreach}
    {/if} {else} {l s='无新附件'mod='blockattachment'}

    {/if}

    顺便说一句,我认为附件中没有“重写”链接。

    您想要最新附件中的多少个附件?并且只需要用户语言或所有语言的附件?嗨!在tpl foreach循环中,模块配置中的变量设置了一个限值(查看确切的block Manufactor){if$smarty.foreach.attachment_list.iteration谢谢,但出现错误500。公共静态函数getlatestaAttachments($id_lang,$n=5)转到attachment.php类。其余在模块php和tpl上。我认为查询有问题。我还没有测试。我没有任何附件。你能打开调试模式吗?在你的条件下,if/defines.inc.php更改定义('PS_MODE_DEV',false);定义('PS_MODE_DEV',true);然后发布错误?您还应该将函数放入附件覆盖中。使用类Attachment extends AttachmentCore创建文件/override/classes/Attachment.php,然后粘贴该函数。然后删除/重命名文件cache/class_index.php。最糟糕的是,开发模式不起作用,我看不出问题出在哪里:(如果您检查模块并给我看一些演示,我可以在PP上给您寄几美元。谢谢!!!:)一些调整,几乎完成了!($n>0?'LIMIT'.$n:'');应该是($n>0?'LIMIT'.$n:'')没有结束“;”。到目前为止还不错。现在的主要问题是获取附件链接,因为getAttachmentLink函数在任何地方都不存在