2

関数を使用して繰り返される PHP コードを最小限に抑えたいと考えています。私はデザイナーで、現在 PHP を学習しようとしています。以下のコードは、Module ブロックがアクティブかどうかをチェックし、ブロックをカウントします。

$TopCol1 = (int)($this->countModules('top-col-1') > 0);
$TopCol2 = (int)($this->countModules('top-col-2') > 0);
$TopCol3 = (int)($this->countModules('top-col-3') > 0);

$topColCount = $TopCol1 + $TopCol2 + $TopCol3;
if ($topColCount) : $TopColClass = 'count-' . $topColCount; 
endif;

次に、以下のコードが処理されます

    <?php if ($topColCount) : ?>
    <div class="row">
        <?php if ($this->countModules('top-col-1')) : ?>    
        <div id="top-col" class="<?php echo $TopColClass ?> columns">
            <div class="panel">
                <jdoc:include type="modules" name="top-col-1" style="html5" />
            </div>
        </div>
        <?php endif ?>
        <?php if ($this->countModules('top-col-2')) : ?>    
        <div id="top-col" class="<?php echo $TopColClass ?> columns">
            <div class="panel">
                <jdoc:include type="modules" name="top-col-2" style="html5" />
            </div>
        </div>
        <?php endif ?>
        <?php if ($this->countModules('top-col-3')) : ?>    
        <div id="top-col" class="<?php echo $TopColClass ?> columns">
            <div class="panel">
                <jdoc:include type="modules" name="top-col-3" style="html5" />
            </div>
        </div>
        <?php endif ?>
    </div>
<?php endif ?>

テンプレートでこのタイプのコードを何度も繰り返す必要があります。このコードを何度も繰り返さずにブロックを作成する関数を作成するのを手伝ってください

4

2 に答える 2

2

構文はお勧めしませんが、生のHTMLコードをphp関数内にインラインで配置できます。

<?php
function code_block( $jdoc_name ) {
global $TopColClass;  //// for variables created outside the function to be visible inside it, we have to include them with "global"
?>
<div id="top-col" class="<?php echo $TopColClass; ?> columns">
        <div class="panel">
            <jdoc:include type="modules" name="<?php echo $jdoc_name; ?>" style="html5" />
        </div>
    </div>
<?php
}

$MODULES = array(
  'top-col-1',
  'top-col-2',
  'top-col-3',
);


//// ....


//// in the page body a foreach loop would also be a good idea:
foreach( (array)$MODULES as $module_name ) {
    if ($this->countModules( $module_name )) {
        code_block( $module_name );
    }
}


?>

編集、要求に応じて解決するには:

<?php
function code_block( $jdoc_name ) {
global $TopColClass;  //// for variables created outside the function to be visible inside it, we have to include them with "global"
?>
<div id="top-col" class="<?php echo $TopColClass; ?> columns">
        <div class="panel">
            <jdoc:include type="modules" name="<?php echo $jdoc_name; ?>" style="html5" />
        </div>
    </div>
<?php
}

function module( $prefix, $comma_seperated_suffixes ) {
    foreach( (array)explode( ",", $comma_seperated_suffixes ) as $suffix ) {
        $module_name = $prefix.trim($suffix);
        code_block( $module_name );
    }
}


//// shorter call, as requested :)
module("top-col-", "1,2,3");


?>

最終編集、クラスに変換

<?php
class tovolt{
    function tovolt() {
        //// constructor function - used to setup default variable states, etc. - if this is omitted PHP may have a fit ( depending on version and config )
    }

    public static $TopColClass = 'default-value';

    function code_block( $jdoc_name ) {
?>
<div id="top-col" class="<?php echo self::$TopColClass; ?> columns">
        <div class="panel">
            <jdoc:include type="modules" name="<?php echo $jdoc_name; ?>" style="html5" />
        </div>
    </div>
<?php
    }

    function module( $prefix, $comma_seperated_suffixes ) {
        foreach( (array)explode( ",", $comma_seperated_suffixes ) as $suffix ) {
            $module_name = $prefix.trim($suffix);
            self::code_block( $module_name );
        }
    }
}


//// calling the class
tovolt::$TopColClass = 'new-value';                //// if you need to change: $TopColClass
tovolt::module("top-col-", "1,2,3");

?>
于 2012-07-31T02:51:43.727 に答える
0

それらをすべて配列に入れてから、 foreach loopを使用します。for ループだけが好まれる場合もあります。

于 2012-07-31T02:11:25.260 に答える