I'm using OctoberCMS based on Laravel.
I'm trying to capture segments of the URL to pass into a Scope Function to filter Database Results.
Visiting localhost/user/john/nature would parse and filter back those results.
URL → Identifiers → Param Variables → Scope → Database Results
Page
[builderDetails builderUser]
identifierValue "{{ :username }}"
[builderDetails builderCategory]
identifierValue "{{ :category }}"
[builderList]
scope = "scopeApplyType"
url = /user/:username?/:category?/:page?
Model Scope
I want to filter Database Results using URL Identifers :username and :category.
public function scopeApplyType($query) {
$params = ['username' => $username, 'category' => $category];
return $query->where($params);
}
Get Identifiers
This will output the requested identifers in the URL, in routes.php
Route::get('user/{username?}/{category?}', function ($username = null, $category = null) {
echo $username;
echo $category;
});
Output
localhost/user/john/nature
john
nature
Soultion?
A Route::get() won't work, I need something inside or passed to the Scope to define the params variables.
Something like:
$username = '{username?}';
$username = request()->url('username');
$username = $this->param('username'); //Components)
$username = $this->route('username');
$username = \Route::current()->getParameter('username');
All return null or error.
Like the way you would normally parse a Query
$param = "username=john&category=nature";
$username = $category = '';
parse_str($param);
echo $username;
echo $category;
Or similar to Request Segment
$username = request()->segment(2); //user/:username
segment(2) is a static location unlike {:category} which can change position on different URL's.
Given the following route
Route::get('foo/{name?}', function ($name = null) {
dd(request()->route()->parameters());
});
When visiting /foo/bar the output is as below.
array:1 [▼
"name" => "bar"
]
Similarly you can use
dd(request()->route()->parameter('name')); // bar
What you are trying to do has gone beyond the scope of the very basic components provided by the builder plugin.
You should now look at creating your own Components within your plugin. See http://octobercms.com/docs/plugin/components and http://octobercms.com/docs/cms/components for further information, as well as the section on routing parameters specifically
A very basic example of your custom component might look like this:
<?php namespace MyVendor/MyPlugin/Components;
use Cms\Classes\ComponentBase;
use MyVendor\MyPlugin\Models\Result as ResultModel;
class MyComponent extends ComponentBase
{
public $results;
public function defineProperties()
{
return [
'categorySlug' => [
'title' => 'Category Slug',
'type' => 'string',
'default' => '{{ :category }}',
],
'username' => [
'title' => 'Username',
'type' => 'string',
'default' => '{{ :username }}',
],
];
}
public function init()
{
$this->results = $this->page['results'] = $this->loadResults();
}
public function loadResults()
{
return ResultModel::where('username', $this->property('username'))
->where('category', $this->property('categorySlug'))
->get();
}
}
Then in your component's default.htm view you'd do something like this:
{% for result in __SELF__.results %}
{{ result.title }}
{% endfor %}
And in your OctoberCMS page:
url = /user/:username?/:category?/:page?
[myComponent]
categorySlug = "{{ :category }}"
username = "{{ :username }}"
==
{% component 'myComponent' %}