Version Notes
First version
Download this release
Release Info
Developer | Tarun Vishnoi |
Extension | tv_faq_new |
Version | 0.1.0 |
Comparing to | |
See all releases |
Version 0.1.0
- app/code/local/TV/Faq/Block/Adminhtml/Category.php +41 -0
- app/code/local/TV/Faq/Block/Adminhtml/Category/Edit.php +74 -0
- app/code/local/TV/Faq/Block/Adminhtml/Category/Edit/Form.php +31 -0
- app/code/local/TV/Faq/Block/Adminhtml/Category/Edit/Tab/Form.php +78 -0
- app/code/local/TV/Faq/Block/Adminhtml/Category/Edit/Tabs.php +50 -0
- app/code/local/TV/Faq/Block/Adminhtml/Category/Grid.php +163 -0
- app/code/local/TV/Faq/Block/Adminhtml/Item.php +41 -0
- app/code/local/TV/Faq/Block/Adminhtml/Item/Edit.php +88 -0
- app/code/local/TV/Faq/Block/Adminhtml/Item/Edit/Form.php +31 -0
- app/code/local/TV/Faq/Block/Adminhtml/Item/Edit/Tab/Form.php +138 -0
- app/code/local/TV/Faq/Block/Adminhtml/Item/Edit/Tabs.php +50 -0
- app/code/local/TV/Faq/Block/Adminhtml/Item/Grid.php +151 -0
- app/code/local/TV/Faq/Block/Frontend/Detail.php +232 -0
- app/code/local/TV/Faq/Block/Frontend/List.php +140 -0
- app/code/local/TV/Faq/Helper/Data.php +27 -0
- app/code/local/TV/Faq/Helper/Jumplist.php +93 -0
- app/code/local/TV/Faq/Helper/JumplistItem.php +136 -0
- app/code/local/TV/Faq/Model/Category.php +40 -0
- app/code/local/TV/Faq/Model/Faq.php +22 -0
- app/code/local/TV/Faq/Model/Mysql4/Category.php +103 -0
- app/code/local/TV/Faq/Model/Mysql4/Category/Collection.php +105 -0
- app/code/local/TV/Faq/Model/Mysql4/Faq.php +140 -0
- app/code/local/TV/Faq/Model/Mysql4/Faq/Collection.php +132 -0
- app/code/local/TV/Faq/Wysiwyg/Images/Content.php +161 -0
- app/code/local/TV/Faq/Wysiwyg/Images/Content/Files.php +155 -0
- app/code/local/TV/Faq/Wysiwyg/Images/Content/Newfolder.php +37 -0
- app/code/local/TV/Faq/Wysiwyg/Images/Content/Uploader.php +71 -0
- app/code/local/TV/Faq/Wysiwyg/Images/Tree.php +99 -0
- app/code/local/TV/Faq/controllers/Adminhtml/Faq/CategoryController.php +189 -0
- app/code/local/TV/Faq/controllers/Adminhtml/FaqController.php +191 -0
- app/code/local/TV/Faq/controllers/IndexController.php +31 -0
- app/code/local/TV/Faq/etc/adminhtml.xml +46 -0
- app/code/local/TV/Faq/etc/config.xml +142 -0
- app/code/local/TV/Faq/sql/faq_setup/mysql4-install-0.1.0.php +34 -0
- app/code/local/TV/Faq/sql/faq_setup/mysql4-install-1.0.7.php +64 -0
- app/code/local/TV/Faq/sql/faq_setup/mysql4-upgrade-1.0.6-1.0.7.php +49 -0
- app/design/adminhtml/default/default/layout/faq.xml +30 -0
- app/etc/modules/TV_Faq.xml +9 -0
- package.xml +18 -0
app/code/local/TV/Faq/Block/Adminhtml/Category.php
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Category extends Mage_Adminhtml_Block_Widget_Grid_Container
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Constructor for FAQ Adminhtml Block
|
17 |
+
*/
|
18 |
+
public function __construct()
|
19 |
+
{
|
20 |
+
$this->_blockGroup = 'tv_faq';
|
21 |
+
$this->_controller = 'adminhtml_category';
|
22 |
+
$this->_headerText = Mage::helper('tv_faq')->__('Manage FAQ Categories');
|
23 |
+
$this->_addButtonLabel = Mage::helper('tv_faq')->__('Add New FAQ Category');
|
24 |
+
|
25 |
+
parent::__construct();
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Returns the CSS class for the header
|
30 |
+
*
|
31 |
+
* Usually 'icon-head' and a more precise class is returned. We return
|
32 |
+
* only an empty string to avoid spacing on the left of the header as we
|
33 |
+
* don't have an icon.
|
34 |
+
*
|
35 |
+
* @return string
|
36 |
+
*/
|
37 |
+
public function getHeaderCssClass()
|
38 |
+
{
|
39 |
+
return '';
|
40 |
+
}
|
41 |
+
}
|
app/code/local/TV/Faq/Block/Adminhtml/Category/Edit.php
ADDED
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Category_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Constructor for the FAQ edit form
|
17 |
+
*/
|
18 |
+
public function __construct()
|
19 |
+
{
|
20 |
+
$this->_objectId = 'category_id';
|
21 |
+
$this->_blockGroup = 'tv_faq';
|
22 |
+
$this->_controller = 'adminhtml_category';
|
23 |
+
|
24 |
+
parent::__construct();
|
25 |
+
|
26 |
+
$this->_updateButton('save', 'label', Mage::helper('tv_faq')->__('Save FAQ Category'));
|
27 |
+
$this->_updateButton('delete', 'label', Mage::helper('tv_faq')->__('Delete FAQ Category'));
|
28 |
+
|
29 |
+
$this->_addButton('saveandcontinue', array (
|
30 |
+
'label' => Mage::helper('tv_faq')->__('Save and continue edit'),
|
31 |
+
'onclick' => 'saveAndContinueEdit()',
|
32 |
+
'class' => 'save' ), -100);
|
33 |
+
|
34 |
+
$this->_formScripts[] = "
|
35 |
+
function saveAndContinueEdit(){
|
36 |
+
editForm.submit($('edit_form').action+'back/edit/');
|
37 |
+
}
|
38 |
+
";
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Helper function to edit the header of the current form
|
43 |
+
*
|
44 |
+
* @return string Returns an "edit" or "new" text depending on the type of modifications.
|
45 |
+
*/
|
46 |
+
public function getHeaderText()
|
47 |
+
{
|
48 |
+
if (Mage::registry('faq_category')->getFaqId()) {
|
49 |
+
return Mage::helper('tv_faq')->__("Edit FAQ Category '%s'", $this->htmlEscape(Mage::registry('faq_category')->getCategoryName()));
|
50 |
+
}
|
51 |
+
else {
|
52 |
+
return Mage::helper('tv_faq')->__('New FAQ Category');
|
53 |
+
}
|
54 |
+
}
|
55 |
+
|
56 |
+
public function getFormActionUrl()
|
57 |
+
{
|
58 |
+
return $this->getUrl('*/*/save');
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Returns the CSS class for the header
|
63 |
+
*
|
64 |
+
* Usually 'icon-head' and a more precise class is returned. We return
|
65 |
+
* only an empty string to avoid spacing on the left of the header as we
|
66 |
+
* don't have an icon.
|
67 |
+
*
|
68 |
+
* @return string
|
69 |
+
*/
|
70 |
+
public function getHeaderCssClass()
|
71 |
+
{
|
72 |
+
return '';
|
73 |
+
}
|
74 |
+
}
|
app/code/local/TV/Faq/Block/Adminhtml/Category/Edit/Form.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Category_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Preperation of current form
|
17 |
+
*
|
18 |
+
* @return TV_Faq_Block_Adminhtml_Category_Edit_Form
|
19 |
+
*/
|
20 |
+
protected function _prepareForm()
|
21 |
+
{
|
22 |
+
$form = new Varien_Data_Form(array (
|
23 |
+
'id' => 'edit_form',
|
24 |
+
'action' => $this->getData('action'),
|
25 |
+
'method' => 'post',
|
26 |
+
'enctype' => 'multipart/form-data' ));
|
27 |
+
$form->setUseContainer(true);
|
28 |
+
$this->setForm($form);
|
29 |
+
return parent::_prepareForm();
|
30 |
+
}
|
31 |
+
}
|
app/code/local/TV/Faq/Block/Adminhtml/Category/Edit/Tab/Form.php
ADDED
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Category_Edit_Tab_Form extends Mage_Adminhtml_Block_Widget_Form
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Preparation of current form
|
17 |
+
*
|
18 |
+
* @return TV_Faq_Block_Adminhtml_Category_Edit_Tab_Main
|
19 |
+
*/
|
20 |
+
protected function _prepareForm()
|
21 |
+
{
|
22 |
+
$model = Mage::registry('faq_category');
|
23 |
+
|
24 |
+
$form = new Varien_Data_Form();
|
25 |
+
$form->setHtmlIdPrefix('faq_');
|
26 |
+
|
27 |
+
$fieldset = $form->addFieldset('base_fieldset', array (
|
28 |
+
'legend' => Mage::helper('tv_faq')->__('General information'),
|
29 |
+
'class' => 'fieldset-wide' ));
|
30 |
+
|
31 |
+
if ($model->getCategoryId()) {
|
32 |
+
$fieldset->addField('category_id', 'hidden', array (
|
33 |
+
'name' => 'category_id'
|
34 |
+
));
|
35 |
+
}
|
36 |
+
|
37 |
+
$fieldset->addField('category_name', 'text', array (
|
38 |
+
'name' => 'category_name',
|
39 |
+
'label' => Mage::helper('tv_faq')->__('Category Name'),
|
40 |
+
'title' => Mage::helper('tv_faq')->__('Category Name'),
|
41 |
+
'required' => true,
|
42 |
+
));
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Check is single store mode
|
46 |
+
*/
|
47 |
+
if (!Mage::app()->isSingleStoreMode()) {
|
48 |
+
$fieldset->addField('store_id', 'multiselect',
|
49 |
+
array (
|
50 |
+
'name' => 'stores[]',
|
51 |
+
'label' => Mage::helper('cms')->__('Store view'),
|
52 |
+
'title' => Mage::helper('cms')->__('Store view'),
|
53 |
+
'required' => true,
|
54 |
+
'values' => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, true) ));
|
55 |
+
}
|
56 |
+
else {
|
57 |
+
$fieldset->addField('store_id', 'hidden', array (
|
58 |
+
'name' => 'stores[]',
|
59 |
+
'value' => Mage::app()->getStore(true)->getId() ));
|
60 |
+
$model->setStoreId(Mage::app()->getStore(true)->getId());
|
61 |
+
}
|
62 |
+
|
63 |
+
$fieldset->addField('is_active', 'select',
|
64 |
+
array (
|
65 |
+
'label' => Mage::helper('cms')->__('Status'),
|
66 |
+
'title' => Mage::helper('tv_faq')->__('Category Status'),
|
67 |
+
'name' => 'is_active',
|
68 |
+
'required' => true,
|
69 |
+
'options' => array (
|
70 |
+
'1' => Mage::helper('cms')->__('Enabled'),
|
71 |
+
'0' => Mage::helper('cms')->__('Disabled') ) ));
|
72 |
+
|
73 |
+
$form->setValues($model->getData());
|
74 |
+
$this->setForm($form);
|
75 |
+
|
76 |
+
return parent::_prepareForm();
|
77 |
+
}
|
78 |
+
}
|
app/code/local/TV/Faq/Block/Adminhtml/Category/Edit/Tabs.php
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Category_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Constructs current object
|
17 |
+
*
|
18 |
+
*/
|
19 |
+
public function __construct()
|
20 |
+
{
|
21 |
+
parent::__construct();
|
22 |
+
$this->setId('faq_tabs');
|
23 |
+
$this->setDestElementId('edit_form');
|
24 |
+
$this->setTitle(Mage::helper('tv_faq')->__('Category Information'));
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Prepares the page layout
|
29 |
+
*
|
30 |
+
* Adds the tabs to the left tab menu.
|
31 |
+
*
|
32 |
+
* @return TV_Faq_Block_Adminhtml_Category_Edit_Tabs
|
33 |
+
*/
|
34 |
+
protected function _prepareLayout()
|
35 |
+
{
|
36 |
+
$return = parent::_prepareLayout();
|
37 |
+
|
38 |
+
$this->addTab(
|
39 |
+
'main_section',
|
40 |
+
array(
|
41 |
+
'label' => Mage::helper('tv_faq')->__('General information'),
|
42 |
+
'title' => Mage::helper('tv_faq')->__('General information'),
|
43 |
+
'content' => $this->getLayout()->createBlock('tv_faq/adminhtml_category_edit_tab_form')->toHtml(),
|
44 |
+
'active' => true,
|
45 |
+
)
|
46 |
+
);
|
47 |
+
|
48 |
+
return $return;
|
49 |
+
}
|
50 |
+
}
|
app/code/local/TV/Faq/Block/Adminhtml/Category/Grid.php
ADDED
@@ -0,0 +1,163 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Category_Grid extends Mage_Adminhtml_Block_Widget_Grid
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Constructor of Grid
|
17 |
+
*
|
18 |
+
*/
|
19 |
+
public function __construct()
|
20 |
+
{
|
21 |
+
parent::__construct();
|
22 |
+
$this->setId('faq_grid');
|
23 |
+
$this->setUseAjax(false);
|
24 |
+
$this->setDefaultSort('creation_time');
|
25 |
+
$this->setDefaultDir('DESC');
|
26 |
+
$this->setSaveParametersInSession(true);
|
27 |
+
}
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Preparation of the data that is displayed by the grid.
|
31 |
+
*
|
32 |
+
* @return TV_Faq_Block_Admin_Grid Self
|
33 |
+
*/
|
34 |
+
protected function _prepareCollection()
|
35 |
+
{
|
36 |
+
$collection = Mage::getResourceModel('tv_faq/category_collection');
|
37 |
+
$this->setCollection($collection);
|
38 |
+
return parent::_prepareCollection();
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Preparation of the requested columns of the grid
|
43 |
+
*
|
44 |
+
* @return TV_Faq_Block_Admin_Grid Self
|
45 |
+
*/
|
46 |
+
protected function _prepareColumns()
|
47 |
+
{
|
48 |
+
$this->addColumn('category_id', array (
|
49 |
+
'header' => Mage::helper('tv_faq')->__('Category #'),
|
50 |
+
'width' => '80px',
|
51 |
+
'type' => 'text',
|
52 |
+
'index' => 'category_id' ));
|
53 |
+
|
54 |
+
if (!Mage::app()->isSingleStoreMode()) {
|
55 |
+
$this->addColumn('store_id',
|
56 |
+
array (
|
57 |
+
'header' => Mage::helper('cms')->__('Store view'),
|
58 |
+
'index' => 'store_id',
|
59 |
+
'type' => 'store',
|
60 |
+
'store_all' => true,
|
61 |
+
'store_view' => true,
|
62 |
+
'sortable' => false,
|
63 |
+
'filter_condition_callback' => array (
|
64 |
+
$this,
|
65 |
+
'_filterStoreCondition' ) ));
|
66 |
+
}
|
67 |
+
|
68 |
+
$this->addColumn(
|
69 |
+
'category_name',
|
70 |
+
array(
|
71 |
+
'header' => Mage::helper('tv_faq')->__('Category Name'),
|
72 |
+
'index' => 'category_name',
|
73 |
+
)
|
74 |
+
);
|
75 |
+
|
76 |
+
$this->addColumn('is_active',
|
77 |
+
array (
|
78 |
+
'header' => Mage::helper('cms')->__('Active'),
|
79 |
+
'index' => 'is_active',
|
80 |
+
'type' => 'options',
|
81 |
+
'width' => '70px',
|
82 |
+
'options' => array (
|
83 |
+
0 => Mage::helper('cms')->__('No'),
|
84 |
+
1 => Mage::helper('cms')->__('Yes') ) ));
|
85 |
+
|
86 |
+
$this->addColumn(
|
87 |
+
'action',
|
88 |
+
array (
|
89 |
+
'header' => Mage::helper('tv_faq')->__('Action'),
|
90 |
+
'width' => '50px',
|
91 |
+
'type' => 'action',
|
92 |
+
'getter' => 'getId',
|
93 |
+
'actions' => array (
|
94 |
+
array (
|
95 |
+
'caption' => Mage::helper('tv_faq')->__('Edit'),
|
96 |
+
'url' => array (
|
97 |
+
'base' => '*/*/edit'
|
98 |
+
),
|
99 |
+
'field' => 'category_id'
|
100 |
+
),
|
101 |
+
),
|
102 |
+
'filter' => false,
|
103 |
+
'sortable' => false,
|
104 |
+
'index' => 'stores',
|
105 |
+
'is_system' => true,
|
106 |
+
)
|
107 |
+
);
|
108 |
+
|
109 |
+
return parent::_prepareColumns();
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Helper function to do after load modifications
|
114 |
+
*
|
115 |
+
*/
|
116 |
+
protected function _afterLoadCollection()
|
117 |
+
{
|
118 |
+
$this->getCollection()->walk('afterLoad');
|
119 |
+
parent::_afterLoadCollection();
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* Helper function to add store filter condition
|
124 |
+
*
|
125 |
+
* @param Mage_Core_Model_Mysql4_Collection_Abstract $collection Data collection
|
126 |
+
* @param Mage_Adminhtml_Block_Widget_Grid_Column $column Column information to be filtered
|
127 |
+
*/
|
128 |
+
protected function _filterStoreCondition($collection, $column)
|
129 |
+
{
|
130 |
+
if (!$value = $column->getFilter()->getValue()) {
|
131 |
+
return;
|
132 |
+
}
|
133 |
+
|
134 |
+
$this->getCollection()->addStoreFilter($value);
|
135 |
+
}
|
136 |
+
|
137 |
+
/**
|
138 |
+
* Helper function to reveive on row click url
|
139 |
+
*
|
140 |
+
* @param TV_Faq_Model_Faq $row Current rows dataset
|
141 |
+
* @return string URL for current row's onclick event
|
142 |
+
*/
|
143 |
+
public function getRowUrl($row)
|
144 |
+
{
|
145 |
+
return $this->getUrl('*/*/edit', array (
|
146 |
+
'category_id' => $row->getCategoryId() ));
|
147 |
+
}
|
148 |
+
|
149 |
+
/**
|
150 |
+
* Helper function to receive grid functionality urls for current grid
|
151 |
+
*
|
152 |
+
* @return string Requested URL
|
153 |
+
*/
|
154 |
+
public function getGridUrl()
|
155 |
+
{
|
156 |
+
return $this->getUrl(
|
157 |
+
'*/*/',
|
158 |
+
array (
|
159 |
+
'_current' => true,
|
160 |
+
)
|
161 |
+
);
|
162 |
+
}
|
163 |
+
}
|
app/code/local/TV/Faq/Block/Adminhtml/Item.php
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Item extends Mage_Adminhtml_Block_Widget_Grid_Container
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Constructor for FAQ Adminhtml Block
|
17 |
+
*/
|
18 |
+
public function __construct()
|
19 |
+
{
|
20 |
+
$this->_blockGroup = 'tv_faq';
|
21 |
+
$this->_controller = 'adminhtml_item';
|
22 |
+
$this->_headerText = Mage::helper('tv_faq')->__('Manage FAQ Items');
|
23 |
+
$this->_addButtonLabel = Mage::helper('tv_faq')->__('Add New FAQ Item');
|
24 |
+
|
25 |
+
parent::__construct();
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Returns the CSS class for the header
|
30 |
+
*
|
31 |
+
* Usually 'icon-head' and a more precise class is returned. We return
|
32 |
+
* only an empty string to avoid spacing on the left of the header as we
|
33 |
+
* don't have an icon.
|
34 |
+
*
|
35 |
+
* @return string
|
36 |
+
*/
|
37 |
+
public function getHeaderCssClass()
|
38 |
+
{
|
39 |
+
return '';
|
40 |
+
}
|
41 |
+
}
|
app/code/local/TV/Faq/Block/Adminhtml/Item/Edit.php
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Item_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Constructor for the FAQ edit form
|
17 |
+
*
|
18 |
+
*/
|
19 |
+
public function __construct()
|
20 |
+
{
|
21 |
+
$this->_objectId = 'faq_id';
|
22 |
+
$this->_blockGroup = 'tv_faq';
|
23 |
+
$this->_controller = 'adminhtml_item';
|
24 |
+
|
25 |
+
parent::__construct();
|
26 |
+
|
27 |
+
$this->_updateButton('save', 'label', Mage::helper('tv_faq')->__('Save FAQ item'));
|
28 |
+
$this->_updateButton('delete', 'label', Mage::helper('tv_faq')->__('Delete FAQ item'));
|
29 |
+
|
30 |
+
$this->_addButton('saveandcontinue', array (
|
31 |
+
'label' => Mage::helper('tv_faq')->__('Save and continue edit'),
|
32 |
+
'onclick' => 'saveAndContinueEdit()',
|
33 |
+
'class' => 'save' ), -100);
|
34 |
+
|
35 |
+
$this->_formScripts[] = "
|
36 |
+
function toggleEditor() {
|
37 |
+
if (tinyMCE.getInstanceById('block_content') == null) {
|
38 |
+
tinyMCE.execCommand('mceAddControl', false, 'block_content');
|
39 |
+
} else {
|
40 |
+
tinyMCE.execCommand('mceRemoveControl', false, 'block_content');
|
41 |
+
}
|
42 |
+
}
|
43 |
+
function saveAndContinueEdit(){
|
44 |
+
editForm.submit($('edit_form').action+'back/edit/');
|
45 |
+
}
|
46 |
+
";
|
47 |
+
}
|
48 |
+
protected function _prepareLayout() {
|
49 |
+
parent::_prepareLayout();
|
50 |
+
if (Mage::getSingleton('cms/wysiwyg_config')->isEnabled()) {
|
51 |
+
$this->getLayout()->getBlock('head')->setCanLoadTinyMce(true);
|
52 |
+
}
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Helper function to edit the header of the current form
|
57 |
+
*
|
58 |
+
* @return string Returns an "edit" or "new" text depending on the type of modifications.
|
59 |
+
*/
|
60 |
+
public function getHeaderText()
|
61 |
+
{
|
62 |
+
if (Mage::registry('faq')->getFaqId()) {
|
63 |
+
return Mage::helper('tv_faq')->__("Edit FAQ item '%s'", $this->htmlEscape(Mage::registry('faq')->getQuestion()));
|
64 |
+
}
|
65 |
+
else {
|
66 |
+
return Mage::helper('tv_faq')->__('New FAQ item');
|
67 |
+
}
|
68 |
+
}
|
69 |
+
|
70 |
+
public function getFormActionUrl()
|
71 |
+
{
|
72 |
+
return $this->getUrl('*/faq/save');
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Returns the CSS class for the header
|
77 |
+
*
|
78 |
+
* Usually 'icon-head' and a more precise class is returned. We return
|
79 |
+
* only an empty string to avoid spacing on the left of the header as we
|
80 |
+
* don't have an icon.
|
81 |
+
*
|
82 |
+
* @return string
|
83 |
+
*/
|
84 |
+
public function getHeaderCssClass()
|
85 |
+
{
|
86 |
+
return '';
|
87 |
+
}
|
88 |
+
}
|
app/code/local/TV/Faq/Block/Adminhtml/Item/Edit/Form.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.hiremagento.com
|
11 |
+
* Email: hiremagento@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Item_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Preperation of current form
|
17 |
+
*
|
18 |
+
* @return TV_Faq_Block_Adminhtml_Item_Edit_Form
|
19 |
+
*/
|
20 |
+
protected function _prepareForm()
|
21 |
+
{
|
22 |
+
$form = new Varien_Data_Form(array (
|
23 |
+
'id' => 'edit_form',
|
24 |
+
'action' => $this->getData('action'),
|
25 |
+
'method' => 'post',
|
26 |
+
'enctype' => 'multipart/form-data' ));
|
27 |
+
$form->setUseContainer(true);
|
28 |
+
$this->setForm($form);
|
29 |
+
return parent::_prepareForm();
|
30 |
+
}
|
31 |
+
}
|
app/code/local/TV/Faq/Block/Adminhtml/Item/Edit/Tab/Form.php
ADDED
@@ -0,0 +1,138 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Item_Edit_Tab_Form extends Mage_Adminhtml_Block_Widget_Form
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Prepares the page layout
|
17 |
+
*
|
18 |
+
* Loads the WYSIWYG editor on demand if enabled.
|
19 |
+
*
|
20 |
+
* @return TV_Faq_Block_Admin_Edit
|
21 |
+
*/
|
22 |
+
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Preparation of current form
|
26 |
+
*
|
27 |
+
* @return TV_Faq_Block_Admin_Edit_Tab_Main Self
|
28 |
+
*/
|
29 |
+
protected function _prepareForm()
|
30 |
+
{
|
31 |
+
$model = Mage::registry('faq');
|
32 |
+
|
33 |
+
$form = new Varien_Data_Form();
|
34 |
+
$form->setHtmlIdPrefix('faq_');
|
35 |
+
$wysiwygConfig = Mage::getSingleton('cms/wysiwyg_config')->getConfig(
|
36 |
+
|
37 |
+
array('tab_id' => 'form_section')
|
38 |
+
|
39 |
+
);
|
40 |
+
|
41 |
+
$wysiwygConfig["files_browser_window_url"] = Mage::getSingleton('adminhtml/url')->getUrl('adminhtml/cms_wysiwyg_images/index');
|
42 |
+
|
43 |
+
$wysiwygConfig["directives_url"] = Mage::getSingleton('adminhtml/url')->getUrl('adminhtml/cms_wysiwyg/directive');
|
44 |
+
|
45 |
+
$wysiwygConfig["directives_url_quoted"] = Mage::getSingleton('adminhtml/url')->getUrl('adminhtml/cms_wysiwyg/directive');
|
46 |
+
|
47 |
+
$wysiwygConfig["widget_window_url"] = Mage::getSingleton('adminhtml/url')->getUrl('adminhtml/widget/index');
|
48 |
+
|
49 |
+
$wysiwygConfig["files_browser_window_width"] = (int) Mage::getConfig()->getNode('adminhtml/cms/browser/window_width');
|
50 |
+
|
51 |
+
$wysiwygConfig["files_browser_window_height"] = (int) Mage::getConfig()->getNode('adminhtml/cms/browser/window_height');
|
52 |
+
|
53 |
+
$plugins = $wysiwygConfig->getData("plugins");
|
54 |
+
|
55 |
+
$plugins[0]["options"]["url"] = Mage::getSingleton('adminhtml/url')->getUrl('adminhtml/system_variable/wysiwygPlugin');
|
56 |
+
|
57 |
+
$plugins[0]["options"]["onclick"]["subject"] = "MagentovariablePlugin.loadChooser('".Mage::getSingleton('adminhtml/url')->getUrl('adminhtml/system_variable/wysiwygPlugin')."', '{{html_id}}');";
|
58 |
+
|
59 |
+
$plugins = $wysiwygConfig->setData("plugins",$plugins);
|
60 |
+
$fieldset = $form->addFieldset('base_fieldset', array (
|
61 |
+
'legend' => Mage::helper('tv_faq')->__('General information'),
|
62 |
+
'class' => 'fieldset-wide' ));
|
63 |
+
|
64 |
+
if ($model->getFaqId()) {
|
65 |
+
$fieldset->addField('faq_id', 'hidden', array (
|
66 |
+
'name' => 'faq_id' ));
|
67 |
+
}
|
68 |
+
|
69 |
+
$fieldset->addField('question', 'text', array (
|
70 |
+
'name' => 'question',
|
71 |
+
'label' => Mage::helper('tv_faq')->__('FAQ item question'),
|
72 |
+
'title' => Mage::helper('tv_faq')->__('FAQ item question'),
|
73 |
+
'required' => true ));
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Check is single store mode
|
77 |
+
*/
|
78 |
+
if (!Mage::app()->isSingleStoreMode()) {
|
79 |
+
$fieldset->addField('store_id', 'multiselect',
|
80 |
+
array (
|
81 |
+
'name' => 'stores[]',
|
82 |
+
'label' => Mage::helper('cms')->__('Store view'),
|
83 |
+
'title' => Mage::helper('cms')->__('Store view'),
|
84 |
+
'required' => true,
|
85 |
+
'values' => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, true) ));
|
86 |
+
}
|
87 |
+
else {
|
88 |
+
$fieldset->addField('store_id', 'hidden', array (
|
89 |
+
'name' => 'stores[]',
|
90 |
+
'value' => Mage::app()->getStore(true)->getId() ));
|
91 |
+
$model->setStoreId(Mage::app()->getStore(true)->getId());
|
92 |
+
}
|
93 |
+
|
94 |
+
$fieldset->addField('is_active', 'select',
|
95 |
+
array (
|
96 |
+
'label' => Mage::helper('cms')->__('Status'),
|
97 |
+
'title' => Mage::helper('tv_faq')->__('Item status'),
|
98 |
+
'name' => 'is_active',
|
99 |
+
'required' => true,
|
100 |
+
'options' => array (
|
101 |
+
'1' => Mage::helper('cms')->__('Enabled'),
|
102 |
+
'0' => Mage::helper('cms')->__('Disabled') ) ));
|
103 |
+
|
104 |
+
$fieldset->addField('category_id', 'multiselect',
|
105 |
+
array (
|
106 |
+
'label' => Mage::helper('tv_faq')->__('Category'),
|
107 |
+
'title' => Mage::helper('tv_faq')->__('Category'),
|
108 |
+
'name' => 'categories[]',
|
109 |
+
'required' => false,
|
110 |
+
'values' => Mage::getResourceSingleton('tv_faq/category_collection')->toOptionArray(),
|
111 |
+
)
|
112 |
+
);
|
113 |
+
|
114 |
+
$fieldset->addField('answer', 'editor',
|
115 |
+
array (
|
116 |
+
'name' => 'answer',
|
117 |
+
'label' => Mage::helper('tv_faq')->__('Content'),
|
118 |
+
'title' => Mage::helper('tv_faq')->__('Content'),
|
119 |
+
'style' => 'height:36em;',
|
120 |
+
'config' => $wysiwygConfig,
|
121 |
+
'required' => true ));
|
122 |
+
|
123 |
+
$fieldset->addField('answer_html', 'select',
|
124 |
+
array (
|
125 |
+
'label' => Mage::helper('tv_faq')->__('HTML answer'),
|
126 |
+
'title' => Mage::helper('tv_faq')->__('HTML answer'),
|
127 |
+
'name' => 'answer_html',
|
128 |
+
'required' => true,
|
129 |
+
'options' => array (
|
130 |
+
'1' => Mage::helper('cms')->__('Enabled'),
|
131 |
+
'0' => Mage::helper('cms')->__('Disabled') ) ));
|
132 |
+
|
133 |
+
$form->setValues($model->getData());
|
134 |
+
$this->setForm($form);
|
135 |
+
|
136 |
+
return parent::_prepareForm();
|
137 |
+
}
|
138 |
+
}
|
app/code/local/TV/Faq/Block/Adminhtml/Item/Edit/Tabs.php
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Item_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Constructs current object
|
17 |
+
*
|
18 |
+
*/
|
19 |
+
public function __construct()
|
20 |
+
{
|
21 |
+
parent::__construct();
|
22 |
+
$this->setId('faq_tabs');
|
23 |
+
$this->setDestElementId('edit_form');
|
24 |
+
$this->setTitle(Mage::helper('tv_faq')->__('FAQ item information'));
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Prepares the page layout
|
29 |
+
*
|
30 |
+
* Adds the tabs to the left tab menu.
|
31 |
+
*
|
32 |
+
* @return TV_Faq_Block_Admin_Edit
|
33 |
+
*/
|
34 |
+
protected function _prepareLayout()
|
35 |
+
{
|
36 |
+
$return = parent::_prepareLayout();
|
37 |
+
|
38 |
+
$this->addTab(
|
39 |
+
'main_section',
|
40 |
+
array(
|
41 |
+
'label' => Mage::helper('tv_faq')->__('General information'),
|
42 |
+
'title' => Mage::helper('tv_faq')->__('General information'),
|
43 |
+
'content' => $this->getLayout()->createBlock('tv_faq/adminhtml_item_edit_tab_form')->toHtml(),
|
44 |
+
'active' => true,
|
45 |
+
)
|
46 |
+
);
|
47 |
+
|
48 |
+
return $return;
|
49 |
+
}
|
50 |
+
}
|
app/code/local/TV/Faq/Block/Adminhtml/Item/Grid.php
ADDED
@@ -0,0 +1,151 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Adminhtml_Item_Grid extends Mage_Adminhtml_Block_Widget_Grid
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Constructor of Grid
|
17 |
+
*
|
18 |
+
*/
|
19 |
+
public function __construct()
|
20 |
+
{
|
21 |
+
parent::__construct();
|
22 |
+
$this->setId('faq_grid');
|
23 |
+
$this->setUseAjax(false);
|
24 |
+
$this->setDefaultSort('creation_time');
|
25 |
+
$this->setDefaultDir('DESC');
|
26 |
+
$this->setSaveParametersInSession(true);
|
27 |
+
}
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Preparation of the data that is displayed by the grid.
|
31 |
+
*
|
32 |
+
* @return TV_Faq_Block_Admin_Grid Self
|
33 |
+
*/
|
34 |
+
protected function _prepareCollection()
|
35 |
+
{
|
36 |
+
//TODO: add full name logic
|
37 |
+
$collection = Mage::getResourceModel('tv_faq/faq_collection');
|
38 |
+
$this->setCollection($collection);
|
39 |
+
#Mage::Log($collection->getData());
|
40 |
+
return parent::_prepareCollection();
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Preparation of the requested columns of the grid
|
45 |
+
*
|
46 |
+
* @return TV_Faq_Block_Admin_Grid Self
|
47 |
+
*/
|
48 |
+
protected function _prepareColumns()
|
49 |
+
{
|
50 |
+
$this->addColumn('faq_id', array (
|
51 |
+
'header' => Mage::helper('tv_faq')->__('FAQ #'),
|
52 |
+
'width' => '80px',
|
53 |
+
'type' => 'text',
|
54 |
+
'index' => 'faq_id' ));
|
55 |
+
|
56 |
+
if (!Mage::app()->isSingleStoreMode()) {
|
57 |
+
$this->addColumn('store_id',
|
58 |
+
array (
|
59 |
+
'header' => Mage::helper('cms')->__('Store view'),
|
60 |
+
'index' => 'store_id',
|
61 |
+
'type' => 'store',
|
62 |
+
'store_all' => true,
|
63 |
+
'store_view' => true,
|
64 |
+
'sortable' => false,
|
65 |
+
'filter_condition_callback' => array (
|
66 |
+
$this,
|
67 |
+
'_filterStoreCondition' ) ));
|
68 |
+
}
|
69 |
+
|
70 |
+
$this->addColumn('question', array (
|
71 |
+
'header' => Mage::helper('tv_faq')->__('Question'),
|
72 |
+
'index' => 'question' ));
|
73 |
+
|
74 |
+
$this->addColumn('is_active',
|
75 |
+
array (
|
76 |
+
'header' => Mage::helper('tv_faq')->__('Status'),
|
77 |
+
'index' => 'is_active',
|
78 |
+
'type' => 'options',
|
79 |
+
'width' => '70px',
|
80 |
+
'options' => array (
|
81 |
+
0 => Mage::helper('tv_faq')->__('No'),
|
82 |
+
1 => Mage::helper('tv_faq')->__('Yes') ) ));
|
83 |
+
|
84 |
+
$this->addColumn('action',
|
85 |
+
array (
|
86 |
+
'header' => Mage::helper('tv_faq')->__('Action'),
|
87 |
+
'width' => '50px',
|
88 |
+
'type' => 'action',
|
89 |
+
'getter' => 'getId',
|
90 |
+
'actions' => array (
|
91 |
+
array (
|
92 |
+
'caption' => Mage::helper('tv_faq')->__('Edit'),
|
93 |
+
'url' => array (
|
94 |
+
'base' => 'adminhtml/faq/edit' ),
|
95 |
+
'field' => 'faq_id' ) ),
|
96 |
+
'filter' => false,
|
97 |
+
'sortable' => false,
|
98 |
+
'index' => 'stores',
|
99 |
+
'is_system' => true ));
|
100 |
+
|
101 |
+
return parent::_prepareColumns();
|
102 |
+
}
|
103 |
+
|
104 |
+
/**
|
105 |
+
* Helper function to do after load modifications
|
106 |
+
*
|
107 |
+
*/
|
108 |
+
protected function _afterLoadCollection()
|
109 |
+
{
|
110 |
+
$this->getCollection()->walk('afterLoad');
|
111 |
+
parent::_afterLoadCollection();
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Helper function to add store filter condition
|
116 |
+
*
|
117 |
+
* @param Mage_Core_Model_Mysql4_Collection_Abstract $collection Data collection
|
118 |
+
* @param Mage_Adminhtml_Block_Widget_Grid_Column $column Column information to be filtered
|
119 |
+
*/
|
120 |
+
protected function _filterStoreCondition($collection, $column)
|
121 |
+
{
|
122 |
+
if (!$value = $column->getFilter()->getValue()) {
|
123 |
+
return;
|
124 |
+
}
|
125 |
+
|
126 |
+
$this->getCollection()->addStoreFilter($value);
|
127 |
+
}
|
128 |
+
|
129 |
+
/**
|
130 |
+
* Helper function to reveive on row click url
|
131 |
+
*
|
132 |
+
* @param TV_Faq_Model_Faq $row Current rows dataset
|
133 |
+
* @return string URL for current row's onclick event
|
134 |
+
*/
|
135 |
+
public function getRowUrl($row)
|
136 |
+
{
|
137 |
+
return $this->getUrl('adminhtml/faq/edit', array (
|
138 |
+
'faq_id' => $row->getFaqId() ));
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Helper function to receive grid functionality urls for current grid
|
143 |
+
*
|
144 |
+
* @return string Requested URL
|
145 |
+
*/
|
146 |
+
public function getGridUrl()
|
147 |
+
{
|
148 |
+
return $this->getUrl('adminhtml/faq/index', array (
|
149 |
+
'_current' => true ));
|
150 |
+
}
|
151 |
+
}
|
app/code/local/TV/Faq/Block/Frontend/Detail.php
ADDED
@@ -0,0 +1,232 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Frontend_Detail extends Mage_Core_Block_Template {
|
14 |
+
|
15 |
+
protected $_faq;
|
16 |
+
protected $_images;
|
17 |
+
|
18 |
+
|
19 |
+
protected function _prepareLayout()
|
20 |
+
{
|
21 |
+
$faq = $this->getFaq();
|
22 |
+
|
23 |
+
if ($faq !== false && $head = $this->getLayout()->getBlock('head')) {
|
24 |
+
$head->setTitle($this->htmlEscape($faq->getQuestion()) . ' - ' . $head->getTitle());
|
25 |
+
}
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Function to gather the current faq item
|
30 |
+
*
|
31 |
+
* @return TV_Faq_Model_Faq The current faq item
|
32 |
+
*/
|
33 |
+
public function getFaq() {
|
34 |
+
if (!$this->_faq) {
|
35 |
+
$id = intval($this->getRequest()->getParam('faq'));
|
36 |
+
try {
|
37 |
+
$this->_faq = Mage :: getModel('tv_faq/faq')->load($id);
|
38 |
+
|
39 |
+
if ($this->_faq->getIsActive() != 1){
|
40 |
+
Mage::throwException('Faq Item is not active');
|
41 |
+
}
|
42 |
+
}
|
43 |
+
catch (Exception $e) {
|
44 |
+
$this->_faq = false;
|
45 |
+
}
|
46 |
+
}
|
47 |
+
|
48 |
+
return $this->_faq;
|
49 |
+
}
|
50 |
+
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Extracting available images
|
54 |
+
*
|
55 |
+
* @param string $thumbSize dimensions of thumbnail image (either number of width pixels or {width]x{height}
|
56 |
+
* @param string $imageSize dimensions of detail image (either number of width pixels or {width]x{height}
|
57 |
+
* @return unknown
|
58 |
+
*/
|
59 |
+
public function getImages($thumbSize = null, $imageSize = null) {
|
60 |
+
if (!$faq = $this->getFaq()) {
|
61 |
+
return false;
|
62 |
+
}
|
63 |
+
|
64 |
+
// read images from dataset
|
65 |
+
$images = $faq->getImage();
|
66 |
+
$result = array();
|
67 |
+
|
68 |
+
// if we have found images - process them
|
69 |
+
if (is_array($images) && !empty($images)) {
|
70 |
+
|
71 |
+
// get media model
|
72 |
+
$mediaConfig = Mage :: getSingleton('faq/faq_media_config');
|
73 |
+
$mediaModel = Mage :: getSingleton('media/image')->setConfig($mediaConfig);
|
74 |
+
|
75 |
+
// iterate through images
|
76 |
+
foreach ($images as $image) {
|
77 |
+
|
78 |
+
// only go on if the image can be found
|
79 |
+
if (file_exists(Mage::getBaseDir('media') . DS . 'faq' . DS . $image)) {
|
80 |
+
|
81 |
+
// gather needed information
|
82 |
+
$newImage = array(
|
83 |
+
'original' => $image,
|
84 |
+
'galleryUrl' => $this->getGalleryUrl($image)
|
85 |
+
);
|
86 |
+
|
87 |
+
if ($thumbSize) {
|
88 |
+
$newImage['src'] = $mediaModel->getSpecialLink($image, $thumbSize);
|
89 |
+
}
|
90 |
+
|
91 |
+
if ($imageSize) {
|
92 |
+
$newImage['href'] = $mediaModel->getSpecialLink($image, $imageSize);
|
93 |
+
$newImage['width'] = intval($imageSize);
|
94 |
+
}
|
95 |
+
else {
|
96 |
+
$newImage['href'] = Mage::getBaseUrl('media') . '/faq/' . $image;
|
97 |
+
$newImage['width'] = $mediaModel->setFileName($image)->getDimensions()->getWidth();
|
98 |
+
}
|
99 |
+
|
100 |
+
$result[] = $newImage;
|
101 |
+
}
|
102 |
+
}
|
103 |
+
}
|
104 |
+
|
105 |
+
return $result;
|
106 |
+
}
|
107 |
+
|
108 |
+
|
109 |
+
/**
|
110 |
+
* Get gallery link for given image
|
111 |
+
*
|
112 |
+
* @param string $image File name
|
113 |
+
* @return string URL to gallery
|
114 |
+
*/
|
115 |
+
public function getGalleryUrl($image) {
|
116 |
+
$params = array('faq' => $this->getFaq()->getFaqId() . '_' . urlencode(str_replace(array(' ', 'ä', 'ö', 'ü', 'ß'), array('_', 'ae', 'oe', 'ue', 'ss'), (strtolower($this->getFaq()->getQuestion())))));
|
117 |
+
if ($image) {
|
118 |
+
$params['image'] = $image;
|
119 |
+
return $this->getUrl('*/*/gallery', $params);
|
120 |
+
}
|
121 |
+
return $this->getUrl('*/*/gallery', $params);
|
122 |
+
}
|
123 |
+
|
124 |
+
|
125 |
+
/**
|
126 |
+
* Get gallery images for current gallery view
|
127 |
+
*
|
128 |
+
* @param string $type needed Image information type ('previous', 'current' or 'next') - if not given the function returns all of them.
|
129 |
+
* @return array Requested image information
|
130 |
+
*/
|
131 |
+
public function getGalleryImages($type = null) {
|
132 |
+
|
133 |
+
// only do processing once (since parameters don't change during gallery view)
|
134 |
+
if (!$this->_images) {
|
135 |
+
|
136 |
+
// get images and parameters
|
137 |
+
$currentParam = $this->getRequest()->getParam('image');
|
138 |
+
$images = $this->getImages();
|
139 |
+
|
140 |
+
// initialization
|
141 |
+
$result = array(
|
142 |
+
'previous' => NULL,
|
143 |
+
'current' => NULL,
|
144 |
+
'next' => NULL
|
145 |
+
);
|
146 |
+
|
147 |
+
// if we have images -> process them
|
148 |
+
if (is_array($images) && !empty($images)) {
|
149 |
+
$previousImage = null;
|
150 |
+
|
151 |
+
foreach ($images as $image) {
|
152 |
+
|
153 |
+
// if we found the requested pic -> save it
|
154 |
+
// if the requested pic was not found the first pic of the collection is used
|
155 |
+
if ($image['original'] == $currentParam || !$result['current']) {
|
156 |
+
$result['current'] = $image;
|
157 |
+
|
158 |
+
// save the previous image to get back to it
|
159 |
+
$result['previous'] = $previousImage;
|
160 |
+
|
161 |
+
if ($image['original'] == $currentParam) {
|
162 |
+
$current = true;
|
163 |
+
}
|
164 |
+
}
|
165 |
+
// save next image for pagination
|
166 |
+
elseif ($result['current']) {
|
167 |
+
$result['next'] = $image;
|
168 |
+
|
169 |
+
// if we found the requested image -> break
|
170 |
+
if ($current) {
|
171 |
+
break;
|
172 |
+
}
|
173 |
+
}
|
174 |
+
|
175 |
+
// save current image as previous image for further processing
|
176 |
+
$previousImage = $image;
|
177 |
+
}
|
178 |
+
}
|
179 |
+
|
180 |
+
// save results in class variable
|
181 |
+
$this->_images = $result;
|
182 |
+
}
|
183 |
+
|
184 |
+
// if the requested type is given - return the image
|
185 |
+
if ($type) {
|
186 |
+
return (isset($this->_images[$type]) ? $this->_images[$type] : false);
|
187 |
+
}
|
188 |
+
|
189 |
+
// if no type given -> return all the three images
|
190 |
+
return $this->_images;
|
191 |
+
}
|
192 |
+
|
193 |
+
|
194 |
+
/**
|
195 |
+
* Gets the current image
|
196 |
+
*
|
197 |
+
* @return array Image information
|
198 |
+
*/
|
199 |
+
public function getCurrentImage() {
|
200 |
+
return $this->getGalleryImages('current');
|
201 |
+
}
|
202 |
+
|
203 |
+
|
204 |
+
/**
|
205 |
+
* Gets the previous image
|
206 |
+
*
|
207 |
+
* @return array Image information
|
208 |
+
*/
|
209 |
+
public function getPreviousImage() {
|
210 |
+
return $this->getGalleryImages('previous');
|
211 |
+
}
|
212 |
+
|
213 |
+
|
214 |
+
/**
|
215 |
+
* Gets the next image
|
216 |
+
*
|
217 |
+
* @return array Image information
|
218 |
+
*/
|
219 |
+
public function getNextImage() {
|
220 |
+
return $this->getGalleryImages('next');
|
221 |
+
}
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Returns the current image's width
|
225 |
+
*
|
226 |
+
* @return int Width of current image
|
227 |
+
*/
|
228 |
+
public function getImageWidth() {
|
229 |
+
$current = $this->getCurrentImage();
|
230 |
+
return $current['width'];
|
231 |
+
}
|
232 |
+
}
|
app/code/local/TV/Faq/Block/Frontend/List.php
ADDED
@@ -0,0 +1,140 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Block_Frontend_List extends Mage_Core_Block_Template
|
14 |
+
{
|
15 |
+
protected $_faqCollection;
|
16 |
+
|
17 |
+
protected function _prepareLayout()
|
18 |
+
{
|
19 |
+
if ($head = $this->getLayout()->getBlock('head')) {
|
20 |
+
$head->setTitle($this->htmlEscape($this->__('Frequently Asked Questions')) . ' - ' . $head->getTitle());
|
21 |
+
}
|
22 |
+
}
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Returns collection of current FAQ entries
|
26 |
+
*
|
27 |
+
* @param int $pageSize
|
28 |
+
* @return TV_Faq_Model_Mysql_Faq_Collection collection of current FAQ entries
|
29 |
+
*/
|
30 |
+
public function getFaqCollection($pageSize = null)
|
31 |
+
{
|
32 |
+
if (!$this->_faqCollection || (intval($pageSize) > 0
|
33 |
+
&& $this->_faqCollection->getSize() != intval($pageSize))
|
34 |
+
) {
|
35 |
+
$this->_faqCollection = Mage :: getModel('tv_faq/faq')
|
36 |
+
->getCollection()
|
37 |
+
->addStoreFilter(Mage :: app()->getStore())
|
38 |
+
->addIsActiveFilter();
|
39 |
+
|
40 |
+
if (isset($pageSize) && intval($pageSize) && intval($pageSize) > 0) {
|
41 |
+
$this->_faqCollection->setPageSize(intval($pageSize));
|
42 |
+
}
|
43 |
+
}
|
44 |
+
|
45 |
+
return $this->_faqCollection;
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Returns all active categories
|
50 |
+
*
|
51 |
+
* @return TV_Faq_Model_Mysql4_Category_Collection
|
52 |
+
*/
|
53 |
+
public function getCategoryCollection()
|
54 |
+
{
|
55 |
+
$categories = $this->getData('category_collection');
|
56 |
+
if (is_null($categories)) {
|
57 |
+
$categories = Mage::getResourceSingleton('tv_faq/category_collection')
|
58 |
+
->addStoreFilter(Mage::app()->getStore())
|
59 |
+
->addIsActiveFilter();
|
60 |
+
$this->setData('category_collection', $categories);
|
61 |
+
}
|
62 |
+
return $categories;
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Returns the item collection for the given category
|
67 |
+
*
|
68 |
+
* @param TV_Faq_Model_Category $category
|
69 |
+
* @return TV_Faq_Model_Mysql4_Faq_Collection
|
70 |
+
*/
|
71 |
+
public function getItemCollectionByCategory(TV_Faq_Model_Category $category)
|
72 |
+
{
|
73 |
+
return $category->getItemCollection()->addIsActiveFilter()->addStoreFilter(Mage::app()->getStore());
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Simple helper function to determine, whether there are FAQ entries or not.
|
78 |
+
*
|
79 |
+
* @return boolean True, if FAQ are given.
|
80 |
+
*/
|
81 |
+
public function hasFaq()
|
82 |
+
{
|
83 |
+
return $this->getFaqCollection()->getSize() > 0;
|
84 |
+
}
|
85 |
+
|
86 |
+
public function getIntro($faqItem)
|
87 |
+
{
|
88 |
+
$_intro = strip_tags($faqItem->getContent());
|
89 |
+
$_intro = mb_substr($_intro, 0, mb_strpos($_intro, "\n"));
|
90 |
+
|
91 |
+
$length = 100 - mb_strlen($faqItem->getQuestion());
|
92 |
+
if ($length < 0) {
|
93 |
+
return '';
|
94 |
+
}
|
95 |
+
if (mb_strlen($_intro) > $length) {
|
96 |
+
$_intro = mb_substr($_intro, 0, $length);
|
97 |
+
$_intro = mb_substr($_intro, 0, mb_strrpos($_intro, ' ')).'...';
|
98 |
+
}
|
99 |
+
|
100 |
+
return $_intro;
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Returns
|
105 |
+
*
|
106 |
+
* @return array
|
107 |
+
*/
|
108 |
+
public function getFaqJumplist()
|
109 |
+
{
|
110 |
+
if(is_null($this->_faqJumplist))
|
111 |
+
{
|
112 |
+
$this->_faqJumplist = Mage::helper('tv_faq/jumplist');
|
113 |
+
$this->_faqJumplist->setFaqItems($this->getFaqCollection());
|
114 |
+
}
|
115 |
+
return $this->_faqJumplist;
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Simple helper function to determine, whether we should display a jumplist or not.
|
120 |
+
*
|
121 |
+
* @return boolean True if the jumplist should be displayed
|
122 |
+
*/
|
123 |
+
public function hasFaqJumplist() {
|
124 |
+
// TODO add configuration option to enable/disable jumplist
|
125 |
+
return count($this->getFaqJumplist()) > 0;
|
126 |
+
}
|
127 |
+
|
128 |
+
public function encodeQuestionForUrl($question)
|
129 |
+
{
|
130 |
+
return urlencode(
|
131 |
+
trim(
|
132 |
+
str_replace(
|
133 |
+
array(' ', 'ä', 'ö', 'ü', 'ß', '.', '/', ';', ':', '=', '?', '__'),
|
134 |
+
array('_', 'ae', 'oe', 'ue', 'ss', '_', '', '', '', '', '', '_'),
|
135 |
+
strtolower($question)
|
136 |
+
), ' _'
|
137 |
+
)
|
138 |
+
);
|
139 |
+
}
|
140 |
+
}
|
app/code/local/TV/Faq/Helper/Data.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Helper_Data extends Mage_Core_Helper_Abstract
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Returns config data
|
17 |
+
*
|
18 |
+
* @param string $field Requested field
|
19 |
+
* @return array config Configuration information
|
20 |
+
*/
|
21 |
+
public function getConfigData($field)
|
22 |
+
{
|
23 |
+
$path = 'faq/config/' . $field;
|
24 |
+
$config = Mage::getStoreConfig($path, Mage::app()->getStore());
|
25 |
+
return $config;
|
26 |
+
}
|
27 |
+
}
|
app/code/local/TV/Faq/Helper/Jumplist.php
ADDED
@@ -0,0 +1,93 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Helper_Jumplist extends Mage_Core_Helper_Abstract implements Countable, Iterator
|
14 |
+
{
|
15 |
+
protected $items = array();
|
16 |
+
|
17 |
+
/**
|
18 |
+
* The "garbage can" for items not fitting in the default range
|
19 |
+
*
|
20 |
+
* @var string
|
21 |
+
*/
|
22 |
+
const KEY_OTHER = 'other';
|
23 |
+
|
24 |
+
public function __construct()
|
25 |
+
{
|
26 |
+
// TODO make init range configurable
|
27 |
+
// create items from A (65) to Z (90)
|
28 |
+
for($ord = 65; $ord <= 90; $ord++)
|
29 |
+
{
|
30 |
+
$chr = chr($ord);
|
31 |
+
$this->items[$chr] = new TV_Faq_Helper_JumplistItem($chr);
|
32 |
+
}
|
33 |
+
|
34 |
+
// TODO make configurable if KEY_OTHER is appended or prepended
|
35 |
+
$this->items[self::KEY_OTHER] = new TV_Faq_Helper_JumplistItem(self::KEY_OTHER);
|
36 |
+
}
|
37 |
+
|
38 |
+
public function setFaqItems(TV_Faq_Model_Mysql4_Faq_Collection $items)
|
39 |
+
{
|
40 |
+
foreach($items as $item)
|
41 |
+
{
|
42 |
+
$key = strtoupper(substr($item->getQuestion(), 0, 1));
|
43 |
+
if(!array_key_exists($key, $this->items))
|
44 |
+
{
|
45 |
+
$key = self::KEY_OTHER;
|
46 |
+
}
|
47 |
+
$this->items[$key]->addFaqItem($item);
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* @see ArrayIterator::current()
|
53 |
+
*/
|
54 |
+
public function current() {
|
55 |
+
return current($this->items);
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* @see ArrayIterator::key()
|
60 |
+
*/
|
61 |
+
public function key() {
|
62 |
+
return key($this->items);
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* @see ArrayIterator::next()
|
67 |
+
*/
|
68 |
+
public function next() {
|
69 |
+
return next($this->items);
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* @see ArrayIterator::rewind()
|
74 |
+
*/
|
75 |
+
public function rewind() {
|
76 |
+
return reset($this->items);
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* @see ArrayIterator::valid()
|
81 |
+
*/
|
82 |
+
public function valid() {
|
83 |
+
return array_key_exists($this->key(), $this->items);
|
84 |
+
}
|
85 |
+
/**
|
86 |
+
* @see Countable::count()
|
87 |
+
*/
|
88 |
+
public function count() {
|
89 |
+
return count($this->items);
|
90 |
+
}
|
91 |
+
|
92 |
+
|
93 |
+
}
|
app/code/local/TV/Faq/Helper/JumplistItem.php
ADDED
@@ -0,0 +1,136 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Helper_JumplistItem extends Mage_Core_Helper_Abstract implements Countable, Iterator
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* @var string
|
17 |
+
*/
|
18 |
+
protected $label;
|
19 |
+
|
20 |
+
/**
|
21 |
+
* @var array
|
22 |
+
*/
|
23 |
+
protected $faqItems = array();
|
24 |
+
|
25 |
+
/**
|
26 |
+
* The constructor
|
27 |
+
*
|
28 |
+
* @param string $label
|
29 |
+
* @param array $faqItems
|
30 |
+
*/
|
31 |
+
public function __construct($label = null, $faqItems = null)
|
32 |
+
{
|
33 |
+
$this->setLabel($label);
|
34 |
+
if(!is_null($faqItems))
|
35 |
+
{
|
36 |
+
$this->setFaqItems($faqItems);
|
37 |
+
}
|
38 |
+
}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* @return array
|
42 |
+
*/
|
43 |
+
public function getFaqItems()
|
44 |
+
{
|
45 |
+
return $this->faqItems;
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* @param array $faqItems
|
50 |
+
*/
|
51 |
+
public function setFaqItems(array $faqItems)
|
52 |
+
{
|
53 |
+
$this->faqItems = $faqItems;
|
54 |
+
}
|
55 |
+
|
56 |
+
public function addFaqItem($item)
|
57 |
+
{
|
58 |
+
$this->faqItems[] = $item;
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* @return string
|
63 |
+
*/
|
64 |
+
public function getLabel()
|
65 |
+
{
|
66 |
+
return $this->label;
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* @param string $label
|
71 |
+
*/
|
72 |
+
public function setLabel($label)
|
73 |
+
{
|
74 |
+
$this->label = (string) $label;
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Count elements of the jumplist
|
79 |
+
*
|
80 |
+
* @return int
|
81 |
+
*/
|
82 |
+
public function count()
|
83 |
+
{
|
84 |
+
return count($this->faqItems);
|
85 |
+
}
|
86 |
+
|
87 |
+
/**
|
88 |
+
* Returns the current element
|
89 |
+
*
|
90 |
+
* @return mixed
|
91 |
+
*/
|
92 |
+
public function current()
|
93 |
+
{
|
94 |
+
return current($this->faqItems);
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Returns the key of the current element
|
99 |
+
*
|
100 |
+
* @return scalar
|
101 |
+
*/
|
102 |
+
public function key()
|
103 |
+
{
|
104 |
+
return key($this->faqItems);
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* Move forward to the next element
|
109 |
+
*
|
110 |
+
* @return void
|
111 |
+
*/
|
112 |
+
public function next()
|
113 |
+
{
|
114 |
+
next($this->faqItems);
|
115 |
+
}
|
116 |
+
|
117 |
+
/**
|
118 |
+
* Rewind the Iterator to the first element
|
119 |
+
*
|
120 |
+
* @void
|
121 |
+
*/
|
122 |
+
public function rewind()
|
123 |
+
{
|
124 |
+
reset($this->faqItems);
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Checks if current position is valid
|
129 |
+
*
|
130 |
+
* @return boolean
|
131 |
+
*/
|
132 |
+
public function valid()
|
133 |
+
{
|
134 |
+
return array_key_exists($this->key(), $this->faqItems);
|
135 |
+
}
|
136 |
+
}
|
app/code/local/TV/Faq/Model/Category.php
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
*
|
5 |
+
|
6 |
+
* @copyright Copyright (c) 2010 TV GmbH & Co. KG <magento@tv.de>
|
7 |
+
*/
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Category Model for FAQ Items
|
11 |
+
*
|
12 |
+
* Website: www.abc.com
|
13 |
+
* Email: honeyvishnoi@gmail.com
|
14 |
+
*/
|
15 |
+
class TV_Faq_Model_Category extends Mage_Core_Model_Abstract
|
16 |
+
{
|
17 |
+
/**
|
18 |
+
* Constructor
|
19 |
+
*/
|
20 |
+
protected function _construct()
|
21 |
+
{
|
22 |
+
$this->_init('tv_faq/category');
|
23 |
+
}
|
24 |
+
|
25 |
+
public function getName()
|
26 |
+
{
|
27 |
+
return $this->getCategoryName();
|
28 |
+
}
|
29 |
+
|
30 |
+
public function getItemCollection()
|
31 |
+
{
|
32 |
+
$collection = $this->getData('item_collection');
|
33 |
+
if (is_null($collection)) {
|
34 |
+
$collection = Mage::getSingleton('tv_faq/faq')->getCollection()
|
35 |
+
->addCategoryFilter($this);
|
36 |
+
$this->setData('item_collection', $collection);
|
37 |
+
}
|
38 |
+
return $collection;
|
39 |
+
}
|
40 |
+
}
|
app/code/local/TV/Faq/Model/Faq.php
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Model_Faq extends Mage_Core_Model_Abstract
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Constructor
|
17 |
+
*/
|
18 |
+
protected function _construct()
|
19 |
+
{
|
20 |
+
$this->_init('tv_faq/faq');
|
21 |
+
}
|
22 |
+
}
|
app/code/local/TV/Faq/Model/Mysql4/Category.php
ADDED
@@ -0,0 +1,103 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Category Resource Model for FAQ Items
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Model_Mysql4_Category extends Mage_Core_Model_Mysql4_Abstract
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Constructor
|
17 |
+
*/
|
18 |
+
protected function _construct()
|
19 |
+
{
|
20 |
+
$this->_init('tv_faq/category', 'category_id');
|
21 |
+
}
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Retrieve select object for load object data
|
25 |
+
*
|
26 |
+
* @param string $field
|
27 |
+
* @param mixed $value
|
28 |
+
* @return Zend_Db_Select
|
29 |
+
*/
|
30 |
+
protected function _getLoadSelect($field, $value, $object)
|
31 |
+
{
|
32 |
+
$select = parent::_getLoadSelect($field, $value, $object);
|
33 |
+
|
34 |
+
if ($object->getStoreId()) {
|
35 |
+
$select->join(
|
36 |
+
array('nns' => $this->getTable('tv_faq/category_store')),
|
37 |
+
$this->getMainTable() . '.item_id = `nns`.category_id'
|
38 |
+
)->where('is_active=1 AND `nns`.store_id in (0, ?) ',
|
39 |
+
$object->getStoreId())->order('creation_time DESC')->limit(1);
|
40 |
+
}
|
41 |
+
return $select;
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Sets the creation and update timestamps
|
46 |
+
*
|
47 |
+
* @param Mage_Core_Model_Abstract $object Current faq category
|
48 |
+
* @return TV_Faq_Model_Mysql4_Category
|
49 |
+
*/
|
50 |
+
protected function _beforeSave(Mage_Core_Model_Abstract $object)
|
51 |
+
{
|
52 |
+
if (!$object->getId()) {
|
53 |
+
$object->setCreationTime(Mage::getSingleton('core/date')->gmtDate());
|
54 |
+
}
|
55 |
+
$object->setUpdateTime(Mage::getSingleton('core/date')->gmtDate());
|
56 |
+
|
57 |
+
return parent::_beforeSave($object);
|
58 |
+
}
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Assign page to store views
|
62 |
+
*
|
63 |
+
* @param Mage_Core_Model_Abstract $object
|
64 |
+
*/
|
65 |
+
protected function _afterSave(Mage_Core_Model_Abstract $object)
|
66 |
+
{
|
67 |
+
$condition = $this->_getWriteAdapter()->quoteInto('category_id = ?', $object->getId());
|
68 |
+
$this->_getWriteAdapter()->delete($this->getTable('tv_faq/category_store'), $condition);
|
69 |
+
|
70 |
+
foreach ((array) $object->getData('stores') as $store) {
|
71 |
+
$storeArray = array ();
|
72 |
+
$storeArray['category_id'] = $object->getId();
|
73 |
+
$storeArray['store_id'] = $store;
|
74 |
+
$this->_getWriteAdapter()->insert(
|
75 |
+
$this->getTable('tv_faq/category_store'), $storeArray
|
76 |
+
);
|
77 |
+
}
|
78 |
+
|
79 |
+
return parent::_afterSave($object);
|
80 |
+
}
|
81 |
+
|
82 |
+
/**
|
83 |
+
* Do store processing after loading
|
84 |
+
*
|
85 |
+
* @param Mage_Core_Model_Abstract $object Current faq item
|
86 |
+
*/
|
87 |
+
protected function _afterLoad(Mage_Core_Model_Abstract $object)
|
88 |
+
{
|
89 |
+
$select = $this->_getReadAdapter()->select()->from(
|
90 |
+
$this->getTable('tv_faq/category_store')
|
91 |
+
)->where('category_id = ?', $object->getId());
|
92 |
+
|
93 |
+
if ($data = $this->_getReadAdapter()->fetchAll($select)) {
|
94 |
+
$storesArray = array ();
|
95 |
+
foreach ($data as $row) {
|
96 |
+
$storesArray[] = $row['store_id'];
|
97 |
+
}
|
98 |
+
$object->setData('store_id', $storesArray);
|
99 |
+
}
|
100 |
+
|
101 |
+
return parent::_afterLoad($object);
|
102 |
+
}
|
103 |
+
}
|
app/code/local/TV/Faq/Model/Mysql4/Category/Collection.php
ADDED
@@ -0,0 +1,105 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Model_Mysql4_Category_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
|
14 |
+
{
|
15 |
+
protected $_previewFlag;
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Constructor
|
19 |
+
*
|
20 |
+
*/
|
21 |
+
protected function _construct()
|
22 |
+
{
|
23 |
+
$this->_init('tv_faq/category');
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Add Filter by store
|
28 |
+
*
|
29 |
+
* @param int|Mage_Core_Model_Store $store Store to be filtered
|
30 |
+
* @return TV_Faq_Model_Mysql4_Category_Collection
|
31 |
+
*/
|
32 |
+
public function addStoreFilter($store)
|
33 |
+
{
|
34 |
+
if ($store instanceof Mage_Core_Model_Store) {
|
35 |
+
$store = array($store->getId());
|
36 |
+
}
|
37 |
+
|
38 |
+
$this->getSelect()->join(
|
39 |
+
array('store_table' => $this->getTable('tv_faq/category_store')),
|
40 |
+
'main_table.category_id = store_table.category_id',
|
41 |
+
array ()
|
42 |
+
)->where('store_table.store_id in (?)', array (
|
43 |
+
0,
|
44 |
+
$store
|
45 |
+
))->group('main_table.category_id');
|
46 |
+
|
47 |
+
return $this;
|
48 |
+
}
|
49 |
+
|
50 |
+
|
51 |
+
/**
|
52 |
+
* After load processing - adds store information to the datasets
|
53 |
+
*
|
54 |
+
*/
|
55 |
+
protected function _afterLoad()
|
56 |
+
{
|
57 |
+
if ($this->_previewFlag) {
|
58 |
+
$items = $this->getColumnValues('faq_id');
|
59 |
+
if (count($items)) {
|
60 |
+
$select = $this->getConnection()->select()->from(
|
61 |
+
$this->getTable('tv_faq/category_store')
|
62 |
+
)->where(
|
63 |
+
$this->getTable('tv_faq/category_store') . '.category_id IN (?)',
|
64 |
+
$items
|
65 |
+
);
|
66 |
+
if ($result = $this->getConnection()->fetchPairs($select)) {
|
67 |
+
foreach ($this as $item) {
|
68 |
+
if (!isset($result[$item->getData('category_id')])) {
|
69 |
+
continue;
|
70 |
+
}
|
71 |
+
if ($result[$item->getData('category_id')] == 0) {
|
72 |
+
$stores = Mage::app()->getStores(false, true);
|
73 |
+
$storeId = current($stores)->getId();
|
74 |
+
$storeCode = key($stores);
|
75 |
+
}
|
76 |
+
else {
|
77 |
+
$storeId = $result[$item->getData('category_id')];
|
78 |
+
$storeCode = Mage::app()->getStore($storeId)->getCode();
|
79 |
+
}
|
80 |
+
$item->setData('_first_store_id', $storeId);
|
81 |
+
$item->setData('store_code', $storeCode);
|
82 |
+
}
|
83 |
+
}
|
84 |
+
}
|
85 |
+
}
|
86 |
+
|
87 |
+
parent::_afterLoad();
|
88 |
+
}
|
89 |
+
|
90 |
+
protected function _toOptionArray($valueField = 'category_id', $labelField = 'category_name', $additional = array())
|
91 |
+
{
|
92 |
+
return parent::_toOptionArray($valueField, $labelField, $additional);
|
93 |
+
}
|
94 |
+
|
95 |
+
protected function _toOptionHash($valueField = 'category_id', $labelField='category_name')
|
96 |
+
{
|
97 |
+
return parent::_toOptionHash($valueField, $labelField);
|
98 |
+
}
|
99 |
+
|
100 |
+
public function addIsActiveFilter()
|
101 |
+
{
|
102 |
+
$this->addFilter('is_active', 1);
|
103 |
+
return $this;
|
104 |
+
}
|
105 |
+
}
|
app/code/local/TV/Faq/Model/Mysql4/Faq.php
ADDED
@@ -0,0 +1,140 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Model_Mysql4_Faq extends Mage_Core_Model_Mysql4_Abstract {
|
14 |
+
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Constructor
|
18 |
+
*
|
19 |
+
*/
|
20 |
+
protected function _construct() {
|
21 |
+
|
22 |
+
$this->_init('tv_faq/faq', 'faq_id');
|
23 |
+
}
|
24 |
+
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Retrieve select object for load object data
|
28 |
+
*
|
29 |
+
* @param string $field
|
30 |
+
* @param mixed $value
|
31 |
+
* @return Zend_Db_Select
|
32 |
+
*/
|
33 |
+
protected function _getLoadSelect($field, $value, $object) {
|
34 |
+
|
35 |
+
$select = parent::_getLoadSelect($field, $value, $object);
|
36 |
+
|
37 |
+
if ($object->getStoreId()) {
|
38 |
+
$select->join(
|
39 |
+
array('nns' => $this->getTable('tv_faq/faq_store')),
|
40 |
+
$this->getMainTable() . '.item_id = `nns`.faq_id'
|
41 |
+
)->where('is_active=1 AND `nns`.store_id in (0, ?) ',
|
42 |
+
$object->getStoreId())->order('creation_time DESC')->limit(1);
|
43 |
+
}
|
44 |
+
|
45 |
+
return $select;
|
46 |
+
}
|
47 |
+
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Some processing prior to saving to database - processes the given images
|
51 |
+
* and the store configuration
|
52 |
+
*
|
53 |
+
* @param Mage_Core_Model_Abstract $object Current faq item
|
54 |
+
*/
|
55 |
+
protected function _beforeSave(Mage_Core_Model_Abstract $object) {
|
56 |
+
|
57 |
+
if (!$object->getId()) {
|
58 |
+
$object->setCreationTime(Mage :: getSingleton('core/date')->gmtDate());
|
59 |
+
}
|
60 |
+
|
61 |
+
$object->setPublicationTime(
|
62 |
+
Mage::app()->getLocale()->date($object->getPublicationTime(),
|
63 |
+
Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT),
|
64 |
+
null, false)->toString(Varien_Date::DATETIME_INTERNAL_FORMAT)
|
65 |
+
);
|
66 |
+
|
67 |
+
$object->setUpdateTime(Mage :: getSingleton('core/date')->gmtDate());
|
68 |
+
}
|
69 |
+
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Assign page to store views
|
73 |
+
*
|
74 |
+
* @param Mage_Core_Model_Abstract $object
|
75 |
+
*/
|
76 |
+
protected function _afterSave(Mage_Core_Model_Abstract $object)
|
77 |
+
{
|
78 |
+
$condition = $this->_getWriteAdapter()->quoteInto('faq_id = ?', $object->getId());
|
79 |
+
|
80 |
+
// process faq item to store relation
|
81 |
+
$this->_getWriteAdapter()->delete($this->getTable('tv_faq/faq_store'), $condition);
|
82 |
+
foreach ((array) $object->getData('stores') as $store) {
|
83 |
+
$storeArray = array ();
|
84 |
+
$storeArray['faq_id'] = $object->getId();
|
85 |
+
$storeArray['store_id'] = $store;
|
86 |
+
$this->_getWriteAdapter()->insert(
|
87 |
+
$this->getTable('tv_faq/faq_store'), $storeArray
|
88 |
+
);
|
89 |
+
}
|
90 |
+
|
91 |
+
// process faq item to category relation
|
92 |
+
$this->_getWriteAdapter()->delete($this->getTable('tv_faq/category_item'), $condition);
|
93 |
+
foreach ((array) $object->getData('categories') as $categoryId) {
|
94 |
+
$categoryArray = array ();
|
95 |
+
$categoryArray['faq_id'] = $object->getId();
|
96 |
+
$categoryArray['category_id'] = $categoryId;
|
97 |
+
$this->_getWriteAdapter()->insert(
|
98 |
+
$this->getTable('tv_faq/category_item'), $categoryArray
|
99 |
+
);
|
100 |
+
}
|
101 |
+
|
102 |
+
return parent::_afterSave($object);
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Do store and category processing after loading
|
107 |
+
*
|
108 |
+
* @param Mage_Core_Model_Abstract $object Current faq item
|
109 |
+
*/
|
110 |
+
protected function _afterLoad(Mage_Core_Model_Abstract $object)
|
111 |
+
{
|
112 |
+
// process faq item to store relation
|
113 |
+
$select = $this->_getReadAdapter()->select()->from(
|
114 |
+
$this->getTable('tv_faq/faq_store')
|
115 |
+
)->where('faq_id = ?', $object->getId());
|
116 |
+
|
117 |
+
if ($data = $this->_getReadAdapter()->fetchAll($select)) {
|
118 |
+
$storesArray = array ();
|
119 |
+
foreach ($data as $row) {
|
120 |
+
$storesArray[] = $row['store_id'];
|
121 |
+
}
|
122 |
+
$object->setData('store_id', $storesArray);
|
123 |
+
}
|
124 |
+
|
125 |
+
// process faq item to category relation
|
126 |
+
$select = $this->_getReadAdapter()->select()->from(
|
127 |
+
$this->getTable('tv_faq/category_item')
|
128 |
+
)->where('faq_id = ?', $object->getId());
|
129 |
+
|
130 |
+
if ($data = $this->_getReadAdapter()->fetchAll($select)) {
|
131 |
+
$categoryArray = array ();
|
132 |
+
foreach ($data as $row) {
|
133 |
+
$categoryArray[] = $row['category_id'];
|
134 |
+
}
|
135 |
+
$object->setData('category_id', $categoryArray);
|
136 |
+
}
|
137 |
+
|
138 |
+
return parent::_afterLoad($object);
|
139 |
+
}
|
140 |
+
}
|
app/code/local/TV/Faq/Model/Mysql4/Faq/Collection.php
ADDED
@@ -0,0 +1,132 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Model_Mysql4_Faq_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
|
14 |
+
{
|
15 |
+
protected $_previewFlag;
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Constructor
|
19 |
+
*
|
20 |
+
*/
|
21 |
+
protected function _construct()
|
22 |
+
{
|
23 |
+
$this->_init('tv_faq/faq')
|
24 |
+
->setOrder('question', 'ASC');
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Creates an options array for grid filter functionality
|
29 |
+
*
|
30 |
+
* @return array Options array
|
31 |
+
*/
|
32 |
+
public function toOptionArray()
|
33 |
+
{
|
34 |
+
return $this->_toOptionArray('faq_id', 'question');
|
35 |
+
}
|
36 |
+
|
37 |
+
public function addIsActiveFilter()
|
38 |
+
{
|
39 |
+
$this->addFilter('is_active', 1);
|
40 |
+
return $this;
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Add Filter by category
|
45 |
+
*
|
46 |
+
* @param int|TV_Faq_Model_Category $category Category to be filtered
|
47 |
+
* @return TV_Faq_Model_Mysql4_Category_Collection
|
48 |
+
*/
|
49 |
+
public function addCategoryFilter($category)
|
50 |
+
{
|
51 |
+
if ($category instanceof TV_Faq_Model_Category) {
|
52 |
+
$category = array($category->getId());
|
53 |
+
}
|
54 |
+
|
55 |
+
$this->getSelect()->join(
|
56 |
+
array('category_table' => $this->getTable('tv_faq/category_item')),
|
57 |
+
'main_table.faq_id = category_table.faq_id',
|
58 |
+
array ()
|
59 |
+
)->where('category_table.category_id in (?)', array (
|
60 |
+
0,
|
61 |
+
$category
|
62 |
+
))->group('main_table.faq_id');
|
63 |
+
|
64 |
+
return $this;
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Add Filter by store
|
69 |
+
*
|
70 |
+
* @param int|Mage_Core_Model_Store $store Store to be filtered
|
71 |
+
* @return TV_Faq_Model_Mysql4_Faq_Collection Self
|
72 |
+
*/
|
73 |
+
public function addStoreFilter($store)
|
74 |
+
{
|
75 |
+
if ($store instanceof Mage_Core_Model_Store) {
|
76 |
+
$store = array (
|
77 |
+
$store->getId()
|
78 |
+
);
|
79 |
+
}
|
80 |
+
|
81 |
+
$this->getSelect()->join(
|
82 |
+
array('store_table' => $this->getTable('tv_faq/faq_store')),
|
83 |
+
'main_table.faq_id = store_table.faq_id',
|
84 |
+
array ()
|
85 |
+
)->where('store_table.store_id in (?)', array (
|
86 |
+
0,
|
87 |
+
$store
|
88 |
+
))->group('main_table.faq_id');
|
89 |
+
|
90 |
+
return $this;
|
91 |
+
}
|
92 |
+
|
93 |
+
|
94 |
+
/**
|
95 |
+
* After load processing - adds store information to the datasets
|
96 |
+
*
|
97 |
+
*/
|
98 |
+
protected function _afterLoad()
|
99 |
+
{
|
100 |
+
if ($this->_previewFlag) {
|
101 |
+
$items = $this->getColumnValues('faq_id');
|
102 |
+
if (count($items)) {
|
103 |
+
$select = $this->getConnection()->select()->from(
|
104 |
+
$this->getTable('tv_faq/faq_store')
|
105 |
+
)->where(
|
106 |
+
$this->getTable('tv_faq/faq_store') . '.faq_id IN (?)',
|
107 |
+
$items
|
108 |
+
);
|
109 |
+
if ($result = $this->getConnection()->fetchPairs($select)) {
|
110 |
+
foreach ($this as $item) {
|
111 |
+
if (!isset($result[$item->getData('faq_id')])) {
|
112 |
+
continue;
|
113 |
+
}
|
114 |
+
if ($result[$item->getData('faq_id')] == 0) {
|
115 |
+
$stores = Mage::app()->getStores(false, true);
|
116 |
+
$storeId = current($stores)->getId();
|
117 |
+
$storeCode = key($stores);
|
118 |
+
}
|
119 |
+
else {
|
120 |
+
$storeId = $result[$item->getData('faq_id')];
|
121 |
+
$storeCode = Mage::app()->getStore($storeId)->getCode();
|
122 |
+
}
|
123 |
+
$item->setData('_first_store_id', $storeId);
|
124 |
+
$item->setData('store_code', $storeCode);
|
125 |
+
}
|
126 |
+
}
|
127 |
+
}
|
128 |
+
}
|
129 |
+
|
130 |
+
parent::_afterLoad();
|
131 |
+
}
|
132 |
+
}
|
app/code/local/TV/Faq/Wysiwyg/Images/Content.php
ADDED
@@ -0,0 +1,161 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to license@magentocommerce.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
18 |
+
* versions in the future. If you wish to customize Magento for your
|
19 |
+
* needs please refer to http://www.magentocommerce.com for more information.
|
20 |
+
*
|
21 |
+
* @category Mage
|
22 |
+
* @package Mage_Adminhtml
|
23 |
+
* @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
|
24 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
25 |
+
*/
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Wysiwyg Images content block
|
29 |
+
*
|
30 |
+
* @category Mage
|
31 |
+
* @package Mage_Adminhtml
|
32 |
+
* @author Magento Core Team <core@magentocommerce.com>
|
33 |
+
*/
|
34 |
+
class Mage_Adminhtml_Block_Cms_Wysiwyg_Images_Content extends Mage_Adminhtml_Block_Widget_Container
|
35 |
+
{
|
36 |
+
/**
|
37 |
+
* Block construction
|
38 |
+
*/
|
39 |
+
public function __construct()
|
40 |
+
{
|
41 |
+
parent::__construct();
|
42 |
+
$this->_headerText = $this->helper('cms')->__('Media Storage');
|
43 |
+
$this->_removeButton('back')->_removeButton('edit');
|
44 |
+
$this->_addButton('newfolder', array(
|
45 |
+
'class' => 'save',
|
46 |
+
'label' => $this->helper('cms')->__('Create Folder...'),
|
47 |
+
'type' => 'button',
|
48 |
+
'onclick' => 'MediabrowserInstance.newFolder();'
|
49 |
+
));
|
50 |
+
|
51 |
+
$this->_addButton('delete_folder', array(
|
52 |
+
'class' => 'delete no-display',
|
53 |
+
'label' => $this->helper('cms')->__('Delete Folder'),
|
54 |
+
'type' => 'button',
|
55 |
+
'onclick' => 'MediabrowserInstance.deleteFolder();',
|
56 |
+
'id' => 'button_delete_folder'
|
57 |
+
));
|
58 |
+
|
59 |
+
$this->_addButton('delete_files', array(
|
60 |
+
'class' => 'delete no-display',
|
61 |
+
'label' => $this->helper('cms')->__('Delete File'),
|
62 |
+
'type' => 'button',
|
63 |
+
'onclick' => 'MediabrowserInstance.deleteFiles();',
|
64 |
+
'id' => 'button_delete_files'
|
65 |
+
));
|
66 |
+
|
67 |
+
$this->_addButton('insert_files', array(
|
68 |
+
'class' => 'save no-display',
|
69 |
+
'label' => $this->helper('cms')->__('Insert File'),
|
70 |
+
'type' => 'button',
|
71 |
+
'onclick' => 'MediabrowserInstance.insert();',
|
72 |
+
'id' => 'button_insert_files'
|
73 |
+
));
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Files action source URL
|
78 |
+
*
|
79 |
+
* @return string
|
80 |
+
*/
|
81 |
+
public function getContentsUrl()
|
82 |
+
{
|
83 |
+
return $this->getUrl('*/*/contents', array('type' => $this->getRequest()->getParam('type')));
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Javascript setup object for filebrowser instance
|
88 |
+
*
|
89 |
+
* @return string
|
90 |
+
*/
|
91 |
+
public function getFilebrowserSetupObject()
|
92 |
+
{
|
93 |
+
$setupObject = new Varien_Object();
|
94 |
+
|
95 |
+
$setupObject->setData(array(
|
96 |
+
'newFolderPrompt' => $this->helper('cms')->__('New Folder Name:'),
|
97 |
+
'deleteFolderConfirmationMessage' => $this->helper('cms')->__('Are you sure you want to delete current folder?'),
|
98 |
+
'deleteFileConfirmationMessage' => $this->helper('cms')->__('Are you sure you want to delete the selected file?'),
|
99 |
+
'targetElementId' => $this->getTargetElementId(),
|
100 |
+
'contentsUrl' => $this->getContentsUrl(),
|
101 |
+
'onInsertUrl' => $this->getOnInsertUrl(),
|
102 |
+
'newFolderUrl' => $this->getNewfolderUrl(),
|
103 |
+
'deleteFolderUrl' => $this->getDeletefolderUrl(),
|
104 |
+
'deleteFilesUrl' => $this->getDeleteFilesUrl(),
|
105 |
+
'headerText' => $this->getHeaderText()
|
106 |
+
));
|
107 |
+
|
108 |
+
return Mage::helper('core')->jsonEncode($setupObject);
|
109 |
+
}
|
110 |
+
|
111 |
+
/**
|
112 |
+
* New directory action target URL
|
113 |
+
*
|
114 |
+
* @return string
|
115 |
+
*/
|
116 |
+
public function getNewfolderUrl()
|
117 |
+
{
|
118 |
+
return $this->getUrl('*/*/newFolder');
|
119 |
+
}
|
120 |
+
|
121 |
+
/**
|
122 |
+
* Delete directory action target URL
|
123 |
+
*
|
124 |
+
* @return string
|
125 |
+
*/
|
126 |
+
protected function getDeletefolderUrl()
|
127 |
+
{
|
128 |
+
return $this->getUrl('*/*/deleteFolder');
|
129 |
+
}
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Description goes here...
|
133 |
+
*
|
134 |
+
* @param none
|
135 |
+
* @return void
|
136 |
+
*/
|
137 |
+
public function getDeleteFilesUrl()
|
138 |
+
{
|
139 |
+
return $this->getUrl('*/*/deleteFiles');
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* New directory action target URL
|
144 |
+
*
|
145 |
+
* @return string
|
146 |
+
*/
|
147 |
+
public function getOnInsertUrl()
|
148 |
+
{
|
149 |
+
return $this->getUrl('*/*/onInsert');
|
150 |
+
}
|
151 |
+
|
152 |
+
/**
|
153 |
+
* Target element ID getter
|
154 |
+
*
|
155 |
+
* @return string
|
156 |
+
*/
|
157 |
+
public function getTargetElementId()
|
158 |
+
{
|
159 |
+
return $this->getRequest()->getParam('target_element_id');
|
160 |
+
}
|
161 |
+
}
|
app/code/local/TV/Faq/Wysiwyg/Images/Content/Files.php
ADDED
@@ -0,0 +1,155 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to license@magentocommerce.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
18 |
+
* versions in the future. If you wish to customize Magento for your
|
19 |
+
* needs please refer to http://www.magentocommerce.com for more information.
|
20 |
+
*
|
21 |
+
* @category Mage
|
22 |
+
* @package Mage_Adminhtml
|
23 |
+
* @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
|
24 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
25 |
+
*/
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Directory contents block for Wysiwyg Images
|
29 |
+
*
|
30 |
+
* @category Mage
|
31 |
+
* @package Mage_Adminhtml
|
32 |
+
* @author Magento Core Team <core@magentocommerce.com>
|
33 |
+
*/
|
34 |
+
class Mage_Adminhtml_Block_Cms_Wysiwyg_Images_Content_Files extends Mage_Adminhtml_Block_Template
|
35 |
+
{
|
36 |
+
/**
|
37 |
+
* Files collection object
|
38 |
+
*
|
39 |
+
* @var Varien_Data_Collection_Filesystem
|
40 |
+
*/
|
41 |
+
protected $_filesCollection;
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Prepared Files collection for current directory
|
45 |
+
*
|
46 |
+
* @return Varien_Data_Collection_Filesystem
|
47 |
+
*/
|
48 |
+
public function getFiles()
|
49 |
+
{
|
50 |
+
if (! $this->_filesCollection) {
|
51 |
+
$this->_filesCollection = Mage::getSingleton('cms/wysiwyg_images_storage')->getFilesCollection(Mage::helper('cms/wysiwyg_images')->getCurrentPath(), $this->_getMediaType());
|
52 |
+
|
53 |
+
}
|
54 |
+
|
55 |
+
return $this->_filesCollection;
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* Files collection count getter
|
60 |
+
*
|
61 |
+
* @return int
|
62 |
+
*/
|
63 |
+
public function getFilesCount()
|
64 |
+
{
|
65 |
+
return $this->getFiles()->count();
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* File idetifier getter
|
70 |
+
*
|
71 |
+
* @param Varien_Object $file
|
72 |
+
* @return string
|
73 |
+
*/
|
74 |
+
public function getFileId(Varien_Object $file)
|
75 |
+
{
|
76 |
+
return $file->getId();
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* File thumb URL getter
|
81 |
+
*
|
82 |
+
* @param Varien_Object $file
|
83 |
+
* @return string
|
84 |
+
*/
|
85 |
+
public function getFileThumbUrl(Varien_Object $file)
|
86 |
+
{
|
87 |
+
return $file->getThumbUrl();
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
* File name URL getter
|
92 |
+
*
|
93 |
+
* @param Varien_Object $file
|
94 |
+
* @return string
|
95 |
+
*/
|
96 |
+
public function getFileName(Varien_Object $file)
|
97 |
+
{
|
98 |
+
return $file->getName();
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Image file width getter
|
103 |
+
*
|
104 |
+
* @param Varien_Object $file
|
105 |
+
* @return string
|
106 |
+
*/
|
107 |
+
public function getFileWidth(Varien_Object $file)
|
108 |
+
{
|
109 |
+
return $file->getWidth();
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Image file height getter
|
114 |
+
*
|
115 |
+
* @param Varien_Object $file
|
116 |
+
* @return string
|
117 |
+
*/
|
118 |
+
public function getFileHeight(Varien_Object $file)
|
119 |
+
{
|
120 |
+
return $file->getHeight();
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* File short name getter
|
125 |
+
*
|
126 |
+
* @param Varien_Object $file
|
127 |
+
* @return string
|
128 |
+
*/
|
129 |
+
public function getFileShortName(Varien_Object $file)
|
130 |
+
{
|
131 |
+
return $file->getShortName();
|
132 |
+
}
|
133 |
+
|
134 |
+
public function getImagesWidth()
|
135 |
+
{
|
136 |
+
return Mage::getSingleton('cms/wysiwyg_images_storage')->getConfigData('resize_width');
|
137 |
+
}
|
138 |
+
|
139 |
+
public function getImagesHeight()
|
140 |
+
{
|
141 |
+
return Mage::getSingleton('cms/wysiwyg_images_storage')->getConfigData('resize_height');
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Return current media type based on request or data
|
146 |
+
* @return string
|
147 |
+
*/
|
148 |
+
protected function _getMediaType()
|
149 |
+
{
|
150 |
+
if ($this->hasData('media_type')) {
|
151 |
+
return $this->_getData('media_type');
|
152 |
+
}
|
153 |
+
return $this->getRequest()->getParam('type');
|
154 |
+
}
|
155 |
+
}
|
app/code/local/TV/Faq/Wysiwyg/Images/Content/Newfolder.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to license@magentocommerce.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
18 |
+
* versions in the future. If you wish to customize Magento for your
|
19 |
+
* needs please refer to http://www.magentocommerce.com for more information.
|
20 |
+
*
|
21 |
+
* @category Mage
|
22 |
+
* @package Mage_Adminhtml
|
23 |
+
* @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
|
24 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
25 |
+
*/
|
26 |
+
|
27 |
+
/**
|
28 |
+
* New directory block for Wysiwyg Images
|
29 |
+
*
|
30 |
+
* @category Mage
|
31 |
+
* @package Mage_Adminhtml
|
32 |
+
* @author Magento Core Team <core@magentocommerce.com>
|
33 |
+
*/
|
34 |
+
class Mage_Adminhtml_Block_Cms_Wysiwyg_Images_Content_Newfolder extends Mage_Adminhtml_Block_Template
|
35 |
+
{
|
36 |
+
|
37 |
+
}
|
app/code/local/TV/Faq/Wysiwyg/Images/Content/Uploader.php
ADDED
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to license@magentocommerce.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
18 |
+
* versions in the future. If you wish to customize Magento for your
|
19 |
+
* needs please refer to http://www.magentocommerce.com for more information.
|
20 |
+
*
|
21 |
+
* @category Mage
|
22 |
+
* @package Mage_Adminhtml
|
23 |
+
* @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
|
24 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
25 |
+
*/
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Uploader block for Wysiwyg Images
|
29 |
+
*
|
30 |
+
* @category Mage
|
31 |
+
* @package Mage_Adminhtml
|
32 |
+
* @author Magento Core Team <core@magentocommerce.com>
|
33 |
+
*/
|
34 |
+
class Mage_Adminhtml_Block_Cms_Wysiwyg_Images_Content_Uploader extends Mage_Adminhtml_Block_Media_Uploader
|
35 |
+
{
|
36 |
+
public function __construct()
|
37 |
+
{
|
38 |
+
parent::__construct();
|
39 |
+
$params = $this->getConfig()->getParams();
|
40 |
+
$type = $this->_getMediaType();
|
41 |
+
$allowed = Mage::getSingleton('cms/wysiwyg_images_storage')->getAllowedExtensions($type);
|
42 |
+
$labels = array();
|
43 |
+
$files = array();
|
44 |
+
foreach ($allowed as $ext) {
|
45 |
+
$labels[] = '.' . $ext;
|
46 |
+
$files[] = '*.' . $ext;
|
47 |
+
}
|
48 |
+
$this->getConfig()
|
49 |
+
->setUrl(Mage::getModel('adminhtml/url')->addSessionParam()->getUrl('*/*/upload', array('type' => $type)))
|
50 |
+
->setParams($params)
|
51 |
+
->setFileField('image')
|
52 |
+
->setFilters(array(
|
53 |
+
'images' => array(
|
54 |
+
'label' => $this->helper('cms')->__('Images (%s)', implode(', ', $labels)),
|
55 |
+
'files' => $files
|
56 |
+
)
|
57 |
+
));
|
58 |
+
}
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Return current media type based on request or data
|
62 |
+
* @return string
|
63 |
+
*/
|
64 |
+
protected function _getMediaType()
|
65 |
+
{
|
66 |
+
if ($this->hasData('media_type')) {
|
67 |
+
return $this->_getData('media_type');
|
68 |
+
}
|
69 |
+
return $this->getRequest()->getParam('type');
|
70 |
+
}
|
71 |
+
}
|
app/code/local/TV/Faq/Wysiwyg/Images/Tree.php
ADDED
@@ -0,0 +1,99 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to license@magentocommerce.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
18 |
+
* versions in the future. If you wish to customize Magento for your
|
19 |
+
* needs please refer to http://www.magentocommerce.com for more information.
|
20 |
+
*
|
21 |
+
* @category Mage
|
22 |
+
* @package Mage_Adminhtml
|
23 |
+
* @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
|
24 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
25 |
+
*/
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Directoty tree renderer for Cms Wysiwyg Images
|
29 |
+
*
|
30 |
+
* @category Mage
|
31 |
+
* @package Mage_Adminhtml
|
32 |
+
* @author Magento Core Team <core@magentocommerce.com>
|
33 |
+
*/
|
34 |
+
class Mage_Adminhtml_Block_Cms_Wysiwyg_Images_Tree extends Mage_Adminhtml_Block_Template
|
35 |
+
{
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Json tree builder
|
39 |
+
*
|
40 |
+
* @return string
|
41 |
+
*/
|
42 |
+
public function getTreeJson()
|
43 |
+
{
|
44 |
+
$helper = Mage::helper('cms/wysiwyg_images');
|
45 |
+
$storageRoot = $helper->getStorageRoot();
|
46 |
+
$collection = Mage::registry('storage')->getDirsCollection($helper->getCurrentPath());
|
47 |
+
$jsonArray = array();
|
48 |
+
foreach ($collection as $item) {
|
49 |
+
$jsonArray[] = array(
|
50 |
+
'text' => $helper->getShortFilename($item->getBasename(), 20),
|
51 |
+
'id' => $helper->convertPathToId($item->getFilename()),
|
52 |
+
'cls' => 'folder'
|
53 |
+
);
|
54 |
+
}
|
55 |
+
return Zend_Json::encode($jsonArray);
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* Json source URL
|
60 |
+
*
|
61 |
+
* @return string
|
62 |
+
*/
|
63 |
+
public function getTreeLoaderUrl()
|
64 |
+
{
|
65 |
+
return $this->getUrl('*/*/treeJson');
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Root node name of tree
|
70 |
+
*
|
71 |
+
* @return string
|
72 |
+
*/
|
73 |
+
public function getRootNodeName()
|
74 |
+
{
|
75 |
+
return $this->helper('cms')->__('Storage Root');
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Return tree node full path based on current path
|
80 |
+
*
|
81 |
+
* @return string
|
82 |
+
*/
|
83 |
+
public function getTreeCurrentPath()
|
84 |
+
{
|
85 |
+
$treePath = '/root';
|
86 |
+
if ($path = Mage::registry('storage')->getSession()->getCurrentPath()) {
|
87 |
+
$helper = Mage::helper('cms/wysiwyg_images');
|
88 |
+
$path = str_replace($helper->getStorageRoot(), '', $path);
|
89 |
+
$relative = '';
|
90 |
+
foreach (explode(DS, $path) as $dirName) {
|
91 |
+
if ($dirName) {
|
92 |
+
$relative .= DS . $dirName;
|
93 |
+
$treePath .= '/' . $helper->idEncode($relative);
|
94 |
+
}
|
95 |
+
}
|
96 |
+
}
|
97 |
+
return $treePath;
|
98 |
+
}
|
99 |
+
}
|
app/code/local/TV/Faq/controllers/Adminhtml/Faq/CategoryController.php
ADDED
@@ -0,0 +1,189 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
* Website: www.abc.com
|
11 |
+
* Email: honeyvishnoi@gmail.com
|
12 |
+
*/
|
13 |
+
class TV_Faq_Adminhtml_Faq_CategoryController extends Mage_Adminhtml_Controller_Action
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Initialization of current view - add's breadcrumps and the current menu status
|
17 |
+
*
|
18 |
+
* @return TV_Faq_AdminController
|
19 |
+
*/
|
20 |
+
protected function _initAction()
|
21 |
+
{
|
22 |
+
$this->_usedModuleName = 'tv_faq';
|
23 |
+
|
24 |
+
$this->loadLayout()
|
25 |
+
->_setActiveMenu('cms/faq')
|
26 |
+
->_addBreadcrumb($this->__('CMS'), $this->__('CMS'))
|
27 |
+
->_addBreadcrumb($this->__('FAQ'), $this->__('FAQ'));
|
28 |
+
|
29 |
+
return $this;
|
30 |
+
}
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Displays the FAQ overview grid.
|
34 |
+
*
|
35 |
+
*/
|
36 |
+
public function indexAction()
|
37 |
+
{
|
38 |
+
$this->_initAction()
|
39 |
+
->_addContent($this->getLayout()->createBlock('tv_faq/adminhtml_category'))
|
40 |
+
->renderLayout();
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Displays the new FAQ item form
|
45 |
+
*/
|
46 |
+
public function newAction()
|
47 |
+
{
|
48 |
+
$this->_forward('edit');
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Displays the new FAQ item form or the edit FAQ item form.
|
53 |
+
*/
|
54 |
+
public function editAction()
|
55 |
+
{
|
56 |
+
$id = $this->getRequest()->getParam('category_id');
|
57 |
+
$model = Mage::getModel('tv_faq/category');
|
58 |
+
|
59 |
+
// if current id given -> try to load and edit current FAQ category
|
60 |
+
if ($id) {
|
61 |
+
$model->load($id);
|
62 |
+
if (!$model->getId()) {
|
63 |
+
Mage::getSingleton('adminhtml/session')->addError(
|
64 |
+
Mage::helper('tv_faq')->__('This FAQ category no longer exists')
|
65 |
+
);
|
66 |
+
$this->_redirect('*/*/');
|
67 |
+
return;
|
68 |
+
}
|
69 |
+
}
|
70 |
+
|
71 |
+
$data = Mage::getSingleton('adminhtml/session')->getFormData(true);
|
72 |
+
if (!empty($data)) {
|
73 |
+
$model->setData($data);
|
74 |
+
}
|
75 |
+
|
76 |
+
Mage::register('faq_category', $model);
|
77 |
+
|
78 |
+
$this->_initAction()
|
79 |
+
->_addBreadcrumb(
|
80 |
+
$id
|
81 |
+
? Mage::helper('tv_faq')->__('Edit FAQ Category')
|
82 |
+
: Mage::helper('tv_faq')->__('New FAQ Category'),
|
83 |
+
$id
|
84 |
+
? Mage::helper('tv_faq')->__('Edit FAQ Category')
|
85 |
+
: Mage::helper('tv_faq')->__('New FAQ Category')
|
86 |
+
)
|
87 |
+
->_addContent(
|
88 |
+
$this->getLayout()
|
89 |
+
->createBlock('tv_faq/adminhtml_category_edit')
|
90 |
+
->setData('action', $this->getUrl('*/*/save'))
|
91 |
+
)
|
92 |
+
->_addLeft($this->getLayout()->createBlock('tv_faq/adminhtml_category_edit_tabs'));
|
93 |
+
|
94 |
+
$this->renderLayout();
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Action that does the actual saving process and redirects back to overview
|
99 |
+
*/
|
100 |
+
public function saveAction()
|
101 |
+
{
|
102 |
+
// check if data sent
|
103 |
+
if ($data = $this->getRequest()->getPost()) {
|
104 |
+
|
105 |
+
// init model and set data
|
106 |
+
$model = Mage::getModel('tv_faq/category');
|
107 |
+
$model->setData($data);
|
108 |
+
|
109 |
+
// try to save it
|
110 |
+
try {
|
111 |
+
// save the data
|
112 |
+
$model->save();
|
113 |
+
|
114 |
+
// display success message
|
115 |
+
Mage::getSingleton('adminhtml/session')->addSuccess(
|
116 |
+
Mage::helper('tv_faq')->__('FAQ Category was successfully saved')
|
117 |
+
);
|
118 |
+
// clear previously saved data from session
|
119 |
+
Mage::getSingleton('adminhtml/session')->setFormData(false);
|
120 |
+
// check if 'Save and Continue'
|
121 |
+
if ($this->getRequest()->getParam('back')) {
|
122 |
+
$this->_redirect('*/*/edit', array (
|
123 |
+
'category_id' => $model->getId() ));
|
124 |
+
return;
|
125 |
+
}
|
126 |
+
}
|
127 |
+
catch (Exception $e) {
|
128 |
+
// display error message
|
129 |
+
Mage::getSingleton('adminhtml/session')->addException($e, $e->getMessage());
|
130 |
+
// save data in session
|
131 |
+
Mage::getSingleton('adminhtml/session')->setFormData($data);
|
132 |
+
// redirect to edit form
|
133 |
+
$this->_redirect('*/*/edit', array (
|
134 |
+
'category_id' => $this->getRequest()->getParam('category_id') ));
|
135 |
+
return;
|
136 |
+
}
|
137 |
+
}
|
138 |
+
$this->_redirect('*/*/');
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Action that does the actual saving process and redirects back to overview
|
143 |
+
*/
|
144 |
+
public function deleteAction()
|
145 |
+
{
|
146 |
+
// check if we know what should be deleted
|
147 |
+
if ($id = $this->getRequest()->getParam('category_id')) {
|
148 |
+
try {
|
149 |
+
// init model and delete
|
150 |
+
$model = Mage::getModel('tv_faq/category');
|
151 |
+
$model->load($id);
|
152 |
+
$model->delete();
|
153 |
+
|
154 |
+
// display success message
|
155 |
+
Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('tv_faq')->__('FAQ Category was successfully deleted'));
|
156 |
+
|
157 |
+
// go to grid
|
158 |
+
$this->_redirect('*/*/');
|
159 |
+
return;
|
160 |
+
|
161 |
+
}
|
162 |
+
catch (Exception $e) {
|
163 |
+
// display error message
|
164 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
165 |
+
|
166 |
+
// go back to edit form
|
167 |
+
$this->_redirect('*/*/edit', array (
|
168 |
+
'category_id' => $id ));
|
169 |
+
return;
|
170 |
+
}
|
171 |
+
}
|
172 |
+
|
173 |
+
// display error message
|
174 |
+
Mage::getSingleton('adminhtml/session')->addError(Mage::helper('tv_faq')->__('Unable to find a FAQ Category to delete'));
|
175 |
+
|
176 |
+
// go to grid
|
177 |
+
$this->_redirect('*/*/');
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
* Simple access control
|
182 |
+
*
|
183 |
+
* @return boolean True if user is allowed to edit FAQ
|
184 |
+
*/
|
185 |
+
protected function _isAllowed()
|
186 |
+
{
|
187 |
+
return Mage::getSingleton('admin/session')->isAllowed('admin/cms/faq');
|
188 |
+
}
|
189 |
+
}
|
app/code/local/TV/Faq/controllers/Adminhtml/FaqController.php
ADDED
@@ -0,0 +1,191 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
*
|
5 |
+
* Website: www.abc.com
|
6 |
+
* Email: honeyvishnoi@gmail.com
|
7 |
+
*/
|
8 |
+
class TV_Faq_Adminhtml_FaqController extends Mage_Adminhtml_Controller_Action
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Initialization of current view - add's breadcrumps and the current menu status
|
12 |
+
*
|
13 |
+
* @return TV_Faq_AdminController
|
14 |
+
*/
|
15 |
+
protected function _initAction()
|
16 |
+
{
|
17 |
+
$this->_usedModuleName = 'tv_faq';
|
18 |
+
|
19 |
+
$this->loadLayout()
|
20 |
+
->_addBreadcrumb($this->__('CMS'), $this->__('CMS'))
|
21 |
+
->_addBreadcrumb($this->__('FAQ'), $this->__('FAQ'));
|
22 |
+
|
23 |
+
return $this;
|
24 |
+
}
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Displays the FAQ overview grid.
|
28 |
+
*
|
29 |
+
*/
|
30 |
+
public function indexAction()
|
31 |
+
{
|
32 |
+
$this->_initAction()
|
33 |
+
->_addContent($this->getLayout()->createBlock('tv_faq/adminhtml_item'))
|
34 |
+
->renderLayout();
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Displays the new FAQ item form
|
39 |
+
*/
|
40 |
+
public function newAction()
|
41 |
+
{
|
42 |
+
$this->_forward('edit');
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Displays the new FAQ item form or the edit FAQ item form.
|
47 |
+
*/
|
48 |
+
public function editAction()
|
49 |
+
{
|
50 |
+
$id = $this->getRequest()->getParam('faq_id');
|
51 |
+
$model = Mage::getModel('tv_faq/faq');
|
52 |
+
|
53 |
+
// if current id given -> try to load and edit current FAQ item
|
54 |
+
if ($id) {
|
55 |
+
$model->load($id);
|
56 |
+
if (!$model->getId()) {
|
57 |
+
Mage::getSingleton('adminhtml/session')->addError(
|
58 |
+
Mage::helper('tv_faq')->__('This FAQ item no longer exists')
|
59 |
+
);
|
60 |
+
$this->_redirect('*/*/');
|
61 |
+
return;
|
62 |
+
}
|
63 |
+
}
|
64 |
+
|
65 |
+
$data = Mage::getSingleton('adminhtml/session')->getFormData(true);
|
66 |
+
if (!empty($data)) {
|
67 |
+
$model->setData($data);
|
68 |
+
}
|
69 |
+
|
70 |
+
Mage::register('faq', $model);
|
71 |
+
|
72 |
+
$this->_initAction()
|
73 |
+
->_addBreadcrumb(
|
74 |
+
$id
|
75 |
+
? Mage::helper('tv_faq')->__('Edit FAQ Item')
|
76 |
+
: Mage::helper('tv_faq')->__('New FAQ Item'),
|
77 |
+
$id
|
78 |
+
? Mage::helper('tv_faq')->__('Edit FAQ Item')
|
79 |
+
: Mage::helper('tv_faq')->__('New FAQ Item')
|
80 |
+
)
|
81 |
+
->_addContent(
|
82 |
+
$this->getLayout()
|
83 |
+
->createBlock('tv_faq/adminhtml_item_edit')
|
84 |
+
->setData('action', $this->getUrl('adminhtml/faq/save'))
|
85 |
+
)
|
86 |
+
->_addLeft($this->getLayout()->createBlock('tv_faq/adminhtml_item_edit_tabs'));
|
87 |
+
|
88 |
+
$this->renderLayout();
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Action that does the actual saving process and redirects back to overview
|
93 |
+
*/
|
94 |
+
public function saveAction()
|
95 |
+
{
|
96 |
+
// check if data sent
|
97 |
+
if ($data = $this->getRequest()->getPost()) {
|
98 |
+
|
99 |
+
// init model and set data
|
100 |
+
$model = Mage::getModel('tv_faq/faq');
|
101 |
+
$model->setCreationTime(Mage::getSingleton('core/date')->gmtDate());
|
102 |
+
$model->setData($data);
|
103 |
+
|
104 |
+
// try to save it
|
105 |
+
try {
|
106 |
+
// save the data
|
107 |
+
$model->save();
|
108 |
+
|
109 |
+
// display success message
|
110 |
+
Mage::getSingleton('adminhtml/session')->addSuccess(
|
111 |
+
Mage::helper('cms')->__('FAQ Item was successfully saved')
|
112 |
+
);
|
113 |
+
// clear previously saved data from session
|
114 |
+
Mage::getSingleton('adminhtml/session')->setFormData(false);
|
115 |
+
// check if 'Save and Continue'
|
116 |
+
if ($this->getRequest()->getParam('back')) {
|
117 |
+
$this->_redirect('*/*/edit', array (
|
118 |
+
'faq_id' => $model->getId() ));
|
119 |
+
return;
|
120 |
+
}
|
121 |
+
// go to grid
|
122 |
+
$this->_redirect('*/*/');
|
123 |
+
return;
|
124 |
+
|
125 |
+
}
|
126 |
+
catch (Exception $e) {
|
127 |
+
// display error message
|
128 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
129 |
+
// save data in session
|
130 |
+
Mage::getSingleton('adminhtml/session')->setFormData($data);
|
131 |
+
// redirect to edit form
|
132 |
+
$this->_redirect('*/*/edit', array (
|
133 |
+
'faq_id' => $this->getRequest()->getParam('faq_id') ));
|
134 |
+
return;
|
135 |
+
}
|
136 |
+
}
|
137 |
+
$this->_redirect('*/*/');
|
138 |
+
}
|
139 |
+
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Simple access control
|
143 |
+
*
|
144 |
+
* @return boolean True if user is allowed to edit FAQ
|
145 |
+
*/
|
146 |
+
protected function _isAllowed()
|
147 |
+
{
|
148 |
+
return Mage::getSingleton('admin/session')->isAllowed('admin/cms/faq');
|
149 |
+
}
|
150 |
+
|
151 |
+
/**
|
152 |
+
* Action that does the actual saving process and redirects back to overview
|
153 |
+
*/
|
154 |
+
public function deleteAction()
|
155 |
+
{
|
156 |
+
// check if we know what should be deleted
|
157 |
+
if ($id = $this->getRequest()->getParam('faq_id')) {
|
158 |
+
try {
|
159 |
+
|
160 |
+
// init model and delete
|
161 |
+
$model = Mage::getModel('tv_faq/faq');
|
162 |
+
$model->load($id);
|
163 |
+
$model->delete();
|
164 |
+
|
165 |
+
// display success message
|
166 |
+
Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('cms')->__('FAQ Entry was successfully deleted'));
|
167 |
+
|
168 |
+
// go to grid
|
169 |
+
$this->_redirect('*/*/');
|
170 |
+
return;
|
171 |
+
|
172 |
+
}
|
173 |
+
catch (Exception $e) {
|
174 |
+
|
175 |
+
// display error message
|
176 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
177 |
+
|
178 |
+
// go back to edit form
|
179 |
+
$this->_redirect('*/*/edit', array (
|
180 |
+
'faq_id' => $id ));
|
181 |
+
return;
|
182 |
+
}
|
183 |
+
}
|
184 |
+
|
185 |
+
// display error message
|
186 |
+
Mage::getSingleton('adminhtml/session')->addError(Mage::helper('cms')->__('Unable to find a FAQ entry to delete'));
|
187 |
+
|
188 |
+
// go to grid
|
189 |
+
$this->_redirect('*/*/');
|
190 |
+
}
|
191 |
+
}
|
app/code/local/TV/Faq/controllers/IndexController.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
/**
|
8 |
+
* FAQ accordion for Magento
|
9 |
+
*
|
10 |
+
|
11 |
+
* Website: www.abc.com
|
12 |
+
* Email: honeyvishnoi@gmail.com
|
13 |
+
*/
|
14 |
+
class TV_Faq_IndexController extends Mage_Core_Controller_Front_Action
|
15 |
+
{
|
16 |
+
/**
|
17 |
+
* Displays the FAQ list.
|
18 |
+
*/
|
19 |
+
public function indexAction()
|
20 |
+
{
|
21 |
+
$this->loadLayout()->renderLayout();
|
22 |
+
}
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Displays the current FAQ's detail view
|
26 |
+
*/
|
27 |
+
public function showAction()
|
28 |
+
{
|
29 |
+
$this->loadLayout()->renderLayout();
|
30 |
+
}
|
31 |
+
}
|
app/code/local/TV/Faq/etc/adminhtml.xml
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<menu>
|
4 |
+
<cms>
|
5 |
+
<children>
|
6 |
+
<faq translate="title" module="tv_faq">
|
7 |
+
<title>FAQ</title>
|
8 |
+
<sort_order>60</sort_order>
|
9 |
+
<children>
|
10 |
+
<item translate="titl" module="tv_faq">
|
11 |
+
<title>Manage Items</title>
|
12 |
+
<action>adminhtml/faq</action>
|
13 |
+
</item>
|
14 |
+
<category translate="titl" module="tv_faq">
|
15 |
+
<title>Manage Categories</title>
|
16 |
+
<action>adminhtml/faq_category</action>
|
17 |
+
</category>
|
18 |
+
</children>
|
19 |
+
</faq>
|
20 |
+
</children>
|
21 |
+
</cms>
|
22 |
+
</menu>
|
23 |
+
<acl>
|
24 |
+
<resources>
|
25 |
+
<admin>
|
26 |
+
<children>
|
27 |
+
<cms>
|
28 |
+
<children>
|
29 |
+
<faq translate="title" module="tv_faq">
|
30 |
+
<title>Faq</title>
|
31 |
+
<sort_order>50</sort_order>
|
32 |
+
</faq>
|
33 |
+
</children>
|
34 |
+
</cms>
|
35 |
+
</children>
|
36 |
+
</admin>
|
37 |
+
</resources>
|
38 |
+
</acl>
|
39 |
+
<layout>
|
40 |
+
<updates>
|
41 |
+
<faq>
|
42 |
+
<file>faq.xml</file>
|
43 |
+
</faq>
|
44 |
+
</updates>
|
45 |
+
</layout>
|
46 |
+
</config>
|
app/code/local/TV/Faq/etc/config.xml
ADDED
@@ -0,0 +1,142 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<TV_Faq>
|
5 |
+
<active>true</active>
|
6 |
+
<codePool>local</codePool>
|
7 |
+
<version>1.1.2</version>
|
8 |
+
</TV_Faq>
|
9 |
+
</modules>
|
10 |
+
|
11 |
+
<admin>
|
12 |
+
<routers>
|
13 |
+
<adminhtml>
|
14 |
+
<args>
|
15 |
+
<modules>
|
16 |
+
<TV_Faq before="Mage_Adminhtml">TV_Faq_Adminhtml</TV_Faq>
|
17 |
+
</modules>
|
18 |
+
</args>
|
19 |
+
</adminhtml>
|
20 |
+
</routers>
|
21 |
+
</admin>
|
22 |
+
|
23 |
+
<frontend>
|
24 |
+
<routers>
|
25 |
+
<faq>
|
26 |
+
<use>standard</use>
|
27 |
+
<args>
|
28 |
+
<module>TV_Faq</module>
|
29 |
+
<frontName>faq</frontName>
|
30 |
+
</args>
|
31 |
+
</faq>
|
32 |
+
</routers>
|
33 |
+
<translate>
|
34 |
+
<modules>
|
35 |
+
<TV_Faq>
|
36 |
+
<files>
|
37 |
+
<default>TV_Faq.csv</default>
|
38 |
+
</files>
|
39 |
+
</TV_Faq>
|
40 |
+
</modules>
|
41 |
+
</translate>
|
42 |
+
<layout>
|
43 |
+
<updates>
|
44 |
+
<faq>
|
45 |
+
<file>faq.xml</file>
|
46 |
+
</faq>
|
47 |
+
</updates>
|
48 |
+
</layout>
|
49 |
+
</frontend>
|
50 |
+
|
51 |
+
<global>
|
52 |
+
<helpers>
|
53 |
+
<tv_faq>
|
54 |
+
<class>TV_Faq_Helper</class>
|
55 |
+
</tv_faq>
|
56 |
+
</helpers>
|
57 |
+
|
58 |
+
<blocks>
|
59 |
+
<tv_faq>
|
60 |
+
<class>TV_Faq_Block</class>
|
61 |
+
</tv_faq>
|
62 |
+
</blocks>
|
63 |
+
|
64 |
+
<models>
|
65 |
+
<tv_faq>
|
66 |
+
<class>TV_Faq_Model</class>
|
67 |
+
<resourceModel>tv_faq_mysql4</resourceModel>
|
68 |
+
</tv_faq>
|
69 |
+
<tv_faq_mysql4>
|
70 |
+
<class>TV_Faq_Model_Mysql4</class>
|
71 |
+
<entities>
|
72 |
+
<category>
|
73 |
+
<table>faq_category</table>
|
74 |
+
</category>
|
75 |
+
<category_item>
|
76 |
+
<table>faq_category_item</table>
|
77 |
+
</category_item>
|
78 |
+
<category_store>
|
79 |
+
<table>faq_category_store</table>
|
80 |
+
</category_store>
|
81 |
+
<faq>
|
82 |
+
<table>faq</table>
|
83 |
+
</faq>
|
84 |
+
<faq_store>
|
85 |
+
<table>faq_store</table>
|
86 |
+
</faq_store>
|
87 |
+
</entities>
|
88 |
+
</tv_faq_mysql4>
|
89 |
+
</models>
|
90 |
+
|
91 |
+
<resources>
|
92 |
+
<faq_setup>
|
93 |
+
<setup>
|
94 |
+
<module>TV_Faq</module>
|
95 |
+
</setup>
|
96 |
+
<connection>
|
97 |
+
<use>core_setup</use>
|
98 |
+
</connection>
|
99 |
+
</faq_setup>
|
100 |
+
<faq_write>
|
101 |
+
<connection>
|
102 |
+
<use>core_write</use>
|
103 |
+
</connection>
|
104 |
+
</faq_write>
|
105 |
+
<faq_read>
|
106 |
+
<connection>
|
107 |
+
<use>core_read</use>
|
108 |
+
</connection>
|
109 |
+
</faq_read>
|
110 |
+
</resources>
|
111 |
+
</global>
|
112 |
+
|
113 |
+
<adminhtml>
|
114 |
+
<translate>
|
115 |
+
<modules>
|
116 |
+
<TV_Faq>
|
117 |
+
<files>
|
118 |
+
<default>TV_Faq.csv</default>
|
119 |
+
</files>
|
120 |
+
</TV_Faq>
|
121 |
+
</modules>
|
122 |
+
</translate>
|
123 |
+
<layout>
|
124 |
+
<updates>
|
125 |
+
<faq>
|
126 |
+
<file>faq.xml</file>
|
127 |
+
</faq>
|
128 |
+
</updates>
|
129 |
+
</layout>
|
130 |
+
</adminhtml>
|
131 |
+
<install>
|
132 |
+
<translate>
|
133 |
+
<modules>
|
134 |
+
<TV_Faq>
|
135 |
+
<files>
|
136 |
+
<default>TV_Faq.csv</default>
|
137 |
+
</files>
|
138 |
+
</TV_Faq>
|
139 |
+
</modules>
|
140 |
+
</translate>
|
141 |
+
</install>
|
142 |
+
</config>
|
app/code/local/TV/Faq/sql/faq_setup/mysql4-install-0.1.0.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
$installer = $this;
|
8 |
+
|
9 |
+
$installer->startSetup();
|
10 |
+
|
11 |
+
$installer->run("
|
12 |
+
-- DROP TABLE IF EXISTS {$this->getTable('tv_faq/faq')};
|
13 |
+
CREATE TABLE IF NOT EXISTS {$this->getTable('tv_faq/faq')} (
|
14 |
+
`faq_id` int(10) unsigned NOT NULL auto_increment,
|
15 |
+
`question` tinytext NOT NULL default '',
|
16 |
+
`answer` text NOT NULL default '',
|
17 |
+
`answer_html` tinyint(1) NOT NULL default '1',
|
18 |
+
`creation_time` datetime default NULL,
|
19 |
+
`update_time` datetime default NULL,
|
20 |
+
`is_active` tinyint(1) NOT NULL default '1',
|
21 |
+
PRIMARY KEY (`faq_id`)
|
22 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='FAQ items' AUTO_INCREMENT=1 ;
|
23 |
+
|
24 |
+
-- DROP TABLE IF EXISTS {$this->getTable('tv_faq/faq_store')};
|
25 |
+
CREATE TABLE `{$this->getTable('tv_faq/faq_store')}` (
|
26 |
+
`faq_id` int(10) unsigned NOT NULL,
|
27 |
+
`store_id` smallint(5) unsigned NOT NULL,
|
28 |
+
PRIMARY KEY (`faq_id`,`store_id`),
|
29 |
+
CONSTRAINT `FK_FAQ_FAQ_STORE_FAQ` FOREIGN KEY (`faq_id`) REFERENCES `{$this->getTable('tv_faq/faq')}` (`faq_id`) ON UPDATE CASCADE ON DELETE CASCADE,
|
30 |
+
CONSTRAINT `FK_FAQ_FAQ_STORE_STORE` FOREIGN KEY (`store_id`) REFERENCES `{$this->getTable('core/store')}` (`store_id`) ON UPDATE CASCADE ON DELETE CASCADE
|
31 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='FAQ items to Stores';
|
32 |
+
");
|
33 |
+
|
34 |
+
$installer->endSetup();
|
app/code/local/TV/Faq/sql/faq_setup/mysql4-install-1.0.7.php
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
$installer = $this;
|
8 |
+
|
9 |
+
$installer->startSetup();
|
10 |
+
|
11 |
+
$installer->run("
|
12 |
+
-- DROP TABLE IF EXISTS {$this->getTable('tv_faq/faq')};
|
13 |
+
CREATE TABLE IF NOT EXISTS {$this->getTable('tv_faq/faq')} (
|
14 |
+
`faq_id` int(10) unsigned NOT NULL auto_increment,
|
15 |
+
`question` tinytext NOT NULL default '',
|
16 |
+
`answer` text NOT NULL default '',
|
17 |
+
`answer_html` tinyint(1) NOT NULL default '1',
|
18 |
+
`creation_time` datetime NOT NULL,
|
19 |
+
`update_time` datetime NOT NULL,
|
20 |
+
`is_active` tinyint(1) NOT NULL default '1',
|
21 |
+
PRIMARY KEY (`faq_id`)
|
22 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='FAQ items' AUTO_INCREMENT=1 ;
|
23 |
+
|
24 |
+
-- DROP TABLE IF EXISTS `{$this->getTable('tv_faq/faq_store')}`;
|
25 |
+
CREATE TABLE `{$this->getTable('tv_faq/faq_store')}` (
|
26 |
+
`faq_id` int(10) unsigned NOT NULL,
|
27 |
+
`store_id` smallint(5) unsigned NOT NULL,
|
28 |
+
PRIMARY KEY (`faq_id`,`store_id`),
|
29 |
+
CONSTRAINT `FK_FAQ_FAQ_STORE_FAQ` FOREIGN KEY (`faq_id`) REFERENCES `{$this->getTable('tv_faq/faq')}` (`faq_id`) ON UPDATE CASCADE ON DELETE CASCADE,
|
30 |
+
CONSTRAINT `FK_FAQ_FAQ_STORE_STORE` FOREIGN KEY (`store_id`) REFERENCES `{$this->getTable('core/store')}` (`store_id`) ON UPDATE CASCADE ON DELETE CASCADE
|
31 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='FAQ items to Stores';
|
32 |
+
|
33 |
+
CREATE TABLE `{$this->getTable('tv_faq/category')}` (
|
34 |
+
`category_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
35 |
+
`parent_id` INT(10) UNSIGNED NULL,
|
36 |
+
`category_name` VARCHAR(255) NOT NULL,
|
37 |
+
`creation_time` DATETIME NOT NULL,
|
38 |
+
`update_time` DATETIME NOT NULL,
|
39 |
+
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
|
40 |
+
PRIMARY KEY (`category_id`),
|
41 |
+
CONSTRAINT `FK_FAQ_CATEGORY_PARENT_ID` FOREIGN KEY (`parent_id`) REFERENCES `{$this->getTable('tv_faq/category')}` (`category_id`) ON DELETE SET NULL
|
42 |
+
) ENGINE=InnoDB COMMENT='FAQ Categories';
|
43 |
+
|
44 |
+
-- DROP TABLE IF EXISTS `{$this->getTable('tv_faq/category_item')}`;
|
45 |
+
CREATE TABLE `{$this->getTable('tv_faq/category_item')}` (
|
46 |
+
`category_id` INT(10) UNSIGNED NOT NULL,
|
47 |
+
`faq_id` INT(10) UNSIGNED NOT NULL,
|
48 |
+
PRIMARY KEY (`category_id`,`faq_id`),
|
49 |
+
CONSTRAINT `FK_FAQ_CATEGORY_ITEM_CATEGORY` FOREIGN KEY (`category_id`) REFERENCES `{$this->getTable('tv_faq/category')}` (`category_id`) ON UPDATE CASCADE ON DELETE CASCADE,
|
50 |
+
CONSTRAINT `FK_FAQ_CATEGORY_ITEM_ITEM` FOREIGN KEY (`faq_id`) REFERENCES `{$this->getTable('tv_faq/faq')}` (`faq_id`) ON UPDATE CASCADE ON DELETE CASCADE
|
51 |
+
) ENGINE=InnoDB COMMENT='FAQ Items to Cateories';
|
52 |
+
|
53 |
+
-- DROP TABLE IF EXISTS `{$this->getTable('tv_faq/category_store')}`;
|
54 |
+
CREATE TABLE `{$this->getTable('tv_faq/category_store')}` (
|
55 |
+
`category_id` INT(10) UNSIGNED NOT NULL,
|
56 |
+
`store_id` SMALLINT(5) UNSIGNED NOT NULL,
|
57 |
+
PRIMARY KEY (`category_id`,`store_id`),
|
58 |
+
CONSTRAINT `FK_FAQ_CATEGORY_STORE_CATEGORY` FOREIGN KEY (`category_id`) REFERENCES `{$this->getTable('tv_faq/category')}` (`category_id`) ON UPDATE CASCADE ON DELETE CASCADE,
|
59 |
+
CONSTRAINT `FK_FAQ_CATEGORY_STORE_STORE` FOREIGN KEY (`store_id`) REFERENCES `{$this->getTable('core/store')}` (`store_id`) ON UPDATE CASCADE ON DELETE CASCADE
|
60 |
+
) ENGINE=InnoDB COMMENT='FAQ Categories to Stores';
|
61 |
+
|
62 |
+
");
|
63 |
+
|
64 |
+
$installer->endSetup();
|
app/code/local/TV/Faq/sql/faq_setup/mysql4-upgrade-1.0.6-1.0.7.php
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* FAQ accordion for Magento
|
4 |
+
|
5 |
+
*/
|
6 |
+
|
7 |
+
$installer = $this;
|
8 |
+
|
9 |
+
$installer->startSetup();
|
10 |
+
|
11 |
+
$installer->run("
|
12 |
+
|
13 |
+
ALTER TABLE `{$this->getTable('tv_faq/faq')}`
|
14 |
+
MODIFY COLUMN `creation_time` DATETIME NOT NULL;
|
15 |
+
ALTER TABLE `{$this->getTable('tv_faq/faq')}`
|
16 |
+
MODIFY COLUMN `update_time` DATETIME NOT NULL;
|
17 |
+
|
18 |
+
CREATE TABLE `{$this->getTable('tv_faq/category')}` (
|
19 |
+
`category_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
20 |
+
`parent_id` INT(10) UNSIGNED NULL,
|
21 |
+
`category_name` VARCHAR(255) NOT NULL,
|
22 |
+
`creation_time` DATETIME NOT NULL,
|
23 |
+
`update_time` DATETIME NOT NULL,
|
24 |
+
`is_active` TINYINT(1) UNSIGNED NOT NULL DEFAULT 1,
|
25 |
+
PRIMARY KEY (`category_id`),
|
26 |
+
CONSTRAINT `FK_FAQ_CATEGORY_PARENT_ID` FOREIGN KEY (`parent_id`) REFERENCES `{$this->getTable('tv_faq/category')}` (`category_id`) ON DELETE SET NULL
|
27 |
+
) ENGINE=InnoDB COMMENT='FAQ Categories';
|
28 |
+
|
29 |
+
-- DROP TABLE IF EXISTS `{$this->getTable('tv_faq/category_item')}`;
|
30 |
+
CREATE TABLE `{$this->getTable('tv_faq/category_item')}` (
|
31 |
+
`category_id` INT(10) UNSIGNED NOT NULL,
|
32 |
+
`faq_id` INT(10) UNSIGNED NOT NULL,
|
33 |
+
PRIMARY KEY (`category_id`,`faq_id`),
|
34 |
+
CONSTRAINT `FK_FAQ_CATEGORY_ITEM_CATEGORY` FOREIGN KEY (`category_id`) REFERENCES `{$this->getTable('tv_faq/category')}` (`category_id`) ON UPDATE CASCADE ON DELETE CASCADE,
|
35 |
+
CONSTRAINT `FK_FAQ_CATEGORY_ITEM_ITEM` FOREIGN KEY (`faq_id`) REFERENCES `{$this->getTable('tv_faq/faq')}` (`faq_id`) ON UPDATE CASCADE ON DELETE CASCADE
|
36 |
+
) ENGINE=InnoDB COMMENT='FAQ Items to Cateories';
|
37 |
+
|
38 |
+
-- DROP TABLE IF EXISTS `{$this->getTable('tv_faq/category_store')}`;
|
39 |
+
CREATE TABLE `{$this->getTable('tv_faq/category_store')}` (
|
40 |
+
`category_id` INT(10) UNSIGNED NOT NULL,
|
41 |
+
`store_id` SMALLINT(5) UNSIGNED NOT NULL,
|
42 |
+
PRIMARY KEY (`category_id`,`store_id`),
|
43 |
+
CONSTRAINT `FK_FAQ_CATEGORY_STORE_CATEGORY` FOREIGN KEY (`category_id`) REFERENCES `{$this->getTable('tv_faq/category')}` (`category_id`) ON UPDATE CASCADE ON DELETE CASCADE,
|
44 |
+
CONSTRAINT `FK_FAQ_CATEGORY_STORE_STORE` FOREIGN KEY (`store_id`) REFERENCES `{$this->getTable('core/store')}` (`store_id`) ON UPDATE CASCADE ON DELETE CASCADE
|
45 |
+
) ENGINE=InnoDB COMMENT='FAQ Categories to Stores';
|
46 |
+
|
47 |
+
");
|
48 |
+
|
49 |
+
$installer->endSetup();
|
app/design/adminhtml/default/default/layout/faq.xml
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<layout version="0.1.0">
|
3 |
+
<default>
|
4 |
+
<reference name="head">
|
5 |
+
<action method="setCanLoadExtJs"><flag>1</flag></action>
|
6 |
+
<action method="setCanLoadTinyMce"><flag>1</flag></action>
|
7 |
+
<action method="addJs"><script>mage/adminhtml/variables.js</script></action>
|
8 |
+
<action method="addJs"><script>mage/adminhtml/wysiwyg/widget.js</script></action>
|
9 |
+
<action method="addJs"><script>lib/flex.js</script></action>
|
10 |
+
<action method="addJs"><script>lib/FABridge.js</script></action>
|
11 |
+
<action method="addJs"><script>mage/adminhtml/flexuploader.js</script></action>
|
12 |
+
<action method="addJs"><script>mage/adminhtml/browser.js</script></action>
|
13 |
+
<action method="addJs"><script>prototype/window.js</script></action>
|
14 |
+
<action method="addJs"><script>prototype/prototype.js</script></action>
|
15 |
+
<action method="addItem"><type>js_css</type><name>prototype/windows/themes/default.css</name></action>
|
16 |
+
<action method="addCss">
|
17 |
+
<name>lib/prototype/windows/themes/magento.css</name>
|
18 |
+
</action>
|
19 |
+
</reference>
|
20 |
+
</default>
|
21 |
+
<faq_adminhtml_faq_index>
|
22 |
+
<reference name="content">
|
23 |
+
<block type="faq/adminhtml_faq" name="faq" />
|
24 |
+
</reference>
|
25 |
+
</faq_adminhtml_faq_index>
|
26 |
+
<faq_adminhtml_faq_edit>
|
27 |
+
<update handle="editor"/>
|
28 |
+
</faq_adminhtml_faq_edit>
|
29 |
+
|
30 |
+
</layout>
|
app/etc/modules/TV_Faq.xml
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<TV_Faq>
|
5 |
+
<active>true</active>
|
6 |
+
<codePool>local</codePool>
|
7 |
+
</TV_Faq>
|
8 |
+
</modules>
|
9 |
+
</config>
|
package.xml
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<package>
|
3 |
+
<name>tv_faq_new</name>
|
4 |
+
<version>0.1.0</version>
|
5 |
+
<stability>stable</stability>
|
6 |
+
<license>OSL</license>
|
7 |
+
<channel>community</channel>
|
8 |
+
<extends/>
|
9 |
+
<summary>This extension allows admin to enter questions and answers and list them on front end.</summary>
|
10 |
+
<description>This extension allows admin to enter questions and answers and list them on front end.</description>
|
11 |
+
<notes>First version</notes>
|
12 |
+
<authors><author><name>tarun vishnoi</name><user>tarun_ons</user><email>honeyvishnoi@gmail.com</email></author></authors>
|
13 |
+
<date>2016-02-02</date>
|
14 |
+
<time>14:26:38</time>
|
15 |
+
<contents><target name="mageetc"><dir name="modules"><file name="TV_Faq.xml" hash="690d6d2c3226982e59507bfc619ceed2"/></dir></target><target name="magelocal"><dir name="TV"><dir name="Faq"><dir name="Block"><dir name="Adminhtml"><dir name="Category"><dir name="Edit"><file name="Form.php" hash="92dff8a012206aae13e4c2ae3759c5f9"/><dir name="Tab"><file name="Form.php" hash="46d4ab06cbd0099a31e4ac99b6de39fc"/></dir><file name="Tabs.php" hash="69bd08df860a478ccf90fc9fa2c56ae7"/></dir><file name="Edit.php" hash="3b58bcd78038a5e943b90da796598d4c"/><file name="Grid.php" hash="319356af6e0e6329a42b779834456bc0"/></dir><file name="Category.php" hash="59a310d0fa62886828e9a53afcf35954"/><dir name="Item"><dir name="Edit"><file name="Form.php" hash="6ec7bc1dea4b127e65298a15ffbe3ee4"/><dir name="Tab"><file name="Form.php" hash="1d9bf36cf280acdee246b61e62ef5320"/></dir><file name="Tabs.php" hash="1fc1ab43dcf72b6e63bc785f4e83effb"/></dir><file name="Edit.php" hash="ee55af3d2c18c06d99c91f50bc38bce6"/><file name="Grid.php" hash="b172258c705c6ac5a10cd28fd513ac2a"/></dir><file name="Item.php" hash="de90e2d7348bf60db6cb0a852f4b558b"/></dir><dir name="Frontend"><file name="Detail.php" hash="2425432562d71949bb7bbc1166915b49"/><file name="List.php" hash="ca84aa33f29c6c817623cd42043cab5a"/></dir></dir><dir name="Helper"><file name="Data.php" hash="b6c919e0c4d5e54e28779c389872f7c2"/><file name="Jumplist.php" hash="c6b5469ffddef4afbb9825787af363ae"/><file name="JumplistItem.php" hash="3323517e20c5db4c5b41caa17a56dd2e"/></dir><dir name="Model"><file name="Category.php" hash="9e928e4f26ac0ad1965b912bd43ff0d4"/><file name="Faq.php" hash="c93d162961776b7c1d4a887b12e15d98"/><dir name="Mysql4"><dir name="Category"><file name="Collection.php" hash="c6f262642e9a3558ef599582e402cf39"/></dir><file name="Category.php" hash="c084383e9031018b4bb93fed37bad39e"/><dir name="Faq"><file name="Collection.php" hash="909b63da3d8c1fb177a49855286ce951"/></dir><file name="Faq.php" hash="691c7c4015628e45671daa9f6a847daf"/></dir></dir><dir name="Wysiwyg"><dir name="Images"><dir name="Content"><file name="Files.php" hash="96ba466e162a5b304e05581a1b9981c2"/><file name="Newfolder.php" hash="e53addca9a2a2a705e97bd493c57833c"/><file name="Uploader.php" hash="d46965540d2986ff74f9c2c030f2dbb4"/></dir><file name="Content.php" hash="fa97cc6ae723a62eeb137dcb23851225"/><file name="Tree.php" hash="6de3fa85978962413118cfc15b5f8f82"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Faq"><file name="CategoryController.php" hash="f66c2305c654f36cb5dc8e2682e135f2"/></dir><file name="FaqController.php" hash="876b26440bb40188b38cfc7b98a38b21"/></dir><file name="IndexController.php" hash="3e8c7abb09eb92da75cf562eb8d3a890"/></dir><dir name="etc"><file name="adminhtml.xml" hash="8a4d6da6397de73caad6d78cd433ed88"/><file name="config.xml" hash="42ecc7df781233659a4d274fa7b11e4b"/></dir><dir name="sql"><dir name="faq_setup"><file name="mysql4-install-0.1.0.php" hash="1a5a6fc58d62fb45706bd94a4c9073cf"/><file name="mysql4-install-1.0.7.php" hash="5914476063c2aef33bb3adb0bdc3effe"/><file name="mysql4-upgrade-1.0.6-1.0.7.php" hash="b63f7b5b2ff00f632b0be0582ef7a530"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="base"><dir name="default"><dir name="layout"><file name="faq.xml" hash=""/></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="faq.xml" hash="d6d4c73235f8fec0b08f545f178db4eb"/></dir></dir></dir></dir></target></contents>
|
16 |
+
<compatible/>
|
17 |
+
<dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php></required></dependencies>
|
18 |
+
</package>
|