現在のブログのウィジェット編集リンクを自動表示したい

テーマ ratio_3_2 の作者のうぇびんです。いつもありがとうございます。

ratio_3_2 では、ウィジェット編集画面へのURLを生成するヘルパークラスを作っているのですが

$this->Ratio32->widget_edit_link(2);

バージョン4以降はブログが複数あり、IDが「2」になるとは限らないことに気付きました。

例えばbcBaserのwidgetAreaクラスは、IDが空だと現在のブログのウィジェットエリアを自動的に表示していますが、

$this->BcBaser->widgetArea();

これと同じように、現在のブログのウィジェットIDを取得するにはどのようにすればよいでしょうか。

いつもありがとうございます。

いまテーマの中に独自のヘルパーを作っておられると思うのですが($this->Ratio32->○○)、その中に新しいヘルパーを以下の内容で用意するとどうでしょうか?
(※すみません、自分で試してないです)

public function getCurrentWidgetArea(){
    if (isset($this->_View->viewVars['widgetArea'])) {
	    return $this->_View->viewVars['widgetArea'];
    } else {
        return false;
    }
}

$this->Ratio32->getCurrentWidgetArea() ;
みたいな感じで使えないですかね?

1 Likes

@Goichi ありがとうございます!

getCurrentWidgetArea() を試したところ、変数で現在のウィジェットエリアのIDが返ってきました。

なのでprivate関数にして、widget_edit_link() を以下のようにID指定がなければこの関数を使用するようにしたところ、希望通りの動作になりました!

public function widget_edit_link( $id = null ) {
	if ( $id ) {
		$area_id = $id;
	} else {
		$area_id = $this->get_current_widget_area();
	}
	$edit_link = '/admin/widget_areas/edit/' . $area_id;

	if( $this->isAdminUser() ) {
		echo $this->getLink('<i class="fa fa-pencil-square-o"></i> ウィジェット編集', $edit_link, array('class' => 'widget-edit-link', 'target' => '_blank'));
	} else {
		return false;
	}
}
1 Likes

良かったです!!! :star_struck:

public function widget_edit_link($area_id = null) {
    if(!$this->isAdminUser()) {
        return;
    }
    if(!$area_id && empty($this->_View->viewVars['widgetArea'])) {
        return;
    }
    echo $this->getLink(
        '<i class="fa fa-pencil-square-o"></i> ウィジェット編集',
        sprintf(
            '/admin/widget_areas/edit/%s',
            $area_id ?: $this->_View->viewVars['widgetArea']
        ),
        [
            'class'  => 'widget-edit-link',
            'target' => '_blank'
        ]
    );
}

一部気になるところがあったので少し手を加えてみました。

2 Likes

@yamamoto ありがとうございますー!

if(!$this->isAdminUser())

管理者ではないユーザーが絶対に実行できないようにする必要がありますね :sweat:

$this->getLink( ... )

丁寧にありがとうございます!Cakeでリンクを生成できることを忘れていました…

修正バージョンではこちらのコードを使わせていただきます :grinning_face_with_smiling_eyes:

こちらで例示していただいたコードを反映しました。ありがとうございました。

1 Likes