Jump to content
Sign in to follow this  
zyto

Как сделать что бы шаблон блока товара описывался в одном месте?

Recommended Posts

У меня в шаблоне есть множество однотипных блоков, которые выводят блок (прямоугольник) товара.

Например, блок товара должен одинаково выглядеть: в списке товаров категории, в списке товаров бренда, в рекомендуемых товарах, в новинках, и т.д. и т.п.

И если вдруг надо внести правки во внешний вид этого блока - то нужно исправить кучу файликов, типа 

category.tpl

featured.tpl

latest.tpl

и т.д.

 

Можно во всех этих файлах шаблона сделать некую "ссылку" на подшаблон товара, что бы потом можно было поменять в одном месте, и во всех блоках отображение изменилось бы.

 

Наверняка можно сделать что-то типа require или include... Но это немножко "топорно"... А есть ли у opencart'a возможность зарендерить часть шаблона из другого шаблона?

Share this post


Link to post
Share on other sites

Версия Opencart 1.5.6.3

Share this post


Link to post
Share on other sites

Т.е. мне нужно что-то типа $this->render() но не из контроллера а из шаблона (tpl).

Что-нибудь такое бывает?

Share this post


Link to post
Share on other sites

"мойфайл.tpl" сделайте и подключайте куда хотите

Share this post


Link to post
Share on other sites

Я и спрашиваю - как в opencart правильно подключить шаблон (tpl) из другого шаблона?

можно кусочек кода?

Share this post


Link to post
Share on other sites

*сейчас в контроллере сделал так:

if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/product_block.tpl')) {
            $this->data['product_template'] = DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/product_block.tpl';
  }

 

и потом в шаблоне:

<?php if(isset($this->data['product_template'])){
                            include $this->data['product_template'];
                        } ?>

 

Но мне кажется это не совсем правильно... Таким образом надо будет изменять каждый контроллер связанный с выводом блока товаров и т.д.

Share this post


Link to post
Share on other sites

Создаете шаблон, например "module/myfile.tpl"

 

Создаете контроллер "module/myfile.php"

В контроллере грузите необходимые модели, делаете че вам там надо делать

и указываете шаблон

$this->template = 'default/template/module/myfile.tpl';

Открываете контроллер шаблона, куда хотите пихать свой шаблон и подключаете его, обычно этот кусок выглядит так

$this->children = array(
	'common/column_left',
	'common/column_right',
	'common/content_top',
	'common/content_bottom',
	'common/footer',
	'common/header'
);

Share this post


Link to post
Share on other sites

Ну мне отдельный шаблон не нужен, я никаких вычислений не произвожу, мне нужно только кусок шаблона вынести в другой шаблон.

 

Пример, файл module/featured.tpl выглядит так:

<div class="box">
  <div class="box-heading"><?php echo $heading_title; ?></div>

  <div class="box-content">

    <div class="box-product">

      <?php foreach ($products as $product) { ?>

      <div>

        <?php if ($product['thumb']) { ?>

        <div class="image"><a href="<?php echo $product['href']; ?>"><img src="<?php echo $product['thumb']; ?>" alt="<?php echo $product['name']; ?>" /></a></div>

        <?php } ?>

        <div class="name"><a href="<?php echo $product['href']; ?>"><?php echo $product['name']; ?></a></div>

        <?php if ($product['price']) { ?>

        <div class="price">

          <?php if (!$product['special']) { ?>

          <?php echo $product['price']; ?>

          <?php } else { ?>

          <span class="price-old"><?php echo $product['price']; ?></span><br /><span class="price-new"><?php echo $product['special']; ?></span>

          <?php } ?>

        </div>

        <?php } ?>

       <div class="rating">

          <?php for ($i = 1; $i <= 5; $i++) { ?>

          <?php if ($product['rating'] < $i) { ?>

          <span class="fa fa-stack"><i class="fa fa-star-o fa-stack-2x"></i></span>

          <?php } else { ?>

          <span class="fa fa-stack"><i class="fa fa-star fa-stack-2x"></i><i class="fa fa-star-o fa-stack-2x"></i></span>

          <?php } ?>

          <?php } ?>

        </div>

        <div class="cart"><input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" /></div>

      </div>

      <?php } ?>

    </div>

  </div>
</div>

Я хочу вынести кусок, который отвечает за сам блок товара в отдельный файл, что бы featured.tpl остался таким:

<div class="box">
  <div class="box-heading"><?php echo $heading_title; ?></div>

  <div class="box-content">

    <div class="box-product">

      <?php foreach ($products as $product) { ?>

            !!!ТУТ НАДО ПОДКЛЮЧАТЬ ДОП.ШАБЛОН  product_block.tpl!!!

      <?php } ?>

    </div>

  </div>
</div>

и появился бы некий product_block.tpl:

<div>
        <?php if ($product['thumb']) { ?>

        <div class="image"><a href="<?php echo $product['href']; ?>"><img src="<?php echo $product['thumb']; ?>" alt="<?php echo $product['name']; ?>" /></a></div>

        <?php } ?>

        <div class="name"><a href="<?php echo $product['href']; ?>"><?php echo $product['name']; ?></a></div>

        <?php if ($product['price']) { ?>

        <div class="price">

          <?php if (!$product['special']) { ?>

          <?php echo $product['price']; ?>

          <?php } else { ?>

          <span class="price-old"><?php echo $product['price']; ?></span><br /><span class="price-new"><?php echo $product['special']; ?></span>

          <?php } ?>

        </div>

        <?php } ?>

       <div class="rating">

          <?php for ($i = 1; $i <= 5; $i++) { ?>

          <?php if ($product['rating'] < $i) { ?>

          <span class="fa fa-stack"><i class="fa fa-star-o fa-stack-2x"></i></span>

          <?php } else { ?>

          <span class="fa fa-stack"><i class="fa fa-star fa-stack-2x"></i><i class="fa fa-star-o fa-stack-2x"></i></span>

          <?php } ?>

          <?php } ?>

        </div>

        <div class="cart"><input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" /></div>
      </div>

никаких доп. вычислений делать не нужно, все данные для вывода у меня уже есть, мне просто в featured.tpl надо подключить product_block.tpl

Можно это сделать без создания доп. контроллера?

Share this post


Link to post
Share on other sites

А чем не устраивает такой вывод своего блока

<?php echo $my_block; ?>

Ну, делайте через ж... по своему.

Share this post


Link to post
Share on other sites

Простите, не совсем понял, где должен заполняться $my_block, при том что данные все уже есть во вьюхе, и новые запросы к БД не хотелось бы делать.

Share this post


Link to post
Share on other sites

Я вам выше описал. Возьмите какой-нибудь модуль и разберите его - поймете что и как работает.

Share this post


Link to post
Share on other sites

requrie_once в шаблонах / создание какой-нибудь библиотеки (или хэлпера) с методом, который будет принимать массив товаров, а отдавать сформированный html (в шаблоне вызываться будет как-то так - "echo $this->megoproducthtmllibrary->buildproductblock($products_array);").

но это привнесет запутанности в движок.

Share this post


Link to post
Share on other sites

А где хелпер должен лежать, и что в нём должно быть?
Где-нибудь можно почитать именно про создание хелперов?

Share this post


Link to post
Share on other sites

А... Вы наверно имели ввиду библиотеку: https://opencartforum.com/topic/29217-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%B2%D0%BE%D0%B5%D0%B9-%D0%B1%D0%B8/

 

А для библиотеки можно шаблон (вид) создать, или предполагается что HTML целиком будет формироваться в этой библиотеке?

Share this post


Link to post
Share on other sites

предполагается что HTML целиком будет формироваться в этой библиотеке

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.