layout builder replace panel page?

it takes too much time to follow and learn what’s going on with the new function. for this layout builder, I just want to know if its the replacement of the D7 panel page? 

at the moment, I can see the layout builder showing on the content type display section. but I don’t see it can create whatever pages like the way what panel page does in D7 ? there is no detail instruction for how this function going on. 

Please advise, if I want the function like D7 panel page to create a landing page with drap-drop to add the block and views in. show I use layout builder or I should stay with panel page 8 ? but in the panel page 8, I don’t see a flexible layout function there yet. 

Please advise. Thank you.

SEO link builder and guest post blogger

Hey all,

I have some keywords from my webmaster tools report that I would like to rank.

I am an SEO guy myself i evern run a website about it but i seriously do not have the time to go find blogs and to write content for them to get a back link, this is why i am looking for an SEO guy.

I want to spend about $ 200 USD a month, for about 6 months or so to rank some inner pages on my ecommerce site.

My site is also sells adult related bedroom only toys for couples if you know what i mean so…

SEO link builder and guest post blogger

Create programmatically a product attribute editable with Page Builder

i need to programmatically create a bunch of custom product attributes, some editable with Page Builder. So i followed https://devdocs.magento.com/page-builder/docs/how-to/how-to-use-pagebuilder-for-product-attributes.html

First of all, i developed a custom module and created my custom attributes via Setup script. For instance, nota_cata has to be editable with PageBuilder:

'nota_cata' => [ 'type' => 'text', 'backend' => '', 'frontend' => '', 'label' => 'Nota de cata', 'input' => 'textarea', 'class' => '', 'source' => '', 'global' => \Magento\Catalog\Model\ResourceModel\Eav\Attribute::SCOPE_STORE, 'visible' => true, 'required' => false, 'user_defined' => true, 'default' => '', 'searchable' => false, 'filterable' => false, 'comparable' => false, 'visible_on_front' => true, 'used_in_product_listing' => false, 'unique' => false, 'apply_to' => 'simple,grouped,configurable,downloadable,virtual,bundle', 'attribute_set_id' => self::ATTR_SET, 'group' => '', 'source' => '', ]

Next, i created app/code/Vendor/Module/view/adminhtml/ui_component/product_form.xml file to change my attribute input to Page Builder:

<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">     <fieldset name="drinks">         <argument name="data" xsi:type="array">             <item name="config" xsi:type="array">                 <item name="label" xsi:type="string" translate="true">Drinks</item>                 <item name="sortOrder" xsi:type="number">100</item>             </item>          </argument>          <field name="nota_cata">             <argument name="data" xsi:type="array">                 <item name="config" xsi:type="array">                     <item name="required" xsi:type="boolean">false</item>                     <item name="validation" xsi:type="array">                         <item name="required-entry" xsi:type="boolean">false</item>                     </item>                     <item name="class" xsi:type="string">Magento\Catalog\Ui\Component\Category\Form\Element\Wysiwyg</item>                     <item name="formElement" xsi:type="string">wysiwyg</item>                     <item name="label" translate="true" xsi:type="string">Nota de Cata</item>                     <item name="wysiwygConfigData" xsi:type="array">                         <item name="is_pagebuilder_enabled" xsi:type="boolean">true</item>                         <item name="pagebuilder_button" xsi:type="boolean">true</item>                     </item>                     <item name="template" xsi:type="string">ui/form/field</item>                     <item name="source" xsi:type="string">product</item>                     <item name="wysiwyg" xsi:type="boolean">true</item>                     <item name="dataScope" xsi:type="string">nota_cata</item>                     <item name="sortOrder" xsi:type="number">60</item>                     <item name="rows" xsi:type="number">8</item>                 </item>             </argument>         </field>     </fieldset> </form> 

But i get this in backend product form:

enter image description here

There’s not only a pagebuilder button as expected, but also a text area with my attribute info. Both fields show attribute current data and change its value.

How can i make that only pagebuilder link is shown in frontend?

Any help will be appreciated. Thanks in advance, Antonio

Layout builder “edit layout” form missing revision log message field

When I edit the layout for a given node it is missing a log message field in the revision area. Is anybody else seeing this or am I alone? In trying to diagnose:

  • Where that particular revision log field would be defined to check if it’s defined at all. If it’s not then this is probably a core bug that should be addressed.
  • If it does exist, where this particular form is defined to make sure that the revision log field is actually being included in the form definition.

Any insights on the above? I’m using the lightning distribution, so it’s possible that there’s some sort of override going on there, but I figured I should be checking in core first just in case.

enter image description here

What is the underlying logic for generating an icon map for a custom registered layout (in Layout Builder)?

There seems to be a dearth of information on the internet about how to generate an icon_map for newly registered layouts in Layout Builder.

I’ve gotten as far as finding a patch file from the project that includes a poorly-documented comment that unfortunately doesn’t shed much light on this:

/**  * Builds a render array representation of an SVG based on an icon map.  *  * @param string[][] $  icon_map  *   A two-dimensional array representing the visual output of the layout.  *   For the following shape:  *   |------------------------------|  *   |                              |  *   |             100%             |  *   |                              |  *   |-------|--------------|-------|  *   |       |              |       |  *   |       |      50%     |  25%  |  *   |       |              |       |  *   |  25%  |--------------|-------|  *   |       |                      |  *   |       |         75%          |  *   |       |                      |  *   |------------------------------|  *   The corresponding array would be:  *   - ['top']  *   - ['first', 'second', 'second', 'third']  *   - ['first', 'bottom', 'bottom', 'bottom'].  ... 

It doesn’t say why we’d use keywords like first, third, and bottom — or even what each term actually means to the Layout Builder module. There doesn’t seem to be any rhyme or reason as to how this is supposed to work. The documentation is also severely lacking.

What is the underlying logic behind the generation of icon maps, and how does it actually work?

Service decorator for entity list builder?

Is it possible to use a service decorator, or similar mechanism, to override a method in an entity’s list builder?

For my specific use case, I want to override the render() method of the Drupal\webform\WebformSubmisionListBuilder class, which is the list builder for the Drupal\webform\Entity\WebformSubmission entity. I’d prefer to not have to replace the list builder class entirely.

I did come across this post, but it doesn’t seem to provide a solution to my use case. I also didn’t fully comprehend the information in the post, so I might have missed the solution.

Designing a builder as a compile-time state machine

I’m working on a text GUI library which comes with builders for UI components (Buttons, Panels, etc). I have a base class for these builders which I’d like to redesign so that meaningless component states can’t be represented with the builder. Right now the API looks like this (over simplified):

interface ComponentBuilder<T : Component, U : ComponentBuilder<T, U>> : Builder<T> {      // aligns a component within a grid (only if it is not positioned directly)     fun withAlignmentWithin(tileGrid: TileGrid, componentAlignment: ComponentAlignment): U      // sets the position of a component directly (only if it is not aligned     fun withPosition(x: Int, y: Int): U      // sets the title of a component (only applicable if it is wrapped in a box)     fun withTitle(title: String): U      // defines the type of box we use for decorating the component with     fun withBoxType(boxType: BoxType): U      // wraps the component with a box (only if no decoration renderers are set)     fun wrapWithBox(): U      // wraps the component with a shadow (only if no decoration renderers are set)     fun wrapWithShadow(): U      // sets the given decoration renderers (only if we dont use box/shadow wrapping)     fun withDecorationRenderers(vararg renderers: ComponentDecorationRenderer): U } 

and it can be used like this:

Components.panel()         .withSize(10, 10)         .withPosition(5, 5)         .wrapWithBox()         .wrapWithShadow()         .withTitle("Test")         .withBoxType(BoxType.SINGLE)         .build() 

and the result looks like this:

example image here

The problem is that the builder can get into a meaningless state like this:

Components.panel()         .withTitle("Test") // meaningless, we have no box         .withBoxType(BoxType.SINGLE) // same as above         .build() 

The problem is that the builder is supposed to be a state machine where some of the methods above can be an initial state, but when I move into one of those states it determines where I can go from there (for example I should only see title/box type if I moved into the wrap with box state first.

I tried to write a prototype for this but I realized that this leads into a combinatorial complexity boom:

interface ComponentBuilder<T : Component, U : ComponentBuilder<T, U>> : Builder<T> {      fun withAlignmentWithin(tileGrid: TileGrid, componentAlignment: ComponentAlignment): AlignedComponentBuilder<T, U>      fun withPosition(x: Int, y: Int): PositionedComponentBuilder<T, U>      fun withDecorationRenderers(vararg renderers: ComponentDecorationRenderer): DecoratedComponentBuilder<T, U>      fun wrapWithBox(wrapWithBox: Boolean = true): WrappedComponentBuilder<T, U>      fun wrapWithShadow(wrapWithShadow: Boolean = true): WrappedComponentBuilder<T, U> }  interface DecoratedComponentBuilder<T : Component, U : ComponentBuilder<T, U>> : Builder<T> {      fun withAlignmentWithin(tileGrid: TileGrid, componentAlignment: ComponentAlignment): AlignedDecoratedComponentBuilder<T, U>      fun withPosition(x: Int, y: Int): PositionedDecoratedComponentBuilder<T, U>      fun withDecorationRenderers(vararg renderers: ComponentDecorationRenderer): DecoratedComponentBuilder<T, U> }  interface AlignedDecoratedComponentBuilder<T : Component, U : ComponentBuilder<T, U>> : Builder<T> {      fun withAlignmentWithin(tileGrid: TileGrid, componentAlignment: ComponentAlignment): AlignedDecoratedComponentBuilder<T, U>      fun withDecorationRenderers(vararg renderers: ComponentDecorationRenderer): AlignedDecoratedComponentBuilder<T, U> }  interface WrappedComponentBuilder<T : Component, U : ComponentBuilder<T, U>> : Builder<T> {      fun withAlignmentWithin(tileGrid: TileGrid, componentAlignment: ComponentAlignment): WrappedAlignedComponentBuilder<T, U>      fun withPosition(x: Int, y: Int): WrappedPositionedComponentBuilder<T, U>      fun withTitle(title: String): WrappedComponentBuilder<T, U>      fun withBoxType(boxType: BoxType): WrappedComponentBuilder<T, U>      fun wrapWithShadow(wrapWithShadow: Boolean = true): WrappedComponentBuilder<T, U> }  interface AlignedComponentBuilder<T : Component, U : ComponentBuilder<T, U>> : Builder<T> {      fun withDecorationRenderers(vararg renderers: ComponentDecorationRenderer): U      fun wrapWithBox(wrapWithBox: Boolean = true): WrappedComponentBuilder<T, U>      fun wrapWithShadow(wrapWithShadow: Boolean = true): WrappedComponentBuilder<T, U> }  interface PositionedComponentBuilder<T : Component, U : ComponentBuilder<T, U>> : Builder<T> {      fun withDecorationRenderers(vararg renderers: ComponentDecorationRenderer): PositionedDecoratedComponentBuilder<T, U>      fun wrapWithBox(wrapWithBox: Boolean = true): WrappedPositionedComponentBuilder<T, U>      fun wrapWithShadow(wrapWithShadow: Boolean = true): WrappedPositionedComponentBuilder<T, U> }  interface PositionedDecoratedComponentBuilder<T : Component, U : ComponentBuilder<T, U>> : Builder<T> {      fun withDecorationRenderers(vararg renderers: ComponentDecorationRenderer): PositionedDecoratedComponentBuilder<T, U>  }  interface WrappedPositionedComponentBuilder<T : Component, U : ComponentBuilder<T, U>> : Builder<T> {      fun withTitle(title: String): WrappedPositionedComponentBuilder<T, U>      fun withBoxType(boxType: BoxType): WrappedPositionedComponentBuilder<T, U>      fun wrapWithShadow(wrapWithShadow: Boolean = true): WrappedPositionedComponentBuilder<T, U> }  interface WrappedAlignedComponentBuilder<T : Component, U : ComponentBuilder<T, U>> : Builder<T> {      fun withAlignmentWithin(tileGrid: TileGrid, componentAlignment: ComponentAlignment): WrappedAlignedComponentBuilder<T, U>      fun withTitle(title: String): U      fun withBoxType(boxType: BoxType): U      fun wrapWithShadow(wrapWithShadow: Boolean = true): U } 

My question is: how can I write a builder API which retains its integrity but avoids the complexity boom above? I might add some other options later so it needs to be scalable.

I’m working with Kotlin so any answer should be within the bounds of what’s possible with Java and/or Kotlin.