2

私は Concrete5 で作業しており、MVC の概念は初めてです。ビューのテキストボックスから順序付けられていないリストを作成するjqueryがあります。Concrete5 に精通している場合、これはリストを追加するブロックのビューです。これは基本的に、製品の機能のリストです。このビューでは、リストをデータベース ベース ファイルに保存する必要があります。通常、これは、情報が保存される変数を使用して非常に簡単に行われます (これは、ビュー内の他のすべてが保存される方法です)。私が抱えている問題は、コントローラーを使用して順序付けられていないリストをビューからコントローラーに渡して保存する方法がわからないことです。ヘルプとサンプル コードをいただければ幸いです。リストを取得するには、コントローラーにphp関数を記述する必要があると確信していますが、コードがどうなるかわかりません。

auto.js

$("#addList").click(function() {
    var text = $("#inputList").val() + '<button>x</button>';
    if(text.length){
        $('<li />', {html: text}).appendTo('ul.featureList')
        };
});
$('ul').on('click','button', function(el){
    $(this).parent().remove()
});

追加/編集.php

<div class="ccm-block-field-group">
<h2><?php echo t('Features') ?></h2>

現在、'features' はデータベース ファイル db.xml のフィールドの名前です。featureList 領域は、リストが生成される場所です。動作させるには少し変更する必要があることはわかっていますが、よくわかりません。

<?php echo $form->textarea('features', $features, array());?>
<input type="test" id="inputList" />
<button type="button" id="addList">Add</button> 
<ul class="featureList"></ul>
</div>

view.php

echo "<h2>{$proName}</h2>";
echo "{$description}";
echo "<h3>{$features}</h3>";
echo "<h2>{$price}</h2>";
echo "<p>{$priceInfo}</p>";

db.xml

<field name="features" type="X2"></field>
4

3 に答える 3

1

具体的な 5 ブロックでは、次の 2 つの異なる状況に陥る可能性があります。

  1. 管理者ユーザーがブロックを編集 (または新しいブロックを追加) しており、このデータをデータベースに保存したいと考えています。
  2. パブリック ユーザーがブロックを表示しているが、ブロック ビュー自体にフォーム (たとえば、連絡先フォーム ブロック) があり、パブリック フォームが送信されたときに何かをしたい (たとえば、誰かが持っている管理者に通知メールを送信する)フォームに記入するか、将来のレビューのために提出物をデータベースに保存します)。

状況 #1 について話している場合は、コントローラーのsave()メソッドにカスタム コードを配置する必要があります。状況 #2 について話している場合は、コントローラーで独自のアクション メソッドを作成する必要があり、実際に<form>view.php ファイルに を含める必要があります。

更新: 質問に追加したサンプル コードに基づく解決策は次のとおりです。データをサーバーに戻す唯一の方法は、フォーム POST を使用することです。<li>要素はフォーム フィールドではないため、要素内のデータはフォームで POST されません。そのため、新しい<li>要素をページに追加するときは、次のように非表示のフォーム フィールドも追加する必要があります。

    var listItemCounter = 0;
$("#addList").click(function() {
        listItemCounter++;
    var text = $("#inputList").val() + '<button data-id="' + listItemCounter + '">x</button>'; //assign a unique id number to this button, so it knows which hidden field to remove when clicked
    if(text.length){
        $('<li />', {html: text}).appendTo('ul.featureList');
        $('<input type="hidden" name="features[]" value="' + text + '" data-id="' + listItemCounter + '" />').insertAfter('ul.featureList');
    };
});
$('ul').on('click','button', function(el){
        $('input[data-id="' + $(this).attr('data-id') + '"]').remove(); //remove the hidden field so it does not get POSTed when user saves
    $(this).parent().remove();
});

ここで、ブロックの controller.php ファイルに、save()これらの非表示フィールドからすべてのデータを取得し、それらを結合して、db.xml ファイルで宣言した「features」フィールドに配置するメソッドを追加する必要があります。

public function save($args) {
    $args['features'] = implode("\n", $args['features']); //combine all feature items into one string, separated by "newline" characters
    parent::save($args);
}

最後に、view.php ファイルで、機能のリスト (各項目が「改行」文字で区切られた 1 つの文字列としてデータベースに保存された) を次のように変換できます。

<?php echo nl2br($features); ?>

または、個別のリスト項目として出力したい場合は、次のようにすることができます。

<ul>
<?php
$features = explode("\n", $features);
foreach ($features as $feature) {
    echo '<li>' . $feature . '</li>';
}
?>
</ul>
于 2013-02-19T21:44:10.203 に答える
0

auto.js ファイルの周りを変更したので、次のようにします。うまくいくようです。

var listItemCounter = 0;
$("#addList").click(function() {
    listItemCounter++;
    var text = $("#inputList").val(); //assign a unique id number to this button, so it knows which hidden field to remove when clicked
    var buttonDataId = text + '<button data-id="' + listItemCounter + '">x</button>';
    if(text.length){
        $('<li />', {html: buttonDataId}).appendTo('ul.featureList');
        $('<input type="hidden" name="features[]" value="' + text + '" data-id="' + listItemCounter + '" />').insertAfter('ul.featureList');
        };
});
$('ul').on('click','button', function(el){
    $('input[data-id="' + $(this).attr('data-id') + '"]').remove();//remove the hidden field so it does not get POSTed when user saves
    $(this).parent().remove()
});

ジョーダン・レフが置いたものと同じビューを残しました。(ありがとう!) 次に、controller.php を次のように変更しました。

public function save($args) { $args['features'] = implode("\n", $args['features']);//combine all feature items into one string, separated by "newline" characters parent::save($args); }

誰かが私のコードを配置するための問題やより良い方法を見つけたら、私に知らせてください! 私の新しい問題は、リストが保存されると、リストを編集すると、過去のエントリが消去され、新しいエントリが保存されることです。誰かが関数を知っていれば、現在のリストを表示するように記述し、編集時に追加する必要があります。いくつかのサンプルコードを教えてください。

于 2013-02-20T01:45:54.713 に答える
0

ビューからコントローラーに物を渡さないでください。コントローラーはビューの前に実行されるため、コントローラーからビューに渡すだけです。

を使用して、jquery からアプリケーションに渡すものにアクセスしてみてください

$this->getRequest()->getParam('yourParametersName');

コントローラー内部。

ルシアン

于 2013-02-19T18:51:06.790 に答える