登録日
2017年5月9日

メンバー検索

  

KMiura

名前(ニックネーム)
KMiura
自分のconcrete5サイト
ホームページ
自己紹介
concrete5.org のユーザー名
concrete5 Slack Team ID
Twitterアカウント
フォーラム総投稿数
23

コミュニティバッジ

投稿

11から20までを表示 (計23)

Re: 検索ブロックの中で表示するトピック属性の見た目をカスタマイズしたい

私も管理画面と同じフォルダツリーのデザインがフロントにも表示されるのにはげんなりしました。
JavaScriptで生成されているところは一切無視して、search.phpを書き換えてしまうのが手っ取り早いかと思います。

参考までに、私が行ったカスタマイズについて記載させていただきます。バージョンは8.2です。

私の場合、階層構造はデザイン上必要なかったため、特定のトピックツリー下のトピックをすべてチェックボックスとして並べています。検索ブロックに独自テンプレートを追加してCSSでチェックボックスをボタンレイアウトにして表示しました。(添付キャプチャ)

手っ取り早くソースを記載しますが、search.phpをごっそり下記に書き換えています。

/application/attributes/topics/search.php


<?php defined('C5_EXECUTE') or die("Access Denied.");
if (is_object($tree)) {
if (!isset($selectedNode)) {
$selectedNode = NULL;
}
?>
<section class="contents tag-view">
<?php
$node = $tree->getRootTreeNodeObject();
if (is_object($node)) {
$node->populateDirectChildrenOnly();
?>
<script type="text/javascript">
$(function() {
$('#check_all').on('click', function() {
$('.check-button').prop('checked', this.checked);
});

$('.check-button').on('click', function() {
if ($('.check-button-child :checked').length == $('.check-button-child :input').length){
$('#check_all').prop('checked', 'checked');
}else{
$('#check_all').prop('checked', false);
}
});
});
</script>
<ul class="tag">
<li>
<input type="checkbox" class="check-button" id="check_all" />
<label class="label" for="check_all"><?php echo t('All'); ?></label>
</li>

<?php
foreach ($node->getChildNodes() as $child) {
?>
<li class="check-button-child">
<input type="checkbox" class="check-button" id="akID[<?php echo $attributeKey->getAttributeKeyID(); ?>][treeNodeID]<?php echo $child->getTreeNodeID(); ?>" name="akID[<?php echo $attributeKey->getAttributeKeyID(); ?>][treeNodeID][]" value="<?php echo $child->getTreeNodeID(); ?>"<?php echo (is_array($selectedNode)) ? ((in_array($child->getTreeNodeID(), $selectedNode)) ? 'checked="checked"' : '') : '' ; ?>/>
<label class="label" for="akID[<?php echo $attributeKey->getAttributeKeyID(); ?>][treeNodeID]<?php echo $child->getTreeNodeID(); ?>"><?php echo $child->getTreeNodeDisplayName(); ?></label>
</li>
<?php
}
?>
</ul>
<?php
}
?>
</section>
<?php
}
?>


JavaScriptの記述は「すべて」のチェックボックスで他の項目のチェックを付けたり外したりする部分なんで無視してください。
肝心なのはトピックツリーからトピックのIDと表示名を取り出しているところでしょうか。

下記のあたりでトピックツリーの子要素を取り出しています。(たしか)

$node = $tree->getRootTreeNodeObject();
if (is_object($node)) {
$node->populateDirectChildrenOnly();
}


そしてforeachでチェックボックスとして書き出しています。
検索ボタンを押すと選択されたトピックのIDが$selectedNodeに配列で渡されるので、checkedを付けるかどうかの判定に使っています。


<input type="checkbox" class="check-button" id="akID[<?php echo $attributeKey->getAttributeKeyID(); ?>][treeNodeID]<?php echo $child->getTreeNodeID(); ?>" name="akID[<?php echo $attributeKey->getAttributeKeyID(); ?>][treeNodeID][]" value="<?php echo $child->getTreeNodeID(); ?>"/>

添付: sample.png
Posted on 10月 06, 2017 at 4:11 午後

Re: 自動返信メールの実現

ぱっと思いつく事としましては、管理画面「スタックとブロック>ブロックタイプ>レガシーフォーム」で更新を行ってみたらどうなりますでしょうか。
後は管理画面でキャッシュの削除で解決しないかどうか試していただけないでしょうか。

Posted on 9月 19, 2017 at 4:26 午後

Re: 自動返信メールの実現

礼羽さん

レガシーフォームの編集ダイアログ上で、オプションタブを開くと「送信されたフォームをメールアドレスに送る」のチェックがあると思います。ここをチェックは入ってますでしょうか?
application/blocks/form/controller.phpの497行目あたりに下記のような条件判定があるので、「送信されたフォームをメールアドレスに送る」のチェックを入れていただければメールが飛ぶと思います。

if (intval($this->notifyMeOnSubmission) > 0 && !$foundSpam) {


もしくは、管理者等へ送る必要がない場合は、497行目付近を下記のような感じに書き換えていただければうまく行くと思いますが、どうでしょうか。

if (intval($this->notifyMeOnSubmission) > 0 && !$foundSpam) {
if (Config::get('concrete.email.form_block.address') && strstr(Config::get('concrete.email.form_block.address'), '@')) {
$formFormEmailAddress = Config::get('concrete.email.form_block.address');
} else {
$adminUserInfo = UserInfo::getByID(USER_SUPER_ID);
$formFormEmailAddress = $adminUserInfo->getUserEmail();
}
$mh = Core::make('helper/mail');
$mh->to($this->recipientEmail);
$mh->from($formFormEmailAddress);
$mh->replyto($replyToEmailAddress);
$mh->addParameter('formName', $this->surveyName);
$mh->addParameter('questionSetId', $this->questionSetId);
$mh->addParameter('questionAnswerPairs', $questionAnswerPairs);
$mh->load('block_form_submission');
$mh->setSubject(t('%s Form Submission', $this->surveyName));
//echo $mh->body.'<br>';
@$mh->sendMail();
}
// ---------------------------------------------------------------
// 自動返信処理 Auto Reply
// ---------------------------------------------------------------
if ($sendConfirmationEmail && !$foundSpam) {
$adminUserInfo = UserInfo::getByID(USER_SUPER_ID);
$formFormEmailAddress = $adminUserInfo->getUserEmail();

$mh = null;
$mh = Core::make('helper/mail');
$mh->from($formFormEmailAddress); // 送信者メールアドレス(サイト管理者)
$mh->to($replyToEmailAddress); // 自動返信先(フォーム入力)
$mh->replyto($formFormEmailAddress); // 返信先メールアドレス(サイト管理者)
$mh->addParameter('formName', $this->surveyName);
$mh->addParameter('questionSetId', $this->questionSetId);
$mh->addParameter('questionAnswerPairs', $questionAnswerPairs);
$mh->load('block_form_auto_reply'); // メールのテンプレート
$mh->setSubject(t('%s Form Submission', $this->surveyName)); // メールの件名
@$mh->sendMail();
}

Posted on 9月 19, 2017 at 11:34 午前

Re: 自動返信メールの実現

すみません。勘違いしておりました。。
ご紹介させていただいた実装方法は「レガシーフォーム」ブロックを利用した場合でした。
「レガシーフォーム」と「フォーム」がごっちゃになっておりました。失礼しました。

で、礼羽さんが利用されているブロックは「フォーム」ブロックかと思います。
「フォーム」ブロックはExpressを利用しているため、ソース上で言うと「blocks/form/controller.php」ではなく「blocks/express_form/controller.php」で処理されています。そのため、ご紹介した方法で自動返信が出来なかったのだと思います。

改めてExpressを利用した場合の自動返信についてですが、
私も簡単に調べて見たのですが、意外にも実装方法を紹介しているサイトを見つけることができず、カスタマイズするにもサービスプロバイダーをオーバーライドする必要がありそうで、ちょっと難解です…
もし通常の「フォーム」ブロックで自動返信が行える方法が分かったらまた共有させていただこうと思いますが、取り急ぎであれば「レガシーフォーム」への切り替えも検討いただいた方が良いかもしれません。

Posted on 9月 17, 2017 at 5:29 午後

Re: 自動返信メールの実現

下記の記事はv5.7での内容ですが、こちらで動きませんでしょうか?
私はv8.1とv8.2を利用していますが、下記の記事を参考に自動返信メールを実現しております。

■標準のメールフォームに確認メール送信機能とCSVを Shift JIS に変換する機能を追加する
https://concrete5-japan.org/help/5-7/recipes/form-confirmation-csv/


■【concrete5】concrete5 ver5.7のフォームに自動返信機能をつける方法

http://onocom.net/blog/%E3%80%90concrete5%E3%80%91concrete5-ver5-7%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AB%E8%87%AA%E5%8B%95%E8%BF%94%E4%BF%A1%E6%A9%9F%E...

Posted on 9月 15, 2017 at 4:00 午後

Re: 編集モードで作成した空エリアに関して

エリアの削除についてはこちらのサイトがとても分かりやすいです。
カラムの追加についても削除の操作の中でメニューが出てくるので分かると思います。

http://wordpress.go-designing.com/archives/1043

Posted on 8月 10, 2017 at 4:41 午後

ページタイプのコンポーザーフォーム要素を手動で出力したい

いつもお世話になっております。

ページタイプでセットしたコンポーザーフォーム要素をページの編集モードから表示させたいと思っており、その方法についてご質問させていただきます。

◆環境情報
# concrete5 Version
Core Version - 8.1.0
# Server Software
Apache/2.4.6 (CentOS 7) PHP/5.6.30

◆質問
前準備が長くて恐縮ですが、手順を追って説明させていただきます。

①「ブログ記事」という名のページタイプを作成
②ブログ記事ページタイプの「フォームを編集」機能で「コントロールセット」を追加し、「記事」ブロックを設定する
③ブログ記事ページタイプの「出力」機能で「コンポーザーコントロール」ブロックをページ内に配置し、②で作成した記事ブロックが出力できるようにする
④「新しいページの追加」で①で作成したブログ記事ページタイプを選択し、コンポーザーから「8月10日のブログ」ページを作成する

上記①~④の手順で作成した「8月10日のブログ」ページにはコンポーザーフォーム要素の「記事」のみが表示されています。

さて、ここでブログ記事ページタイプの出力でコンポーザーフォーム要素の「記事」ブロックを削除したとします。
グローバルブロックのため④で作成した8月10日のブログページでも記事が消えてしまいます。

そこで、もう一度ブログ記事ページタイプの出力で③と同じようにコンポーザーコントロールブロックで「記事」を配置してみます。
仕様上、子ページに対して自動でコンポーザーコントロールは表示されないため、④で作成した8月10日のブログページは記事のないままです。


ここまでは理解しました。


ここからが本題なのですが、
④で作成した8月10日のブログページを編集モードにし、コンポーザーを開くと「記事」のデータはしっかりと残っています。
この記事データをページに表示させたいと思っているのですが、編集モードでは「コンポーザーコントロール」ブロックが表示されないため、手動で配置ができません。

ページタイプのコンポーザーフォーム要素を表示させる方法はございませんでしょうか。
(もしかしてカスタムラベルを使ってプログラムから表示させないとできないのでしょうか・・・)

Posted on 8月 10, 2017 at 11:55 午前

Re: プログラムから特定のユーザに対してトピック属性を追加したい

お早いご教示ありがとうございます。
理解が乏しくお恥ずかしい限りです。
おかげ様で下記のような感じでトピック属性の更新ができました。ありがとうございました。

use Concrete\Core\Tree\Node\Type\Topic as TopicNode;

public function addTopic()
{
$u = new User();
$ui = UserInfo::getByID($u->getUserID());

// リセット
$ui->clearAttribute('属性ハンドル');

// セット
$tn = new TopicNode();
$ui->setAttribute('属性ハンドル', $tn->getNodeByName('トピック名'));
}

Posted on 7月 05, 2017 at 9:56 午前

プログラムから特定のユーザに対してトピック属性を追加したい

お世話になっております。

◆環境情報
# concrete5 Version
Core Version - 8.1.0
# Server Software
Apache/2.4.6 (CentOS 7) PHP/5.6.30

◆目的
プログラムから特定のユーザに対してユーザ属性のトピックを追加したい。

◆質問
上記の目的の通りなのですが、プログラム上から特定のユーザに対してトピック属性の追加を行いたいと考えております。
具体的には下記のメソッドを利用しているのですが、$value値に渡す配列の形式がわからないでおります。

ドキュメントでは文字列でもできるようなのですが、実際に文字列でトピックを渡すとエラーとなりました。
配列にして渡すとエラーは解消されるのですが、内容が間違っているようで属性の追加はされませんでした。
どのような配列で渡してやればよいのかご教示いただけると幸いです。


以下、concrete5 5.7 API のドキュメントより抜粋

http://documentation.concrete5.org/api/source-class-Concrete.Core.User.UserInfo.html#699-712
$ui->setAttribute(mixed $ak, $value)

/**
* Sets the attribute of a user info object to the specified value, and saves it in the database.
*
* @param UserAttributeKey|string $ak
* @param mixed $value
*/
public function setAttribute($ak, $value)
{
if (!is_object($ak)) {
$ak = UserAttributeKey::getByHandle($ak);
}
$ak->setAttribute($this, $value);
$this->reindex();
}


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

Posted on 7月 04, 2017 at 7:49 午後

自身が所属するグループIDから親・子のグループIDを取得したい

お世話になっております。

◆環境情報
# concrete5 Version
Core Version - 8.1.0
# Server Software
Apache/2.4.6 (CentOS 7) PHP/5.6.30

◆目的
自身が所属しているグループのIDから親・子となるグループのグループIDを取得したい。

◆質問
例えば、下記のようなグループ構成を作成した場合に、
編集者AグループのグループIDから閲覧者AAグループと閲覧者BBグループのグループIDを取得したり、
閲覧者AAグループのグループIDから編集者AグループのグループIDを取得したいと考えております。

すべてのグループ
└ゲスト
└登録ユーザー
└管理者
 └編集者A
  └閲覧者AA
  └閲覧者AB
 └編集者B


管理画面>メンバー>ユーザーグループの一覧でグループがツリー表示されており、
DBではツリー構造を保持しているようなので、APIが提供されていると予測しているのですが
管理画面のソースを見ていてもどのメソッドを利用しているのかが分からなかったためこちらでご質問させていただきました。

Concrete\Core\Tree\Type\Group


このあたりのAPIを利用して最上位のグループID(ゲストや管理者)については取得できたのですが、
下の階層のグループIDの取得方法が分からないでおります。

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

Posted on 6月 06, 2017 at 3:54 午後