0

私がやろうとしているのは、必要に応じてサムネイルのレイアウトを変更できる再利用可能なギャラリー機能を作成することです。

私の問題は、中括弧変数を含む $thumbLayout 文字列が、このような関数に含まれていると機能しないことです。変数を置き換えた後に文字列が書き込まれた場合にのみ機能します。

これを行うための解決策またはより良い方法を考え出すための助けを本当に感謝します.

$thumbLayout = "<div class=\"customgallery\"><img src=\"{$thumbImgPath}\" width=\{$width}\" height=\"{$height}\" alt=\"{$imgName}\" /></div>";

function createImageGallery($galleryName,$db,$thumbLayout=''){
        $imgno = 1;
        //Page numbers//
        if(isset($_GET['page']) && is_numeric($_GET['page'])) {
            $page = $_GET['page'];
        }elseif(isset($_POST['page']) && is_numeric($_POST['page'])) {
            $page = $_POST['page'];
        }else{
            $page = 1;
        }

        $rowGallery = $db->query_first("SELECT gallery_id,num_cols,images_per_page FROM tblgallery WHERE gallery_name='$galleryName' AND show_gallery='y' LIMIT 1");    
        if($rowGallery!=false){
            $recordsPerPage = $rowGallery['images_per_page'];
            $numCol = $rowGallery['num_cols'];
            $gallery = '<ul>';
            $gallery_id = $rowGallery['gallery_id'];

            $offset = ($page - 1) * $recordsPerPage;
            $query = "SELECT * FROM tblimages WHERE group_id='$gallery_id' AND imgpath_thumb<>'' AND show_img='y' ORDER BY img_order";
                $rs = $db->query("$query LIMIT $offset,$recordsPerPage");
                foreach($rs as $row){
                    $largeImgPath = '/'.$row['imgpath_large'];
                    $imgName = $row['img_name'];
                    $thumbImgPath = '/'.$row['imgpath_thumb'];
                    if(($imgno>1) && (!is_float(($imgno-1)/$numCol))){
                        $li_class = 'class="newline"';
                    }elseif(($imgno>1) && (!is_float(($imgno)/$numCol))){
                        $li_class = 'class="last"'; 
                    }else{
                        $li_class = ''; 
                    }
                    list($width, $height) = getimagesize($row['imgpath_thumb']);
                    if($thumbLayout==''){
                        $gallery .= '<li '.$li_class.'><a href="'.$largeImgPath.'" class="popup" title="'.$imgName.'"><div class="gallery_imgbox"><img src="'.$thumbImgPath.'" width="'.$width.'" height="'.$height.'" alt="'.$imgName.'" /></div><span>'.$imgno.$imgName.'</span></a></li>';
                    }else{
                        $gallery .= '<li '.$li_class.'>'.$thumbLayout.'</li>';
                    }
                    $imgno++;
                }
            $gallery .= '</ul>';
        }else{
            //Gallery specified does not exist//
            return 'Gallery does not exist';
        }
    return  $gallery;
}

それは本当に $thumbLayout の配置に関係していると思います。関数内で置換変数の下にある場合は機能しますが、関数の外から含めた場合は置換されません。わかりましたので、これは本当に簡単な例です:

$test1 = sprintf("My name is %s.",$name);
$test2 = "My name is {$name}.";
$test3 = "My name is ${name}.";
$test4 = "My name is $name .";
$test5 = "My name is <?= name ?>.";
$test6 = "My name is {{name}} .";

function showtest($test){
$name = "Bob";
echo $test; 
}

showtest($test1); //Result: My name is .//
showtest($test2); //Result: My name is .//
showtest($test3); //Result: My name is .//
showtest($test4); //Result: My name is .//
showtest($test5); //Result: My name is .//
showtest($test6); //Result: My name is {{name}}.//

これは機能しますが(しかし、私には役に立ちません)

function showtest2(){
$name = "Bob";
$test = "My name is {$name}.";  
echo $test; 
}

showtest2(); //Result: My name is Bob.//
4

3 に答える 3

0

中括弧はまったく必要ありません。

$thumbLayout = "<div class=\"customgallery\"><img src=\"$thumbImgPath\" width=\"$width\" height=\"$height\" alt=\"$imgName\" /></div>";

うまくいきます。以下を使用することをお勧めします。

$thumbLayout = sprintf("<div class=\"customgallery\"><img src=\"%s\" width=\"%s\" height=\"%s\" alt=\"s\" /></div>",$thumbImgPath,$width,$height,$imgName);

これは、たとえば mysql クエリの結果など、変数を配列に変更した場合にも機能します。関数、配列、変数の結果を簡単に挿入できるため、読みやすさが少し失われ、変数の順序を間違えてバグが発生するリスクが高くなると感じたので、これを使用しています。注意深いフォーマットと練習により、エラーはあまり一般的ではありません。

于 2013-10-06T07:33:24.010 に答える
0

これを試して:

$thumbLayout = "<div class=\"customgallery\"><img src=\"${thumbImgPath}\" width=\"${width}\" height=\"${height}\" alt=\"${imgName}\" /></div>";

${varname} のように左中括弧 { が $ 記号の後にある場合、中括弧は PHP によって置き換えられます。

追加した:

サブルーチン内に変数 $thumbLayout を配置する必要があります。

関数は次のようにする必要があります。

<?php
function createImageGallery($galleryName,$db){
    $imgno = 1;
    //Page numbers//
    if(isset($_GET['page']) && is_numeric($_GET['page'])) {
        $page = $_GET['page'];
    }elseif(isset($_POST['page']) && is_numeric($_POST['page'])) {
        $page = $_POST['page'];
    }else{
        $page = 1;
    }

    $rowGallery = $db->query("SELECT gallery_id,num_cols,images_per_page FROM tblgallery WHERE gallery_name='$galleryName' AND show_gallery='y' LIMIT 1");    
    if($rowGallery!=false){
        $recordsPerPage = $rowGallery['images_per_page'];
        $numCol = $rowGallery['num_cols'];
        $gallery = '<ul>';
        $gallery_id = $rowGallery['gallery_id'];

        $offset = ($page - 1) * $recordsPerPage;
        $query = "SELECT * FROM tblimages WHERE group_id='$gallery_id' AND imgpath_thumb<>'' AND show_img='y' ORDER BY img_order";
            $rs = $db->query("$query LIMIT $offset,$recordsPerPage");
            foreach($rs as $row){
                $largeImgPath = '/'.$row['imgpath_large'];
                $imgName = $row['img_name'];
                $thumbImgPath = '/'.$row['imgpath_thumb'];
                if(($imgno>1) && (!is_float(($imgno-1)/$numCol))){
                    $li_class = 'class="newline"';
                }elseif(($imgno>1) && (!is_float(($imgno)/$numCol))){
                    $li_class = 'class="last"'; 
                }else{
                    $li_class = ''; 
                }
                list($width, $height) = getimagesize($row['imgpath_thumb']);

$thumbLayout = "<div class=\"customgallery\"><img src=\"${thumbImgPath}\" width=\"${width}\" height=\"${height}\" alt=\"${imgName}\" /></div>";

                if($thumbLayout==''){
                    $gallery .= '<li '.$li_class.'><a href="'.$largeImgPath.'" class="popup" title="'.$imgName.'"><div class="gallery_imgbox"><img src="'.$thumbImgPath.'" width="'.$width.'" height="'.$height.'" alt="'.$imgName.'" /></div><span>'.$imgno.$imgName.'</span></a></li>';
                }else{
                    $gallery .= '<li '.$li_class.'>'.$thumbLayout.'</li>';
                }
                $imgno++;
            }
        $gallery .= '</ul>';
    }else{
        //Gallery specified does not exist//
        return 'Gallery does not exist';
    }
return  $gallery;
}

//
// then in the main body:
//
// ....
//

$host = "localhost";
$database = "picassoreserve";
$user = "johndoe2";
$pass = "mypassword";

$db = new PDO("mysql:host=$host;dbname=$database", $user, $pass);
//
// or 
// $db = @new mysqli($host, $user, $pass, $database);
//

$galleryName = "picasso";

echo createImageGallery($galleryName, $db);

?>
于 2013-10-06T07:23:40.523 に答える
0

テンプレートファイルで取得したものと同じように機能するものが必要だと思います。ここでは、一般的に次のように見えるテンプレート変数が見つかり{{my_var}}ます<?= $my_var ?>

残念ながら、ここで中括弧変数は=、関数に渡した後ではなく、$thumbLayout に割り当てるとすぐに置き換えられます。テンプレートのようには機能しません。

于 2013-10-06T08:05:01.297 に答える