質問 > 管理機能 > v2.13 画像のアップロードにつきまして |
管理機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
ma-ma |
投稿日時: 2017/5/10 12:42
対応状況: −−−
|
常連 登録日: 2014/9/22 居住地: 投稿: 55 |
v2.13 画像のアップロードにつきまして ▼テンプレート
[EC-CUBE] 2.13.5、新規インストール [レンタルサーバ] zenlogic [PHP] PHP 5.6.21 [データベース] MySQL 5.1.73 [カスタマイズの有無] 無し お世話になります。 現在、管理画面の商品登録の画像アップロードの機能を カテゴリ登録にも作りたいと考えています。 LC_Page_Admin_Products.php を確認してみたのですが、 画像をアップロードされている箇所がわかりませんでした。 画像アップロードの記述は別のファイルに記載があるのでしょうか? ご教示頂ければ幸いです。 |
karin |
投稿日時: 2017/5/10 13:18
対応状況: −−−
|
仙人 登録日: 2008/9/15 居住地: 東京都 投稿: 689 |
Re: v2.13 画像のアップロードにつきまして ma-ma 様
LC_Page_Admin_Products_Product.phpを確認してみてください。
|
468 |
投稿日時: 2017/5/10 14:27
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: v2.13 画像のアップロードにつきまして 以下のカテゴリを画像に置き換えるプラグインの2系版を
ちょうど開発しております。 http://www.ec-cube.net/products/detail.php?product_id=1389 karinさんのおっしゃられるようにLC_Page_Admin_Products_Product.phpの 188行目~217行目付近や175行目に画像アップロードに関する記述があります。 処理の流れとして、商品詳細画面のアップロードボタンで、画像を一時ディレクトリに保存して、 商品確認画面から商品登録完了画面への流れの中で 画像データを一時ディレクトリから本番ディレクトリに移動させています。
|
ma-ma |
投稿日時: 2017/5/11 12:39
対応状況: −−−
|
常連 登録日: 2014/9/22 居住地: 投稿: 55 |
Re: v2.13 画像のアップロードにつきまして karin様
468様 ご教示頂きありがとうざいました。 LC_Page_Admin_Products_Product.phpを参考に下記コードを追加いたしまたが、 正常に動作ができませんでした。 (下記コードで使用しているメソッドはそのままコピーしています。) javascript上で ReferenceError: fnInitSelect is not defined のエラーが出ているのですが、どうすればよろしいのでしょうか? お手数をおかけいたしますが、ご教示頂ければ幸いです。 ------------ 追加コード(function action()内) ↓ // アップロードファイル情報の初期化 $objUpFile = new SC_UploadFile_Ex(IMAGE_TEMP_REALDIR, IMAGE_SAVE_REALDIR); $objDownFile = new SC_UploadFile_Ex(DOWN_TEMP_REALDIR, DOWN_SAVE_REALDIR); $this->lfInitFile($objUpFile); $objUpFile->setHiddenFileList($_POST); $mode = $this->getMode(); switch ($mode) { case 'complete': // 一時ファイルを本番ディレクトリに移動する $this->lfSaveUploadFiles($objUpFile, $objDownFile, $product_id); // 画像のアップロード case 'upload_image': case 'delete_image': // パラメーター初期化 $this->lfInitFormParam_UploadImage($objFormParam); $this->lfInitFormParam($objFormParam, $_POST); $arrForm = $objFormParam->getHashArray(); switch ($mode) { case 'upload_image': // ファイルを一時ディレクトリにアップロード $this->arrErr[$arrForm['image_key']] = $objUpFile->makeTempFile($arrForm['image_key'], IMAGE_RENAME); if ($this->arrErr[$arrForm['image_key']] == '') { // 縮小画像作成 $this->lfSetScaleImage($objUpFile, $arrForm['image_key']); } break; case 'delete_image': // ファイル削除 $this->lfDeleteTempFile($objUpFile, $arrForm['image_key']); break; default: break; } // 入力画面表示設定 $this->arrForm = $this->lfSetViewParam_InputPage($objUpFile, $objDownFile, $arrForm); // ページonload時のJavaScript設定 $anchor_hash = $this->getAnchorHash($arrForm['image_key']); $this->tpl_onload = $this->lfSetOnloadJavaScript_InputPage($anchor_hash); break; } } ------------ |
468 |
投稿日時: 2017/5/11 15:06
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: v2.13 画像のアップロードにつきまして 商品編集画面の初期化用のJavascriptがセットされていると思いますので、以下ようにimage_keyだけ渡すようにすれば良いかと思います。
$this->tpl_onload = $this->lfSetOnloadJavaScript_InputPage($anchor_hash); ↓ $this->tpl_onload = $anchor_hash; 以下のメソッドもコピーされていると思いますが、こちらは削除してもいいと思います。 (多分、利用する事は無いと思いますので)
|
ma-ma |
投稿日時: 2017/5/12 12:32
対応状況: −−−
|
常連 登録日: 2014/9/22 居住地: 投稿: 55 |
Re: v2.13 画像のアップロードにつきまして 468様
ご返信ありがとうございます。 ご教示いただた通り行ったところ、 Javascriptのエラーはなくなったのですが、 画像のアップロードが正常にできませんでした。 LC_Page_Admin_Products_Category.phpのfunction action()部分と追加メソッド部分と category.tplの追記した部分を下記に載せさせて頂きますので、 大変恐れ入りますがご教示いただけませんでしょうか? よろしくお願いいたします。 ------------- 【LC_Page_Admin_Products_Category.php】 public function action() { $objFormParam = new SC_FormParam_Ex(); $objCategory = new SC_Helper_Category_Ex(); $objUpFile = new SC_UploadFile_Ex(IMAGE_TEMP_REALDIR, IMAGE_SAVE_REALDIR); $objDownFile = new SC_UploadFile_Ex(DOWN_TEMP_REALDIR, DOWN_SAVE_REALDIR); // 入力パラメーター初期化 $this->initParam($objFormParam); $objFormParam->setParam($_POST); $objFormParam->convParam(); // アップロードファイル情報の初期化 $this->lfInitFile($objUpFile); $objUpFile->setHiddenFileList($_POST); $mode = $this->getMode(); switch ($this->getMode()) { // カテゴリ登録/編集実行 case 'edit': $this->doEdit($objFormParam); break; // 入力ボックスへ編集対象のカテゴリ名をセット case 'pre_edit': $this->doPreEdit($objFormParam); break; // カテゴリ削除 case 'delete': $this->doDelete($objFormParam); break; // 表示順を上へ case 'up': $this->doUp($objFormParam); break; // 表示順を下へ case 'down': $this->doDown($objFormParam); break; // FIXME r19909 によってテンプレートが削除されている case 'moveByDnD': // DnDしたカテゴリと移動先のセットを分解する $keys = explode('-', $_POST['keySet']); if ($keys[0] && $keys[1]) { $objQuery =& SC_Query_Ex::getSingletonInstance(); $objQuery->begin(); // 移動したデータのrank、level、parent_category_idを取得 $rank = $objQuery->get('rank', 'dtb_category', 'category_id = ?', array($keys[0])); $level = $objQuery->get('level', 'dtb_category', 'category_id = ?', array($keys[0])); $parent = $objQuery->get('parent_category_id', 'dtb_category', 'category_id = ?', array($keys[0])); // 同一level内のrank配列を作成 $objQuery->setOption('ORDER BY rank DESC'); if ($level == 1) { // 第1階層の時 $arrRet = $objQuery->select('rank', 'dtb_category', 'level = ?', array($level)); } else { // 第2階層以下の時 $arrRet = $objQuery->select('rank', 'dtb_category', 'level = ? AND parent_category_id = ?', array($level, $parent)); } for ($i = 0; $i < sizeof($arrRet); $i++) { $rankAry[$i + 1] = $arrRet[$i]['rank']; } // 移動したデータのグループ内データ数 $my_count = $this->lfCountChilds($objQuery, 'dtb_category', 'parent_category_id', 'category_id', $keys[0]); if ($rankAry[$keys[1]] > $rank) { // データが今の位置より上がった時 $up_count = $rankAry[$keys[1]] - $rank; $decAry = $objQuery->select('category_id', 'dtb_category', 'level = ? AND rank > ? AND rank <= ?', array($level, $rank, $rankAry[$keys[1]])); foreach ($decAry as $value) { // 上のグループから減算 $this->lfDownRankChilds($objQuery, 'dtb_category', 'parent_category_id', 'category_id', $value['category_id'], $my_count); } // 自分のグループに加算 $this->lfUpRankChilds($objQuery, 'dtb_category', 'parent_category_id', 'category_id', $keys[0], $up_count); } elseif ($rankAry[$keys[1]] < $rank) { // データが今の位置より下がった時 $down_count = 0; $incAry = $objQuery->select('category_id', 'dtb_category', 'level = ? AND rank < ? AND rank >= ?', array($level, $rank, $rankAry[$keys[1]])); foreach ($incAry as $value) { // 下のグループに加算 $this->lfUpRankChilds($objQuery, 'dtb_category', 'parent_category_id', 'category_id', $value['category_id'], $my_count); // 合計減算値 $down_count += $this->lfCountChilds($objQuery, 'dtb_category', 'parent_category_id', 'category_id', $value['category_id']); } // 自分のグループから減算 $this->lfDownRankChilds($objQuery, 'dtb_category', 'parent_category_id', 'category_id', $keys[0], $down_count); } $objQuery->commit(); } break; // カテゴリツリークリック時 case 'tree': break; // CSVダウンロード case 'csv': // CSVを送信する $objCSV = new SC_Helper_CSV_Ex(); $objCSV->sfDownloadCsv('5', '', array(), '', true); SC_Response_Ex::actionExit(); break; default: break; } $parent_category_id = $objFormParam->getValue('parent_category_id'); // 空の場合は親カテゴリを0にする if (empty($parent_category_id)) { $parent_category_id = 0; } // 親カテゴリIDの保持 $this->arrForm['parent_category_id'] = $parent_category_id; // カテゴリ一覧を取得 $this->arrList = $this->findCategoiesByParentCategoryId($parent_category_id); // カテゴリツリーを取得 $this->arrTree = $objCategory->getTree(); $this->arrParentID = $objCategory->getTreeTrail($parent_category_id); // ぱんくずの生成 $arrBread = $objCategory->getTreeTrail($this->arrForm['parent_category_id'], FALSE); $this->tpl_bread_crumbs = SC_Utils_Ex::jsonEncode(array_reverse($arrBread)); switch ($mode) { case 'complete': // 一時ファイルを本番ディレクトリに移動する $this->lfSaveUploadFiles($objUpFile, $objDownFile, $product_id); // 画像のアップロード case 'upload_image': case 'delete_image': // パラメーター初期化 $this->lfInitFormParam_UploadImage($objFormParam); $this->lfInitFormParam($objFormParam, $_POST); $arrForm = $objFormParam->getHashArray(); switch ($mode) { case 'upload_image': // ファイルを一時ディレクトリにアップロード $this->arrErr[$arrForm['image_key']] = $objUpFile->makeTempFile($arrForm['image_key'], IMAGE_RENAME); if ($this->arrErr[$arrForm['image_key']] == '') { // 縮小画像作成 $this->lfSetScaleImage($objUpFile, $arrForm['image_key']); } break; case 'delete_image': // ファイル削除 $this->lfDeleteTempFile($objUpFile, $arrForm['image_key']); break; default: break; } // 入力画面表示設定 $this->arrForm = $this->lfSetViewParam_InputPage($objUpFile, $objDownFile, $arrForm); // ページonload時のJavaScript設定 $anchor_hash = $this->getAnchorHash($arrForm['image_key']); $this->tpl_onload = $anchor_hash; break; } } /*追記メソッド*/ /** * アップロードファイルパラメーター情報の初期化 * - 画像ファイル用 * * @param SC_UploadFile_Ex $objUpFile SC_UploadFileインスタンス * @return void */ public function lfInitFile(&$objUpFile) { //$this->objUpFile->addFile('メイン画像', 'main_image', array('gif','jpeg','jpg','png'), IMAGE_SIZE, false, CLASS_IMAGE_WIDTH, CLASS_IMAGE_HEIGHT); $objUpFile->addFile('メイン画像', 'main_image', array('jpg', 'gif', 'png'), IMAGE_SIZE, false, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT); } /** * パラメーター情報の初期化 * - 画像ファイルアップロードモード * * @param SC_FormParam_Ex $objFormParam SC_FormParamインスタンス * @return void */ public function lfInitFormParam_UploadImage(&$objFormParam) { $objFormParam->addParam('image_key', 'image_key', '', '', array()); } public function lfInitFormParam(&$objFormParam, $arrPost) { } /** * 縮小した画像をセットする * * @param SC_UploadFile_Ex $objUpFile SC_UploadFileインスタンス * @param string $image_key 画像ファイルキー * @return void */ public function lfSetScaleImage(&$objUpFile, $image_key) { $subno = str_replace('sub_large_image', '', $image_key); switch ($image_key) { case 'main_large_image': // 詳細メイン画像 $this->lfMakeScaleImage($objUpFile, $image_key, 'main_image'); case 'main_image': // 一覧メイン画像 $this->lfMakeScaleImage($objUpFile, $image_key, 'main_image'); break; case 'sub_large_image' . $subno: // サブメイン画像 $this->lfMakeScaleImage($objUpFile, $_POST['image_key'], 'sub_image' . $subno); break; default: break; } } /** * 画像ファイルのコピー * * @param object $objUpFile SC_UploadFileインスタンス * @return void */ public function lfCopyProductImageFiles(&$objUpFile) { $arrKey = $objUpFile->keyname; $arrSaveFile = $objUpFile->save_file; foreach ($arrSaveFile as $key => $val) { $this->lfMakeScaleImage($objUpFile, $arrKey[$key], $arrKey[$key], true); } } /** * アンカーハッシュ文字列を取得する * アンカーキーをサニタイジングする * * @param string $anchor_key フォーム入力パラメーターで受け取ったアンカーキー * @return <type> */ public function getAnchorHash($anchor_key) { if ($anchor_key != '') { return "location.hash='#" . htmlspecialchars($anchor_key) . "'"; } else { return ''; } } /** * 表示用フォームパラメーター取得 * - 入力画面 * * @param SC_UploadFile_Ex $objUpFile SC_UploadFileインスタンス * @param SC_UploadFile_Ex $objDownFile SC_UploadFileインスタンス * @param array $arrForm フォーム入力パラメーター配列 * @return array 表示用フォームパラメーター配列 */ public function lfSetViewParam_InputPage(&$objUpFile, &$objDownFile, &$arrForm) { // カテゴリマスターデータ取得 $objDb = new SC_Helper_DB_Ex(); list($this->arrCatVal, $this->arrCatOut) = $objDb->sfGetLevelCatList(false); if (isset($arrForm['category_id']) && !is_array($arrForm['category_id'])) { $arrForm['category_id'] = SC_Utils_Ex::jsonDecode($arrForm['category_id']); } $this->tpl_json_category_id = !empty($arrForm['category_id']) ? SC_Utils_Ex::jsonEncode($arrForm['category_id']) : SC_Utils_Ex::jsonEncode(array()); if ($arrForm['status'] == '') { $arrForm['status'] = DEFAULT_PRODUCT_DISP; } if ($arrForm['product_type_id'] == '') { $arrForm['product_type_id'] = DEFAULT_PRODUCT_DOWN; } if (OPTION_PRODUCT_TAX_RULE) { // 編集の場合は設定された税率、新規の場合はデフォルトの税率を取得 if ($arrForm['product_id'] == '') { $arrRet = SC_Helper_TaxRule_Ex::getTaxRule(); } else { $arrRet = SC_Helper_TaxRule_Ex::getTaxRule($arrForm['product_id'], $arrForm['product_class_id']); } $arrForm['tax_rate'] = $arrRet['tax_rate']; } // アップロードファイル情報取得(Hidden用) $arrHidden = $objUpFile->getHiddenFileList(); $arrForm['arrHidden'] = array_merge((array) $arrHidden, (array) $objDownFile->getHiddenFileList()); // 画像ファイル表示用データ取得 $arrForm['arrFile'] = $objUpFile->getFormFileList(IMAGE_TEMP_URLPATH, IMAGE_SAVE_URLPATH); return $arrForm; } 【category.tpl】 <div style="float:left; width: 100px;">メイン画像:</div> <span class="attention"><!--{$arrErr[$key]}--></span> <!--{if $arrForm.arrFile[$key].filepath != ""}--> <img src="<!--{$arrForm.arrFile[$key].filepath}-->" alt="<!--{$arrForm.name|h}-->" /> <a href="" onclick="eccube.setModeAndSubmit('delete_image', 'image_key', '<!--{$key}-->'); return false;">[画像の取り消し]</a><br /> <!--{/if}--> <input type="file" name="main_image" size="40" style="<!--{$arrErr[$key]|sfGetErrorColor}-->" /> <a class="btn-normal" href="java script:;" name="btn" onclick="eccube.setModeAndSubmit('upload_image', 'image_key', '<!--{$key}-->'); return false;">アップロード</a> ------------- |
468 |
投稿日時: 2017/5/12 15:05
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: v2.13 画像のアップロードにつきまして 返信ありがとうございます。
まず、先のコメントで記載させていただいた通り、 カテゴリ画像投稿プラグイン(2系)を有償プラグインとしての配布を予定している為、 この場ですべてをお応えする事が出来ないという 私の立場については、ご理解をいただきたいと思います。 >画像のアップロードが正常にできませんでした。 とありますが、 アップロードボタンを押した後、画面遷移は発生しましたか? (画面が再読込される動き) 画像ファイル自体がサーバに送信されていないのか? 受け取ったaction()内で一時ディレクトリに保存されていないのか? 一時ディレクトリの保存後、カテゴリ画面を再度表示した時に画像が画面に表示されないのか? どの段階で上手くいっていないのかは、1ステップずつデバッグしていくのが確実かと思います。 私はいつも、var_dump();exit;を多用して、 どこを処理が流れて、想定した値が入ってきているか確認していますので、 まずは、 1.以下のcaseの中に処理が入ってきているかどうか? // 画像のアップロード case 'upload_image': case 'delete_image': 2.$objUpFileにアップロードした画像の情報がきちんとセットされいるか? 3.一時ディレクトリ(/html/upload/temp_image/)にアップロードした画像が保存されているか? 4.function lfSetViewParam_InputPage()の中で画像がセットされているかどうか? の順番で確認されたほうが良いかと思います。 あと、ソースを見ると、action()に画像関連の処理を追記されたのだと思いますが、 カテゴリの処理の最後に、画像関連の追記では無く、 デフォルトの登録や削除などの処理の分岐をしている switch ($this->getMode()) { // カテゴリ登録/編集実行 ・・・・・・ } の中にcaseの分岐を追記する形で移植する必要があります。
|
ma-ma |
投稿日時: 2017/5/15 10:31
対応状況: −−−
|
常連 登録日: 2014/9/22 居住地: 投稿: 55 |
Re: v2.13 画像のアップロードにつきまして 468様
ご返信ありがとうございます。 468様の立場も考慮せず質問ばかりして、 申し訳ございません。 468様のお答え頂ける範囲内で問題ありませんので、 ご教示頂ければ幸いです。 ご教示頂いたデバックを行って、 改めてご連絡させて頂きます。 今のところですが、 caseのcase 'upload_image':には処理が入っているのですが、 画像データが取得できていないかと思われます。 category.tpl側で下記の<input>を記載しているのですが、 こちらがまちがっているのでしょうか? -------- <input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" /> <input type="hidden" name="mode" value="edit" /> <input type="hidden" name="parent_category_id" value="<!--{$arrForm.parent_category_id|h}-->" /> <input type="hidden" name="category_id" value="<!--{$arrForm.category_id|h}-->" /> <input type="hidden" name="keySet" value="" /> <input type="hidden" name="image_key" value="" /> <input type="hidden" name="copy_product_id" value="<!--{$arrForm.copy_product_id|h}-->" /> <input type="hidden" name="anchor_key" value="" /> <input type="hidden" name="select_recommend_no" value="" /> <input type="hidden" name="has_product_class" value="<!--{$arrForm.has_product_class|h}-->" /> <input type="hidden" name="<!--{$key}-->" value="<!--{$item|h}-->" /> ------ お手数をおかけいたしますが、 よろしくお願いいたします。 |
468 |
投稿日時: 2017/5/15 11:23
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: v2.13 画像のアップロードにつきまして copy_product_id, anchor_key, select_recommend_no, has_product_classのinputタグは不要ではないかと思います。
あと、最後のhiddenはループさせる必要があるのではないでしょうか? <!--{foreach key=key item=item from=$arrForm.arrHidden}--> <input type="hidden" name="<!--{$key}-->" value="<!--{$item|h}-->" /> <!--{/foreach}--> あと、デバッグされて、画像データが取得できていないというのは、 $arrForm['image_key'] が空になっているという事でしょうか? 実際にサーバへのリクエストに、ファイルが送信されているかどうかは、 var_dump($_FILES)などで中身を確認すると良いかもしれません。 $_FILESの中身が無ければ、送信するhtml上のformに問題があると思いますので、 問題の切り分けが出来ると思います。
|
ma-ma |
投稿日時: 2017/5/15 13:34
対応状況: −−−
|
常連 登録日: 2014/9/22 居住地: 投稿: 55 |
Re: v2.13 画像のアップロードにつきまして 468様
ご返信誠にありがとうございます! >copy_product_id, anchor_key, select_recommend_no, >has_product_classのinputタグは不要ではないかと思います。 >あと、最後のhiddenはループさせる必要があるのではないでしょうか? ><!--{foreach key=key item=item from=$arrForm.arrHidden}--> ><input type="hidden" name="<!--{$key}-->" value="><!--{$item|h}-->" /> ><!--{/foreach}--> こちら削除、追記をさせていただきました。 画像データの件ですが、 switch ($mode) { case 'upload_image': 内に var_dump($arrForm['image_key']); と記述すると、string(0) "" と表示がされます。 また、 switch ($mode) { case 'upload_image': 内に var_dump($_FILES); と記述すると、 array(1) { ["main_image"]=> array(5) { ["name"]=> string(30) "test.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(19) "/data/tmp/phppmq2mH" ["error"]=> int(0) ["size"]=> int(620144) } } と表示がされます。 こちらはHTML部分は問題ないということでしょうか? 申し訳ございませんが、よろしくお願いいたします。 |
(1) 2 3 4 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |