Расширение Photoshop 2015 не может получить доступ ко всем элементам массива - PullRequest
0 голосов
/ 18 октября 2019

Я начинающий программист и новичок в расширениях Adobe, но разработал расширение, которое не работает корректно в Photoshop 2015. Оно отлично работает в PS 2017, 2018 и 2019.

Я читаю данные массива изфайл JSON с JSX и использование прослушивателя событий в файле main.js для возврата данных. Расширение считывает настройки из возвращенного массива. Он отлично работает, за исключением PS 2015, где он может возвращать только идентификатор пользователя, но не более.

Код JSX, считывающий данные из локального файла:

function ReadUserStoredDataFromFile(vfilepath){      
    var rd = ReadFileData(vfilepath);     
    SendDataToListenerJS("getuserstoredinfo",rd);    
}

function ReadFileData(vfullpath){    
    fle = File(vfullpath); 
    var filedata = 0;

    if(fle.exists){    
        fle.open('r');
        filedata = fle.read();
        fle.close();
    }

    return filedata;
}

function SendDataToListenerJS(JSlistenerName,DatatoJS){
    try {
        var xLib = new ExternalObject("lib:\PlugPlugExternalObject");
    } catch (e) {
        alert(e);
    }

    if (xLib) {
        var eventObj = new CSXSEvent(); 
        eventObj.type = JSlistenerName;
        eventObj.data = DatatoJS;
        eventObj.dispatch();
    }
}

INDEX.HTML

var datareceived_arry = new Array();

MAIN.JS Код

var usermydocuments = csInterface.getSystemPath(SystemPath.MY_DOCUMENTS);

setTimeout(AutoStatus, 1000);  

function AutoStatus(){
    var usdocfp = '"' + usermydocuments + '/rt/autostatus.json' + '"';
    csInterface.evalScript('ReadUserStoredDataFromFile('+ usdocfp +')');
}

csInterface.addEventListener("getuserstoredinfo", function(evt) {              
    datareceived_arry = evt.data;              
    var unoti = GetAllNotifications();                        
});

function GetAllNotifications(){          
            //get user notification
            var allunotifications = "none";

            //add userid
            allunotifications = "<b>Userid: " + datareceived_arry['userinfo']['userid'] + "</b>";

            alert(datareceived_arry['userinfo']['userid']); //This shows the userid Fari
            alert(JSON.stringify(datareceived_arry['apps'][0]['version'])); //This shows undefined
            alert(JSON.stringify(datareceived_arry)); //This shows all the data
            $('#showdata').html(JSON.stringify(datareceived_arry)); //This shows all the data
}

Вот данные, сохраненные в файл:

{"0":0,"userinfo":{"userid":"fari","loginstatus":1,"usernotification":""},"apps":[{"appid":"rt5processor","accounttype":"Admin","status":"6","datestarted":"2019-10-11","usagedata":"1","flagcookiedata":"0","flagstorage":"0","appname":"RTPROCESSOR","version":"1.11.8","appnotification":"","apptype":"extension","updateflag":"0"},{"appid":"rt5sharpen","accounttype":"Admin","status":"6","datestarted":"2019-10-11","usagedata":"1","flagcookiedata":"0","flagstorage":"1","appname":"RTSHARPEN","version":"1.11.8","appnotification":"","apptype":"extension","updateflag":"0"}],"tutorials":[{"appid":"rtp","tutorialurl":"https://www.youtube.com/watch?v=W3cKq7S3qKc","featureonapp":"sharpen3"},{"appid":"rtp","tutorialurl":"https://www.youtube.com/watch?v=fKn5fG3M1m8","featureonapp":"Sharpen"},{"appid":"rtp","tutorialurl":"https://www.youtube.com/watch?v=m9M7J9uMrJk","featureonapp":"sharpen2"}],"misc":{"globalnotification":""}}

Я использовал фиктивные тестовые данные, которые будут заменены. Он возвращается отлично в PS 2017,2018,2019. Он использует CEP 4, но я попробовал CEP 6, и проблема остается. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 18 октября 2019

Возможно, за этим стоит большая история, но, по-видимому, синтаксический анализатор объектов событий в CC2015 не работает: при работе с простыми объектами (так что ваш datareceived_arry['userinfo']['userid'] доступен) массивы преобразуются в строки: JSON, который получает панель, выглядит следующим образом (обратите вниманиевсе массивы теперь являются строками):

{
    "0": "0",
    "tutorials": "[{\"tutorialurl\":\"https://www.youtube.com/watch?v=W3cKq7S3qKc\",\"appid\":\"rtp\",\"featureonapp\":\"sharpen3\"},{\"tutorialurl\":\"https://www.youtube.com/watch?v=fKn5fG3M1m8\",\"appid\":\"rtp\",\"featureonapp\":\"Sharpen\"},{\"tutorialurl\":\"https://www.youtube.com/watch?v=m9M7J9uMrJk\",\"appid\":\"rtp\",\"featureonapp\":\"sharpen2\"}]",
    "userinfo":
    {
        "usernotification": "",
        "userid": "fari",
        "loginstatus": "1"
    },
    "apps": "[{\"version\":\"1.11.8\",\"datestarted\":\"2019-10-11\",\"appname\":\"RTPROCESSOR\",\"updateflag\":\"0\",\"flagstorage\":\"0\",\"accounttype\":\"Admin\",\"appid\":\"rt5processor\",\"status\":\"6\",\"usagedata\":\"1\",\"flagcookiedata\":\"0\",\"apptype\":\"extension\",\"appnotification\":\"\"},{\"version\":\"1.11.8\",\"datestarted\":\"2019-10-11\",\"appname\":\"RTSHARPEN\",\"updateflag\":\"0\",\"flagstorage\":\"1\",\"accounttype\":\"Admin\",\"appid\":\"rt5sharpen\",\"status\":\"6\",\"usagedata\":\"1\",\"flagcookiedata\":\"0\",\"apptype\":\"extension\",\"appnotification\":\"\"}]",
    "misc":
    {
        "globalnotification": ""
    }
}

если вы действительно хотите использовать PlugPlugExternalObject для передачи данных из jsx в js для некоторого повторного использования, я думаю, вам придется написатьнастраиваемый парсер для вашего объекта. В противном случае я бы предложил просто вернуть данные из jsx в js и использовать их в обратном вызове:

JSX:

function ReadUserStoredDataFromFile(vfilepath)
{
    var rd = ReadFileData(vfilepath);
    return rd;
}

function ReadFileData(vfullpath)
{
    fle = File(vfullpath);
    var filedata = 0;

    if (fle.exists)
    {
        fle.open('r');
        filedata = fle.read();
        fle.close();
    }

    return filedata;
}

JS:

    var datareceived_arry = [];
    var usermydocuments = csInterface.getSystemPath(SystemPath.MY_DOCUMENTS);

    setTimeout(AutoStatus, 1000); 

    function AutoStatus()
    {
        var usdocfp = '"' + usermydocuments + '/rt/autostatus.json' + '"';
        csInterface.evalScript('ReadUserStoredDataFromFile(' + usdocfp + ')', function(res)
        {
            datareceived_arry = JSON.parse(res) // result comes as a string
            //get user notification
            var allunotifications = "none";

            //add userid
            allunotifications = "<b>Userid: " + datareceived_arry['userinfo']['userid'] + "</b>";

            alert(datareceived_arry['userinfo']['userid']); //This shows the userid Fari
            alert(JSON.stringify(datareceived_arry['apps'][0]['version'])); //This shows undefined
            alert(JSON.stringify(datareceived_arry)); //This shows all the data
            $('#showdata').html(JSON.stringify(datareceived_arry)); //This shows all the data
        });
    }
...