При изменении шаблонов в пользовательском блоке контент удаляется из БД

У меня есть собственный блок для Concrete5, который я создал, который использует несколько связанных с ним файлов шаблонов. Если я применяю шаблон к блоку при первоначальном добавлении блока на страницу, все работает нормально. Однако, если я затем попытаюсь изменить шаблоны после того, как блок уже установлен, у меня возникнут проблемы. При сохранении изменений с новым шаблоном весь мой контент удаляется из БД; поэтому все в этой текущей строке равно нулю, кроме идентификатора блока «bID», bID изменится на следующий шаг. введите здесь описание изображения

Я не знаю, почему это происходит!! Кажется, я столкнулся с подобным давным-давно, но не помню, как это было решено. Любой совет будет полезен!

Мои файлы шаблонов - это просто стандартный html в файле php с <?php defined('C5_EXECUTE') or die("Access Denied."); ?> в верхней части файла.

Мой контроллер (который сейчас подозревается в проблеме) выглядит так:

<?php

namespace Concrete\Package\ThemeCaboodle\Block\GridBlock;

use Concrete\Core\Block\BlockController;
use Database;
use Page;
use Concrete\Core\Editor\LinkAbstractor;
use Core;
use File;
use View;
use BlockType;

class Controller extends BlockController
{

public $defaultBlockClassList   = '';
public $defaultEntriesClassList = 'unit-md-4';

protected $btTable                                 = 'btGrid';
protected $btExportTables                          = array('btGrid', 'btGridEntries');
protected $btInterfaceWidth                        = "600";
protected $btWrapperClass                          = 'ccm-ui';
protected $btInterfaceHeight                       = "550";
protected $btCacheBlockRecord                      = true;
protected $btExportFileColumns                     = array('thumbnailFID');
protected $btCacheBlockOutput                      = true;
protected $btCacheBlockOutputOnPost                = true;
protected $btCacheBlockOutputForRegisteredUsers    = false;
protected $btIgnorePageThemeGridFrameworkContainer = true;

public function getBlockTypeDescription()
{
    return t("Easily add a grid with prebuilt templates to your site using the grid block");
}

public function getBlockTypeName()
{
    return t("Grid");
}

public function getFileObject($fID) {
    return File::getByID($fID);
}

public function getSearchableContent()
{
    $db      = Database::get();
    $rows    = $db->Execute('SELECT * FROM btGridEntries WHERE bID = ?', array($this->bID));
    $content = '';
    foreach ($rows as $row) {
        $content .= $row['title'].' ';
        $content .= $row['description'].' ';
    }
    return $content;
}

public function view()
{
    $this->set('entries', $this->getEntries());
    $this->set('block', $this->getBlockData());
    $this->addHeaderItem('<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"/>');
}

public function add()
{
    $this->requireAsset('core/file-manager');
    $this->requireAsset('core/sitemap');
    $this->requireAsset('redactor');
}

public function edit()
{
    $this->requireAsset('core/file-manager');
    $this->requireAsset('core/sitemap');
    $this->requireAsset('redactor');
    $this->set('entries', $this->getEntries());
    $this->set('block', $this->getBlockData());
}

public function composer()
{
    $this->edit();
}

public function registerViewAssets($outputContent = '')
{
    $al = \Concrete\Core\Asset\AssetList::getInstance();
    $this->requireAsset('javascript', 'jquery');
}

public function duplicate($newBID)
{
    parent::duplicate($newBID);
    $db = Database::get();
    $rows = $db->Execute('SELECT * FROM btGridEntries WHERE bID = ?', array($this->bID));
    while ($row = $rows->FetchRow()) {
        $db->execute('INSERT INTO btGridEntries (bID, thumbnailFID, fallbackFID, title, description, classList, buttonText, sortOrder, externalLinkURL, internalLinkCID, fileFID) values(?,?,?,?,?,?,?,?,?,?,?)',
            array(
                $newBID,
                $row['ENTRY_thumbnailFID'],
                $row['ENTRY_fallbackFID'],
                $row['ENTRY_title'],
                $row['ENTRY_description'],
                $row['ENTRY_classList'],
                $row['ENTRY_buttonText'],
                $row['ENTRY_sortOrder'],
                $row['ENTRY_externalLinkURL'],
                $row['ENTRY_internalLinkCID'],
                $row['ENTRY_fileFID']
            )
        );
    }
}

public function delete()
{
    $db = Database::get();
    $db->delete('btGridEntries', array('bID' => $this->bID));
    parent::delete();
}

public function save($args)
{
    $db = Database::get();
    $db->execute('DELETE from btGridEntries WHERE bID = ?', array($this->bID));
    parent::save($args);

    if (isset($args['ENTRY_sortOrder'])) {
        $count = count($args['ENTRY_sortOrder']);
        $i = 0;

        while ($i < $count) {
            $externalLinkURL = $args['ENTRY_externalLinkURL'][$i];
            $internalLinkCID = $args['ENTRY_internalLinkCID'][$i];
            $fileFID = $args['ENTRY_fileFID'][$i];
            switch (intval($args['ENTRY_linkType'][$i])) {
                case 1:
                    $externalLinkURL = '';
                    $fileFID = 0;
                    break;
                case 2:
                    $internalLinkCID = 0;
                    $fileFID = 0;
                    break;
                case 3:
                    $externalLinkURL = '';
                    $internalLinkCID = 0;
                    break;
                default:
                    $externalLinkURL = '';
                    $internalLinkCID = 0;
                    $fileFID = 0;
                    break;
            }

            if (isset($args['ENTRY_description'][$i])) {
                $args['ENTRY_description'][$i] = LinkAbstractor::translateTo($args['ENTRY_description'][$i]);
            }

            $db->execute('INSERT INTO btGridEntries (bID, thumbnailFID, fallbackFID, title, description, classList, buttonText, sortOrder, externalLinkURL, internalLinkCID, fileFID) values(?,?,?,?,?,?,?,?,?,?,?)',
                array(
                    $this->bID,
                    intval($args['ENTRY_thumbnailFID'][$i]),
                    intval($args['ENTRY_fallbackFID'][$i]),
                    $args['ENTRY_title'][$i],
                    $args['ENTRY_description'][$i],
                    $args['ENTRY_classList'][$i],
                    $args['ENTRY_buttonText'][$i],
                    $args['ENTRY_sortOrder'][$i],
                    $externalLinkURL,
                    $internalLinkCID,
                    $fileFID
                )
            );
            ++$i;
        }
    }
}

public function getBlockAssetPath() {
    $bt = BlockType::getByHandle('buckets_block');
    return Core::make('helper/concrete/urls')->getBlockTypeAssetsURL($bt);
}

public function getBlockData()
{
    $db  = Database::get();
    $row = $db->GetRow('SELECT * FROM btGrid WHERE bID = ?', array($this->bID));
    if ($row['bgFID']) {
        $row['BG'] = \File::getByID($row['bgFID'])->getVersion()->getRelativePath();
    }

    return $row;
}

public function getEntries()
{
    $v    = View::getInstance();
    $db   = Database::get();
    $rows = $db->GetAll('SELECT * FROM btGridEntries WHERE bID = ? ORDER BY sortOrder', array($this->bID));
    // in view mode, linkURL takes us to where we need to go whether it's on our site or elsewhere
    $entries = array();
    foreach ($rows as $row) {
        // Generate the URL based on what the linkType is
        if ($row['externalLinkURL'] =='' && !$row['fileFID'] && $row['internalLinkCID']) {
            $c = Page::getByID($row['internalLinkCID'], 'ACTIVE');
            $row['linkURL'] = $c->getCollectionLink();
        } elseif ($row['externalLinkURL'] =='' && !$row['internalLinkCID'] && $row['fileFID']) {
            $f = File::getByID($row['fileFID']);
            $row['linkURL'] = $f ? $f->getVersion()->getRelativePath() : '';
        } elseif ($row['externalLinkURL']!='') {
            $row['linkURL'] = $row['externalLinkURL'];
        } else {
            $row['linkURL'] = '';
        }

        // Thumbnail
        $thumbnail = $row['thumbnailFID'] ? File::getByID($row['thumbnailFID'])->getVersion()->getRelativePath() : $v->getThemePath().'/no-image.jpg';
        $row['thumbnail'] = $thumbnail;

        $fallback = $row['fallbackFID'] ? File::getByID($row['fallbackFID'])->getVersion()->getRelativePath() : $v->getThemePath().'/no-image.jpg';
        $row['fallback']    = $fallback;

        $row['description'] = LinkAbstractor::translateFrom($row['description']);
        $entries[]          = $row;
    }

    return $entries;
}

public function getClassList($string) {
    $array = explode(',',$string);
    if (count($array) > 0) {
        return implode(' ',$array);
    }
}

}

Заранее извиняюсь за довольно длинный файл;) я просто хочу убедиться, что вы видите все возможные проблемы


person Brady Edgar    schedule 01.02.2017    source источник


Ответы (1)


Я думаю, ваша проблема в том, что в дублирующей функции, как только вы получили свои результаты обратно из своего выбора, вы везде помещаете префикс ENTRY_, например, в $row['ENTRY_thumbnailFID'], когда он действительно должен быть $row['thumbnailFID'] в соответствии с вашим Скриншот

person Nour Akalay    schedule 16.10.2017