This is config that is specific and necessary to the app core which is distributed with the starter plugin and theme - https://github.com/htmlburger/wpemerge-app-core
The App Core package provides common utilities like image resizing on the fly, asset loading utilities, config.json handling etc. - check out the Utilities section in the docs here: https://docs.wpemerge.com/#/starter/utilities/assets
got it. Should path and url properties reference the plugin root directory? I moved the config file a bit.
Uncaught TypeError: e.elements.$counterNumber.numerator is not a function
). i've tried to use that one on a premade theme (OceanWP) and the error doesn't show. i guess it's a conflict with jQuery, but what can it be? (jQuery.fn.jquery
"3.5.1"
)
@atanas-dev Hey Atanas, during the last week I worked on a fork of WP Emerge that replaces every reference of the concrete pimple container with a container interface. I did this so we can leverage better containers like illuminate/container. I also coded a simple adapter around the pimple container so it can still be used flawlessly as a default container with WP Emerge. Minimal changes were done to the source code and everything is non-breaking. The only changes in the core are changing every implementation of the pimple container to are container interface and refactoring the GenericFactory Class so it uses the container interface.
I already did an integration for the laravel container as that's what I'm using and everything works flawlessly. Zero Configuration Resolution etc.
The only change needed for client code to swap containers is to pass an optional implementation of the containerinterface into the App::make() Facade before bootstrapping. If nothing is passed the default pimple container will be used like before.
Are you open to implementing this in WP Emerge so I can commit a proper pull request?
Greetings.
cool. Starting tomorrow I will have very limited availability for a few weeks and I could not prepare a proper PR yet. Im sure there will be some unit tests that fail because you most probably mocked the container everywhere etc.
In the meantime I will pass you the link to the updated repository so you can have a look and let me now what you think.
https://github.com/calvinalkan/wpemerge
I had to do some more changes but now everything is integrated.
The main changes are:
Hi there, I just found wpemerge yesterday and I am trying to get my hands on that. I have never really worked with MVCs before, so I am trying to understand as much as possible from the documentation, but right now I am facing the following challenge:
I have downloaded the starter theme and I am trying to register custom routes.
From the documentation I thought it might be best to add a new route to the configuration instead of working inside the "web" part.
So I altered this part:
\App::make()->bootstrap( [
'routes' => [
// Assuming your route files are created in /wp-content/themes/my-theme/routes/
'web' => [
'definitions' => get_template_directory() . '/routes/web.php',
],
'admin' => [
'definitions' => get_template_directory() . '/routes/admin.php',
],
'ajax' => [
'definitions' => get_template_directory() . '/routes/ajax.php',
],
'directory' => [
'definitions' => get_template_directory() . '/routes/directory.php';
]
],
// ... other options go here
] );
I added my directory Controller and in my directory.php I have the following:
\Racom::route()->get()->url( '/verzeichnis' )->handle( 'Directory_Controller@index' );;
And this is my Controller:
namespace Racom\Controllers\Directory;
class DIRECTORY_CONTROLLER {
public function index( $request, $view ) {
return \Racom::view( 'templates/directory/index.php' );
// return \Racom::redirect()->to( home_url( '/' ) );
// return \Racom::error( 404 );
// return \Racom::output( 'Hello World!' ); // same as returning a string
// return \Racom::json( ['foo' => 'bar'] ); // same as returning an array
// return \Racom::response(); // a blank response object
}
}
but when I open '/verzeichnis' on my localhost I still get a 404 :/
Basically my Idea was to do routes like.../directory
-> display a list of all countries that are assigned to a user (data is available)/directory/{country}/
-> display a list of all users within that country/directory/{country}/{city}
-> display a list of all users within that city
in my DirectoryController I wanted to have one view with different outputs dependent on the country or city
Hi @jennifer.eberlei_gitlab ,
What Calvin said is right - there are 3 main groups of routes that are supported in WP Emerge - Web (front end if you will), Admin (under /wp-admin/) and AJAX (handled via WordPress' AJAX hooks).
For your use case (and most) web.php is the file to use so you'd want to place \Racom::route()->get()->url( '/verzeichnis/{country?}/{city?}' )->handle( 'DirectoryController@index' );
in that file but above the \Racom::route()->all();
line as the comment warns.
Ok how do I check that country is actually a country and city is actually a city
This type of validation you can do inside your controller method, so something like this is what I imagine you'd need:
// Note that URL parameters are automatically passed to your controller method as extra arguments.
// You can check out the docs which mention this here: https://docs.wpemerge.com/#/framework/routing/conditions?id=url
public function index( $request, $view, $country, $city ) {
// Assuming you have an is_city_valid() function:
if ( ! empty( $city ) && ! is_city_valid( $city ) ) {
return \Racom::error( 404 );
}
// Assuming you have an is_country_valid() function:
if ( ! empty( $country ) && ! is_country_valid( $country ) ) {
return \Racom::error( 404 );
}
// Assuming you'll need both $country and $city in your view:
return \Racom::view( 'templates/directory/index.php' )
->with( [
'country' => $country,
'city' => $city,
] );
}
So I created a folder templates
in the root folder of the theme and a subfolder called directory
and then in my route I want to do this like suggested:
return \Racom::view( 'templates/directory/index.php' )
->with( [
'country' => $country,
'city' => $city,
] );
but when I var_dump
$view in my route it still gives me the 404 template.
class DirectoryController {
public function index( $request, $view, $country, $city ) {
var_dump($view);
var_dump($country);
if (!empty($country) && !is_country_valid($country)) {
return \Racom::error(404);
}
return \Racom::view( 'templates/directory/index.php' )->with(['country' => $country, 'city' => $city]);
}
}
@atanas-dev Could you explain a use case for an admin route? I always thought what happens is that you could override the callback function defined in add_menu_page for a specific admin page. However, after studying the code this it seems like this is not the case but instead we send headers from the request and the body from or view (if there is any view loaded ) straight to the client. When I tried some routes it seems like nothing is happening at all. (Might be because WordPress still loads the default admin view. )
Maybe I'm not getting the admin routes quite right. Hope you can share some insights.
Admin routes check for the registered page slug. The request is then split - headers are sent during do_action( "load-{$hook_suffix}" )
and the view is output during do_action( $hook_suffix )
where $hook_suffix is a hook name that WordPress generates based on your admin page slug.
The above means that headers will be sent correctly before any output and your view will be embedded inside the default admin page (where the usual add_menu_page callback runs).
An important note: Admin routes are currently only meant to be used with custom admin pages i.e. ones registered using add_menu_page and add_submenu_page, not core admin pages.
Ah ok got it, so the do_action( $hook_suffix )
takes care of the placing the content in the correct place I assume.
Btw, is there any reason that im missing for why admin/ajax handlers do need to get passed a $view variable. Its always empty since only the "web function" inside the kernel passes the view as an optional argument to the handle method.
got it. I'll strip it out in the container implementation since every controller, middleware, etc gets resolved automatically.
Another thing, is there a way we could allow for the extension of the error handler in a custom service provider?
So far there are only CsrfException and NotFoundException that we can catch when we push something through the HTTP-Kernal process
protected function toResponse( $exception ) {
// @codeCoverageIgnoreStart
if ( $exception instanceof InvalidCsrfTokenException ) {
wp_nonce_ays( '' );
}
// @codeCoverageIgnoreEnd
if ( $exception instanceof NotFoundException ) {
return $this->response_service->error( 404 );
}
return false;
}
Hey there, if I wanted to add acf to wpemerge, would i do that with its own service provider? would that make sense?
I was thinking that widgets, and sidebars, and menus and such are provided via a service provider so I was wondering if it would make sense to do the same for registering custom fields with acf
Hi, I tried to add woocommerce styles to the theme seperately from admin|frontend|login
and edited the config.json
and the AssetsServiceProvider.php
like this:
config.json
"bundles": [
"frontend",
"admin",
"login",
"editor",
"woocommerce"
],
AssetsServiceProvider.php:
/**
* Enqueue woocommerce assets.
*
* @return void
*/
public function enqueueWoocommerceAssets() {
// Enqueue scripts.
\Racom::core()->assets()->enqueueScript(
'theme-woocommerce-js-bundle',
\Racom::core()->assets()->getBundleUrl( 'woocommerce', '.js' ),
[ 'jquery' ],
true
);
// Enqueue styles.
$style = \Racom::core()->assets()->getBundleUrl( 'woocommerce', '.css' );
if ( $style ) {
\Racom::core()->assets()->enqueueStyle(
'theme-woocommerce-css-bundle',
$style
);
}
// Enqueue theme's style.css file to allow overrides for the bundled styles.
\Racom::core()->assets()->enqueueStyle( 'theme-woocommerce-styles', get_template_directory_uri() . '/woocommerce.css' );
}
ressources/styles/woocommerce/index.scss