0

まず、ビューで達成しようとしていることを示すために、タイプ別にグループ化されたエクストラのリスト。

<ul>
{foreach $extras as $extra_type}
<li>
    <h2>{$extra_type.title}</h2>
    <ul>
        {foreach $extra_type.extras as $extra}
        <li>
            {$extra.name}
        </li>
        {/foreach}
    </ul>
</li>
{/foreach}
</ul>

$extras毎回配列を上書きするのは良い習慣ではないと思いますが、私は重複したエクストラを作成している次のものを持っています。これを行うためのより良い方法はありますか?データベースに対して1つのクエリのみを実行したいと思います。

$stmnt = "SELECT e.*, ed.extra_description_name, ed.extra_description_description,
            et.extra_type_title, ep.extra_price_amount, c.currency_htmlcode
          FROM product_extras pe
          LEFT JOIN extras e ON e.extra_id = pe.extra_id
          LEFT JOIN extra_descriptions ed ON ed.extra_id = pe.extra_id
          LEFT JOIN extra_prices ep ON ep.extra_id = pe.extra_id
          LEFT JOIN extra_types et ON et.extra_type_id = e.extra_type_id
          LEFT JOIN currencies c ON c.currency_id = ep.currency_id
          WHERE pe.product_id = '{$this->id}' AND e.extra_status = 'ENABLED'
            AND ed.language_id = 1 AND ep.currency_id = 1";

if ($isPublished) {
    $stmnt .= "
        AND IF(e.extra_publish_from IS NOT NULL, e.extra_publish_from, NOW()) <= NOW()
        AND IF(e.extra_publish_until IS NOT NULL, e.extra_publish_until, NOW()) >= NOW()";
}

$stmnt .= " ORDER BY e.extra_type_id, pe.product_extra_ordering, ed.extra_description_name";

$cache  = Cache::getInstance()->newObject(300);
$sig = Cache::getCacheName(sha1($stmnt));

if (!$res = $cache->load($sig)) {
    $res = $db->fetchAll($stmnt);
    $cache->save($res, $sig);
}

if(!empty($res))  {
    foreach($res as $row) {
        $extra[] = array(
            'id'        => $row['extra_id'],
            'type'      => $row['extra_type_title'],
            'weight'    => $row['extra_weight'],
            'image'      => $row['extra_image'],
            'name'      => $row['extra_description_name'],
            'description'   => $row['extra_description_description'],
            'price'     => Formatter::getInstance()->outFormat("currency", $row['extra_price_amount']),
            'currency'  => $row['currency_htmlcode']
        );

        $extras[$row['extra_type_id']] = array(
            'title' => $row['extra_type_title'],
            'extras' => $extra
        );
    }
}

それが助けになるならこれはDBです

--
-- Table structure for table `extras`
--

CREATE TABLE IF NOT EXISTS `extras` (
  `extra_id` int(11) NOT NULL AUTO_INCREMENT,
  `extra_weight` float(4,1) NOT NULL COMMENT 'Weight in KG',
  `extra_image` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `extra_available_all_countries` tinyint(1) NOT NULL,
  `extra_type_id` int(11) DEFAULT NULL,
  `extra_publish_from` int(11) DEFAULT NULL,
  `extra_publish_until` int(11) DEFAULT NULL,
  `extra_created` datetime NOT NULL,
  `extra_created_by` int(11) NOT NULL,
  `extra_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `extra_modified_by` int(11) NOT NULL,
  `extra_status` enum('ENABLED','DISABLED') COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`extra_id`),
  KEY `extra_typeFK` (`extra_type_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- --------------------------------------------------------

--
-- Table structure for table `extra_types`
--

CREATE TABLE IF NOT EXISTS `extra_types` (
  `extra_type_id` int(11) NOT NULL AUTO_INCREMENT,
  `extra_type_title` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`extra_type_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
4

2 に答える 2

0

ループの形式が正しくありません

<ul> {foreach $extras as $extra_type} <li>
    <h2>{$extra_type.title}</h2>
    <ul>
        {foreach $extra_type.extras as $extra}
        <li>
            {$extra.name}
        </li>
        {/foreach}
    </ul> </li> {/foreach}

$extra_type.extrasを2番目のforeachにメモします。

テンプレートエンジンが文法をサポートしていない可能性があります

于 2012-07-03T10:25:14.927 に答える
0

私はあきらめて、ロジックをビューに移動する方がはるかに簡単でした。

<ul>
{foreach $extras as $extra}
    {if $_extra_type != $extra.type || $extra@first}
    <li>
        <h2>{$extra.type}</h2>
        <ul>
        {/if}

            <li>
                {$extra.type} - {$extra.name}
            </li>

        {if $_extra_type != $extra.type || $extra@last}
        </ul>
    </li>
    {/if}
    {assign var="_extra_type" value=$extra.type}
{/foreach}
</ul>


if(!empty($res))  {
    foreach($res as $row) {
        $extras[] = array(
            'id'            => $row['extra_id'],
            'type'          => $row['extra_type_title'],
            'weight'        => $row['extra_weight'],
            'image'         => $row['extra_image'],
            'name'          => $row['extra_description_name'],
            'description'   => $row['extra_description_description'],
            'price'         => Formatter::getInstance()->outFormat("currency", $row['extra_price_amount']),
            'currency'      => $row['currency_htmlcode']
        );
    }
}
于 2012-07-03T10:30:36.283 に答える