Добавление новой страницы в интерфейс
ОБНОВЛЕНО
Я пытаюсь добавить новую страницу в интерфейсе. Я делаю следующее. У меня есть форма, в которой я использую свое действие для загрузки представления. При нажатии кнопки он никогда не переходит к контроллеру, пожалуйста, помогите мне, что я делаю неправильно.
Моя форма такая же, как
<div id="abc-category-search">
<form id="abc-category-search-form" method="post" action="<?php echo Mage::getUrl('helloworld') ?>">
<label for="search"><?php echo $this->__('Search by product SKU/Category') ?>:</label>
<input id="abc-category-search-string" name="search" value="" />
<input id="abc-category-search-cat" type="hidden" name="category" value="<?php echo $category; ?>" />
<button id="abc-category-search-submit" type="submit" class="engine-btn" value="" >
<?php echo $this->__('Search') ?>
</button>
</form>
</div>
И я добавляю такую страницу.
app/code/local/Abc/Helloworld/etc/config.xml
<?xml version="1.0"?>
<config>
<global>
<modules>
<Abc_Helloworld>
<version>
0.1.0
</version>
</Abc_Helloworld>
</modules>
<blocks>
<abc_helloworld>
<class>Abc_Helloworld_Block</class>
</abc_helloworld>
</blocks>
</global>
<frontend>
<routers>
<helloworld>
<use>standard</use>
<args>
<module>Abc_Helloworld</module>
<frontName>helloworld</frontName>
</args>
</helloworld>
</routers>
<layout>
<updates>
<helloworld>
<file>abc_helloworld.xml</file>
</helloworld>
</updates>
</layout>
</frontend>
</config>
И
app/code/local/Abc/Helloworld/controllers/IndexController.php
<?php
class Abc_Helloworld_IndexController extends Mage_Core_Controller_Front_Action {
public function indexAction() {
$this->loadLayout();
$this->renderLayout();
}
}
И
app/code/local/Abc/Helloworld/Block/Helloworld.php
<?php
class Abc_HelloWorld_Block_Helloworld extends Mage_Core_Block_Template {
// necessary methods
}
И файл макета
app/design/frontend/default/Jin/layout/abc_helloworld.xml
<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
<helloworld_index_index>
<reference name="content">
<block type="abc_helloworld/helloWorld" name="helloworld_any_block" template="helloworld/index.phtml" />
</reference>
</helloworld_index_index>
</layout>
И .phtml
app/design/frontend/default/jin/template/helloworld/helloworld.phtml
<div>
<?php
echo 'Abdul Ghaffar';
?>
</div>
2 answers
Проблема заключается в вашем XML-файле обновления макета, особенно в следующем объявлении блока.
<block type="abc_helloworld/index" name="helloworld_any_block" template="helloworld/index.phtml" />
Magento не удается найти этот блок, потому что у вас нет объявления блока в файле config.xml
. Поэтому вам необходимо обновить свой config.xml файл со следующим кодом:
<config>
<global>
<blocks>
<abc_helloworld>
<class>Abc_HelloWorld_Block</class>
</abc_helloworld>
</blocks>
</global>
</config>
Здесь вы объявляете имя своей группы блоков. Вот и все.
Если вы хотите использовать свой собственный пользовательский блок, то ссылку на ваш блок также необходимо будет изменить следующим образом это.
<block type="abc_helloworld/helloWorld" name="helloworld_any_block" template="helloworld/index.phtml" />
Разница здесь в том, что я использую abc_helloworld/helloWorld
вместо abc_helloworld/index
. Это связано с тем, что ваша ссылка на тип блока ищет блок Abc_HelloWorld_Block_Index
, который не определен.
Также убедитесь, что default/jin
является вашей текущей темой пакета. В противном случае было бы лучше переместить файл шаблона phtml в каталог тем пакета base/default
, так как это последнее резервное расположение для Magento.
Убедитесь, что вы очистили весь кэш после всех внесенных изменений. Счастливое кодирование
РЕДАКТИРОВАТЬ - 1
Ваше действие формы также необходимо изменить.
Это должно быть похоже на
<form id="abc-category-search-form" method="post" action="<?php echo Mage::getUrl('helloworld') ?>">
Позвольте Magento сгенерировать для вас правильный URL-адрес. :)
РЕДАКТИРОВАТЬ - 2
Используйте приведенный ниже config.xml
файл
<?xml version="1.0"?>
<config>
<modules>
<Abc_HelloWorld>
<version>0.1.0</version>
</Abc_HelloWorld>
</modules>
<global>
<blocks>
<abc_helloworld>
<class>Abc_HelloWorld_Block</class>
</abc_helloworld>
</blocks>
</global>
<frontend>
<routers>
<helloworld>
<use>standard</use>
<args>
<module>Abc_HelloWorld</module>
<frontName>helloworld</frontName>
</args>
</helloworld>
</routers>
<layout>
<updates>
<helloworld>
<file>abc_helloworld.xml</file>
</helloworld>
</updates>
</layout>
</frontend>
</config>
Основное отличие здесь в том, что вы используете Helloworld
вместо HelloWorld
почти во всех конфигурациях, и я также изменил имя интерфейса маршрутизатора на helloworld
вместо Helloworld
.
Убедитесь, что у вас есть файл активации для вашего модуля
Файл : app\etc\modules\Abc_HelloWorld.xml
<?xml version="1.0"?>
<config>
<modules>
<Abc_HelloWorld>
<active>true</active>
<codePool>local</codePool>
</Abc_HelloWorld>
</modules>
</config>
ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ
Magento чувствителен к письмам. И я, и диджиталпианизм говорим об одном и том же. Вы используете файловую структуру Abc\HelloWorld
. Следовательно, вам нужно использовать ту же концепцию именования. т.е. Abc_HelloWorld
. Или, если вам нравится иметь имя класса Abc_Helloworld
, то ваша файловая структура должна быть Abc/Helloworld
.
Теперь о XML-файле обновления макета. У вас есть файл шаблона helloworld/helloworld.phtml
, и, следовательно, вам нужно правильно указать его в своем блоке. ie
<block type="abc_helloworld/helloWorld" name="helloworld_any_block" template="helloworld/helloworld.phtml" />
В этом блоке обычно будет указано 3 вещи в Magento.
Предполагает, что ваш модуль Abc_HelloWorld
, а не Abc_Helloworld
, и ваша файловая структура похожа Abc/HelloWorld
Мой блок имеет тип =
abc_helloworld/helloWorld
. Это будет прочитано Magento, какAbc_HelloWorld_Block_HelloWorld
.Мое имя блока -
helloworld_any_block
- Используйте
app\design\frontend\{package}\{theme}\template\helloworld/helloworld.phtml
в качестве шаблона моего блока.
Проблема в вашем случае заключается в том, что ваша форма не вызывает правильное действие.
Имя, которое вы указываете в своем config.xml
, следующее: Helloworld
(кстати, я предлагаю вам изменить его на helloworld
).
Таким образом, ваше действие формы должно быть helloworld/index/index
вместо abc_helloWorld/index/index
Кроме того, в объявлении макета вашего интерфейса отсутствует тип имени файла.
Вместо:
<layout>
<updates>
<helloworld>
<file>abc_helloworld</file>
</helloworld>
</updates>
</layout>
Это должно быть:
<layout>
<updates>
<helloworld>
<file>abc_helloworld.xml</file>
</helloworld>
</updates>
</layout>
Наконец, ваши блоки вообще не объявлены. Вы должны сделать следующее под тегом <config>
вашего config.xml
:
<global>
<blocks>
<abc_helloworld>
<class>Abc_Helloworld_Block</class>
</abc_helloworld>
</blocks>
</global>
Последнее замечание, я полагаю, у вас проблема с папкой вашего модуля.
Действительно, имя модуля объявлено в вашем config.xml
как Abc_Helloworld
, но ваша папка объявлена как:
app/code/local/Abc/HelloWorld
Вы должны изменить его на:
app/code/local/Abc/Helloworld
И соответственно измените свои классы.