サポート » プラグイン » AdvancedCustomFieldsのPRO版Flexible Content Fieldで前の値を引き継いでしまう

  • 解決済 umioyo

    (@umioyo)


    お世話になります。
    AdvancedCustomFieldsのPRO版で、柔軟コンテンツ(Flexible Content Field)を使用しています。

    柔軟コンテンツの中に、テキストと画像を入力できるフィールドを用意し、入力画面でそのフィールドを繰り返します。

    1
    テキスト: 「ここは1回目の入力」
    画像:なし

    2
    テキスト: なし
    画像: 「画像を指定」

    と入力すると、2回めの表示の際に、1回目に入力した「ここは1回目の入力」が表示されてしまいます。
    コードは、だいぶ端折りますが

    
    	if( have_rows('bodyset') ):
        	while ( have_rows('bodyset') ) : the_row();
        	if( get_row_layout() == 'text_pic' ):
        	$text_pic_text_text=get_sub_field('text_pic_text_text');
        	$text_pic_pic_pic=get_sub_field('text_pic_pic_pic');
        	if($text_pic_text_text){echo $text_pic_text_text;}
        	if($text_pic_pic_pic){echo '<img src="'.$text_pic_pic_pic["url"].'">';}
    	endwhile;
    	endif;
    

    のような、いたって普通のコードです。
    逆の、1回目はテキストなし、画像あり、2回めはテキストあり、画像なしも試したのですが、画像が繰り返し表示されてしまいます。
    $text_pic_text_textと$text_pic_pic_picをunsetしてみたのですが、効果なしです。
    これは回避することはできないのでしょうか。
    これができないと柔軟コンテンツではないと思うのですが・・・

    よろしくお願い致します。

    • このトピックは3年、 1ヶ月前にumioyoが編集しました。理由: RepeaterとFlexible Content Fieldを間違えました
10件の返信を表示中 - 1 - 10件目 (全10件中)
  • スレタイ間違えました。
    RepeaterではなくFlexible Content Fieldです。

    whileでの動作内において変数に取り込む際、毎回「数字がある分を取り込む」をget_sub_fieldにて行っているようですが
    get_sub_field のない場合、渡す数字がカラなのではなく「存在しない」場合は「受け取るべき変数がカラになっていない」のではないですか。
    つまり前にいれた変数がなんの変化もなく2巡目に入っているのでは。

    $text_pic_text_text="";
    $text_pic_pic_pic="";

    などで初期化するかempty(get_sub_fieldのような形にするなど、「項目そのものが存在しない場合」も対処してみてはどうでしょう。
    つかいまわしするコップはグラス交換制なので毎回カラのはず、だとおもいきやそうでもないことはあるとおもうので
    組式如何にかかわらず変数は毎回使用前に初期化するのは全般にあってもいいと思います。

    こんにちは

    2巡目には
    if( get_row_layout() == 'text_pic' ):
    という条件によって
    $text_pic_text_text=get_sub_field('text_pic_text_text');が実行されていません。

    get_row_layout()の内容を出力して確認してみて下さい。

    AdvancedCustomFieldsのPRO版については使ったことがないので分かりません。

    あとこまかい話で恐縮なのですが
    if($hensuu)と書くのは「値がTRUEの場合」TRUEとは1を表し1で代用できる上、状況によっては
    FALSE(0:ゼロ)ではない場合全部が稼働条件になりえます。
    この書き方自体はとても好適なのですが、そうであればブール値、バイナリ変数、つまり0か1しか入らないことを厳密に
    設定する前提があるべきだと思います。たまに数字で0と1として設定し利用している方もいらっしゃいます。
    またFALSE側はゼロでなくとも「値がない」場合も動作します。
    FALSEは数字のゼロかFALSE値なのかも型をあわせて確認する必要があるので、判別式として2値型を使うときにはすこし気を配っていただけると幸いです。
    イコールの算術符が三つつながれば「型まであっているかどうか」を見ることができます。
    例として「文中に文字が含まれているか」という関数でstrposというのがあるのですが、これが先頭の文字の0番目とFALSEが数字としては同じ値になるので
    ===FALSEとしてあげないと「含まれているか否か」の判別が正しくでないことがあります。
    また値が入ってさえいればTRUEを代用、の場合””(文字数ゼロ)もFALSEになりますが0(ゼロ、数字1桁一文字)もFALSEになります。
    unsetはスコープ、有効範囲があるので明確な使用範囲定義がなく流れで下位動作部分で仕掛けても上位範囲で残っていたり
    分岐のフラグ変数に対してであれば、分岐したのちの動作に対し直接効力をもつものではないので
    プログラム的には最初に道具を全部用意する、毎回使用時には初期化する、がいいと思います。
    unsetで判別をするのであれば判別式はissetになると思います。

    実際にunsetを使う場面は複数のプロセスをまたいで機能するとき能動的に干渉動作するものに私はよくつかいますが
    ローカル変数は自動的に開放されるのでローカルプロセスにはあまり使う必要はないと思います。
    飲み会予約が10人だったら、10人分の食器を用意しておくのはとても効率がいいと思いますが全部が使用されるわけではないという
    メモリマップ的に損が大きいですが、実際に必要な分だけ毎回お願いして用意してもらうという形だと物理消費は抑えられますが
    動作コストは上がると思います。
    unsetは毎回必要な分をお願いする、一度宣言してから =””などで初期化し使いまわしするのが10人分用意するのたとえです。

    
    while ( have_rows('bodyset') ) : the_row();
      $text_pic_text_text='';
      $text_pic_pic_pic='';
    
      if ・・・・・・・
    
    

    ってかんじで、クリアすれば平気ですよ。
    もし配列の場合は、$text_pic_pic_pic=array();にしてください。

    umioyo

    (@umioyo)

    皆さまご回答ありがとうございます。
    =”;
    で初期化は試したのですが、それでもクリアできませんでした。

    唯一、photographer hiro. (@mura0403)様の=array();で、画像の幅の情報だけ(!)消えました・・・
    URLなどはそのまま残っており、
    $text_pic_pic_pic[“url”]=””;
    としても消えませんでした。

    しかし、皆さまの回答をみるとやはり一回変数クリアせよということなので、ループごとに変数名を変えていくような形にしてみたいと思います。
    (メモリ云々・・・で怒られるかもしれませんが^^;)

    munyagu

    (@munyagu)

    何か間違った回答をしているかもしれません。
    すいません。

    msio

    (@msio)

    こういうことだとおもうのですが、今一度確認いただけますでしょうか。

    //bodyset というテーブルセットデータがあれば
    if( have_rows('bodyset') ):
    	//データセットの行がある限り : 当該行情報対応
       	while ( have_rows('bodyset') ) : the_row();
        	//もし get_row_layoutの演算結果が text_pic という文字列であれば
        	if( get_row_layout() == 'text_pic' ):
    
    		//NEW! 使う前に初期化 配列で
        	$text_pic_text_text = array();
        	$text_pic_pic_pic = array();
    		//NEW! 使う前に初期化 END
    
    		//NEW! 使う前に初期化
        	$text_pic_text_text = "";
        	$text_pic_pic_pic = "";
    		//NEW! 使う前に初期化 END
    
    		//配列で初期化すると配列として使えるので次の一文は
    		//$text_pic_pic_pic[] = などで追加書式が使えるのですが
    		//今回は受け取りだけなので、値がなくても配列の形式として存在します
    		//=""で文字列にしておけば、受け取り時にARRAYに代わるので
    		//ARRAYに代わっているかどうかで正答確認を兼ねることができます。
    
        	//フィールドの値を取得する
        	$text_pic_text_text=get_sub_field('text_pic_text_text');
        	//フィールドの値を取得する
        	$text_pic_pic_pic=get_sub_field('text_pic_pic_pic');
    
    		//値があればというか読みだした時点で「変数は存在する」ので
    		//「配列型の数字が受け取られている」ことを確認するには
    		//isset($text_pic_pic_pic) たぶんカラの値がはいった変数が存在してしまっている
    		//isarray($text_pic_pic_pic) 受けとったデータ形式がカラだけの場合以外 配列になっている場合 おおよそ正しいデータだろうとき
    
    		//これで初期化しても$text_pic_pic_pic["url"]が存在する場合
    		//受け取っている $text_pic_pic_pic は「ただしく現在のデータ総量についてのみ返しているか」
    		//が怪しくなります
    		
        	//テキストの値がなにかしらあれば その内容を表示する
        	if($text_pic_text_text){echo $text_pic_text_text;}
        	//テキストの値があにかしらあれば その内容を表示する
        	if($text_pic_pic_pic){echo '<img src="'.$text_pic_pic_pic["url"].'">';}
    	//データセットの行がある限り終了宣言
    	endwhile;
    	//データセットあれば終了宣言
    endif;
    umioyo

    (@umioyo)

    msio様 ご丁寧にありがとうございます。
    結論から言うとクリアにならなかったです。
    しかし、このような事象は開発者は想定していたと思うので、何か根本的におかしいのか回りも見直してみたいと思います。

    munyagu様
    大丈夫です。わざわざありがとうございます。

    umioyo

    (@umioyo)

    やっと解決しました。
    やはり初期化し忘れでした。
    大元は初期化していたのですが、一度違う変数に入れていたので、それを見落としていました。
    大変お騒がせいたしました。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「AdvancedCustomFieldsのPRO版Flexible Content Fieldで前の値を引き継いでしまう」には新たに返信することはできません。