Skip to content

Commit 8101789

Browse files
authored
Added blog categories (#589)
1 parent 6b82a4d commit 8101789

File tree

39 files changed

+2800
-31
lines changed

39 files changed

+2800
-31
lines changed

.phpstorm.meta.php/blocks.meta.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -771,15 +771,26 @@
771771
'api2/adminhtml_roles_tab_resources' => \Mage_Api2_Block_Adminhtml_Roles_Tab_Resources::class,
772772
'api2/adminhtml_roles_tab_users' => \Mage_Api2_Block_Adminhtml_Roles_Tab_Users::class,
773773
'api2/adminhtml_roles_tabs' => \Mage_Api2_Block_Adminhtml_Roles_Tabs::class,
774+
'blog/adminhtml_category' => \Maho_Blog_Block_Adminhtml_Category::class,
775+
'blog/adminhtml_category_edit' => \Maho_Blog_Block_Adminhtml_Category_Edit::class,
776+
'blog/adminhtml_category_edit_form' => \Maho_Blog_Block_Adminhtml_Category_Edit_Form::class,
777+
'blog/adminhtml_category_edit_tab_general' => \Maho_Blog_Block_Adminhtml_Category_Edit_Tab_General::class,
778+
'blog/adminhtml_category_edit_tab_meta' => \Maho_Blog_Block_Adminhtml_Category_Edit_Tab_Meta::class,
779+
'blog/adminhtml_category_edit_tab_posts' => \Maho_Blog_Block_Adminhtml_Category_Edit_Tab_Posts::class,
780+
'blog/adminhtml_category_edit_tabs' => \Maho_Blog_Block_Adminhtml_Category_Edit_Tabs::class,
781+
'blog/adminhtml_category_grid' => \Maho_Blog_Block_Adminhtml_Category_Grid::class,
774782
'blog/adminhtml_post' => \Maho_Blog_Block_Adminhtml_Post::class,
775783
'blog/adminhtml_post_edit' => \Maho_Blog_Block_Adminhtml_Post_Edit::class,
776784
'blog/adminhtml_post_edit_form' => \Maho_Blog_Block_Adminhtml_Post_Edit_Form::class,
785+
'blog/adminhtml_post_edit_tab_categories' => \Maho_Blog_Block_Adminhtml_Post_Edit_Tab_Categories::class,
777786
'blog/adminhtml_post_edit_tab_content' => \Maho_Blog_Block_Adminhtml_Post_Edit_Tab_Content::class,
778787
'blog/adminhtml_post_edit_tab_meta' => \Maho_Blog_Block_Adminhtml_Post_Edit_Tab_Meta::class,
779788
'blog/adminhtml_post_edit_tabs' => \Maho_Blog_Block_Adminhtml_Post_Edit_Tabs::class,
780789
'blog/adminhtml_post_grid' => \Maho_Blog_Block_Adminhtml_Post_Grid::class,
781790
'blog/adminhtml_post_grid_renderer_image' => \Maho_Blog_Block_Adminhtml_Post_Grid_Renderer_Image::class,
782791
'blog/autocomplete' => \Maho_Blog_Block_Autocomplete::class,
792+
'blog/category_sidebar' => \Maho_Blog_Block_Category_Sidebar::class,
793+
'blog/category_view' => \Maho_Blog_Block_Category_View::class,
783794
'blog/post_list' => \Maho_Blog_Block_Post_List::class,
784795
'blog/post_view' => \Maho_Blog_Block_Post_View::class,
785796
'bundle/adminhtml_catalog_product_composite_fieldset_bundle' => \Mage_Bundle_Block_Adminhtml_Catalog_Product_Composite_Fieldset_Bundle::class,
@@ -2156,15 +2167,26 @@
21562167
'api2/adminhtml_roles_tab_resources' => \Mage_Api2_Block_Adminhtml_Roles_Tab_Resources::class,
21572168
'api2/adminhtml_roles_tab_users' => \Mage_Api2_Block_Adminhtml_Roles_Tab_Users::class,
21582169
'api2/adminhtml_roles_tabs' => \Mage_Api2_Block_Adminhtml_Roles_Tabs::class,
2170+
'blog/adminhtml_category' => \Maho_Blog_Block_Adminhtml_Category::class,
2171+
'blog/adminhtml_category_edit' => \Maho_Blog_Block_Adminhtml_Category_Edit::class,
2172+
'blog/adminhtml_category_edit_form' => \Maho_Blog_Block_Adminhtml_Category_Edit_Form::class,
2173+
'blog/adminhtml_category_edit_tab_general' => \Maho_Blog_Block_Adminhtml_Category_Edit_Tab_General::class,
2174+
'blog/adminhtml_category_edit_tab_meta' => \Maho_Blog_Block_Adminhtml_Category_Edit_Tab_Meta::class,
2175+
'blog/adminhtml_category_edit_tab_posts' => \Maho_Blog_Block_Adminhtml_Category_Edit_Tab_Posts::class,
2176+
'blog/adminhtml_category_edit_tabs' => \Maho_Blog_Block_Adminhtml_Category_Edit_Tabs::class,
2177+
'blog/adminhtml_category_grid' => \Maho_Blog_Block_Adminhtml_Category_Grid::class,
21592178
'blog/adminhtml_post' => \Maho_Blog_Block_Adminhtml_Post::class,
21602179
'blog/adminhtml_post_edit' => \Maho_Blog_Block_Adminhtml_Post_Edit::class,
21612180
'blog/adminhtml_post_edit_form' => \Maho_Blog_Block_Adminhtml_Post_Edit_Form::class,
2181+
'blog/adminhtml_post_edit_tab_categories' => \Maho_Blog_Block_Adminhtml_Post_Edit_Tab_Categories::class,
21622182
'blog/adminhtml_post_edit_tab_content' => \Maho_Blog_Block_Adminhtml_Post_Edit_Tab_Content::class,
21632183
'blog/adminhtml_post_edit_tab_meta' => \Maho_Blog_Block_Adminhtml_Post_Edit_Tab_Meta::class,
21642184
'blog/adminhtml_post_edit_tabs' => \Maho_Blog_Block_Adminhtml_Post_Edit_Tabs::class,
21652185
'blog/adminhtml_post_grid' => \Maho_Blog_Block_Adminhtml_Post_Grid::class,
21662186
'blog/adminhtml_post_grid_renderer_image' => \Maho_Blog_Block_Adminhtml_Post_Grid_Renderer_Image::class,
21672187
'blog/autocomplete' => \Maho_Blog_Block_Autocomplete::class,
2188+
'blog/category_sidebar' => \Maho_Blog_Block_Category_Sidebar::class,
2189+
'blog/category_view' => \Maho_Blog_Block_Category_View::class,
21682190
'blog/post_list' => \Maho_Blog_Block_Post_List::class,
21692191
'blog/post_view' => \Maho_Blog_Block_Post_View::class,
21702192
'bundle/adminhtml_catalog_product_composite_fieldset_bundle' => \Mage_Bundle_Block_Adminhtml_Catalog_Product_Composite_Fieldset_Bundle::class,

.phpstorm.meta.php/models.meta.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,17 +345,22 @@
345345
'api_resource/user' => \Mage_Api_Model_Resource_User::class,
346346
'api_resource/user_collection' => \Mage_Api_Model_Resource_User_Collection::class,
347347
'blog/api2_post' => \Maho_Blog_Model_Api2_Post::class,
348+
'blog/category' => \Maho_Blog_Model_Category::class,
348349
'blog/observer' => \Maho_Blog_Model_Observer::class,
349350
'blog/post' => \Maho_Blog_Model_Post::class,
350351
'blog/post_api' => \Maho_Blog_Model_Post_Api::class,
351352
'blog/post_api_v2' => \Maho_Blog_Model_Post_Api_V2::class,
352353
'blog/post_attribute_backend_image' => \Maho_Blog_Model_Post_Attribute_Backend_Image::class,
353354
'blog/post_attribute_backend_store' => \Maho_Blog_Model_Post_Attribute_Backend_Store::class,
354355
'blog/resource_attribute' => \Maho_Blog_Model_Resource_Attribute::class,
356+
'blog/resource_category' => \Maho_Blog_Model_Resource_Category::class,
357+
'blog/resource_category_collection' => \Maho_Blog_Model_Resource_Category_Collection::class,
355358
'blog/resource_eav_attribute' => \Maho_Blog_Model_Resource_Eav_Attribute::class,
356359
'blog/resource_post' => \Maho_Blog_Model_Resource_Post::class,
357360
'blog/resource_post_collection' => \Maho_Blog_Model_Resource_Post_Collection::class,
358361
'blog_resource/attribute' => \Maho_Blog_Model_Resource_Attribute::class,
362+
'blog_resource/category' => \Maho_Blog_Model_Resource_Category::class,
363+
'blog_resource/category_collection' => \Maho_Blog_Model_Resource_Category_Collection::class,
359364
'blog_resource/eav_attribute' => \Maho_Blog_Model_Resource_Eav_Attribute::class,
360365
'blog_resource/post' => \Maho_Blog_Model_Resource_Post::class,
361366
'blog_resource/post_collection' => \Maho_Blog_Model_Resource_Post_Collection::class,
@@ -3071,17 +3076,22 @@
30713076
'api_resource/user' => \Mage_Api_Model_Resource_User::class,
30723077
'api_resource/user_collection' => \Mage_Api_Model_Resource_User_Collection::class,
30733078
'blog/api2_post' => \Maho_Blog_Model_Api2_Post::class,
3079+
'blog/category' => \Maho_Blog_Model_Category::class,
30743080
'blog/observer' => \Maho_Blog_Model_Observer::class,
30753081
'blog/post' => \Maho_Blog_Model_Post::class,
30763082
'blog/post_api' => \Maho_Blog_Model_Post_Api::class,
30773083
'blog/post_api_v2' => \Maho_Blog_Model_Post_Api_V2::class,
30783084
'blog/post_attribute_backend_image' => \Maho_Blog_Model_Post_Attribute_Backend_Image::class,
30793085
'blog/post_attribute_backend_store' => \Maho_Blog_Model_Post_Attribute_Backend_Store::class,
30803086
'blog/resource_attribute' => \Maho_Blog_Model_Resource_Attribute::class,
3087+
'blog/resource_category' => \Maho_Blog_Model_Resource_Category::class,
3088+
'blog/resource_category_collection' => \Maho_Blog_Model_Resource_Category_Collection::class,
30813089
'blog/resource_eav_attribute' => \Maho_Blog_Model_Resource_Eav_Attribute::class,
30823090
'blog/resource_post' => \Maho_Blog_Model_Resource_Post::class,
30833091
'blog/resource_post_collection' => \Maho_Blog_Model_Resource_Post_Collection::class,
30843092
'blog_resource/attribute' => \Maho_Blog_Model_Resource_Attribute::class,
3093+
'blog_resource/category' => \Maho_Blog_Model_Resource_Category::class,
3094+
'blog_resource/category_collection' => \Maho_Blog_Model_Resource_Category_Collection::class,
30853095
'blog_resource/eav_attribute' => \Maho_Blog_Model_Resource_Eav_Attribute::class,
30863096
'blog_resource/post' => \Maho_Blog_Model_Resource_Post::class,
30873097
'blog_resource/post_collection' => \Maho_Blog_Model_Resource_Post_Collection::class,

.phpstorm.meta.php/registry.meta.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
application_params,
66
attribute_type_disabled_types,
77
attribute_type_hidden_fields,
8+
blog_category,
89
blog_post,
910
category,
1011
checkout_agreement,
@@ -17,6 +18,7 @@
1718
current_activity,
1819
current_attribute_set,
1920
current_billing_agreement,
21+
current_blog_category,
2022
current_blog_post,
2123
current_catalog_search,
2224
current_category,

.phpstorm.meta.php/resource_models.meta.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
'api_resource/user' => \Mage_Api_Model_Resource_User::class,
5151
'api_resource/user_collection' => \Mage_Api_Model_Resource_User_Collection::class,
5252
'blog_resource/attribute' => \Maho_Blog_Model_Resource_Attribute::class,
53+
'blog_resource/category' => \Maho_Blog_Model_Resource_Category::class,
54+
'blog_resource/category_collection' => \Maho_Blog_Model_Resource_Category_Collection::class,
5355
'blog_resource/eav_attribute' => \Maho_Blog_Model_Resource_Eav_Attribute::class,
5456
'blog_resource/post' => \Maho_Blog_Model_Resource_Post::class,
5557
'blog_resource/post_collection' => \Maho_Blog_Model_Resource_Post_Collection::class,
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* Maho
7+
*
8+
* @category Maho
9+
* @package Maho_Blog
10+
* @copyright Copyright (c) 2026 Maho (https://mahocommerce.com)
11+
* @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
12+
*/
13+
14+
class Maho_Blog_Block_Adminhtml_Category extends Mage_Adminhtml_Block_Widget_Container
15+
{
16+
public function __construct()
17+
{
18+
parent::__construct();
19+
$this->setTemplate('blog/category.phtml');
20+
}
21+
22+
#[\Override]
23+
protected function _prepareLayout()
24+
{
25+
$this->_addButton('add_new', [
26+
'label' => Mage::helper('blog')->__('Add Category'),
27+
'onclick' => Mage::helper('core/js')->getSetLocationJs($this->getUrl('*/*/new')),
28+
'class' => 'add',
29+
]);
30+
31+
$this->setChild('grid', $this->getLayout()->createBlock('blog/adminhtml_category_grid', 'category.grid'));
32+
return parent::_prepareLayout();
33+
}
34+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* Maho
7+
*
8+
* @category Maho
9+
* @package Maho_Blog
10+
* @copyright Copyright (c) 2026 Maho (https://mahocommerce.com)
11+
* @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
12+
*/
13+
14+
class Maho_Blog_Block_Adminhtml_Category_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
15+
{
16+
public function __construct()
17+
{
18+
parent::__construct();
19+
20+
$this->_objectId = 'id';
21+
$this->_blockGroup = 'blog';
22+
$this->_controller = 'adminhtml_category';
23+
24+
$this->_updateButton('save', 'label', Mage::helper('blog')->__('Save Category'));
25+
$this->_updateButton('delete', 'label', Mage::helper('blog')->__('Delete Category'));
26+
27+
$this->_addButton('saveandcontinue', [
28+
'label' => Mage::helper('adminhtml')->__('Save and Continue Edit'),
29+
'onclick' => 'saveAndContinueEdit()',
30+
'class' => 'save',
31+
], -100);
32+
33+
$this->_formScripts[] = "
34+
function saveAndContinueEdit(){
35+
editForm.submit(document.getElementById('edit_form').action+'back/edit/');
36+
}
37+
";
38+
}
39+
40+
#[\Override]
41+
public function getHeaderText()
42+
{
43+
if (Mage::registry('blog_category')->getId()) {
44+
return Mage::helper('blog')->__("Edit Category '%s'", $this->escapeHtml(Mage::registry('blog_category')->getName()));
45+
}
46+
return Mage::helper('blog')->__('New Category');
47+
}
48+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* Maho
7+
*
8+
* @category Maho
9+
* @package Maho_Blog
10+
* @copyright Copyright (c) 2026 Maho (https://mahocommerce.com)
11+
* @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
12+
*/
13+
14+
class Maho_Blog_Block_Adminhtml_Category_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
15+
{
16+
#[\Override]
17+
protected function _prepareForm()
18+
{
19+
$form = new \Maho\Data\Form([
20+
'id' => 'edit_form',
21+
'action' => $this->getUrl('*/*/save', ['id' => $this->getRequest()->getParam('id')]),
22+
'method' => 'post',
23+
'enctype' => 'multipart/form-data',
24+
]);
25+
$form->setUseContainer(true);
26+
$this->setForm($form);
27+
return parent::_prepareForm();
28+
}
29+
}
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* Maho
7+
*
8+
* @category Maho
9+
* @package Maho_Blog
10+
* @copyright Copyright (c) 2026 Maho (https://mahocommerce.com)
11+
* @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
12+
*/
13+
14+
class Maho_Blog_Block_Adminhtml_Category_Edit_Tab_General extends Mage_Adminhtml_Block_Widget_Form implements Mage_Adminhtml_Block_Widget_Tab_Interface
15+
{
16+
#[\Override]
17+
protected function _prepareForm()
18+
{
19+
$model = Mage::registry('blog_category');
20+
21+
$form = new \Maho\Data\Form();
22+
$form->setHtmlIdPrefix('category_');
23+
24+
$fieldset = $form->addFieldset('blog_category_form', [
25+
'legend' => Mage::helper('blog')->__('General Information'),
26+
'class' => 'fieldset-wide',
27+
]);
28+
29+
$form->setFieldNameSuffix('category');
30+
31+
if ($model->getEntityId()) {
32+
$fieldset->addField('entity_id', 'hidden', [
33+
'name' => 'entity_id',
34+
]);
35+
}
36+
37+
$fieldset->addField('name', 'text', [
38+
'label' => Mage::helper('blog')->__('Name'),
39+
'class' => 'required-entry',
40+
'required' => true,
41+
'name' => 'name',
42+
]);
43+
44+
$fieldset->addField('url_key', 'text', [
45+
'label' => Mage::helper('blog')->__('URL Key'),
46+
'name' => 'url_key',
47+
]);
48+
49+
// Parent category select
50+
$parentOptions = $this->_getParentOptions($model);
51+
$fieldset->addField('parent_id', 'select', [
52+
'label' => Mage::helper('blog')->__('Parent Category'),
53+
'name' => 'parent_id',
54+
'options' => $parentOptions,
55+
]);
56+
57+
if (!Mage::app()->isSingleStoreMode()) {
58+
$field = $fieldset->addField('stores', 'multiselect', [
59+
'name' => 'stores[]',
60+
'label' => Mage::helper('blog')->__('Store View'),
61+
'title' => Mage::helper('blog')->__('Store View'),
62+
'required' => true,
63+
'values' => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, true),
64+
]);
65+
$renderer = $this->getStoreSwitcherRenderer();
66+
$field->setRenderer($renderer);
67+
} else {
68+
$fieldset->addField('stores', 'hidden', [
69+
'name' => 'stores[]',
70+
'value' => Mage::app()->getStore(true)->getId(),
71+
]);
72+
$model->setStoreId(Mage::app()->getStore(true)->getId());
73+
}
74+
75+
$fieldset->addField('is_active', 'select', [
76+
'label' => Mage::helper('blog')->__('Status'),
77+
'title' => Mage::helper('blog')->__('Status'),
78+
'name' => 'is_active',
79+
'required' => true,
80+
'options' => [
81+
'1' => Mage::helper('blog')->__('Enabled'),
82+
'0' => Mage::helper('blog')->__('Disabled'),
83+
],
84+
]);
85+
if (!$model->getId()) {
86+
$model->setData('is_active', '1');
87+
}
88+
89+
$fieldset->addField('position', 'text', [
90+
'label' => Mage::helper('blog')->__('Position'),
91+
'name' => 'position',
92+
'value' => '0',
93+
]);
94+
95+
$form->setValues($model->getData());
96+
$this->setForm($form);
97+
98+
return parent::_prepareForm();
99+
}
100+
101+
/**
102+
* Build parent category options with indentation by level
103+
*/
104+
protected function _getParentOptions(?Maho_Blog_Model_Category $currentCategory): array
105+
{
106+
$options = [
107+
Maho_Blog_Model_Category::ROOT_PARENT_ID => Mage::helper('blog')->__('-- Top Level --'),
108+
];
109+
110+
$collection = Mage::getResourceModel('blog/category_collection')
111+
->addRootFilter()
112+
->addActiveFilter()
113+
->setOrder('path', 'ASC');
114+
115+
foreach ($collection as $category) {
116+
// Skip the current category and its children to prevent circular references
117+
if ($currentCategory && $currentCategory->getId()) {
118+
if ($category->getId() == $currentCategory->getId()) {
119+
continue;
120+
}
121+
$currentPath = $currentCategory->getPath();
122+
if ($currentPath && str_starts_with($category->getPath(), $currentPath . '/')) {
123+
continue;
124+
}
125+
}
126+
127+
$indent = str_repeat('--', (int) $category->getLevel());
128+
$prefix = $indent ? $indent . ' ' : '';
129+
$options[$category->getId()] = $prefix . $category->getName();
130+
}
131+
132+
return $options;
133+
}
134+
135+
#[\Override]
136+
public function getTabLabel()
137+
{
138+
return Mage::helper('blog')->__('General');
139+
}
140+
141+
#[\Override]
142+
public function getTabTitle()
143+
{
144+
return Mage::helper('blog')->__('General Information');
145+
}
146+
147+
#[\Override]
148+
public function canShowTab()
149+
{
150+
return true;
151+
}
152+
153+
#[\Override]
154+
public function isHidden()
155+
{
156+
return false;
157+
}
158+
}

0 commit comments

Comments
 (0)