/**
  * @param ActionData $actionData
  *
  * @return void
  */
 public function run(&$actionData)
 {
     $monsterContentConfigs = [];
     foreach ($this->entities as $definition) {
         if (!isset($definition['entity'], $definition['attributes'])) {
             continue;
         }
         $entity = $definition['entity'];
         $definition['attributes'] = (array) $definition['attributes'];
         /** @var yii\base\Model $model */
         $models = ArrayHelper::getValue($actionData->entities, $entity, []);
         $model = is_object($models) ? $models : reset($models);
         if ($model === null) {
             Yii::info("Entities list: " . yii\helpers\VarDumper::dumpAsString($actionData->entities));
             Yii::info((array) ArrayHelper::getValue($actionData->entities, $entity, []));
             Yii::info("Searching for " . $entity);
             throw new \RuntimeException("Model is empty");
         }
         foreach ($definition['attributes'] as $index => $attribute) {
             $materials = $model->{$attribute};
             if (is_array($materials) || is_object($materials)) {
                 $monsterContentConfigs[] = ['materials' => $materials, 'uniqueContentId' => $model::className() . ":{$index}:" . $model->id];
             } else {
                 Yii::warning("Model attribute {$attribute} of entity {$entity} is not array or object");
             }
         }
     }
     $content = '';
     foreach ($monsterContentConfigs as $index => $config) {
         $content .= "<!-- MonsterContent::{$index} -->\n" . MonsterContent::widget($config) . "\n\n";
     }
     $actionData->content = $content;
 }
    public function testMonsterContent()
    {
        // clear cache
        FileHelper::removeDirectory(Yii::getAlias('@app/monster/templates/'));
        $out = MonsterContent::widget(['uniqueContentId' => 'site-index', 'materials' => ['foo' => ['material' => 'example.example-bundle.group1.block1']]]);
        $expected = <<<html
<div class="test"><div class="foo-tst">Hello, bar</div><ul class="nav">

            <li class="nav__item" data-recursive-item-key="0">One<ul class="nav__subnav nav__subnav_nest_1">            <li class="nav__item" data-recursive-item-key="0">1.1</li>
                        <li class="nav__item" data-recursive-item-key="1">1.2<ul class="nav__subnav nav__subnav_nest_2">            <li class="nav__item" data-recursive-item-key="0">1.2.1</li>
                        <li class="nav__item" data-recursive-item-key="1">1.2.2</li>
            </ul></li>
            </ul></li>

</ul></div>
html;
        $expected = preg_replace('/\\s+/', ' ', $expected);
        $out = preg_replace('/\\s+/', ' ', $out);
        static::assertSame($expected, $out);
    }
예제 #3
0
<?php

/** @var \yii\web\View $this */
/** @var string $url */
use DotPlant\Monster\assets\JsTreeDark;
use kartik\icons\Icon;
use yii\helpers\Json;
use yii\helpers\Url;
if (parse_url($url, PHP_URL_QUERY)) {
    $url .= '&__monster_edit_mode__=1';
} else {
    $url .= '?__monster_edit_mode__=1';
}
JsTreeDark::register($this);
Icon::map($this);
echo \DotPlant\Monster\MonsterContent::widget(['uniqueContentId' => 'visual-builder', 'materials' => [['material' => 'core.visual-builder.components.builder', 'data' => ['environments' => [['icon' => Icon::show('list-ul'), 'environment' => 'structure'], ['icon' => Icon::show('tree'), 'environment' => 'page-structure'], ['icon' => Icon::show('list-alt'), 'environment' => 'materials'], ['icon' => Icon::show('paint-brush'), 'environment' => 'customization'], ['icon' => Icon::show('link'), 'environment' => 'action']], 'url' => $url]]]]);
/** @var \DotPlant\Monster\Repository $repository */
$repository = Yii::$app->get('monsterRepository');
//! @todo Is cache needed for Repository::dataForBuilder ?
$bundles = Json::encode($repository->dataForBuilder());
$newBlockUrl = Json::encode(Url::to(['/monster/visual-builder/new-block']));
$js = <<<js
    window.VisualBuilderSettings = {
      'bundles': {$bundles},
      'new-block-url': {$newBlockUrl}
    };
    \$(function() {
      window.FrontendMonster.builder;
    });
js;
$this->registerJs($js, \yii\web\View::POS_BEGIN);
<?php

/**
 * @var \yii\web\View    $this
 * @var TemplateRegion[] $templateRegions
 * @var array            $dataByTemplateRegion
 * @var Page             $model
 */
use app\models\Page;
use DotPlant\Monster\models\TemplateRegion;
use DotPlant\Monster\MonsterContent;
use yii\helpers\ArrayHelper;
//use yii\helpers\VarDumper;
//
//VarDumper::dump($dataByTemplateRegion, 20, true);die();
foreach ($templateRegions as $region) {
    $config = ['uniqueContentId' => 'template-' . $region->template->id . '/' . $region->key, 'regionId' => $region->id, 'regionKey' => $region->key, 'regionEntityDependent' => (bool) $region->entity_dependent, 'contentDescription' => $region->name . " [{$region->key}]"];
    $materials = $region->content;
    if ($region->entity_dependent) {
        $config['uniqueContentId'] = $model->uniqueContentIdPrefix() . '/' . $region->key;
        if (isset($model->content[$region->key])) {
            $materials = $model->content[$region->key];
        }
    }
    $config['data'] = ArrayHelper::getValue($dataByTemplateRegion, $region->key, []);
    $config['materials'] = $materials;
    echo MonsterContent::widget($config);
}
예제 #5
0
    public function testConditions()
    {
        $this->clearCache();
        $dataTrue = ['fooRegion' => ['foo' => 'bar', 'bar' => 'bar']];
        $dataFalse = ['fooRegion' => ['foo' => 'fasdgfalsdf', 'bar' => 'bar']];
        $testMaterial = ['fooRegion' => ['material' => 'example.example-bundle.group1.conditions1']];
        $out = MonsterContent::widget(['uniqueContentId' => 'conditionsTest', 'data' => $dataTrue, 'materials' => $testMaterial]);
        $expected = <<<html
<div class="test">
<div class="test__true">OK</div>
</div>
html;
        static::assertSame($this->trimSpaces($expected), $this->trimSpaces($out));
        $out = MonsterContent::widget(['uniqueContentId' => 'conditionsTest', 'data' => $dataFalse, 'materials' => $testMaterial]);
        $expected = <<<html
<div class="test">
<div class="test__false">not ok</div>
</div>
html;
        static::assertSame($this->trimSpaces($expected), $this->trimSpaces($out));
    }