Ability to provide configuration for different environments in app/etc/local.xml #7

Closed
mzeis opened this Issue Mar 15, 2012 · 18 comments

Projects

None yet

5 participants

@mzeis

My proposed story for the backlog

Provide configuration for different environments in app/etc/local.xml
"As a Magento developer, I want to be able to define different configuration settings for different environments in app/etc/local.xml."

Acceptance criteria:

  • Defining important settings like database connection, cache backends and session handling for different environments in one XML file
  • Extending from other environment sections so only changes have to be specified
  • The environment to be used is defined by SetEnv

Reasoning behind this

In Magento 1, developers have to make sure that app/etc/local.xml doesn't get copied from test / staging servers to production servers because this would break the live system in most cases. app/etc/local.xml has to be excluded from versioning and/or deployment process which is error-prone.

In Magento 2, developers should be able to keep one configuration file and trigger which part of the configuration is used. I don't believe this has to be very fine-grained. In my experience the most common scenarios are different database, caching and session settings.

Nowadays, many frameworks provide the functionality to define setting for different environments in one or more configuration file(s) and load the settings corresponding to a variable set by SetEnv or similar.
The community and the Magento 2 team would have to decide on the concrete implementation but I think this is a good thing (tm).

References:

@Vinai

This is a good idea, I second that. Probably would be much easier (and less complex) to implement using different, additional, app/etc/local.xml files, then building a more complex merging of sections from one single file.

@mzeis

@Vinai You are right, this would be easier. Do you have a suggestion how inheritance could be provided (e.g. if only small parts of the app/etc/local.xml files are different)?

@Vinai

The simplest solution that comes to my mind to pick up your suggestion and add an ENV variable that specifies a additional local.xml file to be merged with the base local.xml, for example

$_SERVER['MAGE_ENV'] = "dev-vinai";
Merged local.xml files:
app/etc/local.xml
app/etc/local-dev-vinai.xml

$_SERVER['MAGE_ENV'] = "live";
Merged local.xml files:
app/etc/local.xml
app/etc/local-live.xml

@mzeis

I guess a one-level inheritance would be good enough in most cases - should be the best trade-off between simplicity and flexibility.

@jigneshthummar

Good idea..

@magento-team

Great proposition, @mzeis !
You can implement the solution and we add it to Magento 2 repository.
Our ACs are following:

  • define environment config options in separate config files, one config file per environment (@Vinai's idea)
  • concrete environment config file is loaded depending on environment variable
  • all config files in app/etc are loaded and merged as it is now
  • environment config file has the highest priority, so it should be loaded after all config files
  • all changes are covered with tests

As you can see, extending environment configuration is not included in ACs list.
Currently all *.xml configs are merged, so there is ability to define some global options and merge local options with them. Looks like it should be enough.
Could you please give some real examples, when it's necessary to merge options from different environment configs?

@magento-team magento-team reopened this Apr 12, 2012
@Vinai

Have you currently got resources to implement this, @mzeis?

@speedupmate

Setting up server variables and stuff will not be much different than changing the local.xml file for each environment from CI point of view as it still depends on making a separate configuration file or setting somewhere in your CI deployment scripts. And this affects all the files that might be different for different environments (not just local.xml but .htaccess and flag files)

On this level you can make Magento just include one of the "prefix_"local.xml or local"_suffix".xml (like code pool does a fallback) file and be done with it and your deployment script just injects the right file to your environment as most CI tools are designed to differ configuration files. File naming in this context is just for ease of distinguishing the configuration file when looking at some filesystem later when it is deployed.

Note that keeping multiple access configurations within one installation might become a security risk too (if staging keeps live credentials and vice versa).

@Vinai

Agreed, but note that by far not all Magento deployments utilize CI. In many (smaller) cases simpler deployment strategies are used.

@speedupmate

This should apply for simpler strategies as well (and the security risks are the same). Making a "code pool" approach to local.xml like config files would follow the patterns used with other xml config files and would make distinction of environment prefixed/suffixed files more understandable for dev's with different knowledge.

There are also other naming possibilities to solve this. Naming configuration files by hostname , subfolder name (think of most used setups that are used by devs) stage_whatever_com_local.xml , www_whatever_com_local.xml. If such implementation is given a good thought before implementing then it would not need additional settings to be set (either server variables or flag files)

In my opinion the offered solution here is a bit "over thinking" as it will make one more thing to learn and coupling it with server variables makes it more abstract than needed. Different approaches are already used and existing in Magento to do the similar things (server variables, flag files for maintenance and compilation mode). In other words it does not solve the need for different config options in any way and thus won't ease the setup for those who don't use CI and does not have real value for those who use CI

@Vinai

In years of work with different clients I have almost never experienced two identical directory structures for development andor deployment, so I believe depending on the filesystem hierarchy is not a suitable approach.
The same goes for the hostname, since most multi-website Magento instances use many hostnames, but the same database, that is local.xml file.

Magento already uses environment variables to set up the application (see MAGE_RUN_TYPE, MAGE_RUN_CODE and MAGE_IS_DEVELOPER_MODE), so building on the same approach makes sense, as it is a known paradigm for a Magento developer.

Magento 2 does introduce a more "convention-over-configuration" approach, but still is basically a configuration based framework.

For this reasons I still believe the first, environment based configuration approach is the most suitable.

The concrete implementation how an additional local.xml files are named (for example filename-prefixes, -sufixes or subdirectories) makes no real difference to me.

@mzeis

@mage2-team:
Thanks for your response. I agree that merging of xml files should be enough for 99% of the projects. Real examples would be projects that require more complex settings than the usual webshop (which uses one database and normal one-level or two-level caches). If you want to keep the whole configuration for the shop in your Magento local.xml file, you can keep things tidy and neat. But you don't necessarily need the initially proposed extension capability.

@Vinai and @speedupmate:
I won't heave resources in the next few weeks, maybe afterwards.

I agree that this can be handled by the build process / CI but there should be the possibilty to do this in a clean way using just Magento. This will help many smaller projects which want to follow best practices and have a development project but don't have the budget or knowledge to setup the needed processes.

I prefer the approach of environment variables shown by Vinai. Magento developers know them. You can set environment variables in vhost settings, so you don't have to change .htaccess on a per-environment basis. You can define the filename so you not only can configure for different environments but also do some quick tests without editing files or starting the build process again.

The compiler gets removed by Magento 2.x so we are left with one flag file for maintenance. There are many reasons for and against using a flag file. I personally don't care too much about this and won't get into that now.

@speedupmate

I did some additional research on this over the weekend , code pool and fallback for config files is not such a good idea after all as accidents can happen if not handled properly (imagine dev box fallback accidentally to live db and vice versa). Therefore sever variable for this can be used if properly documented however as I'm used to CI then i'll probably find no use for this.

@magento-team

@mzeis
Ok, let's keep this discussion open, while you're coming up with a pull request.

@magento-team

Hi @mzeis,

as 2 months have passed from your last answer, then we decided to close this ticket. The story is valuable, thus we moved it to our backlog for further implementation.

Thank you for the good proposal.

@mzeis

Hi Magento team,
sorry I don't have time for the implementation at the moment. Thank you very much for putting the story to your backlog.

@Vinai

I've implemented it in my branch, but haven't had the time to create any tests, so I haven't sent a pull request yet. So just FYI, if you are interested: Vinai@ca1172a

@Vinai

For additional reference: issue from SunshineTech resolved and pull request sent: #41

This was referenced Feb 13, 2013
@magento-team magento-team pushed a commit that referenced this issue May 8, 2015
@cpartica cpartica MAGETWO-18815: code review #7 8a8286c
@navarr navarr added a commit to navarr/magento2 that referenced this issue Nov 4, 2015
@navarr navarr Remove bad type hint from ProductLinkManagementInterface
Upon adding my own API calls, SOAP started throwing an error.  Disabling my own modules, and in fact deleting their code, clearing caches and the generation file resulted in that error still being thrown.  Removing this array fixes the issue.

Class "array[]" does not exist. Please note that namespace must be specified.
#0 /var/www/capstone/app/code/Magento/Webapi/Model/Soap/Config/ClassReflector.php(91): Magento\Framework\Reflection\TypeProcessor->register('array[]')
#1 /var/www/capstone/app/code/Magento/Webapi/Model/Soap/Config/ClassReflector.php(72): Magento\Webapi\Model\Soap\Config\ClassReflector->extractMethodData(Object(Zend\Code\Reflection\MethodReflection))
#2 /var/www/capstone/app/code/Magento/Webapi/Model/Soap/Config.php(181): Magento\Webapi\Model\Soap\Config\ClassReflector->reflectClassMethods('Magento\\Catalog...', Array)
#3 /var/www/capstone/app/code/Magento/Webapi/Model/Soap/Config.php(101): Magento\Webapi\Model\Soap\Config->initServicesMetadata()
#4 /var/www/capstone/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php(107): Magento\Webapi\Model\Soap\Config->__construct(Object(Magento\Framework\ObjectManager\ObjectManager), Object(Magento\Framework\Filesystem), Object(Magento\Webapi\Model\Config), Object(Magento\Webapi\Model\Soap\Config\ClassReflector), Object(Magento\Framework\App\Cache\Type\Webapi), Object(Magento\Framework\Registry))
#5 /var/www/capstone/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php(91): Magento\Framework\ObjectManager\Factory\AbstractFactory->createObject('Magento\\Webapi\\...', Array)
#6 /var/www/capstone/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php(71): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create('Magento\\Webapi\\...')
#7 /var/www/capstone/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php(236): Magento\Framework\ObjectManager\ObjectManager->get('Magento\\Webapi\\...')
#8 /var/www/capstone/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php(53): Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument(Array, 'Magento\\Webapi\\...', NULL, 'apiConfig', 'Magento\\Webapi\\...')
#9 /var/www/capstone/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php(84): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments('Magento\\Webapi\\...', Array, Array)
#10 /var/www/capstone/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php(71): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create('Magento\\Webapi\\...')
#11 /var/www/capstone/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php(236): Magento\Framework\ObjectManager\ObjectManager->get('Magento\\Webapi\\...')
#12 /var/www/capstone/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php(53): Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument(Array, 'Magento\\Webapi\\...', NULL, 'wsdlGenerator', 'Magento\\Webapi\\...')
#13 /var/www/capstone/lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php(84): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments('Magento\\Webapi\\...', Array, Array)
#14 /var/www/capstone/lib/internal/Magento/Framework/ObjectManager/ObjectManager.php(71): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create('Magento\\Webapi\\...')
#15 /var/www/capstone/lib/internal/Magento/Framework/App/Http.php(114): Magento\Framework\ObjectManager\ObjectManager->get('Magento\\Framewo...')
#16 /var/www/capstone/lib/internal/Magento/Framework/App/Bootstrap.php(257): Magento\Framework\App\Http->launch()
#17 /var/www/capstone/index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http))
#18 {main}
431a746
This was referenced Nov 20, 2015
@flancer64 flancer64 added a commit to flancer64/magento2 that referenced this issue Aug 10, 2016
@flancer64 flancer64 Virtual classes cannot be loaded on validation
There is an error "Source class "\Magento\CatalogSearch\Model\ResourceModel\Fulltext\SearchCollection" for "Magento\CatalogSearch\Model\ResourceModel\Fulltext\SearchCollectionFactory" generation does not exist." for URL like ".../index.php/catalogsearch/result/?q=prod" if plugin for factory class exists:

    <!-- Interceptor to get error with full-text search -->
    <type name="Magento\Catalog\Model\ResourceModel\Product\CollectionFactory">
        <plugin name="flancer32_sample_plugin" type="Flancer32\Sample\Plugin\Catalog\Model\ResourceModel\Product\CollectionFactory" sortOrder="100" disabled="false"/>
    </type>

This is an error message:

	Exception #0 (RuntimeException): Source class "\Magento\CatalogSearch\Model\ResourceModel\Fulltext\SearchCollection" for "Magento\CatalogSearch\Model\ResourceModel\Fulltext\SearchCollectionFactory" generation does not exist.
	#0 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/Code/Generator.php(112): Magento\Framework\Code\Generator->tryToLoadSourceClass('Magento\\Catalog...', Object(Magento\Framework\ObjectManager\Code\Generator\Factory))
	#1 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/Code/Generator/Autoloader.php(35): Magento\Framework\Code\Generator->generateClass('Magento\\Catalog...')
	#2 [internal function]: Magento\Framework\Code\Generator\Autoloader->load('Magento\\Catalog...')
	#3 [internal function]: spl_autoload_call('Magento\\Catalog...')
	#4 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/InterceptableValidator.php(44): is_subclass_of('Magento\\Catalog...', '\\\\Magento\\Frame...', true)
	#5 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/InterceptableValidator.php(16): Magento\Framework\ObjectManager\InterceptableValidator->isInterceptable('Magento\\Catalog...')
	#6 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/Interception/ObjectManager/Config/Developer.php(62): Magento\Framework\ObjectManager\InterceptableValidator->validate('Magento\\Catalog...')
	#7 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php(70): Magento\Framework\Interception\ObjectManager\Config\Developer->getInstanceType('Magento\\Catalog...')
	#8 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/ObjectManager.php(71): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create('Magento\\Catalog...')
	#9 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php(126): Magento\Framework\ObjectManager\ObjectManager->get('Magento\\Catalog...')
	#10 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php(53): Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument(Array, 'Magento\\Catalog...', NULL, 'collectionFacto...', 'Magento\\Catalog...')
	#11 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php(82): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments('Magento\\Catalog...', Array, Array)
	#12 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/ObjectManager.php(71): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create('Magento\\Catalog...')
	#13 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php(126): Magento\Framework\ObjectManager\ObjectManager->get('Magento\\Catalog...')
	#14 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php(53): Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument(Array, 'Magento\\Catalog...', NULL, 'collectionProvi...', 'Magento\\Catalog...')
	#15 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php(82): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments('Magento\\Catalog...', Array, Array)
	#16 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/ObjectManager.php(71): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create('Magento\\Catalog...')
	#17 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php(126): Magento\Framework\ObjectManager\ObjectManager->get('Magento\\Catalog...')
	#18 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php(53): Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument(Array, 'Magento\\Catalog...', NULL, 'context', 'Magento\\Catalog...')
	#19 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php(82): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->_resolveArguments('Magento\\Catalog...', Array, Array)
	#20 /home/alex/work/github/sample_mage2_module/work/vendor/magento/framework/ObjectManager/ObjectManager.php(57): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create('Magento\\Catalog...', Array)
	#21 /home/alex/work/github/sample_mage2_module/work/vendor/magento/module-catalog/Model/Layer/Resolver.php(59): Magento\Framework\ObjectManager\ObjectManager->create('Magento\\Catalog...')
	#22 /home/alex/work/github/sample_mage2_module/work/vendor/magento/module-catalog-search/Controller/Result/Index.php(70): Magento\Catalog\Model\Layer\Resolver->create('search')
7166abc
@NikolasSumrak NikolasSumrak added a commit to NikolasSumrak/magento2 that referenced this issue Aug 30, 2016
@NikolasSumrak NikolasSumrak Fix for Product Attribute's Conditions
Fix for Product Attribute's Conditions if attribute option is deleted.

Description bug:
1. Create new cart rule or edit existing.
2. Add condition with multiselect product attribute (ex. attr activity in magento2+sample data)
3. Choose one option of attribute in condition and save rule
4. Delete this option in Stores->Product attributes
5. Reload Cart Rule Page in admin

1 exception(s):
Exception #0 (Exception): Warning: iconv_strlen() expects parameter 1 to be string, array given in /var/www/sources/sumrak/dev21/vendor/magento/framework/Stdlib/StringUtils.php on line 151

Exception #0 (Exception): Warning: iconv_strlen() expects parameter 1 to be string, array given in /var/www/sources/sumrak/dev21/vendor/magento/framework/Stdlib/StringUtils.php on line 151
#0 [internal function]: Magento\Framework\App\ErrorHandler->handler(2, 'iconv_strlen() ...', '/var/www/source...', 151, Array)
#1 /var/www/sources/sumrak/dev21/vendor/magento/framework/Stdlib/StringUtils.php(151): iconv_strlen(Array, 'UTF-8')
#2 /var/www/sources/sumrak/dev21/vendor/magento/framework/Filter/Truncate.php(76): Magento\Framework\Stdlib\StringUtils->strlen(Array)
#3 /var/www/sources/sumrak/dev21/vendor/magento/framework/Filter/FilterManager.php(133): Magento\Framework\Filter\Truncate->filter(Array)
#4 /var/www/sources/sumrak/dev21/vendor/magento/module-rule/Block/Editable.php(74): Magento\Framework\Filter\FilterManager->__call('truncate', Array)
#5 /var/www/sources/sumrak/dev21/vendor/magento/module-rule/Block/Editable.php(74): Magento\Framework\Filter\FilterManager->truncate(Array, Array)
#6 /var/www/sources/sumrak/dev21/vendor/magento/framework/Data/Form/Element/AbstractElement.php(453): Magento\Rule\Block\Editable->render(Object(Magento\Framework\Data\Form\Element\Multiselect))
#7 /var/www/sources/sumrak/dev21/vendor/magento/module-rule/Model/Condition/AbstractCondition.php(649): Magento\Framework\Data\Form\Element\AbstractElement->getHtml()
#8 /var/www/sources/sumrak/dev21/vendor/magento/module-rule/Model/Condition/AbstractCondition.php(477): Magento\Rule\Model\Condition\AbstractCondition->getValueElementHtml()
#9 /var/www/sources/sumrak/dev21/vendor/magento/module-rule/Model/Condition/AbstractCondition.php(488): Magento\Rule\Model\Condition\AbstractCondition->asHtml()
#10 /var/www/sources/sumrak/dev21/vendor/magento/module-rule/Model/Condition/Combine.php(292): Magento\Rule\Model\Condition\AbstractCondition->asHtmlRecursive()
#11 /var/www/sources/sumrak/dev21/vendor/magento/module-rule/Model/Condition/Combine.php(292): Magento\Rule\Model\Condition\Combine->asHtmlRecursive()
#12 /var/www/sources/sumrak/dev21/vendor/magento/module-rule/Block/Conditions.php(19): Magento\Rule\Model\Condition\Combine->asHtmlRecursive()
#13 /var/www/sources/sumrak/dev21/vendor/magento/framework/Data/Form/Element/AbstractElement.php(453): Magento\Rule\Block\Conditions->render(Object(Magento\Framework\Data\Form\Element\Text))
#14 /var/www/sources/sumrak/dev21/vendor/magento/framework/Data/Form/Element/Text.php(43): Magento\Framework\Data\Form\Element\AbstractElement->getHtml()
#15 /var/www/sources/sumrak/dev21/vendor/magento/framework/Data/Form/Element/AbstractElement.php(467): Magento\Framework\Data\Form\Element\Text->getHtml()
#16 /var/www/sources/sumrak/dev21/vendor/magento/framework/Data/Form/Element/Fieldset.php(229): Magento\Framework\Data\Form\Element\AbstractElement->toHtml()
#17 /var/www/sources/sumrak/dev21/vendor/magento/framework/Data/Form/Element/Fieldset.php(80): Magento\Framework\Data\Form\Element\Fieldset->_elementsToHtml(Array)
#18 /var/www/sources/sumrak/dev21/vendor/magento/module-catalog-rule/view/adminhtml/templates/promo/fieldset.phtml(23): Magento\Framework\Data\Form\Element\Fieldset->getChildrenHtml()
#19 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/TemplateEngine/Php.php(59): include('/var/www/source...')
#20 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Element/Template.php(255): Magento\Framework\View\TemplateEngine\Php->render(Object(Magento\Backend\Block\Widget\Form\Renderer\Fieldset), '/var/www/source...', Array)
#21 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Element/Template.php(279): Magento\Framework\View\Element\Template->fetchView('/var/www/source...')
#22 /var/www/sources/sumrak/dev21/vendor/magento/module-backend/Block/Template.php(104): Magento\Framework\View\Element\Template->_toHtml()
#23 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Element/AbstractBlock.php(659): Magento\Backend\Block\Template->_toHtml()
#24 /var/www/sources/sumrak/dev21/vendor/magento/module-backend/Block/Widget/Form/Renderer/Fieldset.php(45): Magento\Framework\View\Element\AbstractBlock->toHtml()
#25 /var/www/sources/sumrak/dev21/vendor/magento/framework/Data/Form/Element/AbstractElement.php(453): Magento\Backend\Block\Widget\Form\Renderer\Fieldset->render(Object(Magento\Framework\Data\Form\Element\Fieldset))
#26 /var/www/sources/sumrak/dev21/vendor/magento/framework/Data/Form/Element/AbstractElement.php(467): Magento\Framework\Data\Form\Element\AbstractElement->getHtml()
#27 /var/www/sources/sumrak/dev21/vendor/magento/framework/Data/Form.php(322): Magento\Framework\Data\Form\Element\AbstractElement->toHtml()
#28 /var/www/sources/sumrak/dev21/vendor/magento/framework/Data/Form.php(337): Magento\Framework\Data\Form->toHtml()
#29 /var/www/sources/sumrak/dev21/vendor/magento/module-backend/Block/Widget/Form.php(98): Magento\Framework\Data\Form->getHtml()
#30 /var/www/sources/sumrak/dev21/vendor/magento/module-backend/view/adminhtml/templates/widget/form.phtml(15): Magento\Backend\Block\Widget\Form->getFormHtml()
#31 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/TemplateEngine/Php.php(59): include('/var/www/source...')
#32 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Element/Template.php(255): Magento\Framework\View\TemplateEngine\Php->render(Object(Magento\SalesRule\Block\Adminhtml\Promo\Quote\Edit\Tab\Conditions), '/var/www/source...', Array)
#33 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Element/Template.php(279): Magento\Framework\View\Element\Template->fetchView('/var/www/source...')
#34 /var/www/sources/sumrak/dev21/vendor/magento/module-backend/Block/Template.php(104): Magento\Framework\View\Element\Template->_toHtml()
#35 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Element/AbstractBlock.php(659): Magento\Backend\Block\Template->_toHtml()
#36 /var/www/sources/sumrak/dev21/vendor/magento/module-ui/Component/HtmlContent.php(50): Magento\Framework\View\Element\AbstractBlock->toHtml()
#37 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout/Generator/UiComponent.php(148): Magento\Ui\Component\HtmlContent->prepare()
#38 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout/Generator/UiComponent.php(145): Magento\Framework\View\Layout\Generator\UiComponent->prepareComponent(Object(Magento\Ui\Component\HtmlContent))
#39 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout/Generator/UiComponent.php(145): Magento\Framework\View\Layout\Generator\UiComponent->prepareComponent(Object(Magento\Ui\Component\Container))
#40 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout/Generator/UiComponent.php(145): Magento\Framework\View\Layout\Generator\UiComponent->prepareComponent(Object(Magento\Ui\Component\Form\Fieldset))
#41 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout/Generator/UiComponent.php(126): Magento\Framework\View\Layout\Generator\UiComponent->prepareComponent(Object(Magento\Ui\Component\Form))
#42 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout/Generator/UiComponent.php(93): Magento\Framework\View\Layout\Generator\UiComponent->generateComponent(Object(Magento\Framework\View\Layout\Data\Structure), 'sales_rule_form', Array, Object(Magento\Framework\View\Layout\Interceptor))
#43 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout/GeneratorPool.php(86): Magento\Framework\View\Layout\Generator\UiComponent->process(Object(Magento\Framework\View\Layout\Reader\Context), Object(Magento\Framework\View\Layout\Generator\Context))
#44 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout.php(327): Magento\Framework\View\Layout\GeneratorPool->process(Object(Magento\Framework\View\Layout\Reader\Context), Object(Magento\Framework\View\Layout\Generator\Context))
#45 /var/www/sources/sumrak/dev21/var/generation/Magento/Framework/View/Layout/Interceptor.php(89): Magento\Framework\View\Layout->generateElements()
#46 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout/Builder.php(129): Magento\Framework\View\Layout\Interceptor->generateElements()
#47 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Page/Builder.php(55): Magento\Framework\View\Layout\Builder->generateLayoutBlocks()
#48 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout/Builder.php(65): Magento\Framework\View\Page\Builder->generateLayoutBlocks()
#49 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout.php(244): Magento\Framework\View\Layout\Builder->build()
#50 /var/www/sources/sumrak/dev21/vendor/magento/framework/View/Layout.php(859): Magento\Framework\View\Layout->build()
#51 /var/www/sources/sumrak/dev21/var/generation/Magento/Framework/View/Layout/Interceptor.php(414): Magento\Framework\View\Layout->getBlock('promo_sales_rul...')
#52 /var/www/sources/sumrak/dev21/vendor/magento/module-sales-rule/Controller/Adminhtml/Promo/Quote/Edit.php(59): Magento\Framework\View\Layout\Interceptor->getBlock('promo_sales_rul...')
#53 /var/www/sources/sumrak/dev21/var/generation/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Edit/Interceptor.php(24): Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Edit->execute()
#54 /var/www/sources/sumrak/dev21/vendor/magento/framework/App/Action/Action.php(102): Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Edit\Interceptor->execute()
#55 /var/www/sources/sumrak/dev21/vendor/magento/module-backend/App/AbstractAction.php(226): Magento\Framework\App\Action\Action->dispatch(Object(Magento\Framework\App\Request\Http))
#56 /var/www/sources/sumrak/dev21/vendor/magento/framework/Interception/Interceptor.php(74): Magento\Backend\App\AbstractAction->dispatch(Object(Magento\Framework\App\Request\Http))
#57 /var/www/sources/sumrak/dev21/vendor/magento/framework/Interception/Chain/Chain.php(70): Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Edit\Interceptor->___callParent('dispatch', Array)
#58 /var/www/sources/sumrak/dev21/vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\SalesRu...', 'dispatch', Object(Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Edit\Interceptor), Array, 'adminAuthentica...')
#59 /var/www/sources/sumrak/dev21/vendor/magento/module-backend/App/Action/Plugin/Authentication.php(143): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Request\Http))
#60 /var/www/sources/sumrak/dev21/vendor/magento/framework/Interception/Chain/Chain.php(67): Magento\Backend\App\Action\Plugin\Authentication->aroundDispatch(Object(Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Edit\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#61 /var/www/sources/sumrak/dev21/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\SalesRu...', 'dispatch', Object(Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Edit\Interceptor), Array, 'adminMassaction...')
#62 /var/www/sources/sumrak/dev21/vendor/magento/module-backend/App/Action/Plugin/MassactionKey.php(33): Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Edit\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#63 /var/www/sources/sumrak/dev21/vendor/magento/framework/Interception/Interceptor.php(142): Magento\Backend\App\Action\Plugin\MassactionKey->aroundDispatch(Object(Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Edit\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#64 /var/www/sources/sumrak/dev21/var/generation/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Edit/Interceptor.php(39): Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Edit\Interceptor->___callPlugins('dispatch', Array, Array)
#65 /var/www/sources/sumrak/dev21/vendor/magento/framework/App/FrontController.php(55): Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Edit\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#66 /var/www/sources/sumrak/dev21/vendor/magento/framework/Interception/Interceptor.php(74): Magento\Framework\App\FrontController->dispatch(Object(Magento\Framework\App\Request\Http))
#67 /var/www/sources/sumrak/dev21/vendor/magento/framework/Interception/Chain/Chain.php(70): Magento\Framework\App\FrontController\Interceptor->___callParent('dispatch', Array)
#68 /var/www/sources/sumrak/dev21/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'dispatch', Object(Magento\Framework\App\FrontController\Interceptor), Array, 'install')
#69 /var/www/sources/sumrak/dev21/vendor/magento/framework/Module/Plugin/DbStatusValidator.php(69): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#70 /var/www/sources/sumrak/dev21/vendor/magento/framework/Interception/Interceptor.php(142): Magento\Framework\Module\Plugin\DbStatusValidator->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#71 /var/www/sources/sumrak/dev21/var/generation/Magento/Framework/App/FrontController/Interceptor.php(26): Magento\Framework\App\FrontController\Interceptor->___callPlugins('dispatch', Array, Array)
#72 /var/www/sources/sumrak/dev21/vendor/magento/framework/App/Http.php(135): Magento\Framework\App\FrontController\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#73 /var/www/sources/sumrak/dev21/vendor/magento/framework/App/Bootstrap.php(258): Magento\Framework\App\Http->launch()
#74 /var/www/sources/sumrak/dev21/index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http))
c158dc8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment